feat(i18n): add Hungarian translation (hu) (#1236)

Integrate the community-contributed Hungarian translation by
Tibor Hermann (@htibcsike) as the 19th locale:

- add apps/web/src/assets/i18n/hu.json (1,142 of 1,175 keys translated;
  32 keys added after the contribution fall back to English, plus the
  new LANGUAGES.HUNGARIAN endonym)
- register HUNGARIAN = 'hu' in the Language enum, SUPPORTED_LANGS,
  Angular date locale registration, and the TMDB language map (hu-HU)
- add LANGUAGES.HUNGARIAN = "Magyar" to en.json and all other locales
  via tools/i18n/fill-missing.mjs
- update README.md and CLAUDE.md language counts to 19

Closes #1192, refs #1140.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5 authored and GitHub committed 2026-07-25 12:20:16 +02:00
1 parent 0ee73f2d0f
commit b94f40dc74
25 files changed
+1372 -20

No files matched your search

+1 -1
View File
@@ -835,7 +835,7 @@ engine` (restart required) or
**Internationalization**:
- Uses `@ngx-translate` with 18 language files in `apps/web/src/assets/i18n/`
- Uses `@ngx-translate` with 19 language files in `apps/web/src/assets/i18n/`
## Development Notes
+1 -1
View File
@@ -67,7 +67,7 @@ The application is a cross-platform, open-source project built with Electron and
- Cross-platform desktop (Electron) and installable PWA
- Desktop auto-updater and mobile remote control _(desktop)_
- Docker self-hosting for the PWA + web backend
- 18 languages ([translation files](apps/web/src/assets/i18n/)), light & dark themes, and keyboard shortcuts
- 19 languages ([translation files](apps/web/src/assets/i18n/)), light & dark themes, and keyboard shortcuts
## Keyboard shortcuts
+2
View File
@@ -6,6 +6,7 @@ import localeDe from '@angular/common/locales/de';
import localeEl from '@angular/common/locales/el';
import localeEs from '@angular/common/locales/es';
import localeFr from '@angular/common/locales/fr';
import localeHu from '@angular/common/locales/hu';
import localeIt from '@angular/common/locales/it';
import localeJa from '@angular/common/locales/ja';
import localeKo from '@angular/common/locales/ko';
@@ -31,6 +32,7 @@ export function registerAppDateLocales(): void {
registerLocaleData(localeEl, 'el');
registerLocaleData(localeEs, 'es');
registerLocaleData(localeFr, 'fr');
registerLocaleData(localeHu, 'hu');
registerLocaleData(localeIt, 'it');
registerLocaleData(localeJa, 'ja');
registerLocaleData(localeKo, 'ko');
+1
View File
@@ -67,6 +67,7 @@ const SUPPORTED_LANGS = new Set([
'en',
'es',
'fr',
'hu',
'it',
'ja',
'ko',
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "نعم",
"NO": "لا",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "آه",
"NO": "لا",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Так",
"NO": "Не",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Ja",
"NO": "Nein",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Ναι",
"NO": "Όχι",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Yes",
"NO": "No",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Sí",
"NO": "No",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Oui",
"NO": "Non",
File diff suppressed because it is too large. Load diff
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Sì",
"NO": "No",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "はい",
"NO": "いいえ",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Yes",
"NO": "No",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Ja",
"NO": "Nee",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Tak",
"NO": "Nie",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Sim",
"NO": "Não",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Да",
"NO": "Нет",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "Evet",
"NO": "Hayır",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "是",
"NO": "否",
+2 -1
View File
@@ -755,7 +755,8 @@
"BELARUSIAN": "Беларуская",
"POLISH": "Polski",
"PORTUGUESE": "Português",
"GREEK": "Ελληνικά"
"GREEK": "Ελληνικά",
"HUNGARIAN": "Magyar"
},
"YES": "是",
"NO": "否",
@@ -49,6 +49,7 @@ const TMDB_LANGUAGE_MAP: Record<Language, string> = {
[Language.POLISH]: 'pl-PL',
[Language.PORTUGUESE]: 'pt-PT',
[Language.GREEK]: 'el-GR',
[Language.HUNGARIAN]: 'hu-HU',
};
export function toTmdbLanguage(
@@ -20,4 +20,5 @@ export enum Language {
POLISH = 'pl',
PORTUGUESE = 'pt',
GREEK = 'el',
HUNGARIAN = 'hu',
}