diff --git a/public/main/inc/lib/api.lib.php b/public/main/inc/lib/api.lib.php index 3186448d22d..511c3407a47 100644 --- a/public/main/inc/lib/api.lib.php +++ b/public/main/inc/lib/api.lib.php @@ -3681,6 +3681,71 @@ function api_get_languages() return $languages; } +/** + * Returns the platform default language isocode. + * Tries 'language.platform_language' (isocode). If empty, falls back to 'platformLanguage' (english_name) and resolves to isocode. + */ +function api_get_platform_default_isocode(): ?string +{ + // Preferred: isocode stored under 'language.platform_language' + $iso = trim((string) api_get_setting('language.platform_language')); + if ($iso !== '') { + return $iso; + } + + // Fallback: older config storing english_name + $englishName = trim((string) api_get_setting('platformLanguage')); + if ($englishName === '') { + return null; + } + + $langTable = Database::get_main_table(TABLE_MAIN_LANGUAGE); + $safe = Database::escape_string($englishName); + $sql = "SELECT isocode FROM $langTable WHERE english_name = '$safe' LIMIT 1"; + $res = Database::query($sql); + if ($row = Database::fetch_assoc($res)) { + return $row['isocode']; + } + + return null; +} + +/** + * Returns available languages (available=1) plus the platform default language even if not available. + * Ensures the platform default never disappears from dropdowns. + * + * @return array isocode => original_name + */ +function api_get_languages_with_platform_default(): array +{ + $langTable = Database::get_main_table(TABLE_MAIN_LANGUAGE); + + // Standard available languages + $sql = "SELECT isocode, original_name FROM $langTable WHERE available = '1' ORDER BY original_name ASC"; + $res = Database::query($sql); + + $languages = []; + while ($row = Database::fetch_assoc($res)) { + $languages[$row['isocode']] = $row['original_name']; + } + + // Ensure platform default is present even if not available + $defaultIso = api_get_platform_default_isocode(); + if ($defaultIso && !isset($languages[$defaultIso])) { + $safe = Database::escape_string($defaultIso); + $sqlDef = "SELECT isocode, original_name FROM $langTable WHERE isocode = '$safe' LIMIT 1"; + $resDef = Database::query($sqlDef); + if ($row = Database::fetch_assoc($resDef)) { + $languages[$row['isocode']] = $row['original_name']; + } + } + + // Optional: stable, human-friendly order + asort($languages, SORT_NATURAL | SORT_FLAG_CASE); + + return $languages; +} + /** * Returns the id (the database id) of a language. * diff --git a/public/main/inc/lib/formvalidator/Element/SelectLanguage.php b/public/main/inc/lib/formvalidator/Element/SelectLanguage.php index c81e61538fe..45e881a10f1 100644 --- a/public/main/inc/lib/formvalidator/Element/SelectLanguage.php +++ b/public/main/inc/lib/formvalidator/Element/SelectLanguage.php @@ -16,20 +16,19 @@ public function __construct( ) { parent::__construct($elementName, $elementLabel, $options, $attributes); - $default = $attributes['set_custom_default'] ?? false; - if (!empty($default)) { - $defaultValue = $default; - } else { - $defaultValue = api_get_setting('platformLanguage'); - } - // Get all languages - $languages = api_get_languages(); + // Prefer a custom default if provided; otherwise use platform default isocode + $customDefault = $attributes['set_custom_default'] ?? false; + $defaultValue = !empty($customDefault) ? $customDefault : api_get_platform_default_isocode(); + + // Fetch languages available + platform default (even if not available) + $languages = api_get_languages_with_platform_default(); + foreach ($languages as $iso => $name) { - $attributes = []; - if ($iso === $defaultValue) { - $attributes = ['selected' => 'selected']; + $optAttrs = []; + if ($defaultValue && $iso === $defaultValue) { + $optAttrs = ['selected' => 'selected']; } - $this->addOption($name, $iso, $attributes); + $this->addOption($name, $iso, $optAttrs); } } }