# "bn_BD" => load_locale("bn_BD"), # Bengali (Bangladesh) [Incomplete] # "eu" => load_locale("eu"), # Basque [Incomplete] # "si" => load_locale("si"), # Sinhala [Incomplete] # "sk" => load_locale("sk"), # Slovak [Incomplete] # "sr" => load_locale("sr"), # Serbian [Incomplete] # "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic) [Incomplete] LOCALES = { "ar" => load_locale("ar"), # Arabic "cs" => load_locale("cs"), # Czech "da" => load_locale("da"), # Danish "de" => load_locale("de"), # German "el" => load_locale("el"), # Greek "en-US" => load_locale("en-US"), # English (US) "eo" => load_locale("eo"), # Esperanto "es" => load_locale("es"), # Spanish "fa" => load_locale("fa"), # Persian "fi" => load_locale("fi"), # Finnish "fr" => load_locale("fr"), # French "he" => load_locale("he"), # Hebrew "hr" => load_locale("hr"), # Croatian "hu-HU" => load_locale("hu-HU"), # Hungarian "id" => load_locale("id"), # Indonesian "is" => load_locale("is"), # Icelandic "it" => load_locale("it"), # Italian "ja" => load_locale("ja"), # Japanese "ko" => load_locale("ko"), # Korean "lt" => load_locale("lt"), # Lithuanian "nb-NO" => load_locale("nb-NO"), # Norwegian Bokmål "nl" => load_locale("nl"), # Dutch "pl" => load_locale("pl"), # Polish "pt" => load_locale("pt"), # Portuguese "pt-BR" => load_locale("pt-BR"), # Portuguese (Brazil) "pt-PT" => load_locale("pt-PT"), # Portuguese (Portugal) "ro" => load_locale("ro"), # Romanian "ru" => load_locale("ru"), # Russian "sv-SE" => load_locale("sv-SE"), # Swedish "tr" => load_locale("tr"), # Turkish "uk" => load_locale("uk"), # Ukrainian "vi" => load_locale("vi"), # Vietnamese "zh-CN" => load_locale("zh-CN"), # Chinese (Simplified) "zh-TW" => load_locale("zh-TW"), # Chinese (Traditional) } def load_locale(name) return JSON.parse(File.read("locales/#{name}.json")).as_h end def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text : String | Nil = nil) # if locale && !locale[translation]? # puts "Could not find translation for #{translation.dump}" # end if locale && locale[translation]? case locale[translation] when .as_h? match_length = 0 locale[translation].as_h.each do |key, value| if md = text.try &.match(/#{key}/) if md[0].size >= match_length translation = value.as_s match_length = md[0].size end end end when .as_s? if !locale[translation].as_s.empty? translation = locale[translation].as_s end else raise "Invalid translation #{translation}" end end if text translation = translation.gsub("`x`", text) end return translation end def translate_bool(locale : Hash(String, JSON::Any) | Nil, translation : Bool) case translation when true return translate(locale, "Yes") when false return translate(locale, "No") end end