Cleanups.

This commit is contained in:
Relintai 2024-04-30 17:58:17 +02:00
parent 486d76d00c
commit b68153e78d
10 changed files with 83 additions and 538 deletions

View File

@ -1,10 +1,8 @@
Internationalizing games # Internationalizing games
========================
Introduction ## Introduction
------------
Sería excelente que el mundo hablara solo un idioma (It would be great if the Sería excelente que el mundo hablara solo un idioma (It would be great if the
world spoke only one language). Unfortunately for world spoke only one language). Unfortunately for
@ -26,8 +24,7 @@ Note:
We will be using the official demo as an example; you can We will be using the official demo as an example; you can
`download it from the Asset Library ( https://pandemoniumengine.org/asset-library/asset/134 )`. `download it from the Asset Library ( https://pandemoniumengine.org/asset-library/asset/134 )`.
Configuring the imported translation ## Configuring the imported translation
------------------------------------
Translations can get updated and re-imported when they change, but Translations can get updated and re-imported when they change, but
they still have to be added to the project. This is done in they still have to be added to the project. This is done in
@ -37,8 +34,7 @@ they still have to be added to the project. This is done in
The above dialog is used to add or remove translations project-wide. The above dialog is used to add or remove translations project-wide.
Localizing resources ## Localizing resources
--------------------
It is also possible to instruct Pandemonium to use alternate versions of It is also possible to instruct Pandemonium to use alternate versions of
assets (resources) depending on the current language. The **Remaps** tab assets (resources) depending on the current language. The **Remaps** tab
@ -49,8 +45,7 @@ can be used for this:
Select the resource to be remapped, then add some alternatives for each Select the resource to be remapped, then add some alternatives for each
locale. locale.
Converting keys to text ## Converting keys to text
-----------------------
Some controls, such as `Button`, Some controls, such as `Button`,
will automatically fetch a translation if their text matches a translation key. will automatically fetch a translation if their text matches a translation key.
@ -94,8 +89,7 @@ translations and convert it if found:
status.set_text(tr("GAME_STATUS_" + str(status_index))) status.set_text(tr("GAME_STATUS_" + str(status_index)))
``` ```
Making controls resizable ### Making controls resizable
--------------------------
The same text in different languages can vary greatly in length. For The same text in different languages can vary greatly in length. For
this, make sure to read the tutorial on `doc_size_and_anchors`, as this, make sure to read the tutorial on `doc_size_and_anchors`, as
@ -103,16 +97,14 @@ dynamically adjusting control sizes may help.
`Container` can be useful, as well as the text wrapping `Container` can be useful, as well as the text wrapping
options available in `Label`. options available in `Label`.
TranslationServer ## TranslationServer
-----------------
Pandemonium has a server handling low-level translation management Pandemonium has a server handling low-level translation management
called the `TranslationServer`. called the `TranslationServer`.
Translations can be added or removed during run-time; Translations can be added or removed during run-time;
the current language can also be changed at run-time. the current language can also be changed at run-time.
Testing translations ## Testing translations
--------------------
You may want to test a project's translation before releasing it. Pandemonium provides two ways You may want to test a project's translation before releasing it. Pandemonium provides two ways
to do this. to do this.
@ -136,8 +128,7 @@ supplied:
pandemonium --language fr pandemonium --language fr
``` ```
Translating the project name ## Translating the project name
----------------------------
The project name becomes the app name when exporting to different The project name becomes the app name when exporting to different
operating systems and platforms. To specify the project name in more operating systems and platforms. To specify the project name in more

View File

@ -1,7 +1,5 @@
# Localization using gettext
Localization using gettext
==========================
In addition to `doc_importing_translations` in CSV format, Pandemonium In addition to `doc_importing_translations` in CSV format, Pandemonium
also supports loading translation files written in the GNU gettext also supports loading translation files written in the GNU gettext
@ -13,8 +11,7 @@ Note:
It's written with C projects in mind, but much of the advice It's written with C projects in mind, but much of the advice
also applies to Pandemonium (with the exception of `xgettext`). also applies to Pandemonium (with the exception of `xgettext`).
Advantages ## Advantages
----------
- gettext is a standard format, which can be edited using any text editor - gettext is a standard format, which can be edited using any text editor
or GUI editors such as `Poedit ( https://poedit.net/ )`. or GUI editors such as `Poedit ( https://poedit.net/ )`.
@ -26,8 +23,7 @@ Advantages
- Multiline strings are more convenient to edit in gettext files compared - Multiline strings are more convenient to edit in gettext files compared
to CSV files. to CSV files.
Disadvantages ## Disadvantages
-------------
- gettext is a more complex format than CSV and can be harder to grasp for - gettext is a more complex format than CSV and can be harder to grasp for
people new to software localization. people new to software localization.
@ -35,15 +31,13 @@ Disadvantages
on their system. However, as Pandemonium supports using text-based message files on their system. However, as Pandemonium supports using text-based message files
(`.po`), translators can test their work without having to install gettext tools. (`.po`), translators can test their work without having to install gettext tools.
Caveats ## Caveats
-------
- As Pandemonium uses its own PO file parser behind the scenes - As Pandemonium uses its own PO file parser behind the scenes
(which is more limited than the reference GNU gettext implementation), (which is more limited than the reference GNU gettext implementation),
some features such as pluralization aren't supported. some features such as pluralization aren't supported.
Installing gettext tools ## Installing gettext tools
------------------------
The command line gettext tools are required to perform maintenance operations, The command line gettext tools are required to perform maintenance operations,
such as updating message files. Therefore, it's strongly recommended to such as updating message files. Therefore, it's strongly recommended to
@ -60,8 +54,7 @@ install them.
- **Linux:** On most distributions, install the `gettext` package from - **Linux:** On most distributions, install the `gettext` package from
your distribution's package manager. your distribution's package manager.
Creating the PO template (POT) manually ## Creating the PO template (POT) manually
---------------------------------------
Pandemonium currently doesn't support extracting source strings using `xgettext`, Pandemonium currently doesn't support extracting source strings using `xgettext`,
so the `.pot` file must be created manually. This file can be placed anywhere so the `.pot` file must be created manually. This file can be placed anywhere
@ -87,8 +80,7 @@ the translated string.
The `msgstr` value in PO template files (`.pot`) should **always** be empty. The `msgstr` value in PO template files (`.pot`) should **always** be empty.
Localization will be done in the generated `.po` files instead. Localization will be done in the generated `.po` files instead.
Creating the PO template (POT) using pybabel ## Creating the PO template (POT) using pybabel
--------------------------------------------
The Python tool pybabel has support for Pandemonium and can be used to automatically The Python tool pybabel has support for Pandemonium and can be used to automatically
create and update the POT file from your scene files and scripts. create and update the POT file from your scene files and scripts.
@ -122,8 +114,7 @@ arguments to `tr()` will be translated, as well
as properties named "text" (commonly used by Control nodes) and LineEdit's as properties named "text" (commonly used by Control nodes) and LineEdit's
"placeholder_text" property. "placeholder_text" property.
Creating a messages file from a PO template ## Creating a messages file from a PO template
-------------------------------------------
The `msginit` command is used to turn a PO template into a messages file. The `msginit` command is used to turn a PO template into a messages file.
For instance, to create a French localization file, use the following command For instance, to create a French localization file, use the following command
@ -139,8 +130,7 @@ as the PO template.
Alternatively, you can do that graphically using Poedit, or by uploading the Alternatively, you can do that graphically using Poedit, or by uploading the
POT file to your web platform of choice. POT file to your web platform of choice.
Loading a messages file in Pandemonium ## Loading a messages file in Pandemonium
--------------------------------
To register a messages file as a translation in a project, open the To register a messages file as a translation in a project, open the
**Project Settings**, then go to the **Localization** tab. **Project Settings**, then go to the **Localization** tab.
@ -152,8 +142,7 @@ Note:
See `doc_internationalizing_games` for more information on See `doc_internationalizing_games` for more information on
importing and testing translations in Pandemonium. importing and testing translations in Pandemonium.
Updating message files to follow the PO template ## Updating message files to follow the PO template
------------------------------------------------
After updating the PO template, you will have to update message files so After updating the PO template, you will have to update message files so
that they contain new strings, while removing strings that are no longer that they contain new strings, while removing strings that are no longer
@ -179,8 +168,7 @@ Note:
Strings with "fuzzy" comments will **not** be read by Pandemonium until the Strings with "fuzzy" comments will **not** be read by Pandemonium until the
translation is updated and the "fuzzy" comment is removed. translation is updated and the "fuzzy" comment is removed.
Checking the validity of a PO file or template ## Checking the validity of a PO file or template
----------------------------------------------
It is possible to check whether a gettext file's syntax is valid by running It is possible to check whether a gettext file's syntax is valid by running
the command below: the command below:
@ -192,8 +180,7 @@ the command below:
If there are syntax errors or warnings, they will be displayed in the console. If there are syntax errors or warnings, they will be displayed in the console.
Otherwise, `msgfmt` won't output anything. Otherwise, `msgfmt` won't output anything.
Using binary MO files (useful for large projects only) ## Using binary MO files (useful for large projects only)
------------------------------------------------------
For large projects with several thousands of strings to translate or more, For large projects with several thousands of strings to translate or more,
it can be worth it to use binary (compiled) MO message files instead of text-based it can be worth it to use binary (compiled) MO message files instead of text-based

