110 lines
2.3 KiB
GDScript
110 lines
2.3 KiB
GDScript
class_name LocaleSystem extends Node
|
|
|
|
enum Language {
|
|
ENGLISH,
|
|
JAPANESE,
|
|
SPANISH,
|
|
};
|
|
|
|
enum Region {
|
|
US,
|
|
EU,
|
|
AU,
|
|
JP
|
|
}
|
|
|
|
const LANGUAGE_MATCH:Dictionary[String, Language] = {
|
|
"EN": Language.ENGLISH,
|
|
"JA": Language.JAPANESE,
|
|
"ES": Language.SPANISH
|
|
}
|
|
|
|
const REGION_MATCH:Dictionary[String, Region] = {
|
|
"US": Region.US,
|
|
"AU": Region.AU,
|
|
"EU": Region.EU,
|
|
"JP": Region.JP
|
|
}
|
|
|
|
const DEFAULT_LANGUAGE:Language = Language.ENGLISH
|
|
const DEFAULT_REGION:Region = Region.US
|
|
|
|
var locale:String = "";
|
|
var language:Language = -1
|
|
var region:Region = -1
|
|
|
|
signal localeChanged
|
|
|
|
func _init() -> void:
|
|
var preferred = OS.get_locale()
|
|
self.setLocaleFromLocaleString(preferred)
|
|
|
|
func setLocaleFromLocaleString(localeString:String) -> void:
|
|
var parts:PackedStringArray = localeString.split("_")
|
|
|
|
var strLang:String
|
|
var strReg:String
|
|
|
|
# Default missing region or language to "??", will default lower
|
|
if parts.size() == 0:
|
|
strLang = "??".to_upper()
|
|
strReg = "??".to_upper()
|
|
elif parts.size() == 1:
|
|
strLang = parts[0].to_upper()
|
|
strReg = "??".to_upper()
|
|
else:
|
|
strLang = parts[0].to_upper()
|
|
strReg = parts[1].to_upper()
|
|
|
|
# Select matching internal language and region
|
|
var lang:Language
|
|
var reg:Region
|
|
|
|
if LANGUAGE_MATCH.has(strLang):
|
|
lang = LANGUAGE_MATCH[strLang]
|
|
else:
|
|
print("Unknown language: " + strLang)
|
|
lang = DEFAULT_LANGUAGE
|
|
reg = DEFAULT_REGION
|
|
|
|
if REGION_MATCH.has(strReg):
|
|
reg = REGION_MATCH[strReg]
|
|
else:
|
|
print("Unknown region: " + strReg)
|
|
reg = DEFAULT_REGION
|
|
|
|
# Set locale.
|
|
self.setLocale(lang, reg)
|
|
|
|
func setLocale(language:Language, region:Region) -> void:
|
|
if self.language == language and self.region == region:
|
|
return
|
|
|
|
var l:String = ""
|
|
|
|
var matchLang = LANGUAGE_MATCH.find_key(language)
|
|
if matchLang:
|
|
l = matchLang.to_lower()
|
|
else:
|
|
print("Invalid language: " + str(language))
|
|
l = LANGUAGE_MATCH.find_key(DEFAULT_LANGUAGE).to_lower()
|
|
|
|
l += "_"
|
|
|
|
var matchRegion = REGION_MATCH.find_key(region)
|
|
if matchRegion:
|
|
l += matchRegion.to_upper()
|
|
else:
|
|
print("Invalid region: " + str(region))
|
|
l += REGION_MATCH.find_key(DEFAULT_REGION).to_upper()
|
|
|
|
self.language = language
|
|
self.region = region
|
|
self.locale = l
|
|
TranslationServer.set_locale(l)
|
|
localeChanged.emit(l)
|
|
print("Locale set to: " + l)
|
|
|
|
func formatInteger(integer:int) -> String:
|
|
return TextServerManager.get_primary_interface().format_number(str(integer))
|