feat(frontend): i18n expansion, admin/profile i18n, grid/list view fix, empty state

- Add 5 new locales (hi, ar, ru, ja, ko) — now 14 total
- Admin panel: 117 i18n keys, confirm modal, animated tabs, no inline handlers
- Profile page: 58 i18n keys with data-i18n attributes
- Fix i18n safeT() shadowing bug and translationsLoaded timing
- Fix grid/list view: list header no longer shows in grid mode on login
- Fix classList.toggle hidden sync for view switching across all nav functions
- Revert .hidden important that broke login page rendering
- Add files empty state (no_files + empty_hint) with translations
- Fix language selector dropdown scroll and styling
- Fix admin panel scroll with sticky tabs
This commit is contained in:
Diocrafts
2026-03-09 00:08:34 +01:00
parent f409a9edd7
commit df336da679
43 changed files with 6645 additions and 2043 deletions
+60 -15
View File
@@ -19,8 +19,8 @@ const FIRST_RUN_KEY = 'oxicloud_first_run_completed';
// Language selector texts (used before i18n is loaded)
const LANGUAGE_TEXTS = {
en: {
title: 'Welcome to OxiCloud',
subtitle: 'Please select your language',
title: 'Welcome!',
subtitle: 'Select your language to continue',
continue: 'Continue',
autodetected: 'We detected your language',
moreLanguages: 'More languages...',
@@ -28,8 +28,8 @@ const LANGUAGE_TEXTS = {
searchPlaceholder: 'Search language...'
},
es: {
title: 'Bienvenido a OxiCloud',
subtitle: 'Por favor, selecciona tu idioma',
title: '¡Bienvenido!',
subtitle: 'Selecciona tu idioma para continuar',
continue: 'Continuar',
autodetected: 'Hemos detectado tu idioma',
moreLanguages: 'More languages...',
@@ -37,8 +37,8 @@ const LANGUAGE_TEXTS = {
searchPlaceholder: 'Buscar idioma...'
},
zh: {
title: '欢迎使用 OxiCloud',
subtitle: '请选择您的语言',
title: '欢迎!',
subtitle: '选择您的语言以继续',
continue: '继续',
autodetected: '我们检测到了您的语言',
moreLanguages: '更多语言...',
@@ -46,8 +46,8 @@ const LANGUAGE_TEXTS = {
searchPlaceholder: '搜索语言...'
},
fa: {
title: 'به OxiCloud خوش آمدید',
subtitle: 'لطفا زبان خود را انتخاب کنید',
title: '!خوش آمدید',
subtitle: 'زبان خود را برای ادامه انتخاب کنید',
continue: 'ادامه',
autodetected: 'زبان شما شناسایی شد',
moreLanguages: 'زبان‌های بیشتر...',
@@ -55,14 +55,59 @@ const LANGUAGE_TEXTS = {
searchPlaceholder: 'جستجوی زبان...'
},
nl: {
title: 'Welkom bij OxiCloud',
subtitle: 'Selecteer uw taal',
title: 'Welkom!',
subtitle: 'Selecteer uw taal om door te gaan',
continue: 'Doorgaan',
autodetected: 'We hebben uw taal gedetecteerd',
moreLanguages: 'Meer talen...',
modalTitle: 'Taal selecteren',
searchPlaceholder: 'Zoek taal...'
},
hi: {
title: 'स्वागत है!',
subtitle: 'जारी रखने के लिए अपनी भाषा चुनें',
continue: 'जारी रखें',
autodetected: 'हमने आपकी भाषा पहचान ली',
moreLanguages: 'और भाषाएँ...',
modalTitle: 'भाषा चुनें',
searchPlaceholder: 'भाषा खोजें...'
},
ar: {
title: '!مرحباً',
subtitle: 'اختر لغتك للمتابعة',
continue: 'متابعة',
autodetected: 'تم اكتشاف لغتك',
moreLanguages: 'المزيد من اللغات...',
modalTitle: 'اختر اللغة',
searchPlaceholder: 'ابحث عن لغة...'
},
ru: {
title: 'Добро пожаловать!',
subtitle: 'Выберите язык для продолжения',
continue: 'Продолжить',
autodetected: 'Мы определили ваш язык',
moreLanguages: 'Больше языков...',
modalTitle: 'Выберите язык',
searchPlaceholder: 'Поиск языка...'
},
ja: {
title: 'ようこそ!',
subtitle: '続行するには言語を選択してください',
continue: '続行',
autodetected: '言語を検出しました',
moreLanguages: 'その他の言語...',
modalTitle: '言語を選択',
searchPlaceholder: '言語を検索...'
},
ko: {
title: '환영합니다!',
subtitle: '계속하려면 언어를 선택하세요',
continue: '계속',
autodetected: '언어가 감지되었습니다',
moreLanguages: '더 많은 언어...',
modalTitle: '언어 선택',
searchPlaceholder: '언어 검색...'
},
};
// Complete language registry — add new languages here, they'll appear automatically
@@ -76,11 +121,11 @@ const ALL_LANGUAGES = [
{ code: 'de', name: 'German', nativeName: 'Deutsch', flag: '🇩🇪', popular: true },
{ code: 'pt', name: 'Portuguese', nativeName: 'Português', flag: '🇧🇷', popular: true },
{ code: 'it', name: 'Italian', nativeName: 'Italiano', flag: '🇮🇹', popular: true },
{ code: 'ru', name: 'Russian', nativeName: 'Русский', flag: '🇷🇺', popular: false },
{ code: 'ja', name: 'Japanese', nativeName: '日本語', flag: '🇯🇵', popular: false },
{ code: 'ko', name: 'Korean', nativeName: '한국어', flag: '🇰🇷', popular: false },
{ code: 'ar', name: 'Arabic', nativeName: 'العربية', flag: '🇸🇦', popular: false },
{ code: 'hi', name: 'Hindi', nativeName: 'हिन्दी', flag: '🇮🇳', popular: false },
{ code: 'ru', name: 'Russian', nativeName: 'Русский', flag: '🇷🇺', popular: true },
{ code: 'ja', name: 'Japanese', nativeName: '日本語', flag: '🇯🇵', popular: true },
{ code: 'ko', name: 'Korean', nativeName: '한국어', flag: '🇰🇷', popular: true },
{ code: 'ar', name: 'Arabic', nativeName: 'العربية', flag: '🇸🇦', popular: true },
{ code: 'hi', name: 'Hindi', nativeName: 'हिन्दी', flag: '🇮🇳', popular: true },
{ code: 'tr', name: 'Turkish', nativeName: 'Türkçe', flag: '🇹🇷', popular: false },
{ code: 'nl', name: 'Dutch', nativeName: 'Nederlands', flag: '🇳🇱', popular: false },
{ code: 'pl', name: 'Polish', nativeName: 'Polski', flag: '🇵🇱', popular: false },