This library provides i18n functionality for Python 3 out of the box. The usage is mostly based on Rails i18n library.
Just run
pip install python-i18n
If you want to use YAML to store your translations, use
pip install python-i18n[YAML]
The simplest, though not very useful usage would be
import i18n
i18n.add_translation('foo', 'bar')
i18n.t('foo') # bar
YAML and JSON formats are supported to store translations. With the default configuration, if you have the following foo.en.yml
file
en:
hi: Hello world !
in /path/to/translations
folder, you simply need to add the folder to the translations path.
import i18n
i18n.load_path.append('/path/to/translations')
i18n.t('foo.hi') # Hello world !
In the above example, the translation key is foo.hi
and not just hi
. This is because the translation filename format is by default {namespace}.{locale}.{format}
, so the {namespace} part of the file is used as translation.
If your files are in subfolders, the foldernames are also used as namespaces, so for example if your translation root path is /path/to/translations
and you have the file /path/to/translations/my/app/name/foo.en.yml
, the translation namespace for the file will be my.app.name
and the file keys will therefore be accessible from my.app.name.foo.my_key
.
You can of course use placeholders in your translations. With the default configuration, the placeholders are used by inserting %{placeholder_name}
in the ntranslation string. Here is a sample usage.
i18n.add_translation('hi', 'Hello %{name} !')
i18n.t('hi', name='Bob') # Hello Bob !
Pluralization is based on Rail i18n module. By passing a count
variable to your translation, it will be pluralized. The translation value should be a dictionnary with at least the keys one
and many
. You can add a zero
or few
key when needed, if it is not present many
will be used instead. Here is a sample usage.
i18n.add_translation('mail_number', {
'zero': 'You do not have any mail.',
'one': 'You have a new mail.',
'few': 'You only have %{count} mails.'
'many': 'You have %{count} new mails.'
})
i18n.t('mail_number', count=0) # You do not have any mail.
i18n.t('mail_number', count=1) # You have a new mail.
i18n.t('mail_number', count=3) # You only have 3 new mails.
i18n.t('mail_number', count=12) # You have 12 new mails.
You can set a fallback which will be used when the key is not found in the default locale.
i18n.set('locale', 'jp')
i18n.set('fallback', 'en')
i18n.add_translation('foo', 'bar', locale='en')
i18n.t('foo') # bar