View File

@ -1,739 +1,375 @@
Locales # Locales
=======
.. Note: This list is synced with core/translation.cpp in the engine. Note: This list is synced with core/translation.cpp in the engine.
This is the list of supported locales and variants in the engine. It's This is the list of supported locales and variants in the engine. It's
based on the Unix standard locale strings: based on the Unix standard locale strings:
+--------------+------------------------------------+
| Locale | Language and Variant | | Locale | Language and Variant |
+==============+====================================+ |--------------|------------------------------------|
| aa | Afar | | aa | Afar |
+--------------+------------------------------------+
| aa_DJ | Afar (Djibouti) | | aa_DJ | Afar (Djibouti) |
+--------------+------------------------------------+
| aa_ER | Afar (Eritrea) | | aa_ER | Afar (Eritrea) |
+--------------+------------------------------------+
| aa_ET | Afar (Ethiopia) | | aa_ET | Afar (Ethiopia) |
+--------------+------------------------------------+
| af | Afrikaans | | af | Afrikaans |
+--------------+------------------------------------+
| af_ZA | Afrikaans (South Africa) | | af_ZA | Afrikaans (South Africa) |
+--------------+------------------------------------+
| agr_PE | Aguaruna (Peru) | | agr_PE | Aguaruna (Peru) |
+--------------+------------------------------------+
| ak_GH | Akan (Ghana) | | ak_GH | Akan (Ghana) |
+--------------+------------------------------------+
| am_ET | Amharic (Ethiopia) | | am_ET | Amharic (Ethiopia) |
+--------------+------------------------------------+
| an_ES | Aragonese (Spain) | | an_ES | Aragonese (Spain) |
+--------------+------------------------------------+
| anp_IN | Angika (India) | | anp_IN | Angika (India) |
+--------------+------------------------------------+
| ar | Arabic | | ar | Arabic |
+--------------+------------------------------------+
| ar_AE | Arabic (United Arab Emirates) | | ar_AE | Arabic (United Arab Emirates) |
+--------------+------------------------------------+
| ar_BH | Arabic (Bahrain) | | ar_BH | Arabic (Bahrain) |
+--------------+------------------------------------+
| ar_DZ | Arabic (Algeria) | | ar_DZ | Arabic (Algeria) |
+--------------+------------------------------------+
| ar_EG | Arabic (Egypt) | | ar_EG | Arabic (Egypt) |
+--------------+------------------------------------+
| ar_IQ | Arabic (Iraq) | | ar_IQ | Arabic (Iraq) |
+--------------+------------------------------------+
| ar_JO | Arabic (Jordan) | | ar_JO | Arabic (Jordan) |
+--------------+------------------------------------+
| ar_KW | Arabic (Kuwait) | | ar_KW | Arabic (Kuwait) |
+--------------+------------------------------------+
| ar_LB | Arabic (Lebanon) | | ar_LB | Arabic (Lebanon) |
+--------------+------------------------------------+
| ar_LY | Arabic (Libya) | | ar_LY | Arabic (Libya) |
+--------------+------------------------------------+
| ar_MA | Arabic (Morocco) | | ar_MA | Arabic (Morocco) |
+--------------+------------------------------------+
| ar_OM | Arabic (Oman) | | ar_OM | Arabic (Oman) |
+--------------+------------------------------------+
| ar_QA | Arabic (Qatar) | | ar_QA | Arabic (Qatar) |
+--------------+------------------------------------+
| ar_SA | Arabic (Saudi Arabia) | | ar_SA | Arabic (Saudi Arabia) |
+--------------+------------------------------------+
| ar_SD | Arabic (Sudan) | | ar_SD | Arabic (Sudan) |
+--------------+------------------------------------+
| ar_SS | Arabic (South Sudan) | | ar_SS | Arabic (South Sudan) |
+--------------+------------------------------------+
| ar_SY | Arabic (Syria) | | ar_SY | Arabic (Syria) |
+--------------+------------------------------------+
| ar_TN | Arabic (Tunisia) | | ar_TN | Arabic (Tunisia) |
+--------------+------------------------------------+
| ar_YE | Arabic (Yemen) | | ar_YE | Arabic (Yemen) |
+--------------+------------------------------------+
| as_IN | Assamese (India) | | as_IN | Assamese (India) |
+--------------+------------------------------------+
| ast_ES | Asturian (Spain) | | ast_ES | Asturian (Spain) |
+--------------+------------------------------------+
| ayc_PE | Southern Aymara (Peru) | | ayc_PE | Southern Aymara (Peru) |
+--------------+------------------------------------+
| ay_PE | Aymara (Peru) | | ay_PE | Aymara (Peru) |
+--------------+------------------------------------+
| az_AZ | Azerbaijani (Azerbaijan) | | az_AZ | Azerbaijani (Azerbaijan) |
+--------------+------------------------------------+
| be | Belarusian | | be | Belarusian |
+--------------+------------------------------------+
| be_BY | Belarusian (Belarus) | | be_BY | Belarusian (Belarus) |
+--------------+------------------------------------+
| bem_ZM | Bemba (Zambia) | | bem_ZM | Bemba (Zambia) |
+--------------+------------------------------------+
| ber_DZ | Berber languages (Algeria) | | ber_DZ | Berber languages (Algeria) |
+--------------+------------------------------------+
| ber_MA | Berber languages (Morocco) | | ber_MA | Berber languages (Morocco) |
+--------------+------------------------------------+
| bg | Bulgarian | | bg | Bulgarian |
+--------------+------------------------------------+
| bg_BG | Bulgarian (Bulgaria) | | bg_BG | Bulgarian (Bulgaria) |
+--------------+------------------------------------+
| bhb_IN | Bhili (India) | | bhb_IN | Bhili (India) |
+--------------+------------------------------------+
| bho_IN | Bhojpuri (India) | | bho_IN | Bhojpuri (India) |
+--------------+------------------------------------+
| bi_TV | Bislama (Tuvalu) | | bi_TV | Bislama (Tuvalu) |
+--------------+------------------------------------+
| bn | Bengali | | bn | Bengali |
+--------------+------------------------------------+
| bn_BD | Bengali (Bangladesh) | | bn_BD | Bengali (Bangladesh) |
+--------------+------------------------------------+
| bn_IN | Bengali (India) | | bn_IN | Bengali (India) |
+--------------+------------------------------------+
| bo | Tibetan | | bo | Tibetan |
+--------------+------------------------------------+
| bo_CN | Tibetan (China) | | bo_CN | Tibetan (China) |
+--------------+------------------------------------+
| bo_IN | Tibetan (India) | | bo_IN | Tibetan (India) |
+--------------+------------------------------------+
| br_FR | Breton (France) | | br_FR | Breton (France) |
+--------------+------------------------------------+
| brx_IN | Bodo (India) | | brx_IN | Bodo (India) |
+--------------+------------------------------------+
| bs_BA | Bosnian (Bosnia and Herzegovina) | | bs_BA | Bosnian (Bosnia and Herzegovina) |
+--------------+------------------------------------+
| byn_ER | Bilin (Eritrea) | | byn_ER | Bilin (Eritrea) |
+--------------+------------------------------------+
| ca | Catalan | | ca | Catalan |
+--------------+------------------------------------+
| ca_AD | Catalan (Andorra) | | ca_AD | Catalan (Andorra) |
+--------------+------------------------------------+
| ca_ES | Catalan (Spain) | | ca_ES | Catalan (Spain) |
+--------------+------------------------------------+
| ca_FR | Catalan (France) | | ca_FR | Catalan (France) |
+--------------+------------------------------------+
| ca_IT | Catalan (Italy) | | ca_IT | Catalan (Italy) |
+--------------+------------------------------------+
| ce_RU | Chechen (Russia) | | ce_RU | Chechen (Russia) |
+--------------+------------------------------------+
| chr_US | Cherokee (United States) | | chr_US | Cherokee (United States) |
+--------------+------------------------------------+
| cmn_TW | Mandarin Chinese (Taiwan) | | cmn_TW | Mandarin Chinese (Taiwan) |
+--------------+------------------------------------+
| crh_UA | Crimean Tatar (Ukraine) | | crh_UA | Crimean Tatar (Ukraine) |
+--------------+------------------------------------+
| csb_PL | Kashubian (Poland) | | csb_PL | Kashubian (Poland) |
+--------------+------------------------------------+
| cs | Czech | | cs | Czech |
+--------------+------------------------------------+
| cs_CZ | Czech (Czech Republic) | | cs_CZ | Czech (Czech Republic) |
+--------------+------------------------------------+
| cv_RU | Chuvash (Russia) | | cv_RU | Chuvash (Russia) |
+--------------+------------------------------------+
| cy_GB | Welsh (United Kingdom) | | cy_GB | Welsh (United Kingdom) |
+--------------+------------------------------------+
| da | Danish | | da | Danish |
+--------------+------------------------------------+
| da_DK | Danish (Denmark) | | da_DK | Danish (Denmark) |
+--------------+------------------------------------+
| de | German | | de | German |
+--------------+------------------------------------+
| de_AT | German (Austria) | | de_AT | German (Austria) |
+--------------+------------------------------------+
| de_BE | German (Belgium) | | de_BE | German (Belgium) |
+--------------+------------------------------------+
| de_CH | German (Switzerland) | | de_CH | German (Switzerland) |
+--------------+------------------------------------+
| de_DE | German (Germany) | | de_DE | German (Germany) |
+--------------+------------------------------------+
| de_IT | German (Italy) | | de_IT | German (Italy) |
+--------------+------------------------------------+
| de_LU | German (Luxembourg) | | de_LU | German (Luxembourg) |
+--------------+------------------------------------+
| doi_IN | Dogri (India) | | doi_IN | Dogri (India) |
+--------------+------------------------------------+
| dv_MV | Dhivehi (Maldives) | | dv_MV | Dhivehi (Maldives) |
+--------------+------------------------------------+
| dz_BT | Dzongkha (Bhutan) | | dz_BT | Dzongkha (Bhutan) |
+--------------+------------------------------------+
| el | Greek | | el | Greek |
+--------------+------------------------------------+
| el_CY | Greek (Cyprus) | | el_CY | Greek (Cyprus) |
+--------------+------------------------------------+
| el_GR | Greek (Greece) | | el_GR | Greek (Greece) |
+--------------+------------------------------------+
| en | English | | en | English |
+--------------+------------------------------------+
| en_AG | English (Antigua and Barbuda) | | en_AG | English (Antigua and Barbuda) |
+--------------+------------------------------------+
| en_AU | English (Australia) | | en_AU | English (Australia) |
+--------------+------------------------------------+
| en_BW | English (Botswana) | | en_BW | English (Botswana) |
+--------------+------------------------------------+
| en_CA | English (Canada) | | en_CA | English (Canada) |
+--------------+------------------------------------+
| en_DK | English (Denmark) | | en_DK | English (Denmark) |
+--------------+------------------------------------+
| en_GB | English (United Kingdom) | | en_GB | English (United Kingdom) |
+--------------+------------------------------------+
| en_HK | English (Hong Kong) | | en_HK | English (Hong Kong) |
+--------------+------------------------------------+
| en_IE | English (Ireland) | | en_IE | English (Ireland) |
+--------------+------------------------------------+
| en_IL | English (Israel) | | en_IL | English (Israel) |
+--------------+------------------------------------+
| en_IN | English (India) | | en_IN | English (India) |
+--------------+------------------------------------+
| en_NG | English (Nigeria) | | en_NG | English (Nigeria) |
+--------------+------------------------------------+
| en_NZ | English (New Zealand) | | en_NZ | English (New Zealand) |
+--------------+------------------------------------+
| en_PH | English (Philippines) | | en_PH | English (Philippines) |
+--------------+------------------------------------+
| en_SG | English (Singapore) | | en_SG | English (Singapore) |
+--------------+------------------------------------+
| en_US | English (United States) | | en_US | English (United States) |
+--------------+------------------------------------+
| en_ZA | English (South Africa) | | en_ZA | English (South Africa) |
+--------------+------------------------------------+
| en_ZM | English (Zambia) | | en_ZM | English (Zambia) |
+--------------+------------------------------------+
| en_ZW | English (Zimbabwe) | | en_ZW | English (Zimbabwe) |
+--------------+------------------------------------+
| eo | Esperanto | | eo | Esperanto |
+--------------+------------------------------------+
| es | Spanish | | es | Spanish |
+--------------+------------------------------------+
| es_AR | Spanish (Argentina) | | es_AR | Spanish (Argentina) |
+--------------+------------------------------------+
| es_BO | Spanish (Bolivia) | | es_BO | Spanish (Bolivia) |
+--------------+------------------------------------+
| es_CL | Spanish (Chile) | | es_CL | Spanish (Chile) |
+--------------+------------------------------------+
| es_CO | Spanish (Colombia) | | es_CO | Spanish (Colombia) |
+--------------+------------------------------------+
| es_CR | Spanish (Costa Rica) | | es_CR | Spanish (Costa Rica) |
+--------------+------------------------------------+
| es_CU | Spanish (Cuba) | | es_CU | Spanish (Cuba) |
+--------------+------------------------------------+
| es_DO | Spanish (Dominican Republic) | | es_DO | Spanish (Dominican Republic) |
+--------------+------------------------------------+
| es_EC | Spanish (Ecuador) | | es_EC | Spanish (Ecuador) |
+--------------+------------------------------------+
| es_ES | Spanish (Spain) | | es_ES | Spanish (Spain) |
+--------------+------------------------------------+
| es_GT | Spanish (Guatemala) | | es_GT | Spanish (Guatemala) |
+--------------+------------------------------------+
| es_HN | Spanish (Honduras) | | es_HN | Spanish (Honduras) |
+--------------+------------------------------------+
| es_MX | Spanish (Mexico) | | es_MX | Spanish (Mexico) |
+--------------+------------------------------------+
| es_NI | Spanish (Nicaragua) | | es_NI | Spanish (Nicaragua) |
+--------------+------------------------------------+
| es_PA | Spanish (Panama) | | es_PA | Spanish (Panama) |
+--------------+------------------------------------+
| es_PE | Spanish (Peru) | | es_PE | Spanish (Peru) |
+--------------+------------------------------------+
| es_PR | Spanish (Puerto Rico) | | es_PR | Spanish (Puerto Rico) |
+--------------+------------------------------------+
| es_PY | Spanish (Paraguay) | | es_PY | Spanish (Paraguay) |
+--------------+------------------------------------+
| es_SV | Spanish (El Salvador) | | es_SV | Spanish (El Salvador) |
+--------------+------------------------------------+
| es_US | Spanish (United States) | | es_US | Spanish (United States) |
+--------------+------------------------------------+
| es_UY | Spanish (Uruguay) | | es_UY | Spanish (Uruguay) |
+--------------+------------------------------------+
| es_VE | Spanish (Venezuela) | | es_VE | Spanish (Venezuela) |
+--------------+------------------------------------+
| et | Estonian | | et | Estonian |
+--------------+------------------------------------+
| et_EE | Estonian (Estonia) | | et_EE | Estonian (Estonia) |
+--------------+------------------------------------+
| eu | Basque | | eu | Basque |
+--------------+------------------------------------+
| eu_ES | Basque (Spain) | | eu_ES | Basque (Spain) |
+--------------+------------------------------------+
| fa | Persian | | fa | Persian |
+--------------+------------------------------------+
| fa_IR | Persian (Iran) | | fa_IR | Persian (Iran) |
+--------------+------------------------------------+
| ff_SN | Fulah (Senegal) | | ff_SN | Fulah (Senegal) |
+--------------+------------------------------------+
| fi | Finnish | | fi | Finnish |
+--------------+------------------------------------+
| fi_FI | Finnish (Finland) | | fi_FI | Finnish (Finland) |
+--------------+------------------------------------+
| fil | Filipino | | fil | Filipino |
+--------------+------------------------------------+
| fil_PH | Filipino (Philippines) | | fil_PH | Filipino (Philippines) |
+--------------+------------------------------------+
| fo_FO | Faroese (Faroe Islands) | | fo_FO | Faroese (Faroe Islands) |
+--------------+------------------------------------+
| fr | French | | fr | French |
+--------------+------------------------------------+
| fr_BE | French (Belgium) | | fr_BE | French (Belgium) |
+--------------+------------------------------------+
| fr_CA | French (Canada) | | fr_CA | French (Canada) |
+--------------+------------------------------------+
| fr_CH | French (Switzerland) | | fr_CH | French (Switzerland) |
+--------------+------------------------------------+
| fr_FR | French (France) | | fr_FR | French (France) |
+--------------+------------------------------------+
| fr_LU | French (Luxembourg) | | fr_LU | French (Luxembourg) |
+--------------+------------------------------------+
| fur_IT | Friulian (Italy) | | fur_IT | Friulian (Italy) |
+--------------+------------------------------------+
| fy_DE | Western Frisian (Germany) | | fy_DE | Western Frisian (Germany) |
+--------------+------------------------------------+
| fy_NL | Western Frisian (Netherlands) | | fy_NL | Western Frisian (Netherlands) |
+--------------+------------------------------------+
| ga | Irish | | ga | Irish |
+--------------+------------------------------------+
| ga_IE | Irish (Ireland) | | ga_IE | Irish (Ireland) |
+--------------+------------------------------------+
| gd_GB | Scottish Gaelic (United Kingdom) | | gd_GB | Scottish Gaelic (United Kingdom) |
+--------------+------------------------------------+
| gez_ER | Geez (Eritrea) | | gez_ER | Geez (Eritrea) |
+--------------+------------------------------------+
| gez_ET | Geez (Ethiopia) | | gez_ET | Geez (Ethiopia) |
+--------------+------------------------------------+
| gl_ES | Galician (Spain) | | gl_ES | Galician (Spain) |
+--------------+------------------------------------+
| gu_IN | Gujarati (India) | | gu_IN | Gujarati (India) |
+--------------+------------------------------------+
| gv_GB | Manx (United Kingdom) | | gv_GB | Manx (United Kingdom) |
+--------------+------------------------------------+
| hak_TW | Hakka Chinese (Taiwan) | | hak_TW | Hakka Chinese (Taiwan) |
+--------------+------------------------------------+
| ha_NG | Hausa (Nigeria) | | ha_NG | Hausa (Nigeria) |
+--------------+------------------------------------+
| he | Hebrew | | he | Hebrew |
+--------------+------------------------------------+
| he_IL | Hebrew (Israel) | | he_IL | Hebrew (Israel) |
+--------------+------------------------------------+
| hi | Hindi | | hi | Hindi |
+--------------+------------------------------------+
| hi_IN | Hindi (India) | | hi_IN | Hindi (India) |
+--------------+------------------------------------+
| hne_IN | Chhattisgarhi (India) | | hne_IN | Chhattisgarhi (India) |
+--------------+------------------------------------+
| hr | Croatian | | hr | Croatian |
+--------------+------------------------------------+
| hr_HR | Croatian (Croatia) | | hr_HR | Croatian (Croatia) |
+--------------+------------------------------------+
| hsb_DE | Upper Sorbian (Germany) | | hsb_DE | Upper Sorbian (Germany) |
+--------------+------------------------------------+
| ht_HT | Haitian (Haiti) | | ht_HT | Haitian (Haiti) |
+--------------+------------------------------------+
| hu | Hungarian | | hu | Hungarian |
+--------------+------------------------------------+
| hu_HU | Hungarian (Hungary) | | hu_HU | Hungarian (Hungary) |
+--------------+------------------------------------+
| hus_MX | Huastec (Mexico) | | hus_MX | Huastec (Mexico) |
+--------------+------------------------------------+
| hy_AM | Armenian (Armenia) | | hy_AM | Armenian (Armenia) |
+--------------+------------------------------------+
| ia_FR | Interlingua (France) | | ia_FR | Interlingua (France) |
+--------------+------------------------------------+
| id | Indonesian | | id | Indonesian |
+--------------+------------------------------------+
| id_ID | Indonesian (Indonesia) | | id_ID | Indonesian (Indonesia) |
+--------------+------------------------------------+
| ig_NG | Igbo (Nigeria) | | ig_NG | Igbo (Nigeria) |
+--------------+------------------------------------+
| ik_CA | Inupiaq (Canada) | | ik_CA | Inupiaq (Canada) |
+--------------+------------------------------------+
| is | Icelandic | | is | Icelandic |
+--------------+------------------------------------+
| is_IS | Icelandic (Iceland) | | is_IS | Icelandic (Iceland) |
+--------------+------------------------------------+
| it | Italian | | it | Italian |
+--------------+------------------------------------+
| it_CH | Italian (Switzerland) | | it_CH | Italian (Switzerland) |
+--------------+------------------------------------+
| it_IT | Italian (Italy) | | it_IT | Italian (Italy) |
+--------------+------------------------------------+
| iu_CA | Inuktitut (Canada) | | iu_CA | Inuktitut (Canada) |
+--------------+------------------------------------+
| ja | Japanese | | ja | Japanese |
+--------------+------------------------------------+
| ja_JP | Japanese (Japan) | | ja_JP | Japanese (Japan) |
+--------------+------------------------------------+
| kab_DZ | Kabyle (Algeria) | | kab_DZ | Kabyle (Algeria) |
+--------------+------------------------------------+
| ka | Georgian | | ka | Georgian |
+--------------+------------------------------------+
| ka_GE | Georgian (Georgia) | | ka_GE | Georgian (Georgia) |
+--------------+------------------------------------+
| kk_KZ | Kazakh (Kazakhstan) | | kk_KZ | Kazakh (Kazakhstan) |
+--------------+------------------------------------+
| kl_GL | Kalaallisut (Greenland) | | kl_GL | Kalaallisut (Greenland) |
+--------------+------------------------------------+
| km_KH | Central Khmer (Cambodia) | | km_KH | Central Khmer (Cambodia) |
+--------------+------------------------------------+
| kn_IN | Kannada (India) | | kn_IN | Kannada (India) |
+--------------+------------------------------------+
| kok_IN | Konkani (India) | | kok_IN | Konkani (India) |
+--------------+------------------------------------+
| ko | Korean | | ko | Korean |
+--------------+------------------------------------+
| ko_KR | Korean (South Korea) | | ko_KR | Korean (South Korea) |
+--------------+------------------------------------+
| ks_IN | Kashmiri (India) | | ks_IN | Kashmiri (India) |
+--------------+------------------------------------+
| ku | Kurdish | | ku | Kurdish |
+--------------+------------------------------------+
| ku_TR | Kurdish (Turkey) | | ku_TR | Kurdish (Turkey) |
+--------------+------------------------------------+
| kw_GB | Cornish (United Kingdom) | | kw_GB | Cornish (United Kingdom) |
+--------------+------------------------------------+
| ky_KG | Kirghiz (Kyrgyzstan) | | ky_KG | Kirghiz (Kyrgyzstan) |
+--------------+------------------------------------+
| lb_LU | Luxembourgish (Luxembourg) | | lb_LU | Luxembourgish (Luxembourg) |
+--------------+------------------------------------+
| lg_UG | Ganda (Uganda) | | lg_UG | Ganda (Uganda) |
+--------------+------------------------------------+
| li_BE | Limburgan (Belgium) | | li_BE | Limburgan (Belgium) |
+--------------+------------------------------------+
| li_NL | Limburgan (Netherlands) | | li_NL | Limburgan (Netherlands) |
+--------------+------------------------------------+
| lij_IT | Ligurian (Italy) | | lij_IT | Ligurian (Italy) |
+--------------+------------------------------------+
| ln_CD | Lingala (Congo) | | ln_CD | Lingala (Congo) |
+--------------+------------------------------------+
| lo_LA | Lao (Laos) | | lo_LA | Lao (Laos) |
+--------------+------------------------------------+
| lt | Lithuanian | | lt | Lithuanian |
+--------------+------------------------------------+
| lt_LT | Lithuanian (Lithuania) | | lt_LT | Lithuanian (Lithuania) |
+--------------+------------------------------------+
| lv | Latvian | | lv | Latvian |
+--------------+------------------------------------+
| lv_LV | Latvian (Latvia) | | lv_LV | Latvian (Latvia) |
+--------------+------------------------------------+
| lzh_TW | Literary Chinese (Taiwan) | | lzh_TW | Literary Chinese (Taiwan) |
+--------------+------------------------------------+
| mag_IN | Magahi (India) | | mag_IN | Magahi (India) |
+--------------+------------------------------------+
| mai_IN | Maithili (India) | | mai_IN | Maithili (India) |
+--------------+------------------------------------+
| mg_MG | Malagasy (Madagascar) | | mg_MG | Malagasy (Madagascar) |
+--------------+------------------------------------+
| mh_MH | Marshallese (Marshall Islands) | | mh_MH | Marshallese (Marshall Islands) |
+--------------+------------------------------------+
| mhr_RU | Eastern Mari (Russia) | | mhr_RU | Eastern Mari (Russia) |
+--------------+------------------------------------+
| mi | Maori | | mi | Maori |
+--------------+------------------------------------+
| mi_NZ | Maori (New Zealand) | | mi_NZ | Maori (New Zealand) |
+--------------+------------------------------------+
| miq_NI | Mískito (Nicaragua) | | miq_NI | Mískito (Nicaragua) |
+--------------+------------------------------------+
| mk | Macedonian | | mk | Macedonian |
+--------------+------------------------------------+
| mk_MK | Macedonian (Macedonia) | | mk_MK | Macedonian (Macedonia) |
+--------------+------------------------------------+
| ml | Malayalam | | ml | Malayalam |
+--------------+------------------------------------+
| ml_IN | Malayalam (India) | | ml_IN | Malayalam (India) |
+--------------+------------------------------------+
| mni_IN | Manipuri (India) | | mni_IN | Manipuri (India) |
+--------------+------------------------------------+
| mn_MN | Mongolian (Mongolia) | | mn_MN | Mongolian (Mongolia) |
+--------------+------------------------------------+
| mr_IN | Marathi (India) | | mr_IN | Marathi (India) |
+--------------+------------------------------------+
| ms | Malay | | ms | Malay |
+--------------+------------------------------------+
| ms_MY | Malay (Malaysia) | | ms_MY | Malay (Malaysia) |
+--------------+------------------------------------+
| mt | Maltese | | mt | Maltese |
+--------------+------------------------------------+
| mt_MT | Maltese (Malta) | | mt_MT | Maltese (Malta) |
+--------------+------------------------------------+
| my_MM | Burmese (Myanmar) | | my_MM | Burmese (Myanmar) |
+--------------+------------------------------------+
| myv_RU | Erzya (Russia) | | myv_RU | Erzya (Russia) |
+--------------+------------------------------------+
| nah_MX | Nahuatl languages (Mexico) | | nah_MX | Nahuatl languages (Mexico) |
+--------------+------------------------------------+
| nan_TW | Min Nan Chinese (Taiwan) | | nan_TW | Min Nan Chinese (Taiwan) |
+--------------+------------------------------------+
| nb | Norwegian Bokmål | | nb | Norwegian Bokmål |
+--------------+------------------------------------+
| nb_NO | Norwegian Bokmål (Norway) | | nb_NO | Norwegian Bokmål (Norway) |
+--------------+------------------------------------+
| nds_DE | Low German (Germany) | | nds_DE | Low German (Germany) |
+--------------+------------------------------------+
| nds_NL | Low German (Netherlands) | | nds_NL | Low German (Netherlands) |
+--------------+------------------------------------+
| ne_NP | Nepali (Nepal) | | ne_NP | Nepali (Nepal) |
+--------------+------------------------------------+
| nhn_MX | Central Nahuatl (Mexico) | | nhn_MX | Central Nahuatl (Mexico) |
+--------------+------------------------------------+
| niu_NU | Niuean (Niue) | | niu_NU | Niuean (Niue) |
+--------------+------------------------------------+
| niu_NZ | Niuean (New Zealand) | | niu_NZ | Niuean (New Zealand) |
+--------------+------------------------------------+
| nl | Dutch | | nl | Dutch |
+--------------+------------------------------------+
| nl_AW | Dutch (Aruba) | | nl_AW | Dutch (Aruba) |
+--------------+------------------------------------+
| nl_BE | Dutch (Belgium) | | nl_BE | Dutch (Belgium) |
+--------------+------------------------------------+
| nl_NL | Dutch (Netherlands) | | nl_NL | Dutch (Netherlands) |
+--------------+------------------------------------+
| nn | Norwegian Nynorsk | | nn | Norwegian Nynorsk |
+--------------+------------------------------------+
| nn_NO | Norwegian Nynorsk (Norway) | | nn_NO | Norwegian Nynorsk (Norway) |
+--------------+------------------------------------+
| nr_ZA | South Ndebele (South Africa) | | nr_ZA | South Ndebele (South Africa) |
+--------------+------------------------------------+
| nso_ZA | Pedi (South Africa) | | nso_ZA | Pedi (South Africa) |
+--------------+------------------------------------+
| oc_FR | Occitan (France) | | oc_FR | Occitan (France) |
+--------------+------------------------------------+
| om | Oromo | | om | Oromo |
+--------------+------------------------------------+
| om_ET | Oromo (Ethiopia) | | om_ET | Oromo (Ethiopia) |
+--------------+------------------------------------+
| om_KE | Oromo (Kenya) | | om_KE | Oromo (Kenya) |
+--------------+------------------------------------+
| or_IN | Oriya (India) | | or_IN | Oriya (India) |
+--------------+------------------------------------+
| os_RU | Ossetian (Russia) | | os_RU | Ossetian (Russia) |
+--------------+------------------------------------+
| pa_IN | Panjabi (India) | | pa_IN | Panjabi (India) |
+--------------+------------------------------------+
| pa_PK | Panjabi (Pakistan) | | pa_PK | Panjabi (Pakistan) |
+--------------+------------------------------------+
| pap | Papiamento | | pap | Papiamento |
+--------------+------------------------------------+
| pap_AN | Papiamento (Netherlands Antilles) | | pap_AN | Papiamento (Netherlands Antilles) |
+--------------+------------------------------------+
| pap_AW | Papiamento (Aruba) | | pap_AW | Papiamento (Aruba) |
+--------------+------------------------------------+
| pap_CW | Papiamento (Curaçao) | | pap_CW | Papiamento (Curaçao) |
+--------------+------------------------------------+
| pl | Polish | | pl | Polish |
+--------------+------------------------------------+
| pl_PL | Polish (Poland) | | pl_PL | Polish (Poland) |
+--------------+------------------------------------+
| pr | Pirate | | pr | Pirate |
+--------------+------------------------------------+
| ps_AF | Pushto (Afghanistan) | | ps_AF | Pushto (Afghanistan) |
+--------------+------------------------------------+
| pt | Portuguese | | pt | Portuguese |
+--------------+------------------------------------+
| pt_BR | Portuguese (Brazil) | | pt_BR | Portuguese (Brazil) |
+--------------+------------------------------------+
| pt_PT | Portuguese (Portugal) | | pt_PT | Portuguese (Portugal) |
+--------------+------------------------------------+
| quy_PE | Ayacucho Quechua (Peru) | | quy_PE | Ayacucho Quechua (Peru) |
+--------------+------------------------------------+
| quz_PE | Cusco Quechua (Peru) | | quz_PE | Cusco Quechua (Peru) |
+--------------+------------------------------------+
| raj_IN | Rajasthani (India) | | raj_IN | Rajasthani (India) |
+--------------+------------------------------------+
| ro | Romanian | | ro | Romanian |
+--------------+------------------------------------+
| ro_RO | Romanian (Romania) | | ro_RO | Romanian (Romania) |
+--------------+------------------------------------+
| ru | Russian | | ru | Russian |
+--------------+------------------------------------+
| ru_RU | Russian (Russia) | | ru_RU | Russian (Russia) |
+--------------+------------------------------------+
| ru_UA | Russian (Ukraine) | | ru_UA | Russian (Ukraine) |
+--------------+------------------------------------+
| rw_RW | Kinyarwanda (Rwanda) | | rw_RW | Kinyarwanda (Rwanda) |
+--------------+------------------------------------+
| sa_IN | Sanskrit (India) | | sa_IN | Sanskrit (India) |
+--------------+------------------------------------+
| sat_IN | Santali (India) | | sat_IN | Santali (India) |
+--------------+------------------------------------+
| sc_IT | Sardinian (Italy) | | sc_IT | Sardinian (Italy) |
+--------------+------------------------------------+
| sco | Scots | | sco | Scots |
+--------------+------------------------------------+
| sd_IN | Sindhi (India) | | sd_IN | Sindhi (India) |
+--------------+------------------------------------+
| se_NO | Northern Sami (Norway) | | se_NO | Northern Sami (Norway) |
+--------------+------------------------------------+
| sgs_LT | Samogitian (Lithuania) | | sgs_LT | Samogitian (Lithuania) |
+--------------+------------------------------------+
| shs_CA | Shuswap (Canada) | | shs_CA | Shuswap (Canada) |
+--------------+------------------------------------+
| sid_ET | Sidamo (Ethiopia) | | sid_ET | Sidamo (Ethiopia) |
+--------------+------------------------------------+
| si | Sinhala | | si | Sinhala |
+--------------+------------------------------------+
| si_LK | Sinhala (Sri Lanka) | | si_LK | Sinhala (Sri Lanka) |
+--------------+------------------------------------+
| sk | Slovak | | sk | Slovak |
+--------------+------------------------------------+
| sk_SK | Slovak (Slovakia) | | sk_SK | Slovak (Slovakia) |
+--------------+------------------------------------+
| sl | Slovenian | | sl | Slovenian |
+--------------+------------------------------------+
| sl_SI | Slovenian (Slovenia) | | sl_SI | Slovenian (Slovenia) |
+--------------+------------------------------------+
| so | Somali | | so | Somali |
+--------------+------------------------------------+
| so_DJ | Somali (Djibouti) | | so_DJ | Somali (Djibouti) |
+--------------+------------------------------------+
| so_ET | Somali (Ethiopia) | | so_ET | Somali (Ethiopia) |
+--------------+------------------------------------+
| so_KE | Somali (Kenya) | | so_KE | Somali (Kenya) |
+--------------+------------------------------------+
| so_SO | Somali (Somalia) | | so_SO | Somali (Somalia) |
+--------------+------------------------------------+
| son_ML | Songhai languages (Mali) | | son_ML | Songhai languages (Mali) |
+--------------+------------------------------------+
| sq | Albanian | | sq | Albanian |
+--------------+------------------------------------+
| sq_AL | Albanian (Albania) | | sq_AL | Albanian (Albania) |
+--------------+------------------------------------+
| sq_KV | Albanian (Kosovo) | | sq_KV | Albanian (Kosovo) |
+--------------+------------------------------------+
| sq_MK | Albanian (Macedonia) | | sq_MK | Albanian (Macedonia) |
+--------------+------------------------------------+
| sr | Serbian | | sr | Serbian |
+--------------+------------------------------------+
| sr_Cyrl | Serbian (Cyrillic) | | sr_Cyrl | Serbian (Cyrillic) |
+--------------+------------------------------------+
| sr_Latn | Serbian (Latin) | | sr_Latn | Serbian (Latin) |
+--------------+------------------------------------+
| sr_ME | Serbian (Montenegro) | | sr_ME | Serbian (Montenegro) |
+--------------+------------------------------------+
| sr_RS | Serbian (Serbia) | | sr_RS | Serbian (Serbia) |
+--------------+------------------------------------+
| ss_ZA | Swati (South Africa) | | ss_ZA | Swati (South Africa) |
+--------------+------------------------------------+
| st_ZA | Southern Sotho (South Africa) | | st_ZA | Southern Sotho (South Africa) |
+--------------+------------------------------------+
| sv | Swedish | | sv | Swedish |
+--------------+------------------------------------+
| sv_FI | Swedish (Finland) | | sv_FI | Swedish (Finland) |
+--------------+------------------------------------+
| sv_SE | Swedish (Sweden) | | sv_SE | Swedish (Sweden) |
+--------------+------------------------------------+
| sw_KE | Swahili (Kenya) | | sw_KE | Swahili (Kenya) |
+--------------+------------------------------------+
| sw_TZ | Swahili (Tanzania) | | sw_TZ | Swahili (Tanzania) |
+--------------+------------------------------------+
| szl_PL | Silesian (Poland) | | szl_PL | Silesian (Poland) |
+--------------+------------------------------------+
| ta | Tamil | | ta | Tamil |
+--------------+------------------------------------+
| ta_IN | Tamil (India) | | ta_IN | Tamil (India) |
+--------------+------------------------------------+
| ta_LK | Tamil (Sri Lanka) | | ta_LK | Tamil (Sri Lanka) |
+--------------+------------------------------------+
| tcy_IN | Tulu (India) | | tcy_IN | Tulu (India) |
+--------------+------------------------------------+
| te | Telugu | | te | Telugu |
+--------------+------------------------------------+
| te_IN | Telugu (India) | | te_IN | Telugu (India) |
+--------------+------------------------------------+
| tg_TJ | Tajik (Tajikistan) | | tg_TJ | Tajik (Tajikistan) |
+--------------+------------------------------------+
| the_NP | Chitwania Tharu (Nepal) | | the_NP | Chitwania Tharu (Nepal) |
+--------------+------------------------------------+
| th | Thai | | th | Thai |
+--------------+------------------------------------+
| th_TH | Thai (Thailand) | | th_TH | Thai (Thailand) |
+--------------+------------------------------------+
| ti | Tigrinya | | ti | Tigrinya |
+--------------+------------------------------------+
| ti_ER | Tigrinya (Eritrea) | | ti_ER | Tigrinya (Eritrea) |
+--------------+------------------------------------+
| ti_ET | Tigrinya (Ethiopia) | | ti_ET | Tigrinya (Ethiopia) |
+--------------+------------------------------------+
| tig_ER | Tigre (Eritrea) | | tig_ER | Tigre (Eritrea) |
+--------------+------------------------------------+
| tk_TM | Turkmen (Turkmenistan) | | tk_TM | Turkmen (Turkmenistan) |
+--------------+------------------------------------+
| tl_PH | Tagalog (Philippines) | | tl_PH | Tagalog (Philippines) |
+--------------+------------------------------------+
| tn_ZA | Tswana (South Africa) | | tn_ZA | Tswana (South Africa) |
+--------------+------------------------------------+
| tr | Turkish | | tr | Turkish |
+--------------+------------------------------------+
| tr_CY | Turkish (Cyprus) | | tr_CY | Turkish (Cyprus) |
+--------------+------------------------------------+
| tr_TR | Turkish (Turkey) | | tr_TR | Turkish (Turkey) |
+--------------+------------------------------------+
| ts_ZA | Tsonga (South Africa) | | ts_ZA | Tsonga (South Africa) |
+--------------+------------------------------------+
| tt_RU | Tatar (Russia) | | tt_RU | Tatar (Russia) |
+--------------+------------------------------------+
| ug_CN | Uighur (China) | | ug_CN | Uighur (China) |
+--------------+------------------------------------+
| uk | Ukrainian | | uk | Ukrainian |
+--------------+------------------------------------+
| uk_UA | Ukrainian (Ukraine) | | uk_UA | Ukrainian (Ukraine) |
+--------------+------------------------------------+
| unm_US | Unami (United States) | | unm_US | Unami (United States) |
+--------------+------------------------------------+
| ur | Urdu | | ur | Urdu |
+--------------+------------------------------------+
| ur_IN | Urdu (India) | | ur_IN | Urdu (India) |
+--------------+------------------------------------+
| ur_PK | Urdu (Pakistan) | | ur_PK | Urdu (Pakistan) |
+--------------+------------------------------------+
| uz | Uzbek | | uz | Uzbek |
+--------------+------------------------------------+
| uz_UZ | Uzbek (Uzbekistan) | | uz_UZ | Uzbek (Uzbekistan) |
+--------------+------------------------------------+
| ve_ZA | Venda (South Africa) | | ve_ZA | Venda (South Africa) |
+--------------+------------------------------------+
| vi | Vietnamese | | vi | Vietnamese |
+--------------+------------------------------------+
| vi_VN | Vietnamese (Vietnam) | | vi_VN | Vietnamese (Vietnam) |
+--------------+------------------------------------+
| wa_BE | Walloon (Belgium) | | wa_BE | Walloon (Belgium) |
+--------------+------------------------------------+
| wae_CH | Walser (Switzerland) | | wae_CH | Walser (Switzerland) |
+--------------+------------------------------------+
| wal_ET | Wolaytta (Ethiopia) | | wal_ET | Wolaytta (Ethiopia) |
+--------------+------------------------------------+
| wo_SN | Wolof (Senegal) | | wo_SN | Wolof (Senegal) |
+--------------+------------------------------------+
| xh_ZA | Xhosa (South Africa) | | xh_ZA | Xhosa (South Africa) |
+--------------+------------------------------------+
| yi_US | Yiddish (United States) | | yi_US | Yiddish (United States) |
+--------------+------------------------------------+
| yo_NG | Yoruba (Nigeria) | | yo_NG | Yoruba (Nigeria) |
+--------------+------------------------------------+
| yue_HK | Yue Chinese (Hong Kong) | | yue_HK | Yue Chinese (Hong Kong) |
+--------------+------------------------------------+
| zh | Chinese | | zh | Chinese |
+--------------+------------------------------------+
| zh_CN | Chinese (China) | | zh_CN | Chinese (China) |
+--------------+------------------------------------+
| zh_HK | Chinese (Hong Kong) | | zh_HK | Chinese (Hong Kong) |
+--------------+------------------------------------+
| zh_SG | Chinese (Singapore) | | zh_SG | Chinese (Singapore) |
+--------------+------------------------------------+
| zh_TW | Chinese (Taiwan) | | zh_TW | Chinese (Taiwan) |
+--------------+------------------------------------+
| zu_ZA | Zulu (South Africa) | | zu_ZA | Zulu (South Africa) |
+--------------+------------------------------------+

