Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions public/main/inc/lib/api.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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<string,string> 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.
*
Expand Down
23 changes: 11 additions & 12 deletions public/main/inc/lib/formvalidator/Element/SelectLanguage.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
Loading