Package: pycord18n
Pycord18nPorted byYoungTrepfor the newDiscord.pyfork -PycordThis is a open sourced version of the internal internationalization engine used forKolumbao.InstallationTo install the Pycord18n, you can just run the following command:# Windowspy-mpipinstallpycord18n# Linux/MacOSpython3-mpipinstallpycord18nYou can now use the library!UsageSetting up languagesA language can be initialized like this:french=Language("French","fr",{"hello":"Bonjour","goodbye":"Au revoir","francais":"Français"})But you may want to store languages seperately and create them as follows:importjsonfrench=Language("French","fr",json.load(open("fr.json")))Base I18n classWhen setting up the i18n class, we need to setup our languages and declare a fallback language:i18n=I18n([Language("English","en",{"hello":"Hello","goodbye":"Goodbye","english":"English"}),Language("French","fr",{"hello":"Bonjour","goodbye":"Au revoir","francais":"Français"}),],fallback="en")i18nwill now fallback to english if it can't find a translation for other languages.>>>i18n.get_text("hello","en")'Hello'>>>i18n.get_text("hello","fr")'Bonjour'>>># "english" is not a listed translation in the French locale, so we revert to english>>>i18n.get_text("english","fr")'English'>>># However we can make it not fallback, but this will throw an error if the translation isn't found>>>i18n.get_text("english","fr",should_fallback=False)Traceback(mostrecentcalllast):...py18n.i18n.InvalidTranslationKeyError:'Translation foo not found for en!'DiscordFor Pycord, we can use the extensionpy18n.extension.I18nExtension. Setup your bot as you would usually, and then runi18n.init_botas follows.fromdiscord.extimportcommandsfrompy18n.extensionimportI18nExtension# Make our botbot=commands.Bot("prefix")# Setup similarly to the usual classi18n=I18nExtension([Language("English","en",{"hello":"Hello","goodbye":"Goodbye","english":"English"}),Language("French","fr",{"hello":"Bonjour","goodbye":"Au revoir","francais":"Français"}),],fallback="en")# Setup the bot by giving it a function to get the user's locale.# This could potentially refer to a database or other file.# Anything you want!# Otherwise, it will always be the fallback locale.defget_locale(ctx:commands.Context):preferences={301736945610915852:"en"}returnpreferences[ctx.author.id]# Set it up!i18n.init_bot(bot,get_locale)@bot.command(pass_context=True)asyncdefhello(ctx):awaitctx.send(i18n.contextual_get_text("hello"))This is all good, but because of our linei18n.init_bot(bot, get_locale), we can shorten things.This function adds a pre-invoke hook that sets the language based on the result ofget_locale. Thecontextually_get_textfunction is also exposed aspy18n.extension._, and it is aclassmethod.We can change it by adding the following import and change our function:frompy18n.extensionimportI18nExtension,_# ...@bot.command(pass_context=True)asyncdefhello(ctx):awaitctx.send(_("hello"))There, much tidier!The_function considers the current context and uses the correct locale by default.When initializing anyI18nExtension, as we did earlier, it becomes the default i18n instance. The default instance is used by_andcontextually_get_text.IssuesIf you encounter any problems, check outcurrent issuesormake a new issue.NotesFeel free to contribute! This is released under the GLP-3 license. (If you suggest another license, make an issue suggesting).