Internationalization, or short “I18n”, stands for the possibility of an application, to present it's user interface in different languages. That would improve the user experience, especially if a user is not that fluent with the default language of an application.
Kaspa is using Transifex to coordinate translations of different applications.
Currently we have limit of 2 translators per language. At least one translator should be native.
To contribute with your mother tongue, head over to Transifex and create an account.
Fill this form to list your application and notify in Discord #translation channel for review. (managed by @azazino in Discord).
If we have open positions - we will approve your application and notify you in #translation channel.
After that - join the Kaspa organisation.
Fun fact: The whole “Internationalization” work is often shortened with “I18n” as the original term has 18 characters between the first and the last letter. ;-)
Currently the following applications respectively their translations are handled on Transifex. The values states the percentage of translated / reviewed strings. So we need at least two translators per language, so that the translation could be reviewed.
No | Language |
KDX |
Kaspium |
Kaspa NG |
Translators (Discord/Transifex) |
---|---|---|---|---|---|
1 | Afrikaans (af) |
|
0% / 0% |
|
|
2 | Albanian (sq) |
100% / 0% |
84% / 84% |
0% / 0% |
xxdilaxxKaspa/aldi.ruli.kaspaTrnslator, nardiidoda/Dodanardi |
3 | Arabic (ar) |
|
46% / 0% |
92% / 0% |
???/حمود احمد حمود حمدان (capitalxrp) |
4 | Basque (eu) |
|
100% / 0% |
0% / 0% |
jorgereyazabal/jorgereyazabal |
5 | Bengali (bn) |
|
100% / 100% |
76% / 1% |
TARZANin/TARZANin |
6 | Bulgarian (bg) |
100% / 0% |
100% / 0% |
25% / 0% |
ceco/cecosvidovski |
7 | Catalan (ca) |
|
84% / 0% |
0% / 0% |
???/rafaaa, gomarco/omco |
8 | Chinese (zh) |
100% / 100% |
100% / 100% |
100% / 100% |
benrod3k#4055/benrod3k, sxd#2804/damiaiqc, kkvvkmuup/WLong |
9 | Croatian (hr) |
0% / 0% |
0% / 0% |
0% / 0% |
xxdilaxxKaspa/aldi.ruli.kaspaTrnslator |
10 | Czech (cs) |
100% / 0% |
84% / 84% |
0% / 0% |
???/tomas.kaspar0, MasterMiner/Aviator366 |
11 | Danish (da) |
100% / 0% |
100% / 100% |
0% / 0% |
OhNoSheDiint/Ohnoshediint |
12 | Dutch (nl) |
0% / 0% |
100% / 100% |
100% / 100% |
Jeroen/monkeyzandwich, Steve B/SteveB_9832, ???/temminck77, inventories/inventories |
13 | Finnish (fi) |
100% / 0% |
100% / 100% |
0% / 0% |
???/Jonttula, Malformation/Malformation |
14 | French (fr) |
100% / 0% |
100% / 0% |
100% / 0% |
Na0mir/Na0mir |
15 | Georgian (ka) |
100% / 0% |
100% / 100% |
63% / 0% |
rattlesssssnake/Rattlesssssnake |
16 | German (de) |
100% / 100% |
100% / 100% |
100% / 100% |
Helix/HelixEasy, jwj/DStacks |
17 | Greek (el) |
100% / 0% |
100% / 0% |
100% / 0% |
???/shadowjump, sp4rtan/sp4rtan, blackrider_92973/CHARILAOS CHRYSOCHOOU (lebrand) |
18 | Hebrew (he) |
|
100% / 100% |
0% / 0% |
O_Josephs Backup Device/O_Josephs_Backup_Device7363, hauntedcook/tmrlvi, BBILISH/BBILISH |
19 | Hindi (hi) |
11% / 0% |
100% / 100% |
16% / 0% |
sa1krishna/Sa1krishna, TARZANin/TARZANin |
20 | Hungarian (hu) |
100% / 0% |
100% / 100% |
4% / 0% |
Csubi(csubi76)/Csubi, |
21 | Icelandic (is) |
|
0% / 0% |
|
FatGorilla8899/??? |
22 | Indonesian (id) |
100% / 0% |
100% / 100% |
100% / 100% |
CHRIS45 | NEW/chris45 |
23 | Italian (it) |
100% / 0% |
83% / 83% |
0% / 0% |
TheSheepCat/TheSheepCat, ???/fiumef |
24 | Japanese (ja) |
30% / 0% |
45% / 0% |
41% / 0% |
Frnf/fiumef |
25 | Kazakh (ka) |
0% / 0% |
|||
26 | Korean (ko) |
56% / 0% |
68% / 0% |
0% / 0% |
BOOM/boomie |
27 | Latvian (lv) |
|
37% / 0% |
|
|
28 | Macedonian (mk) |
|
0% / 0% |
|
|
29 | Malay (ms) |
|
100% / 100% |
0% / 0% |
CHRIS45 | NEW/chris45 |
30 | Norwegian (no) |
100% / 0% |
84% / 0% |
0% / 0% |
supertypo/supertypo, kola5/Jensfch |
31 | Persian (fa) |
100% / 100% |
100% / 100% |
100% / 100% |
daisooki/Amirhossein17, mamad.771/mamadb7 |
32 | Polish (pl) |
100% / 0% |
100% / 100% |
100% / 0% |
azazino/azazino, imalfect/imalfect, Yogaz/blukasz |
33 | Portuguese (pt) |
100% / 0% |
100% / 100% |
65% / 65% |
cafaBR/cafaBR, Porventura/Porventura, ???/elldee |
34 | Romanian (ro) |
100% / 0% |
100% / 100% |
100% / 100% |
Da3m0nN/Da3m0nN, Kaspa Talks/gxggromlin |
35 | Russian (ru) |
100% / 0% |
100% / 100% |
100% / 0% |
???/Legendre, azazino/azazino, ???/eecscorpion, Da3m0nN/Da3m0nN |
36 | Serbian (sr) |
30% / 0% |
84% / 0% |
0% / 0% |
Refloow/Refloow |
37 | Slovenian (sl) |
|
37% / 0% |
|
|
38 | Spanish (es) |
100% / 0% |
100% / 100% |
100% / 0% |
jorgereyazabal/jorgereyazabal, MyGCrypt0/marqueztranslations, azazino/azazino, venom1977/Victor Manuel (venom1977) |
39 | Swedish (sv) |
0% / 0% |
84% / 39% |
0% / 0% |
mawen.algo/mawen123 |
40 | Tagalog (tl) |
|
46% / 0% |
|
|
41 | Telugu (te) |
|
100% / 0% |
0% / 0% |
sa1krishna/Sa1krishna |
42 | Turkish (tr) |
18% / 0% |
100% / 100% |
3% / 0% |
wdjzr/mtardal, jemboy7245/Jem Dikyol (JemNDK) |
43 | Ukrainian (uk) |
100% / 0% |
100% / 100% |
100% / 0% |
azazino/azazino, ???/Roman Vov (336262) |
44 | Urdu (ur) |
100% / 0% |
84% / 0% |
0% / 0% |
Devilking946285/devilking946284 |
45 | Vietnamese (vi) |
80% / 0% |
47% / 0% |
0% / 0% |
ʞhoaratatata/gunnygrovip31 |
On the Kaspa organization you can choose the application, for which you want to improve the translation. After that you see the list of available translations and the current percentage of already finished translation. Click on the language you want to work on. Now you see the main translation screen with the list of entries in english on the left side. In the middle of the screen you can enter your translation of the currently selected entry. Here's a screenshot of the first application, which will be translated using Transifex, which is KDX:
Scroll down on that page to see the list of already configured languages and their percentage of finished translations:
If your language is not on that list, please get in touch with us!
To go ahead with translation work, choose the language into which you want to translate. Here's an example for Italian:
Now you see the main translation page:
On that page the main work will be done. Choose a string from the list on the left side and enter the translation into your language on the translation area. To switch to the next entry, just press tab key on your keyboard.
There are also a lot of filtering and sorting options, so you can customize the UI according to your preferred style on how to go ahead.
There are strings in the form Received {amount} KAS
in the text. That means, that {amount}
will be replaced with a given value like a name or an amount. During the translation these placeholders needs to stay intact! So don't translate them, just copy them onto your translation “as is”. If the placeholder are explicit like on Amount {amount} {coin}
, then their order might be changed according to your language rules. To illustrate this, see the following screenshot:
There are format markers like line breaks on several places. These markers should stay intact also on the translation. To use them on the translation, just position the cursor on the proper position within your translation and click on the marker in the source string. Here's a screenshot to illustrate this:
There are different procedures, how plural forms are handled. This depends on the used programming language a/o technology.
Kaspium, the mobile wallet, is based on Flutter, so it is using the curly braces as placeholders to handle plural form.
Here's an example which shows which words needs to be translated:
The explanation is following right below. For better understanding, you should read the explanation from bottom to top:
After {minutes, plural, =1{1 minute} other{{minutes} minutes}}
^^^^^^^ ^^^^^^ ^ ^^^^^^^^ ^^^^^ ^^^^^^^ ^^^^^^^
| | | | | | |
| | | | | | `-> Translation for all
| | | | | | other amounts
| | | | | `----------> Keyword,
| | | | | must stay intact
| | | | `------------------> Start of plural form
| | | | for all other amounts,
| | | | must stay intact
| | | `--------------------------> Translation for
| | | amount of 1
| | `--------------------------------> Start of plural form
| | for amount of 1,
| | must stay intact
| `---------------------------------------> Keyword for plural,
| must stay intact
`-----------------------------------------------> Keyword,
must stay intact
So as an example here are two translations of the above example:
Nach {minutes, plural, =1{1 Minute} other{{minutes} Minuten}}
Після {minutes, plural, =1{1 хвилини} other{{minutes} хвилин}}
And here are the results on the application:
After 1 minute
Nach 1 Minute
Після 1 хвилини
After 23 minutes
Nach 23 Minuten
Після 23 хвилин
The usage of %d as placeholder is i. e. used on Qt based applications. Kaspa currently has no such application, so the following is intended just as informational description.
If the source string is something like I have %d donut(s)
, there should be multiple results on the translation. If it's filled, the first form would be I have 1 donut
and as soon as the number increases, it changes to I have 2 donuts
. Transifex knows the specialties for these things on different languages. Like to dive deeper into this? See here.
To make it easier to understand the background, here's a very simplified explanation, how the translation technically works for a Qt based application. Don't worry, you don't need to fiddle around with the tech stuff!
To show a string on the user interface (UI), it is used i. e. this way:
String message = tr("Hello world!")
So the function tr(...)
translates the given string Hello world!
onto the currently used language. That's in simple words what happens under the hood.
Now to the translation process itself. During the build of the application, a separate file for the master language is generated, i. e. lang_en.ts
. This file contains all strings found on the code, wrapped on an xml structure. This file needs to be uploaded to transifex and is the master for all the translations. The translation process on Transifex then generates separate files for each translated language, which needs to be downloaded to update the already existing translation files. The next build of the binaries will use these updated translation.