Class Language { static OPTIONS_FILE := App.PATHS.LOC "\locale.options.ini" static SYSTEM_LOCALE := Number("0x" A_Language) static FALLBACK_LOCALE := { ISO: "en-US", HEX: 0x0409 } static supported := Map() static links := Map() static __New() { this.Init() return Event.OnEvent("Language", "Initialized", (*) => this.ValidateActiveLocale()) } static Init() { languages := Util.INIGetSections([this.OPTIONS_FILE]) for i, iso in languages { data := Map( "parent", IniRead(this.OPTIONS_FILE, iso, "parent", ""), "title", IniRead(this.OPTIONS_FILE, iso, "title", ""), "code", IniRead(this.OPTIONS_FILE, iso, "code", ""), "locale", IniRead(this.OPTIONS_FILE, iso, "is_locale", False), "generatedLocale", IniRead(this.OPTIONS_FILE, iso, "is_generated_locale", False), "bindings", IniRead(this.OPTIONS_FILE, iso, "is_bindings", False), "altInput", IniRead(this.OPTIONS_FILE, iso, "alt_input", ""), "index", i, ) data["code"] := data["code"] != "" ? Number(data["code"]) : "" data["locale"] := data["locale"] = "True" ? True : False data["bindings"] := data["bindings"] = "True" ? True : False this.supported.Set(iso, data) if data["code"] != "" this.links.Set(data["code"], iso) } return } static ValidateActiveLocale() { local currentLanguage := Cfg.Get("User_Language") if currentLanguage != "" && !this.Validate(currentLanguage, "locale") Cfg.Set("", "User_Language") return } static GetSupported(by := "locale", get := "key", useIndex := False) { output := useIndex ? Map() : [] for key, value in this.supported if value.Has(by) && value[by] && !(value["code"] is String) if useIndex output.Set(value["index"], get = "key" ? key : value["title"]) else output.Push(get = "key" ? key : value["title"]) return useIndex ? output.Values() : output } static Validate(input, extraRule?) { if input is Number && this.links.Has(input) input := this.links.Get(input) if input is String && input != "" { extraRuleValidate := (!IsSet(extraRule) || IsSet(extraRule) && (this.supported[input].Has(extraRule) ? this.supported[input][extraRule] : False)) if this.supported.Has(input) && extraRuleValidate return True } return False } static Set(value) { if this.Validate(value, "locale") { Cfg.Set(value, "User_Language") } } static Get(language := "", getTitle := False, endLen := 0) { local userLanguage := language != "" ? language : Cfg.Get("User_Language") userLanguage := !IsSpace(userLanguage) ? userLanguage : this.GetSys() if this.Validate(userLanguage) { return getTitle ? this.supported.Get(userLanguage)["title"] : endLen > 0 ? SubStr(userLanguage, 1, endLen) : userLanguage } else { return getTitle ? this.supported.Get(this.FALLBACK_LOCALE.ISO)["title"] : endLen > 0 ? SubStr(this.FALLBACK_LOCALE.ISO, 1, endLen) : this.FALLBACK_LOCALE.ISO } } static GetLanguageBlock(input, &output?) { output := False if input is Number && this.links.Has(input) input := this.links.Get(input) if input is String && input != "" if this.supported.Has(input) output := [input, this.supported.Get(input)] return output } static GetSys(endLen := 0) { languageValue := this.links.Get(this.SYSTEM_LOCALE, this.FALLBACK_LOCALE.ISO) ; || RegRead("HKEY_CURRENT_USER\Control Panel\International", "LocaleName") return endLen > 0 ? SubStr(languageValue, 1, endLen) : languageValue } }