I18n string cleanup and refactoring

This commit is contained in:
Griatch 2021-05-26 21:55:05 +02:00
parent 59dd0b007a
commit 7ff8cbb341
62 changed files with 890 additions and 738 deletions

View file

@ -1,88 +1,99 @@
# Internationalization
*Internationalization* (often abbreviated *i18n* since there are 18 characters between the first "i"
and the last "n" in that word) allows Evennia's core server to return texts in other languages than
English - without anyone having to edit the source code. Take a look at the `locale` directory of
the Evennia installation, there you will find which languages are currently supported.
*Internationalization* (often abbreviated *i18n* since there are 18 characters
between the first "i" and the last "n" in that word) allows Evennia's core
server to return texts in other languages than English - without anyone having
to edit the source code. Take a look at the `locale` directory of the Evennia
installation, there you will find which languages are currently supported.
## Changing server language
Change language by adding the following to your `mygame/server/conf/settings.py` file:
Change language by adding the following to your `mygame/server/conf/settings.py`
file:
```python
USE_I18N = True
LANGUAGE_CODE = 'en'
```
Here `'en'` should be changed to the abbreviation for one of the supported languages found in
`locale/`. Restart the server to activate i18n. The two-character international language codes are
found [here](http://www.science.co.il/Language/Codes.asp).
Here `'en'` should be changed to the abbreviation for one of the supported
languages found in `locale/`. Restart the server to activate i18n. The
two-character international language codes are found
[here](http://www.science.co.il/Language/Codes.asp).
> Windows Note: If you get errors concerning `gettext` or `xgettext` on Windows, see the [Django
documentation](https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#gettext-on-windows). A
self-installing and up-to-date version of gettext for Windows (32/64-bit) is available on
[Github](https://github.com/mlocati/gettext-iconv-windows).
> Windows Note: If you get errors concerning `gettext` or `xgettext` on Windows,
> see the
> [Django documentation](https://docs.djangoproject.com/en/3.2/topics/i18n/translation/#gettext-on-windows).
> A self-installing and up-to-date version of gettext for Windows (32/64-bit) is
> available on [Github](https://github.com/mlocati/gettext-iconv-windows).
## Translating Evennia
> **Important Note:** Evennia offers translations of hard-coded strings in the server, things like
"Connection closed" or "Server restarted", strings that end users will see and which game devs are
not supposed to change on their own. Text you see in the log file or on the command line (like error
messages) are generally *not* translated (this is a part of Python).
```important::
> In addition, text in default Commands and in default Typeclasses will *not* be translated by
switching *i18n* language. To translate Commands and Typeclass hooks you must overload them in your
game directory and translate their returns to the language you want. This is because from Evennia's
perspective, adding *i18n* code to commands tend to add complexity to code that is *meant* to be
changed anyway. One of the goals of Evennia is to keep the user-changeable code as clean and easy-
to-read as possible.
Evennia offers translations of hard-coded strings in the server, things like
"Connection closed" or "Server restarted", strings that end users will see and
which game devs are not supposed to change on their own. Text you see in the log
file or on the command line (like error messages) are generally *not* translated
(this is a part of Python).
If you cannot find your language in `evennia/locale/` it's because noone has translated it yet.
Alternatively you might have the language but find the translation bad ... You are welcome to help
improve the situation!
In addition, text in default Commands and in default Typeclasses will *not* be
translated by switching *i18n* language. To translate Commands and Typeclass
hooks you must overload them in your game directory and translate their returns
to the language you want. This is because from Evennia's perspective, adding
*i18n* code to commands tend to add complexity to code that is *meant* to be
changed anyway. One of the goals of Evennia is to keep the user-changeable code
as clean and easy- to-read as possible.
```
To start a new translation you need to first have cloned the Evennia repositry with GIT and
activated a python virtualenv as described on the [Setup Quickstart](../Setup/Setup-Quickstart) page. You now
need to `cd` to the `evennia/` directory. This is *not* your created game folder but the main
Evennia library folder. If you see a folder `locale/` then you are in the right place. From here you
run:
If you cannot find your language in `evennia/locale/` it's because noone has
translated it yet. Alternatively you might have the language but find the
translation bad ... You are welcome to help improve the situation!
evennia makemessages <language-code>
To start a new translation you need to first have cloned the Evennia repositry
with GIT and activated a python virtualenv as described on the [Setup
Quickstart](../Setup/Setup-Quickstart) page.
Go to your game dir and make sure your `virtualenv` is active so the `evennia`
command is available. Then run
evennia makemessages --locale <language-code>
where `<language-code>` is the [two-letter locale code](http://www.science.co.il/Language/Codes.asp)
for the language you want, like 'sv' for Swedish or 'es' for Spanish. After a moment it will tell
you the language has been processed. For instance:
for the language you want to translate, like 'sv' for Swedish or 'es' for
Spanish. After a moment it will tell you the language has been processed. For
instance:
evennia makemessages sv
evennia makemessages --locale sv
If you started a new language a new folder for that language will have emerged in the `locale/`
folder. Otherwise the system will just have updated the existing translation with eventual new
strings found in the server. Running this command will not overwrite any existing strings so you can
run it as much as you want.
If you started a new language, a new folder for that language will have emerged
in the `locale/` folder. Otherwise the system will just have updated the
existing translation with eventual new strings found in the server. Running this
command will not overwrite any existing strings so you can run it as much as you
want.
> Note: in Django, the `makemessages` command prefixes the locale name by the `-l` option (`...
makemessages -l sv` for instance). This syntax is not allowed in Evennia, due to the fact that `-l`
is the option to tail log files. Hence, `makemessages` doesn't use the `-l` flag.
Next head to `locale/<language-code>/LC_MESSAGES` and edit the `**.po` file you
find there. You can edit this with a normal text editor but it is easiest if
you use a special po-file editor from the web (search the web for "po editor"
for many free alternatives).
Next head to `locale/<language-code>/LC_MESSAGES` and edit the `**.po` file you find there. You can
edit this with a normal text editor but it is easiest if you use a special po-file editor from the
web (search the web for "po editor" for many free alternatives).
The concept of translating is simple, it's just a matter of taking the english strings you find in
the `**.po` file and add your language's translation best you can. The `**.po` format (and many
supporting editors) allow you to mark translations as "fuzzy". This tells the system (and future
translators) that you are unsure about the translation, or that you couldn't find a translation that
exactly matched the intention of the original text. Other translators will see this and might be
able to improve it later.
Finally, you need to compile your translation into a more efficient form. Do so from the `evennia`
folder
again:
The concept of translating is simple, it's just a matter of taking the english
strings you find in the `**.po` file and add your language's translation best
you can. The `**.po` format (and many supporting editors) allow you to mark
translations as "fuzzy". This tells the system (and future translators) that you
are unsure about the translation, or that you couldn't find a translation that
exactly matched the intention of the original text. Other translators will see
this and might be able to improve it later. Finally, you need to compile your
translation into a more efficient form. Do so from the `evennia` folder again:
evennia compilemessages
This will go through all languages and create/update compiled files (`**.mo`) for them. This needs
to be done whenever a `**.po` file is updated.
This will go through all languages and create/update compiled files (`**.mo`)
for them. This needs to be done whenever a `**.po` file is updated.
When you are done, send the `**.po` and `*.mo` file to the Evennia developer list (or push it into
your own repository clone) so we can integrate your translation into Evennia!
When you are done, make sure that everyone can benefit from your translation!
Make a PR against Evennia with the updated `**.po` and `*.mo` files. Less
ideally (if git is not your thing) you can also attach them to a new post in our
forums.