@@ -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,37 @@ 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+ 	if  (auto_language.is_empty ()) {
1863+ 		//  Skip locales which we can't render properly.
1864+ 		const  LocalVector<String> locales_to_skip = _get_skipped_locales ();
1865+ 		const  String host_lang = OS::get_singleton ()->get_locale ();
1866+ 
1867+ 		String best = " en"  ;
1868+ 		int  best_score = 0 ;
1869+ 		for  (const  String &locale : get_editor_locales ()) {
1870+ 			//  Test against language code without regional variants (e.g. ur_PK).
1871+ 			String lang_code = locale.get_slicec (' _'  , 0 );
1872+ 			if  (locales_to_skip.has (lang_code)) {
1873+ 				continue ;
1874+ 			}
1875+ 
1876+ 			int  score = TranslationServer::get_singleton ()->compare_locales (host_lang, locale);
1877+ 			if  (score > 0  && score >= best_score) {
1878+ 				best = locale;
1879+ 				best_score = score;
1880+ 			}
1881+ 		}
1882+ 		auto_language = best;
1883+ 	}
1884+ 	return  auto_language;
1885+ }
1886+ 
18541887//  Shortcuts
18551888
18561889void  EditorSettings::_add_shortcut_default (const  String &p_name, const  Ref<Shortcut> &p_shortcut) {
0 commit comments