@@ -363,6 +363,28 @@ void EditorSettings::_set_initialized() {
363363 initialized = true ;
364364}
365365
366+ static LocalVector<String> _get_skipped_locales () {
367+ // Skip locales if Text server lack required features.
368+ LocalVector<String> locales_to_skip;
369+ if (!TS->has_feature (TextServer::FEATURE_BIDI_LAYOUT) || !TS->has_feature (TextServer::FEATURE_SHAPING)) {
370+ locales_to_skip.push_back (" ar" ); // Arabic.
371+ locales_to_skip.push_back (" fa" ); // Persian.
372+ locales_to_skip.push_back (" ur" ); // Urdu.
373+ }
374+ if (!TS->has_feature (TextServer::FEATURE_BIDI_LAYOUT)) {
375+ locales_to_skip.push_back (" he" ); // Hebrew.
376+ }
377+ if (!TS->has_feature (TextServer::FEATURE_SHAPING)) {
378+ locales_to_skip.push_back (" bn" ); // Bengali.
379+ locales_to_skip.push_back (" hi" ); // Hindi.
380+ locales_to_skip.push_back (" ml" ); // Malayalam.
381+ locales_to_skip.push_back (" si" ); // Sinhala.
382+ locales_to_skip.push_back (" ta" ); // Tamil.
383+ locales_to_skip.push_back (" te" ); // Telugu.
384+ }
385+ return locales_to_skip;
386+ }
387+
366388void EditorSettings::_load_defaults (Ref<ConfigFile> p_extra_config) {
367389 _THREAD_SAFE_METHOD_
368390// Sets up the editor setting with a default value and hint PropertyInfo.
@@ -381,36 +403,18 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
381403 /* Languages */
382404
383405 {
384- String lang_hint = " ;en/[en] English" ;
385- String host_lang = OS::get_singleton ()->get_locale ();
386-
387- // Skip locales if Text server lack required features.
388- Vector<String> locales_to_skip;
389- if (!TS->has_feature (TextServer::FEATURE_BIDI_LAYOUT) || !TS->has_feature (TextServer::FEATURE_SHAPING)) {
390- locales_to_skip.push_back (" ar" ); // Arabic
391- locales_to_skip.push_back (" fa" ); // Persian
392- locales_to_skip.push_back (" ur" ); // Urdu
393- }
394- if (!TS->has_feature (TextServer::FEATURE_BIDI_LAYOUT)) {
395- locales_to_skip.push_back (" he" ); // Hebrew
396- }
397- if (!TS->has_feature (TextServer::FEATURE_SHAPING)) {
398- locales_to_skip.push_back (" bn" ); // Bengali
399- locales_to_skip.push_back (" hi" ); // Hindi
400- locales_to_skip.push_back (" ml" ); // Malayalam
401- locales_to_skip.push_back (" si" ); // Sinhala
402- locales_to_skip.push_back (" ta" ); // Tamil
403- locales_to_skip.push_back (" te" ); // Telugu
404- }
406+ String lang_hint;
407+ const String host_lang = OS::get_singleton ()->get_locale ();
405408
409+ // Skip locales which we can't render properly.
410+ const LocalVector<String> locales_to_skip = _get_skipped_locales ();
406411 if (!locales_to_skip.is_empty ()) {
407412 WARN_PRINT (" Some locales are not properly supported by selected Text Server and are disabled." );
408413 }
409414
410- String best;
415+ String best = " en " ;
411416 int best_score = 0 ;
412417 for (const String &locale : get_editor_locales ()) {
413- // Skip locales which we can't render properly (see above comment).
414418 // Test against language code without regional variants (e.g. ur_PK).
415419 String lang_code = locale.get_slicec (' _' , 0 );
416420 if (locales_to_skip.has (lang_code)) {
@@ -427,11 +431,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
427431 best_score = score;
428432 }
429433 }
430- if (best_score == 0 ) {
431- best = " en" ;
432- }
434+ lang_hint = vformat (" ;auto/Auto (%s);en/[en] English" , TranslationServer::get_singleton ()->get_locale_name (best)) + lang_hint;
433435
434- EDITOR_SETTING_USAGE (Variant::STRING, PROPERTY_HINT_ENUM, " interface/editor/editor_language" , best , lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING);
436+ EDITOR_SETTING_USAGE (Variant::STRING, PROPERTY_HINT_ENUM, " interface/editor/editor_language" , " auto " , lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING);
435437 }
436438
437439 // Asset library
@@ -1329,7 +1331,7 @@ void EditorSettings::create() {
13291331}
13301332
13311333void EditorSettings::setup_language (bool p_initial_setup) {
1332- String lang = _EDITOR_GET ( " interface/editor/editor_language " );
1334+ String lang = get_language ( );
13331335 if (p_initial_setup) {
13341336 String lang_ov = Main::get_locale_override ();
13351337 if (!lang_ov.is_empty ()) {
@@ -1851,6 +1853,35 @@ float EditorSettings::get_auto_display_scale() {
18511853#endif // defined(MACOS_ENABLED) || defined(ANDROID_ENABLED)
18521854}
18531855
1856+ String EditorSettings::get_language () const {
1857+ const String language = has_setting (" interface/editor/editor_language" ) ? get (" interface/editor/editor_language" ) : " auto" ;
1858+ if (language != " auto" ) {
1859+ return language;
1860+ }
1861+
1862+ // Skip locales which we can't render properly.
1863+ const LocalVector<String> locales_to_skip = _get_skipped_locales ();
1864+ const String host_lang = OS::get_singleton ()->get_locale ();
1865+
1866+ String best = " en" ;
1867+ int best_score = 0 ;
1868+ for (const String &locale : get_editor_locales ()) {
1869+ // Test against language code without regional variants (e.g. ur_PK).
1870+ String lang_code = locale.get_slicec (' _' , 0 );
1871+ if (locales_to_skip.has (lang_code)) {
1872+ continue ;
1873+ }
1874+
1875+ int score = TranslationServer::get_singleton ()->compare_locales (host_lang, locale);
1876+ if (score > 0 && score >= best_score) {
1877+ best = locale;
1878+ best_score = score;
1879+ }
1880+ }
1881+
1882+ return best;
1883+ }
1884+
18541885// Shortcuts
18551886
18561887void EditorSettings::_add_shortcut_default (const String &p_name, const Ref<Shortcut> &p_shortcut) {
0 commit comments