diff --git a/.gitignore b/.gitignore index b0c174c..a110873 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bower_components* bower-1.x.json + diff --git a/.travis.yml b/.travis.yml index 8dc09e8..535dcae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,16 +10,13 @@ addons: packages: - google-chrome-stable before_script: + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" + - sleep 3 # give xvfb some time to start - npm install -g polymer-cli - polymer install --variants script: - - xvfb-run polymer test + - polymer test - >- - if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default'; - fi -env: - global: - - secure: >- - DitCRBZSh4YLwnI3LjD1ukbftNDIx6RrUjEYwHi+RMt+OCAkKiY4N0FI9PujlGEnt7tNdaD0CTzLSu+R2vpNeMaqsrjyFKzLfWH8rFRQ1dHCvaqZ1upV92yadzqLW6dhFMMre1OzhMoU0r/4b7hUV93UYAxUZU70WYzJTSjKvv+1ul97UVLMThmulvMBDrOx8cA06SF3oRfZwdxRj7zc8knUZvRmub41exfVonEVYjXdhOstHGLvXBXxmUBOjaTdNNaIT4KvvwMMmMqyQpnoB1uZimTLAy4y4ogpnf9HttPHTSZSTdWI2avk75nlqQCFFCcBier0NWT3phgkQt0CKrKs62w2RwjAIij2/ZVhsUiGLezIuOilG3k3+UYzXHb86KtLMie573XfAsX6cC/DYozJB7NfPA79MOwa/BuzTlyDJdZfKKm8+6FCmh7xQj0OcXHdqqxzTZu40bXwjz32TLDNnkHBdJNjTQrBm//TTQsxZ8BiXiw2tg4r7vXMIr3NjiRLQSLuAiHHQ2MnryhJuvAeBf1cqgjZXxy4mG6ctdus7Fc8nl9GSkY/5VmT4BMGwxbUcdd5/EDf750jwgE/sXzYABABYXd1cwvYPwT5oPsIMOs3hUC5mls+DlTk6Y57EtezsGuvA+EWeyg0rRzuv/u3rfJtOvYV7I7kA9xe/ZU= - - secure: >- - hSCnfwhOhq23wOyRk3vBz4Gz+KBYRaCsekoW9leSQ5LRt7QYF6gESoaiqQaqQ6aL0FX4tW6DCxGStFhwvOcR8EU9J1dz04Xku21bf3haLEFGTpOyDtQwisxw2TKp6ki95FIaBsx6435UvLXn77M3c4X5YW+1N+GKfZ62A/RqP12u6q8c2Sooe70V5E4J7oQS+CW20CvdcfrlEoHgJ89hF7hyu1A5GEj0Y4TJMsNfgqBC7t3k0YMIZ8yEgXRyzxsamKVFaa69U8435Wokol4zcgyVtirXZyKyqVLGk5j5dcUlzlwx4+dpoETrtTsUcIvLyxQ/SxsqBKr3j4u8CMAmKSRkMrDI/Pf6c4Q4H9N+CVOv+VW/TAqD/CnncI9eGaTJ3Ba2HZUMmHImPgBD1a6DqHvaFLbU5J9MHWvwCRBcOwQTAVqaOppgOvmu/mpwNnq9+NJFrwR6aTDgovYzi4TMA9DdoB7O3L6fvwYjqMYRahfukBPSYX5da4DHiQV0P6wEr/Sdub/ERQSgWqXLE6e/jpl4sXBY2rII4Ao3Tc/Xg9suwHjUKvmi8axOyfm0LjE9fmGj1bkFFPKU1JIAbGOaDInbpE6fMjbgpoOeqe6hxRxdrjDn5+/odQhhhUoGNk3YIKuLSeK82lW/ZMgH0/z/NubIQjchIuKDbLqmyX7ZZ2w= + if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test; + fi \ No newline at end of file diff --git a/README.md b/README.md index 83ebbed..9579544 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,14 @@ thing! https://github.com/PolymerLabs/tedium/issues --> -[![Build status](https://travis-ci.org/PolymerElements/app-localize-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/app-localize-behavior) +[![Build status](https://travis-ci.org/toshovski/app-localize-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/app-localize-behavior) +This is a fork of the AppLocalizeBehavior. There are some improved features: + + * Support of structured files + * fallback Language + ## Polymer.AppLocalizeBehavior `Polymer.AppLocalizeBehavior` wraps the [format.js](http://formatjs.io/) library to diff --git a/app-localize-behavior.html b/app-localize-behavior.html index cf4dd21..3d478a4 100644 --- a/app-localize-behavior.html +++ b/app-localize-behavior.html @@ -151,6 +151,21 @@ type: String }, + /** + * Fallback Language if the current language is not yet translated. + * + * For example having only english translation, but trying to open a french localization will return the fallback language + * + * this.resources = { + * 'en': { 'greeting': 'Hello!' } + * } + * + * + */ + fallbackLanguage:{ + type: String + }, + /** * The dictionary of localized messages, for each of the languages that * are going to be used. See http://formatjs.io/guides/message-syntax/ for @@ -248,6 +263,8 @@ __computeLocalize: function(language, resources, formats) { var proto = this.constructor.prototype; + var fallbackLanguage = this.fallbackLanguage; + // Check if localCache exist just in case. this.__checkLocalizationCache(proto); @@ -262,9 +279,14 @@ if (!key || !resources || !language || !resources[language]) return; + // Cache the key/value pairs for the same language, so that we don't // do extra work if we're just reusing strings across an application. - var translatedValue = resources[language][key]; + var translatedValue = this.__findTranslatedValue(resources,language,key); + //use fallback key if provided + if(!translatedValue && fallbackLanguage){ + translatedValue = this.__findTranslatedValue(resources,fallbackLanguage,key) + } if (!translatedValue) { return this.useKeyIfMissing ? key : ''; @@ -287,6 +309,25 @@ }; }, + __findTranslatedValue: function(resources, language, key){ + var subKey = key.split(":"); + var translatedValue = null; + if (subKey.length > 1) { + // use namesSpace multi level + translatedValue = resources[language][subKey[0]]; + for (var i=1; i + @@ -30,5 +31,6 @@ + diff --git a/demo/locales.json b/demo/locales.json index f434899..3347e52 100644 --- a/demo/locales.json +++ b/demo/locales.json @@ -7,7 +7,11 @@ "cats": "I have {numCats, number} cats. Almost {pctBlack, number, percent} of them are black.", "sale": "Sale begins {start, date, medium}, at {time, time, short}. Everything is {price, number, USD}.", "fruit": "{num, plural, =0 {no apples} =1 {one apple} other {# apples}}", - "bananas": "{name} ate {num, plural, =0 {no bananas} =1 {a banana} other {# bananas}} {gender, select, male {at his house.} female {at her house.} other {at their house.}}" + "bananas": "{name} ate {num, plural, =0 {no bananas} =1 {a banana} other {# bananas}} {gender, select, male {at his house.} female {at her house.} other {at their house.}}", + "missing_translation": "Hello world!", + "fruits":{ + "apple": "{num, plural, =0 {no apples} =1 {one apple} other {# apples}}" + } }, "fr": { "header_1": "Traduction et localisation", @@ -17,6 +21,12 @@ "cats": "J'ai {numCats, number} chats. Près de {pctBlack, number, percent} d'entre eux sont noirs.", "sale": "La vente commence le {start, date, medium} à {time, time, short}. Tout est à {price, number, USD}.", "fruit": "{num, plural, =0 {pas de pommes} =1 {une pomme} other {# pommes}}", - "bananas": "{name} {num, plural, =0 {ne} =1 {} other {}} mange {num, plural, =0 {pas de bananes} =1 {une banane} other {# bananes}} {gender, select, male {chez lui.} female {chez elle.} other {chez eux.}}" + "bananas": "{name} {num, plural, =0 {ne} =1 {} other {}} mange {num, plural, =0 {pas de bananes} =1 {une banane} other {# bananes}} {gender, select, male {chez lui.} female {chez elle.} other {chez eux.}}", + "fruits":{ + "apple": "{num, plural, =0 {pas de pommes} =1 {une pomme} other {# pommes}}" + } + }, + "en_US": { + "missing_translation": "Default fallback language" } } diff --git a/demo/x-fallback.html b/demo/x-fallback.html new file mode 100644 index 0000000..aa17734 --- /dev/null +++ b/demo/x-fallback.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + diff --git a/demo/x-translate.html b/demo/x-translate.html index 175477c..8d6eae2 100644 --- a/demo/x-translate.html +++ b/demo/x-translate.html @@ -34,6 +34,7 @@

{{localize('header_1')}}

localize('greeting') + localize('missing_translation') localize('intro', 'name', 'Batman') localize('cats', 'numCats', 10000, 'pctBlack', 0.42) + + + + + + + + + diff --git a/test/x-translate-structured.html b/test/x-translate-structured.html new file mode 100644 index 0000000..9a405bc --- /dev/null +++ b/test/x-translate-structured.html @@ -0,0 +1,63 @@ + + + + + + + + + +