feat: Add Hungarian language support (#7175)

Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
This commit is contained in:
Balázs Úr
2026-02-03 09:22:41 +01:00
committed by GitHub
parent 009beba866
commit f7558a7497
13 changed files with 3500 additions and 90 deletions
+6 -5
View File
@@ -9,17 +9,18 @@
"source": "en-US",
"targets": [
"de-DE",
"es-ES",
"fr-FR",
"hu-HU",
"ja-JP",
"nl-NL",
"pt-BR",
"pt-PT",
"ro-RO",
"zh-Hans-CN",
"zh-Hant-TW",
"nl-NL",
"es-ES",
"ru-RU",
"sv-SE",
"ru-RU"
"zh-Hans-CN",
"zh-Hant-TW"
]
},
"version": 1.8
+2
View File
@@ -227,6 +227,7 @@ checksums:
common/label: a5c71bf158481233f8215dbd38cc196b
common/language: 277fd1a41cc237a437cd1d5e4a80463b
common/learn_more: e598091d132f890c37a6d4ed94f6d794
common/license_expired: 7af13535e320e4197989472c01387d2c
common/light_overlay: 0499907ea7b8405f4267b117998b5a78
common/limits_reached: 98879ae8c2be281ad6d283d7029d0148
common/link: 60f0aa33e70ca6df3b6659802b16f433
@@ -434,6 +435,7 @@ checksums:
common/you_have_reached_your_monthly_miu_limit_of: ded62fc6842c707f62622386ca34f71a
common/you_have_reached_your_monthly_response_limit_of: 3824db23ecc3dcd2b1787b98ccfdd5f9
common/you_will_be_downgraded_to_the_community_edition_on_date: bff35b54c13e2c205dc4c19056261cc0
common/your_license_has_expired_please_renew: 3f21ae4a7deab351b143b407ece58254
emails/accept: f8cc1de4f5e3c850cfdbbc0ec831ade7
emails/click_or_drag_to_upload_files: 64f59bc339568d52b8464b82546b70ea
emails/email_customization_preview_email_heading: 8b798cb8438b3dd356c02dab33b4c897
+8 -7
View File
@@ -165,19 +165,20 @@ export const MAX_ATTRIBUTE_CLASSES_PER_ENVIRONMENT = 150;
export const DEFAULT_LOCALE = "en-US";
export const AVAILABLE_LOCALES: TUserLocale[] = [
"en-US",
"de-DE",
"pt-BR",
"en-US",
"es-ES",
"fr-FR",
"hu-HU",
"ja-JP",
"nl-NL",
"zh-Hant-TW",
"pt-BR",
"pt-PT",
"ro-RO",
"ja-JP",
"zh-Hans-CN",
"es-ES",
"sv-SE",
"ru-RU",
"sv-SE",
"zh-Hans-CN",
"zh-Hant-TW",
];
// Billing constants
+38 -32
View File
@@ -126,12 +126,6 @@ export const addMultiLanguageLabels = (object: unknown, languageSymbols: string[
};
export const appLanguages = [
{
code: "en-US",
label: {
"en-US": "English (US)",
},
},
{
code: "de-DE",
label: {
@@ -139,9 +133,15 @@ export const appLanguages = [
},
},
{
code: "pt-BR",
code: "en-US",
label: {
"en-US": "Portuguese (Brazil)",
"en-US": "English (US)",
},
},
{
code: "es-ES",
label: {
"en-US": "Spanish",
},
},
{
@@ -151,9 +151,27 @@ export const appLanguages = [
},
},
{
code: "zh-Hant-TW",
code: "hu-HU",
label: {
"en-US": "Chinese (Traditional)",
"en-US": "Hungarian",
},
},
{
code: "ja-JP",
label: {
"en-US": "Japanese",
},
},
{
code: "nl-NL",
label: {
"en-US": "Dutch",
},
},
{
code: "pt-BR",
label: {
"en-US": "Portuguese (Brazil)",
},
},
{
@@ -169,27 +187,9 @@ export const appLanguages = [
},
},
{
code: "ja-JP",
code: "ru-RU",
label: {
"en-US": "Japanese",
},
},
{
code: "zh-Hans-CN",
label: {
"en-US": "Chinese (Simplified)",
},
},
{
code: "nl-NL",
label: {
"en-US": "Dutch",
},
},
{
code: "es-ES",
label: {
"en-US": "Spanish",
"en-US": "Russian",
},
},
{
@@ -199,9 +199,15 @@ export const appLanguages = [
},
},
{
code: "ru-RU",
code: "zh-Hans-CN",
label: {
"en-US": "Russian",
"en-US": "Chinese (Simplified)",
},
},
{
code: "zh-Hant-TW",
label: {
"en-US": "Chinese (Traditional)",
},
},
];
+15 -13
View File
@@ -1,5 +1,5 @@
import { formatDistance, intlFormat } from "date-fns";
import { de, enUS, es, fr, ja, nl, pt, ptBR, ro, ru, sv, zhCN, zhTW } from "date-fns/locale";
import { de, enUS, es, fr, hu, ja, nl, pt, ptBR, ro, ru, sv, zhCN, zhTW } from "date-fns/locale";
import { TUserLocale } from "@formbricks/types/user";
export const convertDateString = (dateString: string | null) => {
@@ -87,28 +87,30 @@ const getLocaleForTimeSince = (locale: TUserLocale) => {
return de;
case "en-US":
return enUS;
case "pt-BR":
return ptBR;
case "es-ES":
return es;
case "fr-FR":
return fr;
case "hu-HU":
return hu;
case "ja-JP":
return ja;
case "nl-NL":
return nl;
case "sv-SE":
return sv;
case "zh-Hant-TW":
return zhTW;
case "pt-BR":
return ptBR;
case "pt-PT":
return pt;
case "ro-RO":
return ro;
case "ja-JP":
return ja;
case "zh-Hans-CN":
return zhCN;
case "es-ES":
return es;
case "ru-RU":
return ru;
case "sv-SE":
return sv;
case "zh-Hans-CN":
return zhCN;
case "zh-Hant-TW":
return zhTW;
}
};
File diff suppressed because it is too large Load Diff
@@ -68,6 +68,7 @@ export const getWebAppLocale = (languageCode: string, survey: TSurvey): string =
"pt-BR": "pt-BR",
"pt-PT": "pt-PT",
fr: "fr-FR",
hu: "hu-HU",
nl: "nl-NL",
zh: "zh-Hans-CN", // Default to Simplified Chinese
"zh-Hans": "zh-Hans-CN",
+8 -7
View File
@@ -209,19 +209,20 @@ vi.mock("@/lib/constants", () => ({
MAX_ATTRIBUTE_CLASSES_PER_ENVIRONMENT: 100,
MAX_OTHER_OPTION_LENGTH: 250,
AVAILABLE_LOCALES: [
"en-US",
"de-DE",
"pt-BR",
"en-US",
"es-ES",
"fr-FR",
"hu-HU",
"ja-JP",
"nl-NL",
"zh-Hant-TW",
"pt-BR",
"pt-PT",
"ro-RO",
"ja-JP",
"zh-Hans-CN",
"es-ES",
"sv-SE",
"ru-RU",
"sv-SE",
"zh-Hans-CN",
"zh-Hant-TW",
],
DEFAULT_LOCALE: "en-US",
BREVO_API_KEY: "mock-brevo-api-key",
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -7,7 +7,7 @@
},
"locale": {
"source": "en",
"targets": ["de", "it", "fr", "es", "ar", "pt", "ru", "uz", "ro", "ja", "zh-Hans", "hi", "nl", "sv"]
"targets": ["ar", "de", "es", "fr", "hi", "hu", "it", "ja", "nl", "pt", "ro", "ru", "sv", "uz", "zh-Hans"]
},
"version": 1.8
}
+81
View File
@@ -0,0 +1,81 @@
{
"common": {
"and": "és",
"apply": "alkalmaz",
"auto_close_wrapper": "Borítás automatikus bezárása",
"back": "Vissza",
"close_survey": "Kérdőív lezárása",
"company_logo": "Vállalat logója",
"finish": "Befejezés",
"language_switch": "Nyelvválasztó",
"next": "Következő",
"open_in_new_tab": "Megnyitás új lapon",
"people_responded": "{count, plural, one {1 személy válaszolt} other {{count} személy válaszolt}}",
"please_retry_now_or_try_again_later": "Próbálkozzon újra most, vagy próbálja meg később újra.",
"powered_by": "A gépházban:",
"privacy_policy": "Adatvédelmi irányelvek",
"protected_by_reCAPTCHA_and_the_Google": "A reCAPTCHA és a Google védelme alatt áll",
"question": "Kérdés",
"question_video": "Kérdés videója",
"required": "Kötelező",
"respondents_will_not_see_this_card": "A válaszadók nem fogják látni ezt a kártyát",
"retry": "Újrapróbálkozás",
"retrying": "Újrapróbálkozás…",
"select_option": "Válassz egy lehetőséget",
"select_options": "Válassz lehetőségeket",
"sending_responses": "Válaszok küldése…",
"takes_less_than_x_minutes": "{count, plural, one {Kevesebb mint 1 percet vesz igénybe} other {Kevesebb mint {count} percet vesz igénybe}}",
"takes_x_minutes": "{count, plural, one {1 percet vesz igénybe} other {{count} percet vesz igénybe}}",
"takes_x_plus_minutes": "{count}+ percet vesz igénybe",
"terms_of_service": "Használati feltételek",
"the_servers_cannot_be_reached_at_the_moment": "Jelenleg nem lehet elérni a kiszolgálókat.",
"they_will_be_redirected_immediately": "Azonnal át lesznek irányítva",
"your_feedback_is_stuck": "A visszajelzése elakadt :("
},
"errors": {
"all_options_must_be_ranked": "Rangsorolja az összes lehetőséget",
"all_rows_must_be_answered": "Válaszoljon az összes sorra",
"file_extension_must_be": "A fájlkiterjesztés csak {extension} lehet",
"file_extension_must_not_be": "A fájlkiterjesztés nem lehet {extension}",
"file_input": {
"duplicate_files": "A következő fájlok már fel lettek töltve: {duplicateNames}. Kettőzött fájlok nem engedélyezettek.",
"file_size_exceeded": "A következő fájlok túllépik a legnagyobb, {maxSizeInMB} MB-os méretet, ezért eltávolításra kerültek: {fileNames}",
"file_size_exceeded_alert": "A fájlnak kisebbnek kell lennie mint {maxSizeInMB} MB",
"no_valid_file_types_selected": "Nincs érvényes fájltípus kiválasztva. Válasszon egy érvényes fájltípust.",
"only_one_file_can_be_uploaded_at_a_time": "Egyszerre csak egy fájl tölthető fel.",
"upload_failed": "A feltöltés nem sikerült! Próbálja meg újra.",
"you_can_only_upload_a_maximum_of_files": "Legfeljebb csak {FILE_LIMIT} fájlt tölthet fel."
},
"invalid_device_error": {
"message": "Tiltsa le a szemét elleni védekezést a kérdőív beállításaiban, hogy tovább használhassa ezt az eszközt.",
"title": "Ez az eszköz nem támogatja a szemét elleni védekezést."
},
"invalid_format": "Adjon meg egy érvényes formátumot",
"is_between": "Válasszon egy dátumot {startDate} és {endDate} között",
"is_earlier_than": "Válasszon korábbi dátumot mint {date}",
"is_greater_than": "Adjon meg nagyobb értéket mint {min}",
"is_later_than": "Válasszon későbbi dátumot mint {date}",
"is_less_than": "Adjon meg kisebb értéket mint {max}",
"is_not_between": "Válasszon olyan dátumot, amely nem {startDate} és {endDate} között van",
"max_length": "Ne adjon meg többet {max} karakternél",
"max_selections": "Ne válasszon {max} lehetőségnél többet",
"max_value": "Adjon meg olyan értéket, amely nem nagyobb mint {max}",
"min_length": "Adjon meg legalább {min} karaktert",
"min_selections": "Válasszon legalább {min} lehetőséget",
"min_value": "Adjon meg olyan értéket, amely legalább {min}",
"minimum_options_ranked": "Rangsoroljon legalább {min} lehetőséget",
"minimum_rows_answered": "Válaszoljon legalább {min} sorra",
"please_enter_a_valid_email_address": "Adjon meg egy érvényes e-mail-címet",
"please_enter_a_valid_phone_number": "Adjon meg egy érvényes telefonszámot",
"please_enter_a_valid_url": "Adjon meg egy érvényes URL-t",
"please_fill_out_this_field": "Töltse ki ezt a mezőt",
"recaptcha_error": {
"message": "A válaszát nem sikerült elküldeni, mert automatizált tevékenységként lett megjelölve. Ha lélegzik, akkor próbálja meg újra.",
"title": "Nem tudtuk ellenőrizni, hogy Ön ember-e."
},
"value_must_contain": "Az értéknek tartalmaznia kell ezt: {value}",
"value_must_equal": "Az értéknek egyenlőnek kell lennie ezzel: {value}",
"value_must_not_contain": "Az érték nem tartalmazhatja ezt: {value}",
"value_must_not_equal": "Az érték nem lehet egyenlő ezzel: {value}"
}
}
+21 -18
View File
@@ -7,6 +7,7 @@ import enTranslations from "../../locales/en.json";
import esTranslations from "../../locales/es.json";
import frTranslations from "../../locales/fr.json";
import hiTranslations from "../../locales/hi.json";
import huTranslations from "../../locales/hu.json";
import itTranslations from "../../locales/it.json";
import jaTranslations from "../../locales/ja.json";
import nlTranslations from "../../locales/nl.json";
@@ -23,39 +24,41 @@ i18n
.init({
fallbackLng: "en",
supportedLngs: [
"en",
"de",
"it",
"fr",
"es",
"ar",
"de",
"en",
"es",
"fr",
"hi",
"hu",
"it",
"ja",
"nl",
"pt",
"ro",
"ja",
"ru",
"sv",
"uz",
"zh-Hans",
"hi",
"nl",
"sv",
],
resources: {
en: { translation: enTranslations },
de: { translation: deTranslations },
it: { translation: itTranslations },
fr: { translation: frTranslations },
es: { translation: esTranslations },
ar: { translation: arTranslations },
pt: { translation: ptTranslations },
ro: { translation: roTranslations },
de: { translation: deTranslations },
en: { translation: enTranslations },
es: { translation: esTranslations },
fr: { translation: frTranslations },
hi: { translation: hiTranslations },
hu: { translation: huTranslations },
it: { translation: itTranslations },
ja: { translation: jaTranslations },
nl: { translation: nlTranslations },
pt: { translation: ptTranslations },
ro: { translation: roTranslations },
ru: { translation: ruTranslations },
uz: { translation: uzTranslations },
sv: { translation: svTranslations },
uz: { translation: uzTranslations },
"zh-Hans": { translation: zhHansTranslations },
hi: { translation: hiTranslations },
},
interpolation: { escapeValue: false },
+8 -7
View File
@@ -1,19 +1,20 @@
import { z } from "zod";
export const ZUserLocale = z.enum([
"en-US",
"de-DE",
"pt-BR",
"en-US",
"es-ES",
"fr-FR",
"hu-HU",
"ja-JP",
"nl-NL",
"zh-Hant-TW",
"pt-BR",
"pt-PT",
"ro-RO",
"ja-JP",
"zh-Hans-CN",
"es-ES",
"sv-SE",
"ru-RU",
"sv-SE",
"zh-Hans-CN",
"zh-Hant-TW",
]);
export type TUserLocale = z.infer<typeof ZUserLocale>;