Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/raclettes/py18n
I18n for discord.py
https://github.com/raclettes/py18n
discord discord-py fallback i18n i18n-python internationalization language py18n python python-i18n python3
Last synced: 17 days ago
JSON representation
I18n for discord.py
- Host: GitHub
- URL: https://github.com/raclettes/py18n
- Owner: raclettes
- License: gpl-3.0
- Created: 2021-03-31T20:45:32.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2023-07-20T15:14:09.000Z (over 1 year ago)
- Last Synced: 2024-10-10T15:41:15.098Z (about 1 month ago)
- Topics: discord, discord-py, fallback, i18n, i18n-python, internationalization, language, py18n, python, python-i18n, python3
- Language: Python
- Homepage:
- Size: 72.3 KB
- Stars: 0
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Py18n
This is a open sourced version of the internal internationalization engine used for [Kolumbao](https://kolumbao.com/).[![](https://img.shields.io/pypi/v/py18n.svg)](https://pypi.org/project/Py18n/)
[![](https://img.shields.io/pypi/implementation/py18n.svg)](https://pypi.org/project/Py18n/)## Installation
To install the package to your Python installation, clone the repository locally then run the following command in the repository's directory
```bash
py setup.py install
```You can now use the library!
## Usage
### Setting up languages
A language can be initialized like this:
```python
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:
```python
import json
french = Language("French", "fr", json.load(open("fr.json")))
```### Base I18n class
When setting up the i18n class, we need to setup our languages and declare a fallback language:
```python
i18n = I18n([
Language("English", "en", {
"hello": "Hello",
"goodbye": "Goodbye",
"english": "English"
}),
Language("French", "fr", {
"hello": "Bonjour",
"goodbye": "Au revoir",
"francais": "Français"
}),
], fallback="en")
````i18n` will now fallback to english if it can't find a translation for other languages.
```python
>>> 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 (most recent call last):
...
py18n.i18n.InvalidTranslationKeyError: 'Translation foo not found for en!'
```### Discord
For Discord.py, we can use the extension `py18n.extension.I18nExtension`. Setup your bot as you would usually, and then run `i18n.init_bot` as follows.```python
from discord.ext import commands
from py18n.extension import I18nExtension# Make our bot
bot = commands.Bot("prefix")# Setup similarly to the usual class
i18n = 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.
def get_locale(ctx: commands.Context):
preferences = {
301736945610915852: "en"
}
return preferences[ctx.author.id]# Set it up!
i18n.init_bot(bot, get_locale)@bot.command(pass_context=True)
async def hello(ctx):
await ctx.send(i18n.contextual_get_text("hello"))
```This is all good, but because of our line `i18n.init_bot(bot, get_locale)`, we can shorten things.
This function adds a pre-invoke hook that sets the language based on the result of `get_locale`. The `contextually_get_text` function is also exposed as `py18n.extension._`, and it is a `classmethod`.
We can change it by adding the following import and change our function:
```python
from py18n.extension import I18nExtension, _# ...
@bot.command(pass_context=True)
async def hello(ctx):
await ctx.send(_("hello"))
```There, much tidier!
- The `_` function considers the current context and uses the correct locale by default.
- When initializing any `I18nExtension`, as we did earlier, it becomes the default i18n instance. The default instance is used by `_` and `contextually_get_text`.## Issues
If you encounter any problems, check out [current issues](https://github.com/starsflower/py18n/issues) or [make a new issue](https://github.com/starsflower/py18n/issues/new).## Notes
- Feel free to contribute! This is released under the GLP-3 license. (If you suggest another license, make an issue suggesting).