- 1 ISO Codes in KDE
- 2 Translation Problems
- 3 ISO 3166 Country Code
- 4 ISO 4217 Currency Codes
- 5 ISO 3166-2 Country Subdivision Code
- 6 ISO xxx Language Codes
ISO Codes in KDE
KDE uses ISO standard codes in a number of places, primarily the Country Code, Language Code and Currency Code in KLocale. Currently KDE maintains our own data files for these codes and our own translations which imposes a maintenance burden to keep the codes and translations up to date.
The Debian iso-codes project maintains a package that includes xml files of various ISO Codes and translations for them in po files. This project is well maintained and regularly updated and is used by many projects and distro's for this. It might make sense to adopt iso-codes as the source for our codes and translations, this page investigates this possibility.
TODO: find if official part of MeeGo architecture, is in meego core repository
The iso-codes package is 1.1Mb for the data files and 10.3MB for the translation files, however these are often installed anyway. This compares to KDE requiring approx 2MB for Country and Currency data and translations, albeit for a far smaller set of codes and strings.
If the problems involved in migrating to iso-codes cannot be resolved, then we could migrate to our own xml file format as a new kdesupport project which could attract external use and help in maintenance.
One advantage to switching from kde-runtime to a separate library is that we could change the underlying library used for each platform, i.e. if a particular platform already supplies the ISO codes in their own package or library we could use that instead of iso-codes.
iso-codes ships a a varying number of languages for each different ISO Code each of which is translated to varying degrees. In total they ship 96 languages consisting of 62 languages actively maintained in the Translation Project (TP), 8 languages actively maintained outside TP, and 26 unmaintained languages. Of these, 24 are not supported by KDE, 15 of which are also unmaintained by iso-codes, although it appears many of these were copied from KDE3.
There are 17 KDE languages that are not translated by iso-codes, only 6 of which KDE have never shipped.
Full details are provided below and in the translations spreadsheet attached.
We cannot switch until we are sure that translations will not regress. We need to ensure all shipping or near-shipping KDE languages are fully supported by iso-codes to our high standards. This will likely require the KDE translators to donate translations to iso-codes where necessary and possibly agree to maintain the translations where iso-codes does not currently have a team.
No paperwork is required to submit translations to iso-codes on TP, and a number of KDE translators are already active there. It is not know where the external translations are hosted or what rules may apply.
ISO 3166 Country Code
The iso-codes ISO 3166 file contains two sections of the ISO Country Code standard:
The ISO 3166-2 Country Subdivision Codes are packaged and addressed separately below.
KDE derives the ISO Country Codes and names from the KDE Locale (l10n) settings files. As such if KDE doesn't support a given country locale then we don't know the country code or have a translation for it. This is fine for our Localization module but renders the support incomplete for any other purposes. The code are accessed via api in KLocale.
The iso-codes xml format provides for the three different code types (alpha2, alpha3 and numeric) and both official and unofficial/common names of a country.
The iso-codes project xml format is as follows:
<!DOCTYPE iso_3166_entries [ <!ELEMENT iso_3166_entries (iso_3166_entry+, iso_3166_3_entry*)> <!ELEMENT iso_3166_entry EMPTY> <!ATTLIST iso_3166_entry alpha_2_code CDATA #REQUIRED alpha_3_code CDATA #REQUIRED numeric_code CDATA #REQUIRED common_name CDATA #IMPLIED name CDATA #REQUIRED official_name CDATA #IMPLIED > <!ELEMENT iso_3166_3_entry EMPTY> <!ATTLIST iso_3166_3_entry alpha_4_code CDATA #REQUIRED alpha_3_code CDATA #REQUIRED numeric_code CDATA #IMPLIED date_withdrawn CDATA #IMPLIED names CDATA #REQUIRED comment CDATA #IMPLIED > ]>
Some example entries are:
<iso_3166_entry alpha_2_code="AF" alpha_3_code="AFG" numeric_code="004" name="Afghanistan" official_name="Islamic Republic of Afghanistan" />
<iso_3166_3_entry alpha_4_code="YUCS" alpha_3_code="YUG" numeric_code="891" date_withdrawn="1993-07-28" names="Yugoslavia, Socialist Federal Republic of" />
It's little hard directly comparing translations stats as iso-codes include official, unofficial and former names, whereas KDE only has unofficial names which are mixed into 1 file with other translations. It is instead assumed a 100% rate for all shipped or recently shipped KDE languages.
The base iso-codes xml file is in standard US English.
Version 3.25 of iso-codes ships with 96 translations files for ISO 3166, 62 languages are translated via The Translation Project, 8 are externally hosted and 26 are apparently unmaintained. At least 72% of the languages are 90% to 100% complete, with a further 7% at least 75% complete.
- KDE 4.6 shipped 53 languages, 5 of which are not shipped by iso-codes 3166
- Previous KDE4 versions shipped 17 other languages, 6 of which are not in iso-codes 3166
- KDE has 19 other languages that have not yet shipped, 6 of which are not in iso-codes 3166
- In total KDE4 has 89 languages, 29 of which are not in iso-codes 3166
- iso-codes has 24 languages that KDE does not have
iso-codes Change Required
May need to review unofficial names to see if close enough match to ours.
KDE Changes Required
- Add KLocale::countryCodes() that returns a QList<QString> of all Country Codes loaded from the iso-codes xml file. Returns correct uppercase format.
- Add KLocale::countryName() taking a country code, name type (official/unofficial name) to return, and a language code to translate into. Default values to return current locale country name in informal format for current language. Loads name translations from the iso-codes .po files
- Add KLocale::countryNames() that returns a QHash<QString,QString> of all Country Codes and their Names in requested format and language.
- Add KLocale::localeCountryCodes() to call allCountriesList()
- Mark KLocale::allCountriesList() as deprecated.
- Modify KLocale::countryCodeToName() to call countryName(). Mark as deprecated.
- Modify kde-runtime/l10n/ *.desktop files to remove the Name field and their translations. Possibly rename from .desktop to .locale or similar if doesn't break some implied API guarantee. Possibly move to different repo and install location with better name?
Alternatively add a KCountryCode class similar to KCurrencyCode to embed all the details, could use for the level 2 names as well?
Country Code Format Conversion
A number of apps in KDE may need to convert between the different code formats, i.e. EXIV2 stores the country code using the Alpha3 code. As the iso-codes file provides all the code formats we can provide conversion tools. We can either add an extra parm to all the country code api calls to allow any code format to be used, but I think this would just confuse issues. We should stick with a single format as standard, and just provide a single api call to convert the codes.
ISO 4217 Currency Codes
KDE provides far more details and translations than iso-codes, to adopt iso-codes would require iso-codes to make considerable changes.
KDE supports the following fields for all currencies except a few obsolete currencies.
CurrencyCodeIsoAlpha3 = NZD CurrencyCodeIsoNumeric3 = 554 Name = New Zealand Dollar CurrencyNameIso = New Zealand Dollar CurrencyUnitSymbols = $,NZ$,NZD CurrencyUnitSymbolDefault = $ CurrencyUnitSymbolUnambiguous = NZ$ CurrencyUnitSingular = dollar CurrencyUnitPlural = dollars CurrencySubunitSymbol = c CurrencySubunitSingular = cent CurrencySubunitPlural = cents CurrencyIntroducedDate = 1967-07-10 CurrencySuspendedDate = CurrencyWithdrawnDate = CurrencySubunits = 1 CurrencySubunitsInCirculation = true CurrencySubunitsPerUnit = 100 CurrencyDecimalPlacesDisplay = 2 CurrencyCountriesInUse = NZ,CK,NU,PN,TK
The only translated field is Name.
The Unit and Subunit name fields are not currently used by the API as we hit issues around translations and plural forms when mixing units and subunits. I'm exploring an alternative plan.
The iso-codes xml format provides for the Alpha3 and Numeric Code and the official ISO Currency Name. Note that this ISO Name is inconsistent, it may not include the country name and may even not be in English.
The iso-codes project xml format is as follows:
<!DOCTYPE iso_4217_entries [ <!ELEMENT iso_4217_entries (iso_4217_entry+, historic_iso_4217_entry*)> <!ELEMENT iso_4217_entry EMPTY> <!ATTLIST iso_4217_entry letter_code CDATA #REQUIRED numeric_code CDATA #IMPLIED currency_name CDATA #REQUIRED > <!ELEMENT historic_iso_4217_entry EMPTY> <!ATTLIST historic_iso_4217_entry letter_code CDATA #REQUIRED numeric_code CDATA #IMPLIED currency_name CDATA #REQUIRED date_withdrawn CDATA #REQUIRED > ]>
Some example entries are:
<iso_4217_entry letter_code="NZD" numeric_code="554" currency_name="New Zealand Dollar" />
<iso_4217_entry letter_code="ALL" numeric_code="008" currency_name="Lek" />
<iso_4217_entry letter_code="UYU" numeric_code="858" currency_name="Peso Uruguayo" />
<historic_iso_4217_entry letter_code="YUN" numeric_code="890" currency_name="Yugoslavian Dinar" date_withdrawn="1995-11" />
It's little hard directly comparing translations stats as iso-codes includes the official ISO name, whereas KDE only has our own adjectival form names which are mixed into 1 file with other translations. It is instead assumed a 100% rate for all shipped or recently shipped KDE languages.
The base iso-codes xml file is mostly in standard US English, but some names are in the local language.
Version 3.25 of iso-codes ships with 42 translations files for ISO 4217, 33 languages are translated via The Translation Project, 7 are externally hosted and 2 are apparently unmaintained. At least 52% of the languages are 90% to 100% complete, with a further 2% at least 75% complete.
- KDE 4.6 shipped 53 languages, 18 of which are not shipped by iso-codes 4217
- Previous KDE4 versions shipped 17 other languages, 1 of which are not in iso-codes 4217
- KDE has 19 other languages that have not yet shipped, 16 of which are not in iso-codes 4217
- In total KDE4 has 89 languages, 35 of which are not in iso-codes 4217
- iso-codes has 3 languages that KDE does not have
iso-codes Change Required
- Add all KDE required fields
- Add all KDE required languages and translations
KDE Changes Required
- Change KCurrencyCode to load all details from iso-codes xml
- Delete .desktop files
ISO 3166-2 Country Subdivision Code
The iso-codes file for ISO 3166-2 contains one section of the ISO Country Code standard:
KDE does not currently support the Level 2 codes, but I want to use these in KLocale and KHolidays, with Plasma, Marble and KGeography also potential users.
It may be possible to use iso-codes for this without requiring translations as the names are in the latinised native language, i.e. regions in Spain have names in Spanish and as the vast majority of use cases for the code involve a native choosing their home region this may be acceptable for teh majority of languages. However if we start requiring iso-codes in kdelibs for this we may as well switch for all the others.
<!DOCTYPE iso_3166_2_entries [ <!ELEMENT iso_3166_2_entries (iso_3166_country+)> <!ELEMENT iso_3166_country (iso_3166_subset*)> <!ATTLIST iso_3166_country code CDATA #REQUIRED > <!ELEMENT iso_3166_subset (iso_3166_2_entry+)> <!ATTLIST iso_3166_subset type CDATA #REQUIRED > <!ELEMENT iso_3166_2_entry EMPTY> <!ATTLIST iso_3166_2_entry code CDATA #REQUIRED name CDATA #REQUIRED parent CDATA #IMPLIED > ]>
iso-codes only ships 40 languages, 17% are 90%-100% complete, 25% are 10%-89% complete and 57% are 0%-9% complete.