diff --git a/app/plugins/global/languages.php b/app/plugins/global/languages.php index 8f14978..4425454 100644 --- a/app/plugins/global/languages.php +++ b/app/plugins/global/languages.php @@ -77,15 +77,38 @@ function loadTranslations(string $lang): array { $defaultFile = dirname(__DIR__, 2) . "/default/languages/$lang.ini"; $customFile = dirname(__DIR__, 3) . "/custom/languages/$lang.ini"; - $translations = file_exists($defaultFile) ? parse_ini_file($defaultFile) ?: [] : []; + $translations = file_exists($defaultFile) ? flattenIniSections(parse_ini_file($defaultFile, true) ?: []) : []; if (file_exists($customFile)) { - $translations = array_merge($translations, parse_ini_file($customFile) ?: []); + $translations = array_merge($translations, flattenIniSections(parse_ini_file($customFile, true) ?: [])); } return $translations; } +/** + * Flatten INI sections into dot notation keys + * [section] key = value becomes section.key = value + * Top-level keys without sections are preserved as-is + */ +function flattenIniSections(array $ini): array { + $result = []; + + foreach ($ini as $key => $value) { + if (is_array($value)) { + // This is a section - prefix all keys with section name + foreach ($value as $subKey => $subValue) { + $result["$key.$subKey"] = $subValue; + } + } else { + // Top-level key without section + $result[$key] = $value; + } + } + + return $result; +} + function formatDate(string $dateString, string $lang): string { if (!preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $dateString, $m)) { return $dateString; @@ -116,10 +139,13 @@ function filterFilesByLanguage(array $files, string $dir, Context $ctx): array { foreach ($files as $file) { $parts = explode('.', $file['name']); - // Language-specific file (name.lang.ext) - if (count($parts) >= 3 && in_array($parts[count($parts) - 2], $availableLangs)) { - $fileLang = $parts[count($parts) - 2]; - if ($fileLang === $currentLang) { + // Language-specific file (name.lang.ext) - detect by 2-letter code pattern + $potentialLang = $parts[count($parts) - 2] ?? ''; + $isLangFile = count($parts) >= 3 && preg_match('/^[a-z]{2}$/', $potentialLang); + + if ($isLangFile) { + // Only include if it matches current language AND is available + if ($potentialLang === $currentLang && in_array($potentialLang, $availableLangs)) { $filtered[] = $file; $seen[$parts[0]] = true; }