- From: Janusz Majnert <j.majnert@samsung.com>
- Date: Tue, 12 Mar 2013 10:00:48 +0100
- To: public-sysapps@w3.org
Hi, If I understand correctly, in Firefox OS the localised strings are in the main manifest file, while in Widgets P&C and Google's format, separate files are used? If so, I think Firefox OS model has the advantage that for hosted apps the user gets localised UI (app name, author etc) before actually installing the app. This makes hosting the app a bit easier. /Janusz On 2013-03-11 18:11, Marcos Caceres wrote: > Hi, > TL;DR: We need to settle on an i18n model for the manifest format. We have a few options here (based on the membership of the group): > > 1. Firefox OS's model [1]. > 2. Google packaged apps's [2]. > 3. W3C Packaged Web Apps (widgets) i18n model [3]. > > Each of the models have their own pros and cons. Below I describe each model. > > My recommendation is that we use the FireFox OS one, but with a few modifications: > > * Mozilla's i18n model currently only supports language tags with only two sub-tags. This should be fixed to allow three or more sub tags (I've got confirmation from Mozilla that they are willing to change this: https://bugzilla.mozilla.org/show_bug.cgi?id=846269). However, this depends on affected populations of people (see discussion on www-international: http://lists.w3.org/Archives/Public/www-international/2013JanMar/0305.html). > > * Language tag decomposition should follow BCP47's lookup algorithm (and an "application locale" should be derived from the union of the user agent locale and the manifest's declared locales). > > * The application locale should be exposed in JS through an interface. > > Ok… the rest is the long bla bla for each…. Will maybe put this into the Wiki or something. > > > > > > # Internationalization model of Firefox OS > > A more human readable version of this section is at [1]. > > This section lists a set of localization scenarios and describes how Firefox OS handles these different use cases. The section makes some recommendations about how particular use cases could be better addressed. > > To simplify the discussion, this document assumes the runtime is running in locale "en-US". > > ## CASE 1 - No localisation information. > > *Use case:* The author does not wish to explicitly localize any content. > > ```JSON > { > "name": "foo" > } > ``` > > *FxOS:* When there is no localized content declared, the user agent just uses what is at the root of the manifest. Hence, the name of the app is "foo". > > ## CASE 2 - No default locale > > *Use case:* The author provides the required ```name``` member, but chooses to localize the application's name for the "en-US" locale. However, the author neglects to add the ```default_locale``` member. > > ```JSON > { > "name": "unknown-locale name", > "locales": { > "jp": { > "name": "jp name" > }, > "en-US": { > "name": "en-US name" > } > } > } > ``` > > *FxOS:* Despite there not being any ```default_locale```, the user agent still chooses "en-US name" as the name for the application. When neither localized content matches, the value at the root of the manifest is selected. > > ## CASE 3 - No default locale, multiple matching ranges > > *Use case:* The author declares the name of the application using a set of variants of the English language. The author omits the ```default_locale``` member. > > ```JSON > { > "name": "unknown-locale name", > "locales": { > "en-US-x-test": { > "name": "en-US-x-test name" > } > "en-US": { > "name": "en-US name" > }, > "en": { > "name": "en name" > } > } > } > ``` > > *FxOS:* The user agent selects the localized content that exactly matches the user agent's default language (so, in this case, "en-US name" is shown). > > ## CASE 4 - No default locale, with catch all > > *Use case:* The author declares the name of the application using a set of variants of the English language. However, none of them match the user agent's locale settings exactly. Fortunately, the author has included a catch all ("en"). > > ```JSON > { > "name": "unknown-locale name", > "locales": { > "en-AU": { > "name": "en-AU name" > } > "en-GB": { > "name": "en-GB name" > }, > "en": { > "name": "en name" > } > } > } > ``` > > *FxOS:* The user agent first checks for "en-US", but failing that, it selects the next best match, which is "en name". > > ## CASE 5 - No default locale, multiple matching ranges > > *Use case:* The author wants to localize the name, but does not need to localize the developer information. > > ```JSON > { > "name": "unknown-locale name", > "developer": { > "name": "unknown-locale author" > }, > "locales": { > "en-US": { > "name": "en-US name" > }, > "jp":{ > "name": "jp name" > } > } > } > ``` > > *FxOS:* The user agent selects "en-US" as the name, and "unknown-locale author" as the author. > > ## CASE 6 - No default locale, multiple matching ranges > > *Use case:* the author wants to localize the developer name but not the developer URL. > > ```JSON > { > "name": "unknown-locale name", > "developer": { > "name": "unknown-locale author", > "url": "http://unknown-locale.com/" > }, > "locales": { > "en-US": { > "developer": { > "name": "localized author" > } > } > } > } > ``` > > *FxOS:* The user agent selects the localized developer name and uses the unknown-locale developer ```url```. > > ## CASE 7 - Default locale > Use case: When the author uses any value for ```default_locale```, but no localized content is given through a ```locale``` member, the author still expects some content to be displayed to the user (even if they user might not be able to understand it). > > ```JSON > { > "name": "unknown-locale name", > "developer": { > "name": "unknown-locale author" > }, > "default_locale": "unknown-locale" > } > ``` > > *FxOS:* The user agent selects "unknown-locale name" as the name of the application. > > ## CASE 8 - Language tag decomposition and lookup > *Use case:* > > ```JSON > { > "name": "unknown-locale name", > "developer": { > "name": "unknown-locale author" > }, > "locales": { > "en-US": { > "name": "en name" > }, > "en": { > "developer": { > "name": "en developer" > } > } > }, > "default_locale": "unknown-locale" > } > ``` > The name of the app is "en name". > > *FxOS:* When neither the ```default_locale``` nor the user agent locale matches any localized content, FxOS just uses the first sub-tag of the language range (in this case, just "en"). So, "en-US" becomes "en" ([see code](https://mxr.mozilla.org/mozilla-central/source/dom/apps/src/AppsUtils.jsm#427)). > > *[BUG 846269](https://bugzilla.mozilla.org/show_bug.cgi?id=846269)*: Because FxOS currently takes the first subtag in a language range, this will exclude language ranges initially composed of three or more subtags (e.g., zh-Hans-XQ). This means that if the user's regional preference is expressed as "zh-Hans-XQ", the following will not match any localized content (when zh-Hans would have been a reasonable match): > > ```JSON > { > "name": "unknown-locale name", > "developer": {"name": "unknown-locale author"}, > "locales": { > "zh-Hans": { > "name": "zh-Hans name" > } > }, > "default_locale": "unknown-locale" > } > ``` > > ## CASE 9 - Granularity > Use case: The author wishes for the name of the application to be localized for a particular locale. However, the author does not want to duplicate the developer information. > > ```JSON > { > "name": "您好!颜色", > "locales": { > "en-US": { > "name": "Hi! Color" > }, > "en-AU": { > "name": "G'Day! Colour" > }, > "en": { > "developer": { > "name": "en developer" > } > } > }, > "developer": { > "name": "中国开发者" > }, > "default_locale": "zh-Hans" > } > ``` > > *FxOS:* The user agent selects "Hi! Color" as the name, but then selects "中国开发者" as the developer. Expected ```"name": "en developer"``` to be selected. Filed [BUG 846432](https://bugzilla.mozilla.org/show_bug.cgi?id=846432). > > *Proposal:* To address the above, the user agent should arrange the user's preferred locales and decompose them in order (removing any duplicates). So, if the user has "en-US, en-AU, jp" as her preferred language settings, those would decompose to "en-US, en-AU, en, jp". > > > # Chrome i18n Model > > Chrome's i18n model [2] for localisation of manifest data differs quite significantly from the Mozilla one and the W3C widgets one [3]. In particularly, it's vastly more complicated in that it follows a more traditional software 18n model - some aspects are tightly bound to the Chrome apps store for some fields. > > Instead of allowing manifest content to be localized within the application manifest itself, all localized content is put into "messages.json" files in a special "_locales/language-TAG" directory (where language-TAG is, for example, en-US). The developer is then required to "key" all localised data and then Chrome reconstructs the localised content by matching keys to a magic string (__MSG_*__). For example: > > manifest.json > ========== > "name": "__MSG_application_title__", "description": "__MSG_application_description__" > > > _locales/de/messages.json > =============== > "application_title": { "message": "Eine lokalisierte gehostete Beispielanwendung" } > > > Then the developer declares what the "default_locale" is, which works as a catch-all for when the user's locale does not match the locale of the application. > > Chrome then provides an API to access localised strings from within the application itself. Having the API is not a bad thing (as it takes away some of the burden of having to read files from within a package through either XHR or a file reader API), but it does lock the developer into using a particular i18n model. > > Other none standard features include using custom language tags [2]. These language tags are non-standard in that they don't conform to BCP 47. As such, some region, language, script combinations cannot, theoretically speaking, be adequately expressed. If this affects actual populations of people, I am unsure of. > > > # W3C Packaged Web Apps (widgets) 18n Model. > The model is already fully described [3] - with plenty of examples. It supports both manifest level localizations as all directory-based localisation in a manner similar to Google's. > > http://www.w3.org/TR/widgets/#internationalization-and-localization > > [1] https://gist.github.com/marcoscaceres/5055717 > [2] https://developers.google.com/chrome/web-store/docs/i18n > [3] http://www.w3.org/TR/widgets/#internationalization-and-localization > -- > Marcos Caceres > http://datadriven.com.au > > > >
Received on Tuesday, 12 March 2013 09:01:27 UTC