View File

@ -1,10 +1,8 @@
Creating Android plugins # Creating Android plugins
========================
Introduction ## Introduction
------------
Android plugins are powerful tools to extend the capabilities of the Pandemonium engine Android plugins are powerful tools to extend the capabilities of the Pandemonium engine
by tapping into the functionality provided by the Android platform and ecosystem. by tapping into the functionality provided by the Android platform and ecosystem.
@ -29,8 +27,7 @@ and capabilities that don't belong to the core feature set of a game engine:
- Posting to Facebook, Twitter, etc. - Posting to Facebook, Twitter, etc.
- Push notifications - Push notifications
Android plugin ## Android plugin
--------------
While introduced in Pandemonium 3.2, the Android plugin system got a significant architecture update starting with Pandemonium 3.2.2. While introduced in Pandemonium 3.2, the Android plugin system got a significant architecture update starting with Pandemonium 3.2.2.
The new plugin system is backward-incompatible with the previous one, but both systems are kept functional in future releases of the 3.2.x branch. The new plugin system is backward-incompatible with the previous one, but both systems are kept functional in future releases of the 3.2.x branch.
@ -46,8 +43,7 @@ with the following caveats:
- The library must have a dependency on the Pandemonium engine library (`pandemonium-lib.<version>.<status>.aar`). A stable version is made available for each Pandemonium release on the `Pandemonium download page ( https://pandemoniumengine.org/download )`. - The library must have a dependency on the Pandemonium engine library (`pandemonium-lib.<version>.<status>.aar`). A stable version is made available for each Pandemonium release on the `Pandemonium download page ( https://pandemoniumengine.org/download )`.
- The library must include a specifically configured `<meta-data )` tag in its manifest file. - The library must include a specifically configured `<meta-data )` tag in its manifest file.
Building an Android plugin #### Building an Android plugin
^^^^^^^^^^^^^^^^^^^^^^^^^^
**Prerequisite:** `Android Studio ( https://developer.android.com/studio )` is strongly recommended as the IDE to use to create Android plugins. **Prerequisite:** `Android Studio ( https://developer.android.com/studio )` is strongly recommended as the IDE to use to create Android plugins.
The instructions below assumes that you're using Android Studio. The instructions below assumes that you're using Android Studio.
@ -122,8 +118,7 @@ The instructions below assumes that you're using Android Studio.
- **remote**: contains a list of remote binary gradle dependencies for the plugin. - **remote**: contains a list of remote binary gradle dependencies for the plugin.
- **custom_maven_repos**: contains a list of URLs specifying the custom maven repositories required for the plugin's dependencies. - **custom_maven_repos**: contains a list of URLs specifying the custom maven repositories required for the plugin's dependencies.
Loading and using an Android plugin #### Loading and using an Android plugin
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Move the plugin configuration file (e.g.: `MyPlugin.gdap`) and, if any, its local binary (e.g.: `MyPlugin.aar`) and dependencies to the Pandemonium project's `res://android/plugins` directory. Move the plugin configuration file (e.g.: `MyPlugin.gdap`) and, if any, its local binary (e.g.: `MyPlugin.aar`) and dependencies to the Pandemonium project's `res://android/plugins` directory.
@ -140,8 +135,7 @@ From your script:
``` ```
Bundling GDNative resources #### Bundling GDNative resources
^^^^^^^^^^^^^^^^^^^^^^^^^^^
An Android plugin can define and provide C/C++ GDNative resources, either to provide and/or access functionality from the game logic. An Android plugin can define and provide C/C++ GDNative resources, either to provide and/or access functionality from the game logic.
The GDNative resources can be bundled within the plugin `aar` file which simplifies the distribution and deployment process: The GDNative resources can be bundled within the plugin `aar` file which simplifies the distribution and deployment process:
@ -154,19 +148,16 @@ For GDNative libraries, the plugin singleton object must override the `org.pande
and return the paths to the bundled GDNative libraries config files (`*.gdnlib`). The paths must be relative to the `assets` directory. and return the paths to the bundled GDNative libraries config files (`*.gdnlib`). The paths must be relative to the `assets` directory.
At runtime, the plugin will provide these paths to Pandemonium core which will use them to load and initialize the bundled GDNative libraries. At runtime, the plugin will provide these paths to Pandemonium core which will use them to load and initialize the bundled GDNative libraries.
Reference implementations #### Reference implementations
^^^^^^^^^^^^^^^^^^^^^^^^^
- `Pandemonium Oculus Mobile plugin ( https://github.com/PandemoniumVR/pandemonium_oculus_mobile )` - `Pandemonium Oculus Mobile plugin ( https://github.com/PandemoniumVR/pandemonium_oculus_mobile )`
- `Bundled gdnative resources ( https://github.com/PandemoniumVR/pandemonium_oculus_mobile/tree/master/plugin/src/main/assets/addons/pandemonium_ovrmobile )` - `Bundled gdnative resources ( https://github.com/PandemoniumVR/pandemonium_oculus_mobile/tree/master/plugin/src/main/assets/addons/pandemonium_ovrmobile )`
- `Pandemonium Google Play Billing plugin ( https://github.com/Relintai/pandemonium_engine-google-play-billing )` - `Pandemonium Google Play Billing plugin ( https://github.com/Relintai/pandemonium_engine-google-play-billing )`
Troubleshooting ## Troubleshooting
---------------
Pandemonium crashes upon load #### Pandemonium crashes upon load
^^^^^^^^^^^^^^^^^^^^^^^
Check `adb logcat` for possible problems, then: Check `adb logcat` for possible problems, then:

View File

@ -1,7 +1,6 @@
Android in-app purchases # Android in-app purchases
========================
Pandemonium offers a first-party `PandemoniumGooglePlayBilling` Android plugin since Pandemonium 3.2.2. Pandemonium offers a first-party `PandemoniumGooglePlayBilling` Android plugin since Pandemonium 3.2.2.
The new plugin uses the `Google Play Billing library ( https://developer.android.com/google/play/billing )` The new plugin uses the `Google Play Billing library ( https://developer.android.com/google/play/billing )`
@ -11,13 +10,11 @@ If you learn better by looking at an example, you can find the demo project
`here ( https://github.com/Relintai/pandemonium_engine-demo-projects/tree/master/mobile/android_iap )`. `here ( https://github.com/Relintai/pandemonium_engine-demo-projects/tree/master/mobile/android_iap )`.
Migrating from Pandemonium 3.2.1 and lower (PandemoniumPaymentsV3) ## Migrating from Pandemonium 3.2.1 and lower (PandemoniumPaymentsV3)
------------------------------------------------------
The new `PandemoniumGooglePlayBilling` API is not compatible with its predecessor `PandemoniumPaymentsV3`. The new `PandemoniumGooglePlayBilling` API is not compatible with its predecessor `PandemoniumPaymentsV3`.
Changes #### Changes
*******
- You need to enable the Custom Build option in your Android export settings and install - You need to enable the Custom Build option in your Android export settings and install
the `PandemoniumGooglePlayBilling` plugin manually (see below for details) the `PandemoniumGooglePlayBilling` plugin manually (see below for details)
@ -28,11 +25,9 @@ Changes
- Signals (no polling or callback objects) - Signals (no polling or callback objects)
Usage ## Usage
-----
Getting started #### Getting started
***************
If not already done, make sure you have enabled and successfully set up `Android Custom Builds ( doc_android_custom_build )`. If not already done, make sure you have enabled and successfully set up `Android Custom Builds ( doc_android_custom_build )`.
Grab the`PandemoniumGooglePlayBilling` plugin binary and config from the `releases page ( https://github.com/Relintai/pandemonium_engine-google-play-billing/releases )` Grab the`PandemoniumGooglePlayBilling` plugin binary and config from the `releases page ( https://github.com/Relintai/pandemonium_engine-google-play-billing/releases )`
@ -40,8 +35,7 @@ and put both into `res://android/plugins`.
The plugin should now show up in the Android export settings, where you can enable it. The plugin should now show up in the Android export settings, where you can enable it.
Getting started #### Getting started
***************
To use the `PandemoniumGooglePlayBilling` API you first have to get the `PandemoniumGooglePlayBilling` To use the `PandemoniumGooglePlayBilling` API you first have to get the `PandemoniumGooglePlayBilling`
singleton and start the connection: singleton and start the connection:
@ -75,8 +69,7 @@ singleton and start the connection:
All API methods only work if the API is connected. You can use `payment.isReady()` to check the connection status. All API methods only work if the API is connected. You can use `payment.isReady()` to check the connection status.
Querying available items #### Querying available items
************************
As soon as the API is connected, you can query SKUs using `querySkuDetails`. As soon as the API is connected, you can query SKUs using `querySkuDetails`.
@ -92,8 +85,7 @@ Full example:
``` ```
Purchase an item #### Purchase an item
****************
To initiate the purchase flow for an item, call `purchase`. To initiate the purchase flow for an item, call `purchase`.
You **must** query the SKU details for an item before you can You **must** query the SKU details for an item before you can
@ -117,8 +109,7 @@ Then, wait for the `on_purchases_updated` callback and handle the purchase resul
``` ```
Check if the user purchased an item #### Check if the user purchased an item
***********************************
To get all purchases, call `queryPurchases`. Unlike most of the other functions, `queryPurchases` is To get all purchases, call `queryPurchases`. Unlike most of the other functions, `queryPurchases` is
a synchronous operation and returns a `Dictionary` with a status code a synchronous operation and returns a `Dictionary` with a status code
@ -138,8 +129,7 @@ Full example:
``` ```
Consumables #### Consumables
***********
If your in-app item is not a one-time purchase but a consumable item (e.g. coins) which can be purchased If your in-app item is not a one-time purchase but a consumable item (e.g. coins) which can be purchased
multiple times, you can consume an item by calling `consumePurchase` with a purchase token. multiple times, you can consume an item by calling `consumePurchase` with a purchase token.
@ -157,8 +147,7 @@ Consuming a product allows the user to purchase it again, and removes it from ap
# Or wait for the _on_purchase_consumed callback before giving the user what they bought # Or wait for the _on_purchase_consumed callback before giving the user what they bought
``` ```
Subscriptions #### Subscriptions
*************
Subscriptions don't work much different from regular in-app items. Just use `"subs"` as second Subscriptions don't work much different from regular in-app items. Just use `"subs"` as second
argument to `querySkuDetails` to get subscription details. argument to `querySkuDetails` to get subscription details.

View File

@ -1,14 +1,12 @@
Creating iOS plugins # Creating iOS plugins
====================
This page explains what iOS plugins can do for you, how to use an existing plugin, and the steps to code a new one. This page explains what iOS plugins can do for you, how to use an existing plugin, and the steps to code a new one.
iOS plugins allow you to use third-party libraries and support iOS-specific features like In-App Purchases, GameCenter integration, ARKit support, and more. iOS plugins allow you to use third-party libraries and support iOS-specific features like In-App Purchases, GameCenter integration, ARKit support, and more.
Loading and using an existing plugin ## Loading and using an existing plugin
------------------------------------
An iOS plugin requires a `.gdip` configuration file, a binary file which can be either `.a` static library or `.xcframework` containing `.a` static libraries, and possibly other dependencies. To use it, you need to: An iOS plugin requires a `.gdip` configuration file, a binary file which can be either `.a` static library or `.xcframework` containing `.a` static libraries, and possibly other dependencies. To use it, you need to:
@ -28,8 +26,7 @@ When a plugin is active, you can access it in your using `Engine.get_singleton()
print(singleton.foo()) print(singleton.foo())
``` ```
Creating an iOS plugin #### Creating an iOS plugin
----------------------
At its core, a Pandemonium iOS plugin is an iOS library (*.a* archive file or *.xcframework* containing static libraries) with the following requirements: At its core, a Pandemonium iOS plugin is an iOS library (*.a* archive file or *.xcframework* containing static libraries) with the following requirements:

View File

@ -1,7 +1,6 @@
Plugins for iOS # Plugins for iOS
===============
Pandemonium provides StoreKit, GameCenter, iCloud services and other plugins. Pandemonium provides StoreKit, GameCenter, iCloud services and other plugins.
They are using same model of asynchronous calls explained below. They are using same model of asynchronous calls explained below.
@ -10,8 +9,7 @@ ARKit and Camera access are also provided as plugins.
Latest updates, documentation and source code can be found at `Pandemonium iOS plugins repository ( https://github.com/Relintai/pandemonium_engine-ios-plugins )` Latest updates, documentation and source code can be found at `Pandemonium iOS plugins repository ( https://github.com/Relintai/pandemonium_engine-ios-plugins )`
Accessing plugin singletons ## Accessing plugin singletons
---------------------------
To access plugin functionality, you first need to check that the plugin is To access plugin functionality, you first need to check that the plugin is
exported and available by calling the `Engine.has_singleton()` function, which exported and available by calling the `Engine.has_singleton()` function, which
@ -36,8 +34,7 @@ Here's an example of how to do this in GDScript:
``` ```
Asynchronous methods ## Asynchronous methods
--------------------
When requesting an asynchronous operation, the method will look like When requesting an asynchronous operation, the method will look like
this: this:
@ -87,8 +84,7 @@ The pending event interface consists of two methods:
- `Variant pop_pending_event()` - `Variant pop_pending_event()`
Pops the first event from the queue and returns it. Pops the first event from the queue and returns it.
Store Kit ## Store Kit
---------
Implemented in `Pandemonium iOS InAppStore plugin ( https://github.com/Relintai/pandemonium_engine-ios-plugins/blob/master/plugins/inappstore/in_app_store.mm )`. Implemented in `Pandemonium iOS InAppStore plugin ( https://github.com/Relintai/pandemonium_engine-ios-plugins/blob/master/plugins/inappstore/in_app_store.mm )`.
@ -112,15 +108,13 @@ The following methods are available and documented below:
Variant pop_pending_event() Variant pop_pending_event()
``` ```
`purchase` ### `purchase`
~~~~~~~~~~~~
Purchases a product ID through the Store Kit API. You have to call `finish_transaction(product_id)` once you Purchases a product ID through the Store Kit API. You have to call `finish_transaction(product_id)` once you
receive a successful response or call `set_auto_finish_transaction(true)` prior to calling `purchase()`. receive a successful response or call `set_auto_finish_transaction(true)` prior to calling `purchase()`.
These two methods ensure the transaction is completed. These two methods ensure the transaction is completed.
Parameters #### Parameters
^^^^^^^^^^
Takes a dictionary as a parameter, with one field, `product_id`, a Takes a dictionary as a parameter, with one field, `product_id`, a
string with your product ID. Example: string with your product ID. Example:
@ -129,8 +123,7 @@ string with your product ID. Example:
var result = in_app_store.purchase({ "product_id": "my_product" }) var result = in_app_store.purchase({ "product_id": "my_product" })
``` ```
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -154,13 +147,11 @@ On success:
} }
``` ```
`request_product_info` ### `request_product_info`
~~~~~~~~~~~~~~~~~~~~~~~~
Requests the product info on a list of product IDs. Requests the product info on a list of product IDs.
Parameters #### Parameters
^^^^^^^^^^
Takes a dictionary as a parameter, with a single `product_ids` key to which a Takes a dictionary as a parameter, with a single `product_ids` key to which a
string array of product IDs is assigned. Example: string array of product IDs is assigned. Example:
@ -169,8 +160,7 @@ string array of product IDs is assigned. Example:
var result = in_app_store.request_product_info({ "product_ids": ["my_product1", "my_product2"] }) var result = in_app_store.request_product_info({ "product_ids": ["my_product1", "my_product2"] })
``` ```
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -187,14 +177,12 @@ The response event will be a dictionary with the following fields:
} }
``` ```
`restore_purchases` ### `restore_purchases`
~~~~~~~~~~~~~~~~~~~~~
Restores previously made purchases on user's account. This will create Restores previously made purchases on user's account. This will create
response events for each previously purchased product ID. response events for each previously purchased product ID.
Response event #### Response event
^^^^^^^^^^^^^^
The response events will be dictionaries with the following fields: The response events will be dictionaries with the following fields:
@ -206,14 +194,12 @@ The response events will be dictionaries with the following fields:
} }
``` ```
`set_auto_finish_transaction` ### `set_auto_finish_transaction`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If set to `true`, once a purchase is successful, your purchase will be If set to `true`, once a purchase is successful, your purchase will be
finalized automatically. Call this method prior to calling `purchase()`. finalized automatically. Call this method prior to calling `purchase()`.
Parameters #### Parameters
^^^^^^^^^^
Takes a boolean as a parameter which specifies if purchases should be Takes a boolean as a parameter which specifies if purchases should be
automatically finalized. Example: automatically finalized. Example:
@ -222,15 +208,13 @@ automatically finalized. Example:
in_app_store.set_auto_finish_transaction(true) in_app_store.set_auto_finish_transaction(true)
``` ```
`finish_transaction` ### `finish_transaction`
~~~~~~~~~~~~~~~~~~~~~~
If you don't want transactions to be automatically finalized, call this If you don't want transactions to be automatically finalized, call this
method after you receive a successful purchase response. method after you receive a successful purchase response.
Parameters #### Parameters
^^^^^^^^^^
Takes a string `product_id` as an argument. `product_id` specifies what product to Takes a string `product_id` as an argument. `product_id` specifies what product to
finalize the purchase on. Example: finalize the purchase on. Example:
@ -239,8 +223,7 @@ finalize the purchase on. Example:
in_app_store.finish_transaction("my_product1") in_app_store.finish_transaction("my_product1")
``` ```
Game Center ## Game Center
-----------
Implemented in `Pandemonium iOS GameCenter plugin ( https://github.com/Relintai/pandemonium_engine-ios-plugins/blob/master/plugins/gamecenter/game_center.mm )`. Implemented in `Pandemonium iOS GameCenter plugin ( https://github.com/Relintai/pandemonium_engine-ios-plugins/blob/master/plugins/gamecenter/game_center.mm )`.
@ -266,13 +249,11 @@ and the pending events interface:
Variant pop_pending_event() Variant pop_pending_event()
``` ```
`authenticate` ### `authenticate`
~~~~~~~~~~~~~~~~
Authenticates a user in Game Center. Authenticates a user in Game Center.
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -297,13 +278,11 @@ On success:
} }
``` ```
`post_score` ### `post_score`
~~~~~~~~~~~~~~
Posts a score to a Game Center leaderboard. Posts a score to a Game Center leaderboard.
Parameters #### Parameters
^^^^^^^^^^
Takes a dictionary as a parameter, with two fields: Takes a dictionary as a parameter, with two fields:
@ -316,8 +295,7 @@ Example:
var result = game_center.post_score({ "score": 100, "category": "my_leaderboard", }) var result = game_center.post_score({ "score": 100, "category": "my_leaderboard", })
``` ```
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -341,13 +319,11 @@ On success:
} }
``` ```
`award_achievement` ### `award_achievement`
~~~~~~~~~~~~~~~~~~~~~
Modifies the progress of a Game Center achievement. Modifies the progress of a Game Center achievement.
Parameters #### Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with 3 fields: Takes a Dictionary as a parameter, with 3 fields:
@ -363,8 +339,7 @@ Example:
var result = award_achievement({ "name": "hard_mode_completed", "progress": 6.1 }) var result = award_achievement({ "name": "hard_mode_completed", "progress": 6.1 })
``` ```
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -387,13 +362,11 @@ On success:
} }
``` ```
`reset_achievements` ### `reset_achievements`
~~~~~~~~~~~~~~~~~~~~~~
Clears all Game Center achievements. The function takes no parameters. Clears all Game Center achievements. The function takes no parameters.
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -416,14 +389,12 @@ On success:
} }
``` ```
`request_achievements` ### `request_achievements`
~~~~~~~~~~~~~~~~~~~~~~~~
Request all the Game Center achievements the player has made progress Request all the Game Center achievements the player has made progress
on. The function takes no parameters. on. The function takes no parameters.
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -448,14 +419,12 @@ On success:
} }
``` ```
`request_achievement_descriptions` ### `request_achievement_descriptions`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Request the descriptions of all existing Game Center achievements Request the descriptions of all existing Game Center achievements
regardless of progress. The function takes no parameters. regardless of progress. The function takes no parameters.
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -485,14 +454,12 @@ On success:
} }
``` ```
`show_game_center` ### `show_game_center`
~~~~~~~~~~~~~~~~~~~~
Displays the built in Game Center overlay showing leaderboards, Displays the built in Game Center overlay showing leaderboards,
achievements, and challenges. achievements, and challenges.
Parameters #### Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with two fields: Takes a Dictionary as a parameter, with two fields:
@ -511,8 +478,7 @@ Examples:
var result = show_game_center({ "view": "achievements" }) var result = show_game_center({ "view": "achievements" })
``` ```
Response event #### Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields: The response event will be a dictionary with the following fields:
@ -525,8 +491,7 @@ On close:
} }
``` ```
Multi-platform games ### Multi-platform games
--------------------
When working on a multi-platform game, you won't always have the When working on a multi-platform game, you won't always have the
"GameCenter" singleton available (for example when running on PC or "GameCenter" singleton available (for example when running on PC or

View File

@ -1,11 +0,0 @@
HTML5
=====
.. toctree::
:maxdepth: 1
:name: toc-learn-features-platform-html5
html5_shell_classref
customizing_html5_shell