diff --git a/src/babel/cog.py b/src/babel/cog.py index bd535a3e..8f18ddf9 100644 --- a/src/babel/cog.py +++ b/src/babel/cog.py @@ -230,14 +230,15 @@ class BabelCog(LionCog): supported = self.bot.translator.supported_locales formatted = [] for locale in supported: - name = locale_names.get(locale.replace('_', '-'), None) - if name: - localestr = f"{locale} ({t(name)})" + names = locale_names.get(locale.replace('_', '-'), None) + if names: + local_name, native_name = names + localestr = f"{native_name} ({t(local_name)})" else: localestr = locale formatted.append((locale, localestr)) - matching = {item for item in formatted if partial in item[1]} + matching = {item for item in formatted if partial in item[1] or partial in item[0]} if matching: choices = [ appcmds.Choice(name=localestr, value=locale) diff --git a/src/babel/enums.py b/src/babel/enums.py index 6ab77a74..9e73da33 100644 --- a/src/babel/enums.py +++ b/src/babel/enums.py @@ -38,37 +38,44 @@ class LocaleMap(Enum): hebrew = 'he-IL' +# Original Discord names locale_names = { - 'en-US': _p('localenames|locale:en-US', "American English"), - 'en-GB': _p('localenames|locale:en-GB', "British English"), - 'bg': _p('localenames|locale:bg', "Bulgarian"), - 'zh-CN': _p('localenames|locale:zh-CN', "Chinese"), - 'zh-TW': _p('localenames|locale:zh-TW', "Taiwan Chinese"), - 'hr': _p('localenames|locale:hr', "Croatian"), - 'cs': _p('localenames|locale:cs', "Czech"), - 'da': _p('localenames|locale:da', "Danish"), - 'nl': _p('localenames|locale:nl', "Dutch"), - 'fi': _p('localenames|locale:fi', "Finnish"), - 'fr': _p('localenames|locale:fr', "French"), - 'de': _p('localenames|locale:de', "German"), - 'el': _p('localenames|locale:el', "Greek"), - 'hi': _p('localenames|locale:hi', "Hindi"), - 'hu': _p('localenames|locale:hu', "Hungarian"), - 'it': _p('localenames|locale:it', "Italian"), - 'ja': _p('localenames|locale:ja', "Japanese"), - 'ko': _p('localenames|locale:ko', "Korean"), - 'lt': _p('localenames|locale:lt', "Lithuanian"), - 'no': _p('localenames|locale:no', "Norwegian"), - 'pl': _p('localenames|locale:pl', "Polish"), - 'pt-BR': _p('localenames|locale:pt-BR', "Brazil Portuguese"), - 'ro': _p('localenames|locale:ro', "Romanian"), - 'ru': _p('localenames|locale:ru', "Russian"), - 'es-ES': _p('localenames|locale:es-ES', "Spain Spanish"), - 'sv-SE': _p('localenames|locale:sv-SE', "Swedish"), - 'th': _p('localenames|locale:th', "Thai"), - 'tr': _p('localenames|locale:tr', "Turkish"), - 'uk': _p('localenames|locale:uk', "Ukrainian"), - 'vi': _p('localenames|locale:vi', "Vietnamese"), - 'he': _p('localenames|locale:he', "Hebrew"), - 'he-IL': _p('localenames|locale:he_IL', "Hebrew (Israel)"), + 'id': (_p('localenames|locale:id', "Indonesian"), "Bahasa Indonesia"), + 'da': (_p('localenames|locale:da', "Danish"), "Dansk"), + 'de': (_p('localenames|locale:de', "German"), "Deutsch"), + 'en-GB': (_p('localenames|locale:en-GB', "English, UK"), "English, UK"), + 'en-US': (_p('localenames|locale:en-US', "English, US"), "English, US"), + 'es-ES': (_p('localenames|locale:es-ES', "Spanish"), "Español"), + 'fr': (_p('localenames|locale:fr', "French"), "Français"), + 'hr': (_p('localenames|locale:hr', "Croatian"), "Hrvatski"), + 'it': (_p('localenames|locale:it', "Italian"), "Italiano"), + 'lt': (_p('localenames|locale:lt', "Lithuanian"), "Lietuviškai"), + 'hu': (_p('localenames|locale:hu', "Hungarian"), "Magyar"), + 'nl': (_p('localenames|locale:nl', "Dutch"), "Nederlands"), + 'no': (_p('localenames|locale:no', "Norwegian"), "Norsk"), + 'pl': (_p('localenames|locale:pl', "Polish"), "Polski"), + 'pt-BR': (_p('localenames|locale:pt-BR', "Portuguese, Brazilian"), "Português do Brasil"), + 'ro': (_p('localenames|locale:ro', "Romanian, Romania"), "Română"), + 'fi': (_p('localenames|locale:fi', "Finnish"), "Suomi"), + 'sv-SE': (_p('localenames|locale:sv-SE', "Swedish"), "Svenska"), + 'vi': (_p('localenames|locale:vi', "Vietnamese"), "Tiếng Việt"), + 'tr': (_p('localenames|locale:tr', "Turkish"), "Türkçe"), + 'cs': (_p('localenames|locale:cs', "Czech"), "Čeština"), + 'el': (_p('localenames|locale:el', "Greek"), "Ελληνικά"), + 'bg': (_p('localenames|locale:bg', "Bulgarian"), "български"), + 'ru': (_p('localenames|locale:ru', "Russian"), "Pусский"), + 'uk': (_p('localenames|locale:uk', "Ukrainian"), "Українська"), + 'hi': (_p('localenames|locale:hi', "Hindi"), "हिन्दी"), + 'th': (_p('localenames|locale:th', "Thai"), "ไทย"), + 'zh-CN': (_p('localenames|locale:zh-CN', "Chinese, China"), "中文"), + 'ja': (_p('localenames|locale:ja', "Japanese"), "日本語"), + 'zh-TW': (_p('localenames|locale:zh-TW', "Chinese, Taiwan"), "繁體中文"), + 'ko': (_p('localenames|locale:ko', "Korean"), "한국어"), +} + +# More names for languages not supported by Discord +locale_names |= { + 'he': (_p('localenames|locale:he', "Hebrew"), "Hebrew"), + 'he-IL': (_p('localenames|locale:he-IL', "Hebrew"), "Hebrew"), + 'ceaser': (_p('localenames|locale:test', "Test Language"), "dfbtfs"), } diff --git a/src/babel/settings.py b/src/babel/settings.py index bacfda87..47da6afe 100644 --- a/src/babel/settings.py +++ b/src/babel/settings.py @@ -43,9 +43,9 @@ class LocaleSetting(StringSetting): if data is None: formatted = t(_p('settype:locale|formatted:unset', "Unset")) else: - name = locale_names.get(data, None) - if name: - formatted = f"`{data} ({t(name)})`" + if data in locale_names: + local_name, native_name = locale_names[data] + formatted = f"`{native_name} ({t(local_name)})`" else: formatted = f"`{data}`" return formatted diff --git a/src/babel/translator.py b/src/babel/translator.py index 0d4141b3..6e5fe904 100644 --- a/src/babel/translator.py +++ b/src/babel/translator.py @@ -47,33 +47,43 @@ class LeoBabel(Translator): Initialise the gettext translators for the supported_locales. """ self.read_supported() + missing = [] + loaded = [] for locale in self.supported_locales: for domain in self.supported_domains: if locale == SOURCE_LOCALE: continue try: translator = gettext.translation(domain, "locales/", languages=[locale]) + loaded.append(f"Loaded translator for ") except OSError: # Presume translation does not exist - logger.warning(f"Could not load translator for supported ") - pass - else: - logger.debug(f"Loaded translator for ") - self.translators[locale][domain] = translator + missing.append(f"Could not load translator for supported ") + translator = null + + self.translators[locale][domain] = translator + if missing: + logger.warning('\n'.join(("Missing Translators:", *missing))) + if loaded: + logger.debug('\n'.join(("Loaded Translators:", *loaded))) async def unload(self): self.translators.clear() def get_translator(self, locale, domain): if locale == SOURCE_LOCALE: - return null - - translator = self.translators[locale].get(domain, None) - if translator is None: - logger.warning( - f"Translator missing for requested and . Setting NullTranslator." - ) - self.translators[locale][domain] = null + translator = null + elif locale in self.supported_locales and domain in self.supported_domains: + translator = self.translators[locale].get(domain, None) + if translator is None: + # This should never really happen because we already loaded the supported translators + logger.warning( + f"Translator missing for supported " + "and . Setting NullTranslator." + ) + translator = self.translators[locale][domain] = null + else: + # Unsupported translator = null return translator