Skip to content

Commit 32c5ab0

Browse files
ADFA-4537: translate the dashboard for the full language set
Add 28 machine-translated lang files (pending human review) so the device dashboard (static/dashboard) matches the Android app's supported languages. Expand SUPPORTED_LANGS accordingly, flip the document direction for RTL locales (ar, fa), and extend the lang-parity test LOCALES to every shipped locale. Brand names, versions, file names, commands and emojis stay as-is.
1 parent 1f95a0b commit 32c5ab0

30 files changed

Lines changed: 3538 additions & 3 deletions

‎static/dashboard/public/js/dashboard.js‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ const themeManager = {
3737
// --- i18n System ---
3838
// Locales the dashboard ships (kept in parity with the Android app). 'en' is the
3939
// source of truth and the fallback for any missing locale/key.
40-
const SUPPORTED_LANGS = ['en', 'es', 'fr', 'hi', 'pt', 'ru'];
40+
const SUPPORTED_LANGS = ['en', 'es', 'fr', 'hi', 'pt', 'ru', 'de', 'it', 'ar',
41+
'ja', 'zh', 'ko', 'nl', 'tr', 'vi', 'pl', 'cs', 'id', 'fa', 'uk', 'ro', 'el',
42+
'sk', 'bg', 'sr', 'lt', 'no', 'hu', 'az', 'bn', 'gu', 'ta', 'sw', 'yo'];
43+
// Scripts that read right-to-left; the document direction flips for these.
44+
const RTL_LANGS = ['ar', 'fa'];
4145

4246
// Translate a key, falling back to the given English text (or the key) when the active
4347
// locale is missing that key. Safe for dynamically-rendered strings (see maps/kiwix JS).
@@ -71,8 +75,9 @@ const loadLanguage = () => {
7175
const userLang = (navigator.language || navigator.userLanguage || 'en').substring(0, 2).toLowerCase();
7276
const lang = SUPPORTED_LANGS.includes(userLang) ? userLang : 'en';
7377
// Reflect the active locale on <html> so :lang() styling (e.g. non-Latin scripts) and
74-
// assistive tech announce the right language.
78+
// assistive tech announce the right language, and flip direction for RTL scripts.
7579
document.documentElement.lang = lang;
80+
document.documentElement.dir = RTL_LANGS.includes(lang) ? 'rtl' : 'ltr';
7681
const script = document.createElement('script');
7782
script.src = `lang/${lang}.js`;
7883
// If the locale file fails to load, fall back to English so the UI is never blank.

‎static/dashboard/public/lang/ar.js‎

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Machine-translated (ar) — pending human review. See ADFA-4537.
2+
window.i18n = {
3+
// --- Navigation / sidebar ---
4+
"nav_home": "الرئيسية",
5+
"nav_maps": "الخرائط",
6+
"nav_kiwix": "Kiwix",
7+
"nav_books": "الكتب",
8+
"nav_theme": "المظهر",
9+
10+
// --- Footer / about ---
11+
"footer_version": "K2Go Dashboard v1.0.1",
12+
"footer_about": "حول لوحة تحكم K2Go",
13+
"about_text": "صُممت هذه اللوحة لإدارة المحتوى عبر تطبيقات IIAB على أجهزة Android.",
14+
15+
// --- Common / shared ---
16+
"common_loading": "جارٍ التحميل...",
17+
"common_close": "إغلاق",
18+
"common_cancel": "إلغاء",
19+
"common_yes": "نعم",
20+
"common_no": "لا",
21+
"common_got_it": "فهمت",
22+
"common_got_it_upper": "فهمت",
23+
"common_delete_icon": "🗑️ حذف",
24+
"common_deleting": "⏳ جارٍ الحذف...",
25+
"common_refreshing": "جارٍ التحديث...",
26+
"common_hide_terminal": "▲ إخفاء الطرفية",
27+
"common_show_terminal": "▼ إظهار الطرفية",
28+
"common_waiting_commands": "في انتظار الأوامر...",
29+
"common_unknown": "غير معروف",
30+
"common_na": "N/A",
31+
32+
// --- Home panel ---
33+
"home_title": "لوحة تحكم K2Go",
34+
"home_ip_label": "IP:",
35+
"home_online": "متصل",
36+
"home_main_storage": "💾 وحدة التخزين الرئيسية",
37+
"home_ram": "⚡ ذاكرة RAM",
38+
"home_swap": "💽 المبادلة (الافتراضية)",
39+
"home_installed_modules": "الوحدات المثبتة",
40+
"home_card_kiwix_title": "مدير Kiwix",
41+
"home_card_kiwix_desc": "تصفّح وتنزيل Wikipedia دون اتصال",
42+
"home_card_maps_title": "مستخرج الخرائط",
43+
"home_card_maps_desc": "إدارة بلاطات OpenStreetMap",
44+
"home_card_books_title": "أداة تنزيل الكتب",
45+
"home_card_books_desc": "كتالوج منسّق لـ Calibre-Web",
46+
47+
// --- Kiwix panel ---
48+
"kiwix_title": "مستودع Kiwix - Wikipedia",
49+
"kiwix_connecting": "جارٍ الاتصال بالخادم المحلي...",
50+
"kiwix_search_placeholder": "بحث (مثال: es all nopic...)",
51+
"kiwix_local_filter": "💾 محلي:",
52+
"kiwix_selected": "المحدد:",
53+
"kiwix_download_btn": "تنزيل",
54+
"kiwix_cancel_download": "🛑 إلغاء التنزيل",
55+
"kiwix_load_more": "تحميل المزيد من النتائج ↓",
56+
"kiwix_limit_modal_body": "يرجى إكمال التنزيلات في قائمة الانتظار أولاً. ساعد في استخدام عرض النطاق الترددي لـ Kiwix بمسؤولية.",
57+
"kiwix_aria_title": "❌ خطأ: لم يتم العثور على Aria2",
58+
"kiwix_aria_body": "لم يتم اكتشاف الملف الثنائي /usr/bin/aria2c.",
59+
"kiwix_indexer_title": "⚠️ تحذير: المفهرس مفقود",
60+
"kiwix_indexer_body": "لم يتم اكتشاف iiab-make-kiwix-lib في الواجهة الخلفية. هل تريد المتابعة؟",
61+
"kiwix_continue_download": "متابعة التنزيل",
62+
"kiwix_overwrite_confirm": "الملف",
63+
"kiwix_overwrite_confirm2": "تم تنزيله بالفعل.",
64+
"kiwix_overwrite_confirm3": "هل تريد الكتابة فوقه؟",
65+
"kiwix_delete_confirm": "⚠️ هل تريد حذف الملف",
66+
"kiwix_delete_confirm2": "سيؤدي هذا إلى تحديث قاعدة بيانات Kiwix.",
67+
"kiwix_requesting_deletion": "[النظام] جارٍ طلب الحذف من الخادم...",
68+
"kiwix_cancel_confirm": "⚠️ هل تريد إلغاء التنزيل الجاري؟\n\nسيتم مسح الملفات غير المكتملة من القرص الصلب.",
69+
"kiwix_aborting": "⏳ جارٍ الإحباط...",
70+
"kiwix_downloading": "جارٍ التنزيل...",
71+
72+
// --- Maps panel ---
73+
"maps_title": "لوحة استخراج الخرائط",
74+
"maps_command_label": "تنفيذ أمر شل الخاص بخرائط IIAB:",
75+
"maps_command_placeholder": "مثال: sudo /opt/iiab/maps/...",
76+
"maps_start": "بدء",
77+
"maps_executing": "جارٍ التنفيذ...",
78+
"maps_confirm_prompt": "⚠️ يتطلب النظام تأكيدك للمتابعة:",
79+
"maps_existing_regions": "🗺️ المناطق الموجودة",
80+
"maps_refresh_list": "تحديث القائمة",
81+
"maps_loading_catalog": "جارٍ تحميل كتالوج الخادم...",
82+
"maps_empty": "لا توجد مناطق خرائط مسجلة في extracts.json.",
83+
"maps_no_layers": "لا توجد طبقات مدرجة",
84+
"maps_incomplete": "⚠️ استخراج غير مكتمل — مفقود:",
85+
"maps_render": "التصيير:",
86+
"maps_delete_confirm": "⚠️ هل تريد حذف المنطقة",
87+
"maps_delete_confirm2": "من الخادم؟",
88+
89+
// --- Books panel ---
90+
"books_title": "📚 أداة تنزيل الكتب",
91+
"books_subtitle": "كتالوج منسّق يضم أكثر من 1,000 كتاب مدعوم من Project Gutenberg",
92+
"books_search_placeholder": "ابحث في الكتالوج المحلي أو البعيد...",
93+
"books_tab_local": "📚 الكتب المحلية",
94+
"books_tab_top": "🏆 أفضل 100",
95+
"books_tab_edu": "🎓 تعليمي وأطفال",
96+
"books_download_btn": "تنزيل",
97+
"books_downloading": "جارٍ التنزيل...",
98+
"books_limit_modal_body": "يرجى إكمال التنزيلات في قائمة الانتظار أولاً. ساعد في استخدام عرض النطاق الترددي لـ Project Gutenberg بمسؤولية.",
99+
"books_modal_title_ph": "عنوان الكتاب",
100+
"books_modal_author_ph": "اسم المؤلف",
101+
"books_modal_meta_ph": "السنة: 1900",
102+
"books_no_description": "لا يوجد وصف متاح لهذا الكتاب.",
103+
"books_download_calibre": "📥 تنزيل وإضافة إلى Calibre-Web",
104+
"books_read_calibre": "📖 القراءة في Calibre-Web",
105+
"books_queue_full": "⏳ قائمة الانتظار ممتلئة (انتظر التنزيلات الحالية)",
106+
"books_no_local": "لم يتم العثور على كتب محلية. تحقق من علامة تبويب أفضل 100!",
107+
"books_no_remote": "لم يتم العثور على كتب في الكتالوج البعيد.",
108+
"books_read": "قراءة",
109+
"books_badge_local": "محلي",
110+
"books_badge_info": "معلومات",
111+
"books_delete_confirm": "هل أنت متأكد أنك تريد حذف هذا الكتاب؟",
112+
"books_error_alert": "❌ فشل تنزيل الكتاب أو رفعه.",
113+
"books_error_reason": "سبب الخادم:",
114+
"books_error_hint": "تأكد من أنك لست مسجّل الدخول في عدة علامات تبويب في وقت واحد.",
115+
116+
// --- Calibre-Web login modal ---
117+
"calibre_error_title": "🔒 خطأ في الاتصال بـ Calibre-Web",
118+
"calibre_error_body": "فشلت بيانات اعتماد الرافع المخزنة. يرجى إدخال اسم المستخدم وكلمة المرور الحاليين لمسؤول Calibre-Web لمعالجة التغييرات.",
119+
"calibre_username": "اسم المستخدم",
120+
"calibre_password": "كلمة المرور",
121+
"calibre_update_retry": "تحديث وإعادة المحاولة",
122+
"calibre_enter_both": "يرجى إدخال كل من اسم المستخدم وكلمة المرور.",
123+
124+
// --- Shared modal titles ---
125+
"limit_modal_title": "⚠️ حد التنزيل المقترح"
126+
};

‎static/dashboard/public/lang/az.js‎

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Machine-translated (az) — pending human review. See ADFA-4537.
2+
window.i18n = {
3+
// --- Navigation / sidebar ---
4+
"nav_home": "Ana səhifə",
5+
"nav_maps": "Xəritələr",
6+
"nav_kiwix": "Kiwix",
7+
"nav_books": "Kitablar",
8+
"nav_theme": "Mövzu",
9+
10+
// --- Footer / about ---
11+
"footer_version": "K2Go Dashboard v1.0.1",
12+
"footer_about": "K2Go İdarə Paneli haqqında",
13+
"about_text": "Bu idarə paneli Android cihazlarında IIAB tətbiqləri üzrə məzmunu idarə etmək üçün nəzərdə tutulub.",
14+
15+
// --- Common / shared ---
16+
"common_loading": "Yüklənir...",
17+
"common_close": "Bağla",
18+
"common_cancel": "Ləğv et",
19+
"common_yes": "Bəli",
20+
"common_no": "Xeyr",
21+
"common_got_it": "Anladım",
22+
"common_got_it_upper": "ANLADIM",
23+
"common_delete_icon": "🗑️ Sil",
24+
"common_deleting": "⏳ Silinir...",
25+
"common_refreshing": "Yenilənir...",
26+
"common_hide_terminal": "▲ Terminalı gizlət",
27+
"common_show_terminal": "▼ Terminalı göstər",
28+
"common_waiting_commands": "Əmrlər gözlənilir...",
29+
"common_unknown": "Naməlum",
30+
"common_na": "N/A",
31+
32+
// --- Home panel ---
33+
"home_title": "K2Go İdarə Paneli",
34+
"home_ip_label": "IP:",
35+
"home_online": "Onlayn",
36+
"home_main_storage": "💾 Əsas yaddaş",
37+
"home_ram": "⚡ RAM yaddaşı",
38+
"home_swap": "💽 Svap (Virtual)",
39+
"home_installed_modules": "Quraşdırılmış modullar",
40+
"home_card_kiwix_title": "Kiwix Meneceri",
41+
"home_card_kiwix_desc": "Wikipedia-nı oflayn nəzərdən keçir və yüklə",
42+
"home_card_maps_title": "Xəritə Çıxarıcı",
43+
"home_card_maps_desc": "OpenStreetMap kafellərini idarə et",
44+
"home_card_books_title": "Kitab Yükləyici",
45+
"home_card_books_desc": "Calibre-Web üçün seçilmiş kataloq",
46+
47+
// --- Kiwix panel ---
48+
"kiwix_title": "Kiwix Anbarı - Wikipedia",
49+
"kiwix_connecting": "Yerli serverə qoşulur...",
50+
"kiwix_search_placeholder": "Axtar (məs., es all nopic...)",
51+
"kiwix_local_filter": "💾 Yerli:",
52+
"kiwix_selected": "Seçilmiş:",
53+
"kiwix_download_btn": "Yüklə",
54+
"kiwix_cancel_download": "🛑 Yükləməni ləğv et",
55+
"kiwix_load_more": "Daha çox nəticə yüklə ↓",
56+
"kiwix_limit_modal_body": "Zəhmət olmasa əvvəlcə növbədəki yükləmələri tamamlayın. Kiwix-in zolaq genişliyindən məsuliyyətlə istifadə etməyə kömək edin.",
57+
"kiwix_aria_title": "❌ Xəta: Aria2 tapılmadı",
58+
"kiwix_aria_body": "/usr/bin/aria2c ikili faylı aşkarlanmadı.",
59+
"kiwix_indexer_title": "⚠️ Xəbərdarlıq: İndeksləyici çatışmır",
60+
"kiwix_indexer_body": "iiab-make-kiwix-lib arxa tərəfdə aşkarlanmadı. Davam etmək istəyirsiniz?",
61+
"kiwix_continue_download": "Yükləməyə davam et",
62+
"kiwix_overwrite_confirm": "Fayl",
63+
"kiwix_overwrite_confirm2": "artıq yüklənib.",
64+
"kiwix_overwrite_confirm3": "Onun üzərinə yazmaq istəyirsiniz?",
65+
"kiwix_delete_confirm": "⚠️ Faylı SİLMƏK istəyirsiniz",
66+
"kiwix_delete_confirm2": "Bu, Kiwix verilənlər bazasını yeniləyəcək.",
67+
"kiwix_requesting_deletion": "[Sistem] Serverdən silinmə tələb olunur...",
68+
"kiwix_cancel_confirm": "⚠️ Davam edən yükləməni LƏĞV etmək istəyirsiniz?\n\nNatamam fayllar sabit diskinizdən silinəcək.",
69+
"kiwix_aborting": "⏳ Dayandırılır...",
70+
"kiwix_downloading": "Yüklənir...",
71+
72+
// --- Maps panel ---
73+
"maps_title": "Xəritə Çıxarma Paneli",
74+
"maps_command_label": "IIAB Xəritələr shell əmrini icra et:",
75+
"maps_command_placeholder": "məs.: sudo /opt/iiab/maps/...",
76+
"maps_start": "Başlat",
77+
"maps_executing": "İcra olunur...",
78+
"maps_confirm_prompt": "⚠️ Sistem davam etmək üçün təsdiqinizi tələb edir:",
79+
"maps_existing_regions": "🗺️ Mövcud bölgələr",
80+
"maps_refresh_list": "Siyahını yenilə",
81+
"maps_loading_catalog": "Server kataloqu yüklənir...",
82+
"maps_empty": "extracts.json faylında qeydə alınmış xəritə bölgəsi yoxdur.",
83+
"maps_no_layers": "sadalanan qat yoxdur",
84+
"maps_incomplete": "⚠️ Natamam çıxarış — çatışmır:",
85+
"maps_render": "render:",
86+
"maps_delete_confirm": "⚠️ Bölgəni silmək istəyirsiniz",
87+
"maps_delete_confirm2": "serverdən?",
88+
89+
// --- Books panel ---
90+
"books_title": "📚 Kitab Yükləyici",
91+
"books_subtitle": "Project Gutenberg tərəfindən dəstəklənən 1.000-dən çox kitabdan ibarət seçilmiş kataloq",
92+
"books_search_placeholder": "Yerli və ya uzaq kataloqda axtar...",
93+
"books_tab_local": "📚 Yerli kitablar",
94+
"books_tab_top": "🏆 Ən yaxşı 100",
95+
"books_tab_edu": "🎓 Təhsil və uşaqlar",
96+
"books_download_btn": "YÜKLƏ",
97+
"books_downloading": "YÜKLƏNİR...",
98+
"books_limit_modal_body": "Zəhmət olmasa əvvəlcə növbədəki yükləmələri tamamlayın. Project Gutenberg-in zolaq genişliyindən məsuliyyətlə istifadə etməyə kömək edin.",
99+
"books_modal_title_ph": "Kitabın adı",
100+
"books_modal_author_ph": "Müəllifin adı",
101+
"books_modal_meta_ph": "İl: 1900",
102+
"books_no_description": "Bu kitab üçün təsvir mövcud deyil.",
103+
"books_download_calibre": "📥 Yüklə və Calibre-Web-ə əlavə et",
104+
"books_read_calibre": "📖 Calibre-Web-də oxu",
105+
"books_queue_full": "⏳ Növbə doludur (Cari yükləmələri gözləyin)",
106+
"books_no_local": "Yerli kitab tapılmadı. Ən yaxşı 100 tabına baxın!",
107+
"books_no_remote": "Uzaq kataloqda kitab tapılmadı.",
108+
"books_read": "Oxu",
109+
"books_badge_local": "Yerli",
110+
"books_badge_info": "Məlumat",
111+
"books_delete_confirm": "Bu kitabı silmək istədiyinizə əminsiniz?",
112+
"books_error_alert": "❌ Kitabın yüklənməsi və ya göndərilməsi uğursuz oldu.",
113+
"books_error_reason": "Server səbəbi:",
114+
"books_error_hint": "Eyni anda bir neçə tabda daxil olmadığınızdan əmin olun.",
115+
116+
// --- Calibre-Web login modal ---
117+
"calibre_error_title": "🔒 Calibre-Web bağlantı xətası",
118+
"calibre_error_body": "Saxlanılan yükləyici etimadnaməsi uğursuz oldu. Dəyişiklikləri emal etmək üçün zəhmət olmasa cari Calibre-Web admin istifadəçi adını və parolunu daxil edin.",
119+
"calibre_username": "İstifadəçi adı",
120+
"calibre_password": "Parol",
121+
"calibre_update_retry": "Yenilə və yenidən cəhd et",
122+
"calibre_enter_both": "Zəhmət olmasa həm istifadəçi adını, həm də parolu daxil edin.",
123+
124+
// --- Shared modal titles ---
125+
"limit_modal_title": "⚠️ Təklif olunan yükləmə limiti"
126+
};

0 commit comments

Comments
 (0)