diff --git a/doc/de/index.md b/doc/de/index.md
new file mode 100644
index 0000000..11be8f5
--- /dev/null
+++ b/doc/de/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+Dieses Plugin Ruft Informationen und führt durch spezifisch für des Benutzers Gebietsschema, Sprache und Zeitzone. Beachten Sie den Unterschied zwischen Sprache und Gebietsschema: Gebietsschema Steuerelemente wie Zahlen, Datumsangaben und Zeiten werden angezeigt für eine Region, während die Sprache bestimmt, welcher Text in Sprache erscheint als, unabhängig von den Einstellungen des Gebietsschemas. Häufig Entwickler verwenden Gebietsschema verwenden, setzen Sie beide Einstellungen aber es gibt keinen Grund, die ein Benutzer ihre Sprache auf "Englisch" eingestellt konnte nicht aber Gebietsschema "Französisch", damit Text angezeigt wird, in Englisch, aber Termine, Zeiten, usw. werden angezeigt wie in Frankreich. Leider machen die meisten mobile Plattformen derzeit keine Unterscheidung zwischen diesen Einstellungen.
+
+## Installation
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## Objekte
+
+*   GlobalizationError
+
+## Methoden
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+Erhalten Sie das BCP 47-Sprachtag für aktuelle Sprache des Clients.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### Beschreibung
+
+Gibt den BCP-47-kompatiblen Sprache-Bezeichner-Tag für die `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `value` Eigenschaft mit einer `String` Wert.
+
+Wenn ein Fehler immer die Sprache der `errorCallback` führt mit ein `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.UNKNOWN_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en-US` Sprache, dies sollte einen Popup-Dialog mit dem Text angezeigt `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Android Macken
+
+*   Gibt zurück, der ISO 639-1 zwei Buchstaben bestehenden Sprachcode, Großbuchstaben ISO 3166-1-Ländercode und Variante, die durch Bindestriche getrennt sind. Beispiele: "de", "En-US", "US"
+
+### Windows Phone 8 Macken
+
+*   Gibt die ISO 639-1 zweistelligen Sprachcode und ISO 3166-1-Ländercode der regionalen Variante der "Sprache" festlegen, durch einen Bindestrich getrennt.
+*   Beachten Sie, dass die regionale Variante eine Eigenschaft des "Spracheinstellung ist" und nicht durch die unabhängige "Land/Region" Einstellung auf Windows Phone bestimmt.
+
+## navigator.globalization.getLocaleName
+
+Gibt das BCP 47 kompatible Tag für aktuelle Gebietsschema-Einstellung des Clients zurück.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### Beschreibung
+
+Gibt die BCP 47 kompatible Gebietsschemabezeichner-Zeichenfolge, die `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `value` Eigenschaft mit einer `String` Wert. Das Gebietsschema-Tag besteht aus ein Sprachcode zwei Buchstaben in Kleinbuchstaben und Großbuchstaben Zweibuchstaben-Ländercode (nicht spezifiziert) Variantencode, durch einen Bindestrich getrennt.
+
+Wenn es ist ein Fehler, der immer des Gebietsschemas, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.UNKNOWN_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en-US` Gebietsschema, das zeigt einen Popup-Dialog mit dem Text`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Android Macken
+
+*   Java unterscheidet nicht zwischen einem Set "Sprache" und Set "Locale", so dass diese Methode im Wesentlichen identisch ist`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 Macken
+
+*   Gibt die ISO 639-1 zweistelligen Sprachcode und ISO 3166-1-Ländercode der regionalen Variante entsprechenden auf die "Regionales Format"-Einstellung, die durch einen Bindestrich getrennt.
+
+## navigator.globalization.dateToString
+
+Gibt ein Datum formatiert als Zeichenfolge gemäß der Client Gebietsschema und Zeitzone.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt das formatierte Datum `String` über eine `value` -Eigenschaft zugänglich aus dem Objekt übergeben als Parameter für die`successCallback`.
+
+Die eingehende `date` -Parameter des Typs sein sollte`Date`.
+
+Wenn ein Fehler, die Formatierung des Datums vorliegt dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.FORMATTING_ERROR`.
+
+Die `options` Parameter ist optional, und die Standardwerte sind:
+
+    {FormatLength: 'kurz', Selektor: "Datum und Uhrzeit"}
+    
+
+Die `options.formatLength` kann `short` , `medium` , `long` , oder`full`.
+
+Die `options.selector` kann `date` , `time` oder`date and time`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser so, dass eingestellt ist die `en_US` Gebietsschema, das zeigt einen Popup-Dialog mit Text ähnlich wie `date: 9/25/2012 4:21PM` mit den Standardoptionen:
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 Macken
+
+*   Die `formatLength` option unterstützt nur `short` und `full` Werte.
+
+## navigator.globalization.getCurrencyPattern
+
+Gibt eine Musterzeichenfolge zum Formatieren und Analysieren von Währungsangaben nach Benutzereinstellungen und ISO 4217 Währungscode des Kunden.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### Beschreibung
+
+Gibt das Muster auf der `successCallback` mit einem `properties` -Objekt als Parameter. Das Objekt sollte die folgenden Eigenschaften enthalten:
+
+*   **Muster**: das Währung-Muster zur Formatierung und zum Analysieren von Währungswerten. Die Muster folgen [Unicode Technical Standard #35][1]. *(String)*
+
+*   **Code**: der ISO-4217-Währungscode für das Muster. *(String)*
+
+*   **Bruch**: die Anzahl von Bruchziffern zum analysieren und Formatieren einer Währung verwendet. *(Anzahl)*
+
+*   **Rundung**: die Rundung erhöhen wenn analysieren und formatieren verwenden. *(Anzahl)*
+
+*   **Dezimal**: das Dezimaltrennzeichen für analysieren und formatieren. *(String)*
+
+*   **Gruppieren**: das Symbol für Zifferngruppierung zum analysieren und formatieren verwenden. *(String)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+Die eingehende `currencyCode` Parameter sollte eine `String` eines der ISO 4217 Währungscodes, z. B. 'USD'.
+
+Wenn es einen Fehler erhalten das Muster, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.FORMATTING_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema und die gewählte Währung US-Dollar, in diesem Beispiel wird einen Popup-Dialog mit Text ähnlich wie die Ergebnisse, die Folgen:
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+Erwartete Ergebnis:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+Gibt ein Array der Namen der Monate oder Tage der Woche, abhängig von dem Client Benutzereinstellungen und Kalender.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt das Array von Namen der `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt enthält eine `value` -Eigenschaft mit einer `Array` der `String` Werte. Die Namen von Array-Funktionen, entweder der erste Monat im Jahr oder der erste Tag der Woche, je nach der ausgewählten Option ab.
+
+Wenn ein Fehler auftritt erhalten die Namen, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.UNKNOWN_ERROR`.
+
+Die `options` Parameter ist optional, und die Standardwerte sind:
+
+    {type:'wide', item:'months'}
+    
+
+Der Wert des `options.type` kann `narrow` oder`wide`.
+
+Der Wert des `options.item` kann `months` oder`days`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, in diesem Beispiel wird eine Reihe von zwölf Popup-Dialoge, eine pro Monat, mit Text ähnlich `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+Gibt eine Musterzeichenfolge zum Formatieren und Analysieren von Daten entsprechend der Client-Benutzer-Einstellungen.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt das Muster auf der `successCallback` . Das als Parameter übergebene Objekt enthält die folgenden Eigenschaften:
+
+*   **Muster**: das Datum und die Uhrzeit-Muster zur Formatierung und zum Analysieren von Daten. Die Muster folgen [Unicode Technical Standard #35][1]. *(String)*
+
+*   **Zeitzone**: der abgekürzte Name der Zeitzone auf dem Client. *(String)*
+
+*   **Utc_offset**: die aktuelle Differenz in Sekunden zwischen dem Client Zeitzone und koordinierte Weltzeit. *(Anzahl)*
+
+*   **Dst_offset**: der aktuelle Sommerzeit-Offset in Sekunden zwischen der Client-Sommerzeit der Zeitzone und der Client Tageslicht Speichern der Zeitzone. *(Anzahl)*
+
+Wenn es einen Fehler erhalten das Muster der `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.PATTERN_ERROR`.
+
+Die `options` Parameter ist optional und wird standardmäßig auf folgende Werte:
+
+    {FormatLength: 'kurz', Selektor: "Datum und Uhrzeit"}
+    
+
+Die `options.formatLength` kann `short` , `medium` , `long` , oder `full` . Die `options.selector` kann `date` , `time` oder`date and
+time`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, in diesem Beispiel wird einen Popup-Dialog mit Text wie z. B. `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 Macken
+
+*   Die `formatLength` unterstützt nur `short` und `full` Werte.
+
+*   Die `pattern` für `date and time` Muster kehrt nur volle Datetime-Format.
+
+*   Die `timezone` gibt den Namen des Vollzeit-Zone zurück.
+
+*   Die `dst_offset` -Eigenschaft wird nicht unterstützt, und gibt immer NULL.
+
+## navigator.globalization.getFirstDayOfWeek
+
+Den ersten Tag der Woche laut dem Client Benutzereinstellungen und Kalender gibt.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### Beschreibung
+
+Die Tage der Woche sind nummeriert, beginnend mit 1, wo wird 1 Sonntag angenommen. Liefert den Tag auf der `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `value` Eigenschaft mit einer `Number` Wert.
+
+Wenn es einen Fehler erhalten das Muster, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.UNKNOWN_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, das zeigt einen Popup-Dialog mit Text ähnlich`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+Gibt eine Musterzeichenfolge zum Formatieren und Analysieren von Zahlen nach der Client-Benutzer-Einstellungen.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt das Muster auf der `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt enthält die folgenden Eigenschaften:
+
+*   **Muster**: die Muster zur Formatierung und zum Analysieren von Zahlen. Die Muster folgen [Unicode Technical Standard #35][1]. *(String)*
+
+*   **Symbol**: das Symbol beim Formatieren und analysieren, wie ein Prozentsatz oder Symbol verwendet. *(String)*
+
+*   **Bruch**: die Anzahl von Bruchziffern zum analysieren und Formatieren von Zahlen verwendet. *(Anzahl)*
+
+*   **Rundung**: die Rundung erhöhen wenn analysieren und formatieren verwenden. *(Anzahl)*
+
+*   **positiv**: das Symbol für positive Zahlen beim Analysieren und formatieren verwenden. *(String)*
+
+*   **negativ**: das Symbol für negative Zahlen beim Analysieren und formatieren verwenden. *(String)*
+
+*   **Dezimal**: das Dezimaltrennzeichen für analysieren und formatieren. *(String)*
+
+*   **Gruppieren**: das Symbol für Zifferngruppierung zum analysieren und formatieren verwenden. *(String)*
+
+Wenn es einen Fehler erhalten das Muster, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.PATTERN_ERROR`.
+
+Die `options` Parameter ist optional und Standardwerte sind:
+
+    {Typ: "decimal"}
+    
+
+Die `options.type` kann `decimal` , `percent` , oder`currency`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, dies sollte einen Popup-Dialog mit Text ähnlich wie die Ergebnisse in den folgenden anzeigen:
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+Ergebnisse:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 Macken
+
+*   Die `pattern` -Eigenschaft wird nicht unterstützt, und Retuens eine leere Zeichenfolge.
+
+*   Die `fraction` -Eigenschaft wird nicht unterstützt, und gibt NULL zurück.
+
+## navigator.globalization.isDayLightSavingsTime
+
+Gibt an, ob die Sommerzeit ist in der Tat für ein bestimmtes Datum unter Verwendung des Auftraggebers Zeitzone und Kalender.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### Beschreibung
+
+Gibt an, ob Sommerzeit ist in der Tat zu den `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `dst` Eigenschaft mit einer `Boolean` Wert. A `true` Wert angibt, dass die Sommer-/Winterzeit für das angegebene Datum gültig ist und `false` weist darauf hin, dass es nicht.
+
+Die eingehenden Parameter `date` sollte vom Typ`Date`.
+
+Wenn gibt es einen Lesefehler das Datum der `errorCallback` führt. Die erwarteten Fehlercode ist`GlobalizationError.UNKNOWN_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Im Sommer und wenn der Browser auf eine DST-fähigen Zeitzone festgelegt ist, sollte dies einen Popup-Dialog mit Text ähnlich angezeigt `dst: true` :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+Gibt eine Zahl, die als Zeichenfolge nach dem Client-Benutzer-Einstellungen formatiert.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt die formatierte Zeichenfolge, die `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `value` Eigenschaft mit einer `String` Wert.
+
+Wenn es ist ein Fehler, die Formatierung der Zahl, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.FORMATTING_ERROR`.
+
+Die `options` Parameter ist optional, und die Standardwerte sind:
+
+    {Typ: "decimal"}
+    
+
+Die `options.type` kann sein "decimal", "Prozent" oder "Währung".
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, das zeigt einen Popup-Dialog mit Text ähnlich wie `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+Analysiert ein Datum formatiert als Zeichenfolge, nach der Client Benutzereinstellungen und Kalender mit der Zeitzone des Clients, und gibt das entsprechende Datumsobjekt zurück.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Gibt das Datum zurück, an den Erfolg-Rückruf mit einem `properties` -Objekt als Parameter. Das Objekt sollte folgenden Eigenschaften aufweisen:
+
+*   **Jahr**: die vier Digit Year. *(Anzahl)*
+
+*   **Monat**: der Monat ab (0-11). *(Anzahl)*
+
+*   **Tag**: der Tag von (1-31). *(Anzahl)*
+
+*   **Stunde**: die Stunde (0-23). *(Anzahl)*
+
+*   **Minute**: die Minute (0-59). *(Anzahl)*
+
+*   **zweite**: die zweite von (0-59). *(Anzahl)*
+
+*   **Millisekunde**: die Millisekunden (von 0-999), nicht auf allen Plattformen verfügbar. *(Anzahl)*
+
+Die eingehende `dateString` -Parameter des Typs sein sollte`String`.
+
+Die `options` Parameter ist optional und wird mit den folgenden Werten:
+
+    {FormatLength: 'kurz', Selektor: "Datum und Uhrzeit"}
+    
+
+Die `options.formatLength` kann `short` , `medium` , `long` , oder `full` . Die `options.selector` kann `date` , `time` oder`date and
+time`.
+
+Wenn es ist ein Fehler beim Analysieren der Datumszeichenfolge dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.PARSING_ERROR`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, das zeigt einen Popup-Dialog mit Text ähnlich `month:8 day:25 year:2012` . Beachten Sie, dass im Monat ganze Zahl ist kleiner als die Zeichenfolge AsInteger Monat stellt einen Array-Index.
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 Macken
+
+*   Die `formatLength` option unterstützt nur `short` und `full` Werte.
+
+## navigator.globalization.stringToNumber
+
+Analysiert eine Zahl als Zeichenfolge nach dem Client-Benutzer-Einstellungen formatiert und gibt die entsprechende Nummer zurück.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### Beschreibung
+
+Liefert die Anzahl an der `successCallback` mit einem `properties` -Objekt als Parameter. Dieses Objekt muss eine `value` Eigenschaft mit einer `Number` Wert.
+
+Wenn es ist ein Fehler beim Analysieren der Zeichenfolge, dann die `errorCallback` führt mit einem `GlobalizationError` -Objekt als Parameter. Die erwarteten Fehlercode ist`GlobalizationError.PARSING_ERROR`.
+
+Die `options` Parameter ist optional und wird standardmäßig auf folgende Werte:
+
+    {Typ: "decimal"}
+    
+
+Die `options.type` kann `decimal` , `percent` , oder`currency`.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Beispiel
+
+Wenn der Browser auf festgelegt ist die `en_US` Gebietsschema, dies sollte einen Popup-Dialog mit Text ähnlich anzeigen `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+Ein Objekt, das einen Fehler von der Globalisierung-API darstellt.
+
+### Eigenschaften
+
+*   **Code**: Einen der folgenden Codes, der den Fehlertyp *(Anzahl)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **Nachricht**: eine SMS-Nachricht, die enthält den Fehler Erklärung und/oder details *(String)*
+
+### Beschreibung
+
+Dieses Objekt ist erstellt und bevölkert von Cordova und kehrte nach einem Rückruf im Fehlerfall.
+
+### Unterstützte Plattformen
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+
+### Beispiel
+
+Die folgenden Fehler-Callback ausgeführt wird, zeigt einen Popup-Dialog mit dem Text ähnlich wie `code: 3` und`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/es/index.md b/doc/es/index.md
new file mode 100644
index 0000000..9f701c4
--- /dev/null
+++ b/doc/es/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+Este plugin obtiene información y realiza operaciones específicas de la configuración regional del usuario, idioma y zona horaria. Tenga en cuenta la diferencia entre la configuración regional e idioma: controles locale como números, fechas y tiempos se muestran para una región, mientras que el lenguaje determina qué texto aparece como, independientemente de la configuración local. A menudo los desarrolladores utilizan locale para fijar ambos ajustes, pero no hay razón que el usuario no pudo establecer su idioma a "Inglés" locale "Francés", para que se muestre el texto en inglés, pero las fechas, tiempos, etc., se muestran como son en Francia. Desafortunadamente, las plataformas móviles más actualmente no hacen una distinción entre estos ajustes.
+
+## Instalación
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## Objetos
+
+*   GlobalizationError
+
+## Métodos
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+Busque la etiqueta de idioma BCP 47 el idioma actual del cliente.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### Descripción
+
+Devuelve la etiqueta de identificador de idioma compatible con BCP-47 a la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `value` propiedad con un `String` valor.
+
+Si hay un error al obtener el idioma, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador está configurado la `en-US` lengua, ésta debe mostrar un cuadro de diálogo emergente con el texto `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Rarezas Android
+
+*   Devuelve el código de idioma de dos letras 639-1 ISO, mayúsculas código ISO 3166-1 y la variante separada por guiones. Ejemplos: "at", "en-US", "US"
+
+### Windows Phone 8 rarezas
+
+*   Código de idioma devuelve el ISO 639-1 dos letras y código de la ISO 3166-1 de la variante regional correspondiente a la "lengua" ajuste, separados por un guión.
+*   Tenga en cuenta que la variante regional es una característica de la configuración del "Idioma" y no determinado por el ajuste de "País o región" sin relación en Windows Phone.
+
+## navigator.globalization.getLocaleName
+
+Devuelve la etiqueta compatible con BCP 47 para la configuración regional actual del cliente.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### Descripción
+
+Devuelve el identificador BCP 47 local conforme a la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `value` propiedad con un `String` valor. La etiqueta de configuración regional consistirá en un código de idioma de dos letras minúsculas, código de país de dos letras mayúsculas y códigos de la variante (no especificados), separados por un guión.
+
+Si hay un error al obtener la configuración regional, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en-US` local, muestra un cuadro de diálogo emergente con el texto`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Rarezas Android
+
+*   Java no distingue entre un conjunto "idioma" y establecer "locale", así que este método es esencialmente el mismo que`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 rarezas
+
+*   Código de idioma devuelve el ISO 639-1 dos letras y código de la ISO 3166-1 de la variante regional correspondiente a la posición "Formato Regional", separada por un guión.
+
+## navigator.globalization.dateToString
+
+Devuelve una fecha con formato como una cadena según la configuración regional del cliente y zona horaria.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve la fecha con formato `String` vía un `value` propiedad accesible desde el objeto pasado como parámetro para el`successCallback`.
+
+Los entrantes `date` parámetro debe ser del tipo`Date`.
+
+Si hay un error de formato de la fecha, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.FORMATTING_ERROR`.
+
+El `options` parámetro es opcional, y sus valores por defecto son:
+
+    {formatLength: selector de 'corto',: 'fecha y hora'}
+    
+
+El `options.formatLength` puede ser `short` , `medium` , `long` , o`full`.
+
+El `options.selector` puede ser `date` , `time` o`date and time`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Si el navegador está configurado la `en_US` local, muestra un cuadro de diálogo emergente con texto similar a `date: 9/25/2012 4:21PM` utilizando las opciones predeterminadas:
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 rarezas
+
+*   El `formatLength` los soportes de la opción `short` y `full` los valores.
+
+## navigator.globalization.getCurrencyPattern
+
+Devuelve una cadena de patrón para analizar valores de divisas según las preferencias del usuario y código de moneda ISO 4217 del cliente y el formato.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### Descripción
+
+Devuelve el patrón a la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe contener las siguientes propiedades:
+
+*   **patrón**: el patrón de la moneda para analizar los valores de la moneda y el formato. Los patrones siguen [Unicode técnica estándar #35][1]. *(String)*
+
+*   **código**: código de divisa de la ISO 4217 para el patrón. *(String)*
+
+*   **fracción**: el número de dígitos fraccionarios a utilizar al análisis sintáctico y el formato de moneda. *(Número)*
+
+*   **redondeo**: el redondeo incremento para utilizar al análisis sintáctico y formato. *(Número)*
+
+*   **decimal**: el símbolo decimal para analizar y dar formato. *(String)*
+
+*   **agrupación**: el símbolo de la agrupación para analizar y dar formato. *(String)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+Los entrantes `currencyCode` parámetro debe ser un `String` de uno de los códigos de moneda ISO 4217, por ejemplo 'USD'.
+
+Si hay un error obteniendo el patrón, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.FORMATTING_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+
+### Ejemplo
+
+Cuando el navegador está configurado la `en_US` local y la moneda seleccionada dólares de Estados Unidos, este ejemplo muestra un cuadro de diálogo emergente con texto similar a los resultados que siguen:
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+Resultado esperado:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+Devuelve una matriz de los nombres de los meses o días de la semana, dependiendo de las preferencias del usuario y el calendario del cliente.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve la matriz de nombres de la `successCallback` con un `properties` objeto como parámetro. Ese objeto contiene un `value` propiedad con un `Array` de `String` valores. Los nombres de funciones de matriz a partir desde el primer mes en el año o el primer día de la semana, dependiendo de la opción seleccionada.
+
+Si hay un error obteniendo los nombres, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.UNKNOWN_ERROR`.
+
+El `options` parámetro es opcional, y sus valores por defecto son:
+
+    {type:'wide', item:'months'}
+    
+
+El valor de `options.type` puede ser `narrow` o`wide`.
+
+El valor de `options.item` puede ser `months` o`days`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en_US` local, este ejemplo muestra una serie de doce diálogos emergente, uno por mes, con un texto similar a `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+Devuelve una cadena de patrón para analizar las fechas según las preferencias del cliente usuario y el formato.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve el patrón a la `successCallback` . El objeto se pasa como parámetro contiene las siguientes propiedades:
+
+*   **patrón**: el patrón para analizar las fechas y el formato de fecha y hora. Los patrones siguen [Unicode técnica estándar #35][1]. *(String)*
+
+*   **zona horaria**: el nombre abreviado de la zona horaria en el cliente. *(String)*
+
+*   **utc_offset**: la actual diferencia de segundos entre la zona horaria del cliente y el tiempo universal coordinado. *(Número)*
+
+*   **dst_offset**: el desplazamiento horario actual en segundos entre no-horario del cliente de huso horario y día del cliente ahorro de zona horaria. *(Número)*
+
+Si hay un error obteniendo el patrón, el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.PATTERN_ERROR`.
+
+El `options` parámetro es opcional y por defecto los siguientes valores:
+
+    {formatLength: selector de 'corto',: 'fecha y hora'}
+    
+
+El `options.formatLength` puede ser `short` , `medium` , `long` , o `full` . El `options.selector` puede ser `date` , `time` o`date and
+time`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en_US` local, este ejemplo muestra un cuadro de diálogo emergente con el texto como `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 rarezas
+
+*   El `formatLength` sólo es compatible con `short` y `full` los valores.
+
+*   El `pattern` para `date and time` patrón devuelve sólo formato datetime completo.
+
+*   El `timezone` devuelve el nombre de zona de tiempo completo.
+
+*   El `dst_offset` no se admite la propiedad, y siempre devuelve cero.
+
+## navigator.globalization.getFirstDayOfWeek
+
+Devuelve el primer día de la semana según las preferencias del usuario y el calendario del cliente.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### Descripción
+
+Los días de la semana están contados a partir de la 1, donde 1 se supone que es el domingo. Devuelve el día de la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `value` propiedad con un `Number` valor.
+
+Si hay un error obteniendo el patrón, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en_US` local, muestra un cuadro de diálogo emergente con texto similar a`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+Devuelve una cadena de patrón para analizar números según las preferencias del cliente usuario y el formato.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve el patrón a la `successCallback` con un `properties` objeto como parámetro. Ese objeto contiene las siguientes propiedades:
+
+*   **patrón**: el patrón del número a analizar números y el formato. Los patrones siguen [Unicode técnica estándar #35][1]. *(String)*
+
+*   **símbolo**: el símbolo a usar cuando formateo y análisis, como un símbolo por ciento o moneda. *(String)*
+
+*   **fracción**: el número de dígitos fraccionarios a utilizar al análisis sintáctico y el formato de números. *(Número)*
+
+*   **redondeo**: el redondeo incremento para utilizar al análisis sintáctico y formato. *(Número)*
+
+*   **positivo**: el símbolo para números positivos al análisis sintáctico y formato. *(String)*
+
+*   **negativo**: el símbolo para números negativos al análisis sintáctico y formato. *(String)*
+
+*   **decimal**: el símbolo decimal para analizar y dar formato. *(String)*
+
+*   **agrupación**: el símbolo de la agrupación para analizar y dar formato. *(String)*
+
+Si hay un error obteniendo el patrón, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.PATTERN_ERROR`.
+
+El `options` parámetro es opcional, y los valores por defecto son:
+
+    {tipo: 'decimal'}
+    
+
+El `options.type` puede ser `decimal` , `percent` , o`currency`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador está configurado el `en_US` locale, esto debería mostrar un cuadro de diálogo emergente con texto similar a los resultados que siguen:
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+Resultados:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 rarezas
+
+*   El `pattern` no se admite la propiedad y retuens una cadena vacía.
+
+*   El `fraction` no se admite la propiedad, y devuelve cero.
+
+## navigator.globalization.isDayLightSavingsTime
+
+Indica si el horario de verano es en efecto para una fecha determinada usando la zona horaria y el calendario del cliente.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### Descripción
+
+Indica si es o no horario de verano en efecto a la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `dst` propiedad con un `Boolean` valor. A `true` valor indica que el horario de verano es en efecto para la fecha determinada, y `false` indica que no es.
+
+El parámetro entrantes `date` debe ser de tipo`Date`.
+
+Si hay un error de lectura de la fecha, entonces el `errorCallback` se ejecuta. Código esperado del error es`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Durante el verano, y si el navegador está configurado para una zona horaria DST habilitado, esto debería mostrar un cuadro de diálogo emergente con texto similar a `dst: true` :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+Devuelve un número con formato como una cadena según las preferencias del cliente usuario.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve la cadena con formato de número a la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `value` propiedad con un `String` valor.
+
+Si hay un error de formato del número, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.FORMATTING_ERROR`.
+
+El `options` parámetro es opcional, y sus valores por defecto son:
+
+    {tipo: 'decimal'}
+    
+
+El `options.type` puede ser 'decimal', '%' o 'moneda'.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en_US` local, muestra un cuadro de diálogo emergente con texto similar a `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+Analiza una fecha con formato como una cadena, según las preferencias del usuario y calendario usando la zona horaria del cliente, el cliente y devuelve el objeto correspondiente fecha.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve la fecha para la devolución de llamada con éxito un `properties` objeto como parámetro. Ese objeto debe tener las siguientes propiedades:
+
+*   **año**: el año de cuatro dígitos. *(Número)*
+
+*   **mes**: mes de (0-11). *(Número)*
+
+*   **día**: el día de (1-31). *(Número)*
+
+*   **hora**: la hora de (0-23). *(Número)*
+
+*   **minuto**: el minuto de (0-59). *(Número)*
+
+*   **segundo**: el segundo de (0-59). *(Número)*
+
+*   **milisegundo**: los milisegundos (de 0-999), no está disponibles en todas las plataformas. *(Número)*
+
+Los entrantes `dateString` parámetro debe ser del tipo`String`.
+
+El `options` parámetro es opcional y por defecto los siguientes valores:
+
+    {formatLength: selector de 'corto',: 'fecha y hora'}
+    
+
+El `options.formatLength` puede ser `short` , `medium` , `long` , o `full` . El `options.selector` puede ser `date` , `time` o`date and
+time`.
+
+Si hay un error al analizar la cadena de fecha, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.PARSING_ERROR`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador se establece en el `en_US` local, muestra un cuadro de diálogo emergente con texto similar a `month:8 day:25 year:2012` . Tenga en cuenta que el mes entero es uno menos de la cadena, como el entero mes representa un índice de matriz.
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 rarezas
+
+*   El `formatLength` los soportes de la opción `short` y `full` los valores.
+
+## navigator.globalization.stringToNumber
+
+Analiza un número con formato como una cadena según las preferencias del cliente usuario y devuelve el número correspondiente.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### Descripción
+
+Devuelve el número de la `successCallback` con un `properties` objeto como parámetro. Ese objeto debe tener un `value` propiedad con un `Number` valor.
+
+Si hay un error al analizar la cadena de número, entonces el `errorCallback` se ejecuta con un `GlobalizationError` objeto como parámetro. Código esperado del error es`GlobalizationError.PARSING_ERROR`.
+
+El `options` parámetro es opcional y por defecto los siguientes valores:
+
+    {tipo: 'decimal'}
+    
+
+El `options.type` puede ser `decimal` , `percent` , o`currency`.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Ejemplo
+
+Cuando el navegador está configurado el `en_US` locale, esto debería mostrar un cuadro de diálogo emergente con texto similar a `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+Un objeto que representa un error de la API de la globalización.
+
+### Propiedades
+
+*   **Código**: Uno de los siguientes códigos que representa el tipo de error *(Número)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **mensaje**: un mensaje de texto que incluye la explicación de los errores o detalles *(String)*
+
+### Descripción
+
+Este objeto es creado y poblada por Córdoba y regresó a una devolución de llamada en caso de error.
+
+### Plataformas soportadas
+
+*   Amazon fuego OS
+*   Android
+*   iOS
+
+### Ejemplo
+
+Cuando se ejecuta el callback de error siguiente, se muestra un cuadro de diálogo emergente con el texto similar a `code: 3` y`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/fr/index.md b/doc/fr/index.md
new file mode 100644
index 0000000..1b86154
--- /dev/null
+++ b/doc/fr/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+Ce plugin obtienne des informations et effectue des opérations spécifiques aux paramètres régionaux de l'utilisateur, la langue et fuseau horaire. Notez la différence entre les paramètres régionaux et linguistiques : contrôles de paramètres régionaux comment nombres, les dates et les heures sont affichées pour une région, tandis que la langue détermine quel texte apparaît sous la forme, indépendamment des paramètres régionaux. Souvent les développeurs utilisent des paramètres régionaux pour définir ces deux paramètres, mais il n'y a aucune raison, qu'un utilisateur ne pouvait pas régler sa langue sur « English », mais en paramètres régionaux « Français », afin que le texte s'affiche en anglais mais dates, heures, etc., s'affichent comme ils sont en France. Malheureusement, les plateformes mobiles plus actuellement ne font pas une distinction entre ces paramètres.
+
+## Installation
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## Objets
+
+*   GlobalizationError
+
+## Méthodes
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+Obtenir la balise de langue BCP 47 pour la langue du client actuel.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### Description
+
+Retourne la balise d'identificateur de langage compatible BCP-47 à la `successCallback` avec un `properties` objet comme paramètre. Cet objet doit avoir une `value` propriété avec une `String` valeur.
+
+S'il y a une erreur d'obtention de la langue, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour le `en-US` langue, cela devrait afficher une boîte de dialogue contextuelle avec le texte `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Quirks Android
+
+*   Retourne le code de langue à deux lettres 639-1 ISO, majuscules du code ISO 3166-1 country et variante séparés par des tirets. Exemples: « fr », « en-US », « US »
+
+### Windows Phone 8 Quirks
+
+*   Code renvoie l'ISO 639-1 deux lettres de la langue et indicatif ISO 3166-1 de la variante régionale correspondant à la « langue » définissant, séparés par un tiret.
+*   Notez que la variante régionale est une propriété du paramètre « Langue » et pas déterminé par le paramètre « Pays/région » sans rapport avec Windows Phone.
+
+## navigator.globalization.getLocaleName
+
+Retourne la balise conforme BCP 47 pour paramètre de langue actuel du client.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### Description
+
+Retourne la chaîne d'identificateur de paramètres régionaux compatibles BCP 47 à la `successCallback` avec un `properties` objet comme paramètre. Cet objet doit avoir une `value` propriété avec une `String` valeur. La balise locale comprendra un code de deux lettres minuscules langue, code de pays à deux lettres majuscules et code de variante (non précisé), séparés par un tiret.
+
+S'il y a une erreur d'obtenir les paramètres régionaux, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en-US` locale, ceci pour afficher une fenêtre popup avec le texte`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Quirks Android
+
+*   Java ne distingue pas entre un set « langue » et le set « locale », donc cette méthode est essentiellement identique à`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 Quirks
+
+*   Code renvoie l'ISO 639-1 deux lettres de la langue et indicatif ISO 3166-1 de la variante régionale correspondant au paramètre de Format « régional », séparé par un trait d'Union.
+
+## navigator.globalization.dateToString
+
+Renvoie une date mise en forme comme une chaîne selon les paramètres régionaux du client et de fuseau horaire.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### Description
+
+Retourne la date de mise en forme `String` par une `value` propriété accessible à partir de l'objet passé comme paramètre à la`successCallback`.
+
+L'entrantes `date` paramètre doit être de type`Date`.
+
+S'il y a une erreur de mise en forme la date, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.FORMATTING_ERROR`.
+
+Le `options` paramètre est facultatif, et ses valeurs par défaut sont :
+
+    {formatLength: « court », sélecteur: « date et heure »}
+    
+
+Le `options.formatLength` peut être `short` , `medium` , `long` , ou`full`.
+
+Le `options.selector` peut être `date` , `time` ou`date and time`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Si le navigateur est configuré pour la `en_US` locale, cela permet d'afficher une boîte de dialogue contextuelle avec un texte semblable à `date: 9/25/2012 4:21PM` en utilisant les options par défaut :
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 Quirks
+
+*   Le `formatLength` prend en charge uniquement l'option `short` et `full` valeurs.
+
+## navigator.globalization.getCurrencyPattern
+
+Retourne une chaîne de modèles pour formater et analyser les valeurs de monnaie selon les préférences de l'utilisateur et du code de devise ISO 4217 du client.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### Description
+
+Retourne le modèle de la `successCallback` avec un `properties` objet comme paramètre. Cet objet doit contenir les propriétés suivantes :
+
+*   **modèle**: le modèle de la monnaie de formater et d'analyser les valeurs de devise. Les modèles suivent [Unicode Technical Standard #35][1]. *(String)*
+
+*   **code**: code de devise de l'ISO 4217 pour le modèle. *(String)*
+
+*   **fraction**: le nombre de chiffres fractionnaires à utiliser lors de l'analyse et de formatage de devises. *(Nombre)*
+
+*   **arrondissement**: l'arrondi incrémenter pour utiliser lors de l'analyse et de mise en forme. *(Nombre)*
+
+*   **décimal**: le symbole décimal à utiliser pour l'analyse et de mise en forme. *(String)*
+
+*   **regroupement**: le symbole de groupe à utiliser pour l'analyse et de mise en forme. *(String)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+L'entrantes `currencyCode` paramètre doit être un `String` de l'un des codes de devise ISO 4217, par exemple « USD ».
+
+S'il y a une erreur, obtenir le modèle, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.FORMATTING_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale et la devise sélectionnée est Dollars des États-Unis, cet exemple pour afficher une fenêtre popup avec un texte semblable aux résultats qui suivent :
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+Résultat escompté :
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+Retourne un tableau des noms des mois ou jours de la semaine, selon le calendrier et les préférences de l'utilisateur du client.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### Description
+
+Retourne le tableau de noms à la `successCallback` avec un `properties` objet comme paramètre. Cet objet contient une `value` propriété avec un `Array` de `String` valeurs. Les noms de fonctionnalités de tableau à partir de soit le premier mois de l'année ou le premier jour de la semaine, selon l'option choisie.
+
+S'il y a une erreur d'obtention des noms, puis les `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.UNKNOWN_ERROR`.
+
+Le `options` paramètre est facultatif, et ses valeurs par défaut sont :
+
+    {type:'wide', item:'months'}
+    
+
+La valeur de `options.type` peut être `narrow` ou`wide`.
+
+La valeur de `options.item` peut être `months` ou`days`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cet exemple affiche une série de douze fenêtres popup, un par mois, avec un texte semblable à `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+Retourne une chaîne de modèles pour formater et d'analyser les dates selon les préférences de l'utilisateur du client.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### Description
+
+Retourne le modèle de la `successCallback` . L'objet passé comme paramètre contient les propriétés suivantes :
+
+*   **modèle**: le modèle de date et d'heure pour formater et analyser des dates. Les modèles suivent [Unicode Technical Standard #35][1]. *(String)*
+
+*   **fuseau horaire**: l'abréviation du fuseau horaire sur le client. *(String)*
+
+*   **utc_offset**: la différence actuelle en secondes entre le temps universel coordonné et du fuseau horaire du client. *(Nombre)*
+
+*   **DST_OFFSET**: l'offset d'heure actuel en secondes entre non-heure le client du fuseau horaire et l'heure du client sauver du fuseau horaire. *(Nombre)*
+
+S'il y a une erreur, obtenir le modèle, le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.PATTERN_ERROR`.
+
+Le `options` paramètre est facultatif et par défaut les valeurs suivantes :
+
+    {formatLength: « court », sélecteur: « date et heure »}
+    
+
+Le `options.formatLength` peut être `short` , `medium` , `long` , ou `full` . Le `options.selector` peut être `date` , `time` ou`date and
+time`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cet exemple pour afficher une fenêtre popup avec texte comme `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 Quirks
+
+*   Le `formatLength` prend uniquement en charge `short` et `full` valeurs.
+
+*   Le `pattern` pour `date and time` modèle retourne uniquement datetime plein format.
+
+*   Le `timezone` retourne le nom de zone à temps plein.
+
+*   La `dst_offset` propriété n'est pas prise en charge, et toujours retourne zéro.
+
+## navigator.globalization.getFirstDayOfWeek
+
+Retourne le premier jour de la semaine selon le calendrier et les préférences de l'utilisateur du client.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### Description
+
+Les jours de la semaine sont numérotés à partir de 1, où 1 est supposé pour être le dimanche. Retourne le jour de la `successCallback` avec un `properties` objet comme paramètre. Cet objet doit avoir une `value` propriété avec une `Number` valeur.
+
+S'il y a une erreur, obtenir le modèle, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cela permet d'afficher une boîte de dialogue contextuelle avec un texte semblable à`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+Retourne une chaîne de modèles pour formater et d'analyser les chiffres selon les préférences de l'utilisateur du client.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### Description
+
+Retourne le modèle de la `successCallback` avec un `properties` objet comme paramètre. Cet objet contient les propriétés suivantes :
+
+*   **modèle**: le modèle de numéro de formater et d'analyser les chiffres. Les modèles suivent [Unicode Technical Standard #35][1]. *(String)*
+
+*   **symbole**: le symbole à utiliser lors de la mise en forme et l'analyse, comme un symbole de pourcentage ou de la monnaie. *(String)*
+
+*   **fraction**: le nombre de chiffres fractionnaires à utiliser lors de l'analyse et de mise en forme des nombres. *(Nombre)*
+
+*   **arrondissement**: l'arrondi incrémenter pour utiliser lors de l'analyse et de mise en forme. *(Nombre)*
+
+*   **positif**: le symbole à utiliser pour les nombres positifs lors de l'analyse et de mise en forme. *(String)*
+
+*   **négatif**: le symbole à utiliser pour les nombres négatifs lors de l'analyse et de mise en forme. *(String)*
+
+*   **décimal**: le symbole décimal à utiliser pour l'analyse et de mise en forme. *(String)*
+
+*   **regroupement**: le symbole de groupe à utiliser pour l'analyse et de mise en forme. *(String)*
+
+S'il y a une erreur, obtenir le modèle, puis le `errorCallback` s'exécute avec un `GlobalizationError` objet comme paramètre. Code attendu de l'erreur est`GlobalizationError.PATTERN_ERROR`.
+
+Le `options` paramètre est facultatif, et les valeurs par défaut sont :
+
+    {type: « decimal »}
+    
+
+Le `options.type` peut être `decimal` , `percent` , ou`currency`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cela doit afficher une boîte de dialogue contextuelle avec un texte semblable aux résultats qui suivent :
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+Résultats :
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 Quirks
+
+*   La `pattern` propriété n'est pas prise en charge et retuens une chaîne vide.
+
+*   La `fraction` propriété n'est pas prise en charge et retourne zéro.
+
+## navigator.globalization.isDayLightSavingsTime
+
+Indique si l'heure d'été est en vigueur pour une date donnée en utilisant le calendrier et le fuseau horaire du client.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### Description
+
+Indique si l'heure d'été est en vigueur ou non en transmettant un objet `properties` en paramètre de la fonction `successCallback`. Cet objet contient une propriété `dst` dont la valeur est de type `Boolean`. Ainsi, `true` indique que l'heure d'été est en vigueur à la date donnée, au contraire `false` indique qu'elle ne l'est pas.
+
+Le paramètre obligatoire `date` doit être de type `Date`.
+
+S'il y a une erreur de lecture de la date, puis le `errorCallback` s'exécute. Code attendu de l'erreur est`GlobalizationError.UNKNOWN_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Pendant l'été et si l'heure d'été est activée sur le fuseau horaire actuel du navigateur, une fenêtre popup contenant `dst : true` est affichée :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst : ' + date.dst + '\n');},
+        function () {alert('Erreur lors de l\'obtention de la valeur de dst\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+Renvoie un nombre formaté dans une chaîne de caractères en tenant compte des préférences utilisateur du client.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### Description
+
+Transmet le nombre formaté en paramètre à la fonction `successCallback` sous la forme d'un objet `properties`. Cet objet doit avoir une `value` propriété avec une `String` valeur.
+
+Si une erreur survient lors du formatage du nombre, la fonction `errorCallback` est exécutée et un objet `GlobalizationError` lui est passé en paramètre. Code attendu de l'erreur est`GlobalizationError.FORMATTING_ERROR`.
+
+Le `options` paramètre est facultatif, et ses valeurs par défaut sont :
+
+    {type: « decimal »}
+    
+
+Le `options.type` peut être « decimal », « % » ou « monnaie ».
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cela permet d'afficher une boîte de dialogue contextuelle avec un texte semblable à `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number : ' + number.value + '\n');},
+        function () {alert('Erreur lors du formatage du nombre\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+Retourne un objet date construit à partir d'une date contenue dans une chaîne de caractères, en tenant compte des préférences utilisateur, du calendrier et du fuseau horaire du client.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### Description
+
+Transmet la date demandée en paramètre à la fonction successCallback sous la forme d'un objet `properties`. Cet objet contient les propriétés suivantes :
+
+*   **année**: l'année à quatre chiffres. *(Nombre)*
+
+*   **mois**: le mois de (0-11). *(Nombre)*
+
+*   **jour**: le jour de (1-31). *(Nombre)*
+
+*   **heure**: l'heure du (0-23). *(Nombre)*
+
+*   **minute**: la minute (0-59). *(Nombre)*
+
+*   **deuxième**: la seconde de (0 à 59). *(Nombre)*
+
+*   **milliseconde**: les millisecondes (entre 0 et 999), non disponibles sur toutes les plateformes. *(Nombre)*
+
+Le paramètre `dateString` doit être de type `String`.
+
+Le paramètre `options` est facultatif, sa valeur par défaut est :
+
+    {formatLength: « court », sélecteur: « date et heure »}
+    
+
+Le `options.formatLength` peut être `short` , `medium` , `long` , ou `full` . Le `options.selector` peut être `date` , `time` ou`date and
+time`.
+
+Si une erreur survient lors de l'analyse de la chaîne de caractères, la fonction `errorCallback` est exécutée et un objet `GlobalizationError` lui est passé en paramètre. Code attendu de l'erreur est`GlobalizationError.PARSING_ERROR`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cela permet d'afficher une boîte de dialogue contextuelle avec un texte semblable à `month:8 day:25 year:2012` . Notez que l'entier faisant référence au numéro du mois est différent de celui présent dans la chaîne parsée, ceci car il représente un index de tableau.
+
+    navigator.globalization.stringToDate(
+        '25/09/2012',
+        function (date) {alert('month : ' + date.month + ',' +
+                               ' day : '  + date.day + ',' +
+                               ' year : ' + date.year + '\n');},
+        function () {alert('Erreur lors de l\'obtention de la date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 Quirks
+
+*   Le `formatLength` prend en charge uniquement l'option `short` et `full` valeurs.
+
+## navigator.globalization.stringToNumber
+
+Retourne un nombre à partir d'une chaîne de caractères contenant un nombre formaté, en tenant compte des préférences utilisateur du client.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### Description
+
+Transmet le nombre demandé en paramètre à la fonction `successCallback` sous la forme d'un objet `properties`. Cet objet contient une propriété `value` dont la valeur est de type `Number`.
+
+Si une erreur survient lors de l'analyse de la chaîne de caractères, la fonction `errorCallback` est exécutée et un objet `GlobalizationError` lui est passé en paramètre. Code attendu de l'erreur est`GlobalizationError.PARSING_ERROR`.
+
+Le `options` paramètre est facultatif et par défaut les valeurs suivantes :
+
+    {type: « decimal »}
+    
+
+Le `options.type` peut être `decimal` , `percent` , ou`currency`.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Exemple
+
+Lorsque le navigateur est configuré pour la `en_US` locale, cela doit afficher une boîte de dialogue contextuelle avec un texte semblable à `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234,56',
+        function (number) {alert('number : ' + number.value + '\n');},
+        function () {alert('Erreur lors de l\'obtention du nombre\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+Un objet représentant une erreur de l'API Globalization.
+
+### Propriétés
+
+*   **code**: Un des codes suivants qui représente le type d'erreur *(Nombre)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **message**: un message texte qui comprend l'explication de l'erreur et/ou de détails *(String)*
+
+### Description
+
+Cet objet est créé et remplie par Cordova, puis transmis à une fonction callback en cas d'erreur.
+
+### Plates-formes prises en charge
+
+*   Amazon Fire OS
+*   Android
+*   iOS
+
+### Exemple
+
+Lorsque la fonction callback d'erreur suivante est exécutée, une fenêtre popup contenant par exemple `code : 3` et `message :` est affichée.
+
+    function errorCallback(error) {
+        alert('code : ' + error.code + '\n' +
+              'message : ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/it/index.md b/doc/it/index.md
new file mode 100644
index 0000000..737e05a
--- /dev/null
+++ b/doc/it/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+Questo plugin ottiene informazioni ed esegue operazioni specifiche impostazioni locali dell'utente, lingua e fuso orario. Si noti la differenza tra lingua e impostazioni internazionali: controlli delle impostazioni internazionali, numeri, date e tempi di visualizzazione per una regione, mentre la lingua determina quale testo di lingua appare come, indipendentemente dalle impostazioni locali. Spesso gli sviluppatori utilizzano impostazioni locali per impostare entrambe le impostazioni, ma non non c'è alcun motivo per che un utente non poteva impostare la lingua "Inglese" ma locale alla "Francese", così che il testo viene visualizzato in inglese ma le date, tempi, ecc., vengono visualizzati come sono in Francia. Purtroppo, piattaforme mobili più attualmente non fanno una distinzione tra queste impostazioni.
+
+## Installazione
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## Oggetti
+
+*   GlobalizationError
+
+## Metodi
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+Ottenere il tag di lingua BCP 47 per la lingua corrente del client.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### Descrizione
+
+Restituisce l'etichetta di identificatore di linguaggio compatibile con BCP-47 per il `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `value` proprietà con un `String` valore.
+
+Se c'è un errore nell'acquisizione della lingua, poi la `errorCallback` viene eseguita con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.UNKNOWN_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en-US` lingua, questo dovrebbe visualizzare una finestra di dialogo pop-up con il testo `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Stranezze Android
+
+*   Restituisce il codice di due lettere della lingua 639-1 ISO, maiuscolo ISO 3166-1 prefisso e variante separati da trattini. Esempi: "en", "en-US", "US"
+
+### Windows Phone 8 stranezze
+
+*   Codice restituisce l'ISO 639-1 due lettere della lingua e il codice ISO 3166-1 paese della variante regionale corrispondente alla "Lingua" impostazione, separati da un trattino.
+*   Si noti che la variante regionale è una proprietà di impostazione "Language" e non determinato dall'impostazione del "Paese" indipendente su Windows Phone.
+
+## navigator.globalization.getLocaleName
+
+Restituisce il tag compatibile con BCP 47 per impostazione locale corrente del client.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### Descrizione
+
+Restituisce la stringa dell'identificatore locale conforme BCP 47 per il `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `value` proprietà con un `String` valore. L'etichetta locale sarà costituito da un codice di due lettere minuscole lingua, codice paese di due lettere maiuscole e codice variante (non specificato), separati da un trattino.
+
+Se c'è un errore di ottenere le impostazioni locali, poi il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.UNKNOWN_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en-US` locale, questa viene visualizzata una finestra popup con il testo`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Stranezze Android
+
+*   Java non fa distinzione tra un set "lingua" e impostare "impostazioni", quindi questo metodo è essenzialmente lo stesso`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 stranezze
+
+*   Codice restituisce l'ISO 639-1 due lettere della lingua e il codice ISO 3166-1 paese della variante regionale corrispondente all'impostazione "Formato regionale", separato da un trattino.
+
+## navigator.globalization.dateToString
+
+Restituisce una data formattata come stringa secondo le impostazioni locali del client e fuso orario.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce la data formattata `String` tramite un `value` proprietà accessibile dall'oggetto passato come parametro per la`successCallback`.
+
+L'ingresso `date` parametro dovrebbe essere di tipo`Date`.
+
+Se c'è un errore di formattazione della data, allora il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.FORMATTING_ERROR`.
+
+Il `options` parametro è facoltativo e valori predefiniti sono:
+
+    {formatLength: 'breve', selettore: 'data e ora'}
+    
+
+Il `options.formatLength` può essere `short` , `medium` , `long` , o`full`.
+
+Il `options.selector` può essere `date` , `time` o`date and time`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Se il browser è impostato per la `en_US` locale, questa viene visualizzata una finestra di popup con testo simile a `date: 9/25/2012 4:21PM` utilizzando le opzioni di default:
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 stranezze
+
+*   Il `formatLength` opzione supporta solo `short` e `full` i valori.
+
+## navigator.globalization.getCurrencyPattern
+
+Restituisce una stringa per formattare e analizzare i valori di valuta secondo le preferenze dell'utente e il codice ISO 4217 del client.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### Descrizione
+
+Restituisce il modello per la `successCallback` con un `properties` oggetto come parametro. Tale oggetto deve contenere le seguenti proprietà:
+
+*   **modello**: il modello valuta per formattare e analizzare i valori di valuta. I modelli seguono [Unicode Technical Standard #35][1]. *(String)*
+
+*   **codice**: codice per il modello The ISO 4217. *(String)*
+
+*   **frazione**: il numero di cifre da utilizzare durante l'analisi e la formattazione valuta. *(Numero)*
+
+*   **arrotondamento**: l'arrotondamento incrementare per utilizzare quando l'analisi e la formattazione. *(Numero)*
+
+*   **decimale**: il simbolo decimale da utilizzare per l'analisi e la formattazione. *(String)*
+
+*   **raggruppamenti**: il raggruppamento simbolo da utilizzare per l'analisi e la formattazione. *(String)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+L'ingresso `currencyCode` parametro dovrebbe essere un `String` di uno dei codici valuta ISO 4217, ad esempio 'USD'.
+
+Se c'è un errore, ottenendo il pattern, allora il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.FORMATTING_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale e la valuta selezionata è dollari degli Stati Uniti, in questo esempio viene visualizzata una finestra di popup con testo simile ai risultati che seguono:
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+Risultato atteso:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+Restituisce una matrice di nomi di mesi o giorni della settimana, a seconda delle preferenze dell'utente del client e calendario.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce la matrice di nomi per la `successCallback` con un `properties` oggetto come parametro. Tale oggetto contiene un `value` proprietà con un `Array` di `String` i valori. I nomi di funzioni matrice a partire da entrambi il primo mese dell'anno o il primo giorno della settimana, a seconda dell'opzione selezionata.
+
+Se c'è un errore ottenendo i nomi, poi il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.UNKNOWN_ERROR`.
+
+Il `options` parametro è facoltativo e valori predefiniti sono:
+
+    {type:'wide', item:'months'}
+    
+
+Il valore di `options.type` può essere `narrow` o`wide`.
+
+Il valore di `options.item` può essere `months` o`days`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, in questo esempio viene visualizzata una serie di dodici finestre pop-up, uno al mese, con un testo simile a `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+Restituisce una stringa per formattare e analizzare i dati secondo le preferenze dell'utente del client.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce il modello per la `successCallback` . L'oggetto passato come parametro contiene le seguenti proprietà:
+
+*   **modello**: il modello di data e ora per formattare e analizzare i dati. I modelli seguono [Unicode Technical Standard #35][1]. *(String)*
+
+*   **fuso orario**: il nome abbreviato del fuso orario sul client. *(String)*
+
+*   **utc_offset**: l'attuale differenza in secondi tra del client fuso orario e tempo universale coordinato. *(Numero)*
+
+*   **DST_OFFSET**: l'offset corrente ora legale in secondi tra non-legale del client di fuso orario e ora legale del cliente risparmio di fuso orario. *(Numero)*
+
+Se c'è un errore per ottenere il modello, il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.PATTERN_ERROR`.
+
+Il `options` parametro è facoltativo e verrà impostato i seguenti valori:
+
+    {formatLength: 'breve', selettore: 'data e ora'}
+    
+
+Il `options.formatLength` può essere `short` , `medium` , `long` , o `full` . Il `options.selector` può essere `date` , `time` o`date and
+time`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, in questo esempio viene visualizzata una finestra di popup con il testo come `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 stranezze
+
+*   Il `formatLength` supporta solo `short` e `full` i valori.
+
+*   La `pattern` per `date and time` modello restituisce solo il formato datetime completo.
+
+*   Il `timezone` restituisce il nome della zona a tempo pieno.
+
+*   La `dst_offset` proprietà non è supportata, e sempre restituisce zero.
+
+## navigator.globalization.getFirstDayOfWeek
+
+Restituisce il primo giorno della settimana secondo le preferenze dell'utente del client e calendario.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### Descrizione
+
+I giorni della settimana sono numerati a partire da 1, dove 1 è presupposto per essere domenica. Restituisce il giorno per la `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `value` proprietà con un `Number` valore.
+
+Se c'è un errore, ottenendo il pattern, allora il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.UNKNOWN_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, questa viene visualizzata una finestra di popup con testo simile a`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+Restituisce una stringa per formattare e analizzare i numeri secondo le preferenze dell'utente del client.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce il modello per la `successCallback` con un `properties` oggetto come parametro. Tale oggetto contiene le seguenti proprietà:
+
+*   **modello**: il modello del numero per formattare e analizzare i numeri. I modelli seguono [Unicode Technical Standard #35][1]. *(String)*
+
+*   **simbolo**: il simbolo da utilizzare durante la formattazione e l'analisi, come un simbolo di percentuale o valuta. *(String)*
+
+*   **frazione**: il numero di cifre da utilizzare durante l'analisi e la formattazione dei numeri. *(Numero)*
+
+*   **arrotondamento**: l'arrotondamento incrementare per utilizzare quando l'analisi e la formattazione. *(Numero)*
+
+*   **positivo**: il simbolo da utilizzare per i numeri positivi quando l'analisi e la formattazione. *(String)*
+
+*   **negativo**: il simbolo da utilizzare per i numeri negativi quando l'analisi e la formattazione. *(String)*
+
+*   **decimale**: il simbolo decimale da utilizzare per l'analisi e la formattazione. *(String)*
+
+*   **raggruppamenti**: il raggruppamento simbolo da utilizzare per l'analisi e la formattazione. *(String)*
+
+Se c'è un errore, ottenendo il pattern, allora il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.PATTERN_ERROR`.
+
+Il `options` parametro è facoltativo e i valori predefiniti sono:
+
+    {tipo: 'decimale'}
+    
+
+Il `options.type` può essere `decimal` , `percent` , o`currency`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, questo dovrebbe visualizzare una finestra di popup con testo simile ai risultati che seguono:
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+Risultati:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 stranezze
+
+*   La `pattern` proprietà non è supportata e retuens una stringa vuota.
+
+*   La `fraction` proprietà non è supportata e restituisce zero.
+
+## navigator.globalization.isDayLightSavingsTime
+
+Indica se l'ora legale è in vigore per una data specifica utilizzando del client fuso orario e calendario.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### Descrizione
+
+Indica se è o meno dell'ora legale in vigore alla `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `dst` proprietà con un `Boolean` valore. A `true` il valore indica che l'ora legale è in vigore per la data specificata, e `false` indica che non è.
+
+Il parametro in ingresso `date` dovrebbe essere di tipo`Date`.
+
+Se c'è un errore di lettura della data, allora il `errorCallback` esegue. Previsto codice dell'errore è`GlobalizationError.UNKNOWN_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Durante l'estate, e se il browser è impostato su un fuso orario abilitato DST, questo dovrebbe visualizzare una finestra di popup con testo simile a `dst: true` :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+Restituisce un numero formattato come una stringa secondo le preferenze dell'utente del client.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce la stringa formattata numero per la `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `value` proprietà con un `String` valore.
+
+Se c'è un errore di formattazione del numero, poi il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.FORMATTING_ERROR`.
+
+Il `options` parametro è facoltativo e valori predefiniti sono:
+
+    {tipo: 'decimale'}
+    
+
+Il `options.type` può essere 'decimale', '%' o 'valuta'.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, questa viene visualizzata una finestra di popup con testo simile a `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+Analizza una data formattata come stringa, secondo le preferenze dell'utente e calendario utilizzando il fuso orario del cliente, il cliente e restituisce l'oggetto data corrispondente.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce la data al metodo di callback con successo un `properties` oggetto come parametro. Tale oggetto dovrebbe avere le seguenti proprietà:
+
+*   **anno**: l'anno a quattro cifre. *(Numero)*
+
+*   **mese**: mese da (0-11). *(Numero)*
+
+*   **giorno**: il giorno da (1-31). *(Numero)*
+
+*   **ora**: l'ora (0-23). *(Numero)*
+
+*   **minuti**: il minuto da (0-59). *(Numero)*
+
+*   **secondo**: il secondo da (0-59). *(Numero)*
+
+*   **millisecondo**: I millisecondi (da 0-999), non disponibili su tutte le piattaforme. *(Numero)*
+
+L'ingresso `dateString` parametro dovrebbe essere di tipo`String`.
+
+Il `options` parametro è facoltativo e verrà impostato i seguenti valori:
+
+    {formatLength: 'breve', selettore: 'data e ora'}
+    
+
+Il `options.formatLength` può essere `short` , `medium` , `long` , o `full` . Il `options.selector` può essere `date` , `time` o`date and
+time`.
+
+Se c'è un errore di parsing della stringa data, allora il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.PARSING_ERROR`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, questa viene visualizzata una finestra di popup con testo simile a `month:8 day:25 year:2012` . Si noti che il mese intero è uno minore di stringa, come l'intero mese rappresenta un indice di matrice.
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 stranezze
+
+*   Il `formatLength` opzione supporta solo `short` e `full` i valori.
+
+## navigator.globalization.stringToNumber
+
+Analizza un numero formattato come una stringa secondo le preferenze dell'utente del client e restituisce il numero corrispondente.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### Descrizione
+
+Restituisce il numero per il `successCallback` con un `properties` oggetto come parametro. Tale oggetto dovrebbe avere una `value` proprietà con un `Number` valore.
+
+Se c'è un errore di parsing della stringa di numeri, poi il `errorCallback` viene eseguito con un `GlobalizationError` oggetto come parametro. Previsto codice dell'errore è`GlobalizationError.PARSING_ERROR`.
+
+Il `options` parametro è facoltativo e verrà impostato i seguenti valori:
+
+    {tipo: 'decimale'}
+    
+
+Il `options.type` può essere `decimal` , `percent` , o`currency`.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Esempio
+
+Quando il browser è impostato per la `en_US` locale, questo dovrebbe visualizzare una finestra di popup con testo simile a `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+Un oggetto che rappresenta un errore dall'API di globalizzazione.
+
+### Proprietà
+
+*   **codice**: Uno dei seguenti codici che rappresenta il tipo di errore *(Numero)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **messaggio**: un messaggio di testo che include la spiegazione dell'errore e/o dettagli *(String)*
+
+### Descrizione
+
+Questo oggetto è creato e popolato da Cordova e restituito una richiamata in caso di errore.
+
+### Piattaforme supportate
+
+*   Amazon fuoco OS
+*   Android
+*   iOS
+
+### Esempio
+
+Quando si esegue il callback di errore seguenti, esso viene visualizzata una finestra popup con il testo simile a `code: 3` e`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/ja/index.md b/doc/ja/index.md
new file mode 100644
index 0000000..936ad37
--- /dev/null
+++ b/doc/ja/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+このプラグインは、情報を取得し、ユーザーのロケール、言語、およびタイム ゾーンに固有の操作を実行します。 ロケールと言語の違いに注意してください: ロケール コントロール番号、日付、および時刻の表示方法、地域の言語で決まりますがどのような言語のテキストの間のように、ロケールの設定とは無関係です。 多くの開発者を使用してロケール設定両方、しかしユーザーは「英語」彼女言語を設定できませんでした理由はない"フランス語"ロケールので英語が日付時刻等でテキストが表示されますが表示されるフランスでは。 残念ながら、ほとんどのモバイルプラット フォーム現在行いませんこれらの設定の間の区別。
+
+## インストール
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## オブジェクト
+
+*   GlobalizationError
+
+## メソッド
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+クライアントの現在の言語の BCP 47 言語タグを取得します。
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### 説明
+
+BCP 47 準拠の言語識別子タグを返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが必要な `value` を持つプロパティ、 `String` 値。
+
+言語を取得中にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.UNKNOWN_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en-US` 言語、これで、テキストとポップアップ ダイアログを表示 `language: en-US` ：
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Android の癖
+
+*   ISO 639-1 の 2 文字の言語コード、大文字の ISO 3166-1 国名コードおよびハイフンで区切られたバリアントを返します。例:"en"、"EN-US"、「米国」
+
+### Windows Phone 8 癖
+
+*   返します ISO 639-1 の 2 文字言語コードと設定、ハイフンで区切られた「言語」に対応する地域バリアントの ISO 3166-1 国名コード。
+*   地域バリアント「言語」の設定のプロパティは Windows Phone に無関係な"国/地域] の設定によって決定できないことに注意してください。
+
+## navigator.globalization.getLocaleName
+
+クライアントの現在のロケール設定 BCP 47 準拠タグを返します。
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### 説明
+
+BCP 47 準拠ロケール識別子文字列を返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが必要な `value` を持つプロパティ、 `String` 値。 ロケール タグは 2 文字の小文字の言語コード、大文字 2 文字の国コード、ハイフンで区切られた (不特定) のバリアント型コードで構成されます。
+
+ロケールを取得中にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.UNKNOWN_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en-US` ロケール、テキストとポップアップ ダイアログが表示されます`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Android の癖
+
+*   Java は区別されません設定「言語」と「ロケール設定、」ので、このメソッドは、本質的に同じ`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 癖
+
+*   返します ISO 639-1 の 2 文字言語コードおよびハイフンで区切られた「地域形式」の設定に対応する地域バリアントの ISO 3166-1 国名コード。
+
+## navigator.globalization.dateToString
+
+日付を返します、クライアントのロケールおよびタイムゾーンに従って文字列として書式設定されます。
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### 説明
+
+書式設定された日付を返します `String` を介して、 `value` にパラメーターとして渡されたオブジェクトからアクセス可能なプロパティ、`successCallback`.
+
+受信 `date` パラメーター型である必要があります`Date`.
+
+場合は、日付の書式設定エラーがあるし、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.FORMATTING_ERROR`.
+
+`options`パラメーターはオプションであり、既定値は。
+
+    {formatLength: 'ショート' セレクター： '日付と時刻'}
+    
+
+`options.formatLength`することができます `short` 、 `medium` 、 `long` 、または`full`.
+
+`options.selector`することができます `date` 、 `time` または`date and time`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザー設定されている場合、 `en_US` のロケールのようなテキストとポップアップ ダイアログが表示されます `date: 9/25/2012 4:21PM` 既定のオプションを使用して。
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 癖
+
+*   `formatLength`オプションをサポートするだけ `short` と `full` の値。
+
+## navigator.globalization.getCurrencyPattern
+
+書式設定および通貨の値によると、クライアントのユーザーの基本設定と ISO 4217 通貨コードを解析するパターン文字列を返します。
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### 説明
+
+パターンを返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。そのオブジェクトは、次のプロパティを含める必要があります。
+
+*   **パターン**: 通貨パターンを書式設定および通貨の値を解析します。 パターンは、 [Unicode 技術標準 #35][1]に従ってください。 *(文字列)*
+
+*   **コード**: パターンの ISO 4217 通貨コード。*(文字列)*
+
+*   **分数**: 解析および通貨を書式設定するときに使用する小数部の桁の数。*(数)*
+
+*   **丸め**: 解析および書式設定するときに使用するインクリメントに丸め。*(数)*
+
+*   **10 進数**: 解析および書式設定を使用する小数点の記号。*(文字列)*
+
+*   **グループ**: 解析および書式設定を使用する区切り記号。*(文字列)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+受信した `currencyCode` パラメーターをする必要があります、 `String` 、ISO 4217 通貨コードは、たとえば 'USD' のいずれかの。
+
+パターンを取得時にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.FORMATTING_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+
+### 例
+
+ブラウザーに設定すると、 `en_US` ロケールと、選択した通貨は米国ドルで、この例は次の結果のようなテキストとポップアップ ダイアログを表示します。
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+期待される結果:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+月の名前またはクライアントのユーザーの好みやカレンダーに応じて曜日の配列を返します。
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### 説明
+
+名前の配列を返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが含まれています、 `value` プロパティ、 `Array` の `String` の値。 年または選択したオプションに応じて、週の最初の日の最初の月のいずれかから始まってアレイ機能の名前。
+
+名前の取得エラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.UNKNOWN_ERROR`.
+
+`options`パラメーターはオプションであり、既定値は。
+
+    {type:'wide', item:'months'}
+    
+
+値 `options.type` することができます `narrow` または`wide`.
+
+値 `options.item` することができます `months` または`days`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` ロケール、この例の表示 12 ポップアップ ダイアログ ボックスのようなテキストで、毎月のシリーズ `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+クライアントのユーザーの設定に従った日付を解析するパターン文字列を返します。
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### 説明
+
+パターンを返します、 `successCallback` 。パラメーターとして渡されたオブジェクトには、次のプロパティが含まれています。
+
+*   **パターン**: 書式し、日付を解析する日付と時刻のパターン。 パターンは、 [Unicode 技術標準 #35][1]に従ってください。 *(文字列)*
+
+*   **タイムゾーン**: クライアントのタイム ゾーンの省略名。*(文字列)*
+
+*   **とおりです。**: クライアントのタイム ゾーンと世界協定時刻間の秒で現在の差異。*(数)*
+
+*   **dst_offset**： クライアントの非夏時間 (秒単位) は、現在の夏時間オフセットのタイムゾーンとクライアントの夏時間保存のタイム ゾーン。*(数)*
+
+パターンを取得時にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.PATTERN_ERROR`.
+
+`options`パラメーターはオプションであり、次の値を既定値します。
+
+    {formatLength: 'ショート' セレクター： '日付と時刻'}
+    
+
+`options.formatLength`することができます `short` 、 `medium` 、 `long` 、または `full` 。 `options.selector`することができます `date` 、 `time` または`date and
+time`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` ロケール、例など、テキストとポップアップ ダイアログを表示します `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 癖
+
+*   `formatLength`のみをサポートしています `short` と `full` の値。
+
+*   `pattern`の `date and time` パターンは完全な datetime 形式のみを返します。
+
+*   `timezone`完全なタイム ゾーン名を返します。
+
+*   `dst_offset`プロパティはサポートされていませんし、常に 0 を返します。
+
+## navigator.globalization.getFirstDayOfWeek
+
+よると、クライアントのユーザー設定カレンダー週の最初の曜日を返します。
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### 説明
+
+週の日 1 日曜日であると見なされます、1 から始まる番号が付けられます。 曜日を返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが必要な `value` を持つプロパティ、 `Number` 値。
+
+パターンを取得時にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.UNKNOWN_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` のロケールのようなテキストとポップアップ ダイアログが表示されます`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+クライアントのユーザーの設定に従って数値を解析するパターン文字列を返します。
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### 説明
+
+パターンを返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。そのオブジェクトには、次のプロパティが含まれています。
+
+*   **パターン**: 番号のパターンを書式設定および解析の数字。 パターンは、 [Unicode 技術標準 #35][1]に従ってください。 *(文字列)*
+
+*   **記号**: 書式設定と解析、パーセントや通貨記号などのときに使用するシンボル。*(文字列)*
+
+*   **分数**: 解析および数値を書式設定するときに使用する小数部の桁の数。*(数)*
+
+*   **丸め**: 解析および書式設定するときに使用するインクリメントに丸め。*(数)*
+
+*   **正**： 正の数の解析および書式設定するときに使用する記号。*(文字列)*
+
+*   **負**: 負の数の解析および書式設定するときに使用する記号。*(文字列)*
+
+*   **10 進数**: 解析および書式設定を使用する小数点の記号。*(文字列)*
+
+*   **グループ**: 解析および書式設定を使用する区切り記号。*(文字列)*
+
+パターンを取得時にエラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.PATTERN_ERROR`.
+
+`options`パラメーターが省略可能であり、既定値。
+
+    {0} 型: 'decimal'}
+    
+
+`options.type`することができます `decimal` 、 `percent` 、または`currency`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` のロケールに従って結果のようなテキストとポップアップ ダイアログが表示されます。
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+結果:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 癖
+
+*   `pattern`プロパティはサポートされていませんと retuens、空の文字列。
+
+*   `fraction`プロパティはサポートされていません、0 を返します。
+
+## navigator.globalization.isDayLightSavingsTime
+
+夏時間の時間が、クライアントのタイム ゾーンとカレンダーを使用して特定の日付に対して有効かどうかを示します。
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### 説明
+
+夏時間が有効にするかどうかを示します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが必要な `dst` を持つプロパティ、 `Boolean` 値。 A `true` 値は、夏時間の時間が指定した日付のために有効であることを示しますと `false` がないことを示します。
+
+受信パラメーター `date` 型である必要があります`Date`.
+
+日付を読み取り中にエラーがある場合、 `errorCallback` を実行します。予想されるエラーコードです。`GlobalizationError.UNKNOWN_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+夏の間、これでのようなテキストとポップアップ ダイアログを表示するブラウザーは、DST が有効なタイム ゾーンに設定されている場合と `dst: true` ：
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+クライアントのユーザーの設定に従って文字列として書式設定された数を返します。
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### 説明
+
+番号の書式設定された文字列を返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。 そのオブジェクトが必要な `value` を持つプロパティ、 `String` 値。
+
+番号、書式設定エラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.FORMATTING_ERROR`.
+
+`options`パラメーターはオプションであり、既定値は。
+
+    {0} 型: 'decimal'}
+    
+
+`options.type`'Decimal'、'%' または '通貨' にすることができます。
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` のロケールのようなテキストとポップアップ ダイアログが表示されます `number: 3.142` ：
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+クライアントのユーザーの基本設定や、クライアントのタイム ゾーンを使用して予定表によると、文字列として書式設定された日付を解析し、対応する日付オブジェクトを返します。
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### 説明
+
+日付の成功時のコールバックを返します、 `properties` オブジェクトをパラメーターとして。そのオブジェクトは、次のプロパティが必要です。
+
+*   **年**： 4 桁の年。*(数)*
+
+*   **月**: (0-11) から 1 カ月。*(数)*
+
+*   **日**: 日 (1 から 31)。*(数)*
+
+*   **時間**: 時間 (0-23) から。*(数)*
+
+*   **分**: (0-59） から分です。*(数)*
+
+*   **2 番目**: (0-59） から 2 番目。*(数)*
+
+*   **ミリ秒**： 時間をミリ秒単位 (0 ～ 999) まですべてのプラットフォームでは利用できません。*(数)*
+
+受信 `dateString` パラメーター型である必要があります`String`.
+
+`options`パラメーターはオプションであり、次の値を既定値します。
+
+    {formatLength: 'ショート' セレクター： '日付と時刻'}
+    
+
+`options.formatLength`することができます `short` 、 `medium` 、 `long` 、または `full` 。 `options.selector`することができます `date` 、 `time` または`date and
+time`.
+
+日付文字列の解析エラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.PARSING_ERROR`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` のロケールのようなテキストとポップアップ ダイアログが表示されます `month:8 day:25 year:2012` 。 注意： 整数は 1 ヶ月未満の文字列、月整数として配列のインデックスを表します。
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 癖
+
+*   `formatLength`オプションをサポートするだけ `short` と `full` の値。
+
+## navigator.globalization.stringToNumber
+
+クライアントのユーザーの設定に従って文字列として書式設定された数を解析し、対応する番号を返します。
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### 説明
+
+番号を返します、 `successCallback` と、 `properties` オブジェクトをパラメーターとして。そのオブジェクトが必要な `value` を持つプロパティ、 `Number` 値。
+
+数値文字列の解析エラーがある場合、 `errorCallback` で実行する、 `GlobalizationError` オブジェクトをパラメーターとして。 予想されるエラーコードです。`GlobalizationError.PARSING_ERROR`.
+
+`options`パラメーターはオプションであり、次の値を既定値します。
+
+    {0} 型: 'decimal'}
+    
+
+`options.type`することができます `decimal` 、 `percent` 、または`currency`.
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+*   Windows Phone 8
+
+### 例
+
+ブラウザーに設定すると、 `en_US` ロケール、これのようなテキストとポップアップ ダイアログを表示する必要があります `number: 1234.56` ：
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+グローバリゼーション API からエラーを表すオブジェクト。
+
+### プロパティ
+
+*   **コード**: エラーの種類を表す次のコードの 1 つ *(数)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **メッセージ**: エラーの説明が含まれていますおよび/または*(文字列)*の詳細をテキスト メッセージ
+
+### 説明
+
+このオブジェクトが作成され、コルドバ、によって移入エラーの場合のコールバックに返されます。
+
+### サポートされているプラットフォーム
+
+*   アマゾン火 OS
+*   アンドロイド
+*   iOS
+
+### 例
+
+次のエラー コールバックを実行するのようなテキストとポップアップ ダイアログが表示されます `code: 3` と`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/ko/index.md b/doc/ko/index.md
new file mode 100644
index 0000000..8c1f16f
--- /dev/null
+++ b/doc/ko/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+이 플러그인 정보를 가져오고 사용자의 로캘, 언어 및 표준 시간대에 특정 작업을 수행 합니다. 로캘 및 언어의 차이점을 참고: 로캘 어떻게 숫자, 날짜 및 시간 표시 되는 제어 영역의 언어 어떤 언어 텍스트를 결정 하는 반면, 로캘 설정에 관계 없이 나타납니다. 종종 개발자 로캘 설정을 모두를 사용 하 여 하지만 거기에 아무 이유 없이 사용자 "영어"로 그녀의 언어를 설정할 수 없습니다 있지만 "프랑스어" 로캘을 영어 하지만 날짜, 시간, 등, 텍스트 표시 되도록 표시 됩니다 그들은 프랑스에. 불행히도, 대부분의 모바일 플랫폼 현재 만들지 않는다 이러한 설정 구분.
+
+## 설치
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## 개체
+
+*   GlobalizationError
+
+## 메서드
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+클라이언트의 현재 언어에 대 한 BCP 47 언어 태그를 얻을.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### 설명
+
+BCP 47 규격 언어 식별자 태그를 반환 합니다는 `successCallback` 와 `properties` 개체를 매개 변수로 합니다. 있어야 해당 개체는 `value` 속성을 `String` 값.
+
+언어, 점점 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.UNKNOWN_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en-US` 언어,이 텍스트와 함께 팝업 대화 상자를 표시 한다 `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### 안 드 로이드 단점
+
+*   ISO 639-1 두 자리 언어 코드, 대문자 ISO 3166-1 국가 코드와 하이픈으로 구분 된 variant를 반환 합니다. 예: "en", "en-US", "미국"
+
+### Windows Phone 8 단점
+
+*   반환 ISO 639-1 두 글자 언어 코드 및 ISO 3166-1 국가 코드의 "언어" 설정, 하이픈으로 구분 된 해당 지역 이체.
+*   Note 지역 변종 "언어" 설정의 속성 이며 Windows Phone 관련 없는 "국가/지역" 설정에 의해 결정 되지.
+
+## navigator.globalization.getLocaleName
+
+클라이언트의 현재 로캘 설정에 대 한 BCP 47 호환 태그를 반환합니다.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### 설명
+
+BCP 47 준수 로캘 식별자 문자열을 반환 합니다에 `successCallback` 와 함께 한 `properties` 개체를 매개 변수로. 있어야 해당 개체는 `value` 속성을 `String` 값. 두 자리 소문자 언어 코드, 두 글자 대문자 국가 코드와 하이픈으로 분리 된 (지정 되지 않은) 변형 코드 로캘 태그 구성 됩니다.
+
+로캘, 점점 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.UNKNOWN_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en-US` 로케일, 텍스트와 함께 팝업 대화 상자가 표시 됩니다`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### 안 드 로이드 단점
+
+*   자바 구분 하지 않습니다 설정된 "언어"를 설정된 "로캘" 이므로이 방법은 기본적으로 동일`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 단점
+
+*   반환 ISO 639-1 두 글자 언어 코드 및 ISO 3166-1 국가 코드 지역 변형 하이픈으로 구분 된 "지역 포맷" 설정에 해당 합니다.
+
+## navigator.globalization.dateToString
+
+날짜를 반환 합니다 클라이언트의 로케일과 시간대에 따라 문자열로 서식이 지정 된.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### 설명
+
+서식이 지정 된 날짜를 반환 합니다 `String` 통해는 `value` 개체에서 액세스할 수 있는 속성을 매개 변수로 전달 되는`successCallback`.
+
+인바운드는 `date` 매개 변수 유형 이어야 합니다`Date`.
+
+날짜 서식을 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.FORMATTING_ERROR`.
+
+`options`매개 변수는 선택적 이며 그것의 기본 값은:
+
+    {formatLength: '짧은' 선택기: '날짜 및 시간'}
+    
+
+`options.formatLength`수 있는 `short` , `medium` , `long` , 또는`full`.
+
+`options.selector`수 있는 `date` , `time` 또는`date and time`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우는 `en_US` 로케일,이 텍스트에 유사한 팝업 대화 상자가 표시 됩니다 `date: 9/25/2012 4:21PM` 기본 옵션을 사용 하 여:
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 단점
+
+*   `formatLength`만 지원 옵션 `short` 및 `full` 값.
+
+## navigator.globalization.getCurrencyPattern
+
+포맷 하 고 클라이언트의 사용자 환경 설정 및 ISO 4217 통화 부호에 따라 통화 값을 구문 분석 패턴 문자열을 반환 합니다.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### 설명
+
+패턴을 반환 합니다에 `successCallback` 와 함께 한 `properties` 개체를 매개 변수로. 해당 개체에는 다음과 같은 속성이 포함 되어야 합니다.
+
+*   **패턴**: 통화 패턴 서식을 지정 하 여 통화 값을 구문 분석 합니다. 패턴에 따라 [유니코드 기술 표준 #35][1]. *(문자열)*
+
+*   **코드**: ISO 4217 통화 코드 패턴. *(문자열)*
+
+*   **분수**: 구문 분석 하 고 통화 서식을 사용 하 여 소수 자릿수의 수. *(수)*
+
+*   **반올림**: 라운딩 때 구문 분석 및 서식 지정을 사용 하 여 증가 합니다. *(수)*
+
+*   **10 진수**: 구문 분석 및 서식 지정에 사용할 소수점 기호가. *(문자열)*
+
+*   **그룹화**: 구문 분석 및 서식 지정에 사용할 그룹화 기호. *(문자열)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+인바운드는 `currencyCode` 매개 변수 이어야 합니다는 `String` 의 ISO 4217 통화 코드, 예를 들어 '미화' 중 하나.
+
+패턴을 얻는 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.FORMATTING_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로캘 및 선택한 통화는 미국 달러,이 예제에서는 수행 결과를 유사한 텍스트와 팝업 대화 상자가 표시 됩니다:
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+예상된 결과:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+달의 이름 또는 클라이언트의 사용자 환경 설정 및 일정에 따라 매일의 배열을 반환합니다.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### 설명
+
+이름의 배열을 반환 합니다는 `successCallback` 와 `properties` 개체를 매개 변수로 합니다. 해당 개체를 포함 한 `value` 속성으로는 `Array` 의 `String` 값. 배열 기능 이름과 년 또는 선택한 옵션에 따라 일주일의 첫날 첫 번째 달에서 시작.
+
+이름을 얻는 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.UNKNOWN_ERROR`.
+
+`options`매개 변수는 선택적 이며 그것의 기본 값은:
+
+    {type:'wide', item:'months'}
+    
+
+값 `options.type` 일 수 있다 `narrow` 또는`wide`.
+
+값 `options.item` 일 수 있다 `months` 또는`days`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 예에서는 표시 12 팝업 대화 상자, 텍스트 비슷한 한달에 하나 시리즈 `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+포맷 하 고 클라이언트의 사용자 환경 설정에 따라 날짜 구문 분석 패턴 문자열을 반환 합니다.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### 설명
+
+패턴을 반환 합니다 `successCallback` . 매개 변수로 전달 된 개체에는 다음 속성이 포함 되어 있습니다.
+
+*   **패턴**: 포맷 하 고 날짜를 구문 분석할 날짜 및 시간 패턴. 패턴에 따라 [유니코드 기술 표준 #35][1]. *(문자열)*
+
+*   **시간대**: 클라이언트에 표준 시간대의 약식된 이름. *(문자열)*
+
+*   **utc_offset**: 클라이언트의 시간대와 세계시 간의 초에서 현재 차이. *(수)*
+
+*   **dst_offset**: 클라이언트의 비 일광 절약 간격 (초)에 현재 일광 절약 시간제 오프셋의 시간대와 클라이언트의 일광 절약의 시간대. *(수)*
+
+패턴을 얻는 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로 합니다. 오류의 예상 된 코드는`GlobalizationError.PATTERN_ERROR`.
+
+`options`매개 변수는 선택적 이며 기본값은 다음 값:
+
+    {formatLength: '짧은' 선택기: '날짜 및 시간'}
+    
+
+`options.formatLength`수 있는 `short` , `medium` , `long` , 또는 `full` . `options.selector`수 있는 `date` , `time` 또는`date and
+time`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로캘,이 예제에서는 같은 텍스트와 함께 팝업 대화 상자를 표시 `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 단점
+
+*   `formatLength`만 지원 `short` 및 `full` 값.
+
+*   `pattern`에 대 한 `date and time` 패턴 전체 datetime 형식만 반환 합니다.
+
+*   `timezone`풀 타임 영역 이름을 반환 합니다.
+
+*   `dst_offset`속성은 지원 되지 않으며 항상 반환 0.
+
+## navigator.globalization.getFirstDayOfWeek
+
+클라이언트의 사용자 환경 설정 및 일정에 따라 일주일의 첫 날을 반환합니다.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### 설명
+
+주일의 일 1 일요일으로 간주 됩니다 1에서 시작 하는 번호가 지정 됩니다. 하루에 반환 합니다는 `successCallback` 와 `properties` 개체를 매개 변수로. 있어야 해당 개체는 `value` 속성을 `Number` 값.
+
+패턴을 얻는 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.UNKNOWN_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 텍스트에 유사한 팝업 대화 상자가 표시 됩니다`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+포맷 하 고 클라이언트의 사용자 환경 설정에 따라 숫자를 구문 분석할 패턴 문자열을 반환 합니다.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### 설명
+
+패턴을 반환 합니다에 `successCallback` 와 함께 한 `properties` 개체를 매개 변수로. 해당 개체에는 다음 속성이 포함 되어 있습니다.
+
+*   **패턴**: 포맷 하 고 숫자를 구문 분석할 숫자 패턴. 패턴에 따라 [유니코드 기술 표준 #35][1]. *(문자열)*
+
+*   **기호**: 때 서식 지정 및 구문 분석, % 또는 통화 기호 등을 사용 하 여 기호. *(문자열)*
+
+*   **분수**: 구문 분석 하 고 숫자 서식을 사용 하 여 소수 자릿수의 수. *(수)*
+
+*   **반올림**: 라운딩 때 구문 분석 및 서식 지정을 사용 하 여 증가 합니다. *(수)*
+
+*   **양수**: 양수 때 구문 분석 및 서식 지정에 사용할 기호. *(문자열)*
+
+*   **음수**: 음수 때 구문 분석 및 서식 지정에 사용할 기호. *(문자열)*
+
+*   **10 진수**: 구문 분석 및 서식 지정에 사용할 소수점 기호가. *(문자열)*
+
+*   **그룹화**: 구문 분석 및 서식 지정에 사용할 그룹화 기호. *(문자열)*
+
+패턴을 얻는 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.PATTERN_ERROR`.
+
+`options`매개 변수는 선택적 이며 기본값은:
+
+    {유형: '10 진수'}
+    
+
+`options.type`수 있는 `decimal` , `percent` , 또는`currency`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 수행 결과를 유사한 텍스트 팝업 대화 상자를 표시 합니다:
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+결과:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 단점
+
+*   `pattern`속성은 지원 되지 않습니다, 및 retuens는 빈 문자열.
+
+*   `fraction`속성은 지원 되지 않습니다, 그리고 반환 0.
+
+## navigator.globalization.isDayLightSavingsTime
+
+일광 절약 시간이 클라이언트의 표준 시간대 및 달력을 사용 하 여 특정된 날짜에 대 한 효과 인지 표시 합니다.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### 설명
+
+나타냅니다 여부 일광 절약 시간 적용 하는 `successCallback` 와 `properties` 개체를 매개 변수로. 있어야 해당 개체는 `dst` 속성을 `Boolean` 값. A `true` 값 나타냅니다 일광 절약 시간이 특정된 날짜에 대해 적용 되 고 `false` 하지 않음을 나타냅니다.
+
+인바운드 매개 변수는 `date` 형식 이어야 합니다`Date`.
+
+날짜 읽기 오류가 발생 하는 경우 다음 `errorCallback` 를 실행 합니다. 오류의 예상 된 코드는`GlobalizationError.UNKNOWN_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+여름 동안에, 브라우저 DST 설정 표준 시간대로 설정 되어 있으면이 텍스트 비슷한 팝업 대화 상자를 표시 해야 하 고 `dst: true` :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+클라이언트의 사용자 환경 설정에 따라 문자열 형식으로 숫자를 반환 합니다.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### 설명
+
+서식이 지정 된 숫자 문자열을 반환 합니다에 `successCallback` 와 함께 한 `properties` 개체를 매개 변수로. 있어야 해당 개체는 `value` 속성을 `String` 값.
+
+번호, 서식 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.FORMATTING_ERROR`.
+
+`options`매개 변수는 선택적 이며 그것의 기본 값은:
+
+    {유형: '10 진수'}
+    
+
+`options.type`'소수', '%' 또는 '통화' 될 수 있습니다.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 텍스트에 유사한 팝업 대화 상자가 표시 됩니다 `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+클라이언트의 사용자 환경 설정 및 달력 클라이언트의 표준 시간대를 사용 하 여 문자열 형식으로 날짜를 구문 분석 하 고 해당 하는 date 개체를 반환 합니다.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### 설명
+
+날짜와 함께 성공 콜백 반환 된 `properties` 개체를 매개 변수로. 해당 개체는 다음 속성이 있어야 합니다.
+
+*   **년**: 4 자리 연도. *(수)*
+
+*   **달**: 달 (0-11). *(수)*
+
+*   **주**: (1-31)에서 하루. *(수)*
+
+*   **시간**: 1 시간 (0-23). *(수)*
+
+*   **분**: 분 (0-59)에서. *(수)*
+
+*   **두 번째**: (0-59)에서 두 번째. *(수)*
+
+*   **밀리초**: 모든 플랫폼에서 사용할 수 없습니다 (0-999)에서 밀리초. *(수)*
+
+인바운드는 `dateString` 매개 변수 유형 이어야 합니다`String`.
+
+`options`매개 변수는 선택적 이며 기본값은 다음 값:
+
+    {formatLength: '짧은' 선택기: '날짜 및 시간'}
+    
+
+`options.formatLength`수 있는 `short` , `medium` , `long` , 또는 `full` . `options.selector`수 있는 `date` , `time` 또는`date and
+time`.
+
+날짜 문자열을 구문 분석 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.PARSING_ERROR`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 텍스트에 유사한 팝업 대화 상자가 표시 됩니다 `month:8 day:25 year:2012` . 유의 정수는 한 달 미만의 문자열, 달 정수로 나타내는 배열 인덱스.
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 단점
+
+*   `formatLength`만 지원 옵션 `short` 및 `full` 값.
+
+## navigator.globalization.stringToNumber
+
+클라이언트의 사용자 환경 설정에 따라 문자열 형식으로 번호를 구문 분석 하 고 해당 번호를 반환 합니다.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### 설명
+
+번호를 반환 합니다는 `successCallback` 와 `properties` 개체를 매개 변수로 합니다. 있어야 해당 개체는 `value` 속성을 `Number` 값.
+
+숫자 문자열을 구문 분석 오류가 발생 하는 경우는 `errorCallback` 로 실행 한 `GlobalizationError` 개체를 매개 변수로. 오류의 예상 된 코드는`GlobalizationError.PARSING_ERROR`.
+
+`options`매개 변수는 선택적 이며 기본값은 다음 값:
+
+    {유형: '10 진수'}
+    
+
+`options.type`수 있는 `decimal` , `percent` , 또는`currency`.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+*   Windows Phone 8
+
+### 예를 들어
+
+브라우저 설정 된 경우에 `en_US` 로케일,이 텍스트와 유사한 팝업 대화 상자를 표시 한다 `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+세계화 API에서 오류를 나타내는 개체입니다.
+
+### 속성
+
+*   **코드**: 오류 형식을 나타내는 다음 코드 중 하나 *(수)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **메시지**: 오류 설명을 포함 및/또는 *(문자열)를* 자세히 설명 하는 텍스트 메시지
+
+### 설명
+
+이 개체와 코르도바, 의해 만들어지고 오류 경우 콜백 반환.
+
+### 지원 되는 플랫폼
+
+*   아마존 화재 운영 체제
+*   안 드 로이드
+*   iOS
+
+### 예를 들어
+
+유사한 텍스트와 팝업 대화 상자가 표시 됩니다 다음 오류 콜백 실행 되 면 `code: 3` 와`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/pl/index.md b/doc/pl/index.md
new file mode 100644
index 0000000..80b13db
--- /dev/null
+++ b/doc/pl/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+Ten plugin uzyskuje informacje i wykonuje operacje specyficzne dla użytkownika ustawienia regionalne, język i strefa czasowa. Zwróć uwagę na różnicę między ustawień regionalnych i językowych: regionalny kontroli jak liczby, daty i godziny są wyświetlane dla regionu, podczas gdy język określa, jaki tekst w języku pojawia się jako, niezależnie od ustawień regionalnych. Często Deweloperzy używają regionalny do zarówno ustawienia, ale nie ma żadnego powodu, które użytkownik nie mógł ustawić jej język "Polski" regionalny "Francuski", tak, że tekst jest wyświetlany w angielski, ale daty, godziny, itp., są wyświetlane są one we Francji. Niestety najbardziej mobilnych platform obecnie nie wprowadzają rozróżnienia tych ustawień.
+
+## Instalacji
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## Obiekty
+
+*   GlobalizationError
+
+## Metody
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+Znacznik języka BCP 47 uzyskać bieżący język klienta.
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### Opis
+
+Zwraca tag identyfikator język zgodny z BCP-47 `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `value` Właściwość `String` wartość.
+
+Jeśli tu jest błąd w języku, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.UNKNOWN_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en-US` języka, to należy wyświetlić wyskakujące okno z tekstem `language: en-US` :
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Android dziwactwa
+
+*   Zwraca ISO 639-1 języka dwuliterowy kod, wielkie litery ISO 3166-1 kraj kod i wariant oddzielonych myślnikami. Przykłady: "pl", "pl", "US"
+
+### Windows Phone 8 dziwactwa
+
+*   Zwraca ISO 639-1 dwuliterowy kod języka i kod ISO 3166-1 kraju regionalne wariant odpowiadający "Język" ustawienie, oddzielone myślnikiem.
+*   Należy zauważyć, że regionalne wariant jest Właściwość ustawieniem "Language" i nie określona przez ustawienie "Kraj" niepowiązanych na Windows Phone.
+
+## navigator.globalization.getLocaleName
+
+Zwraca znacznik zgodny z BCP 47 dla klienta bieżące ustawienia regionalne.
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### Opis
+
+Zwraca ciąg identyfikatora regionalny zgodny z BCP 47 `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `value` Właściwość `String` wartość. Tag regionalnych będzie się składać z ma³e dwuliterowy kod języka, dwie litery wielkie litery kodu kraju i (nieokreślone) kod wariantu, oddzielone myślnikiem.
+
+Jeśli tu jest błąd ustawienia regionalne, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.UNKNOWN_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en-US` Ustawienia regionalne, to wyświetla okno dialogowe popup z tekstem`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Android dziwactwa
+
+*   Java nie rozróżnia się między zestaw "języka" i ustaw "regionalny", więc ta metoda jest zasadniczo taka sama, jak`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 dziwactwa
+
+*   Zwraca ISO 639-1 dwuliterowy kod języka i kod ISO 3166-1 kraju regionalne wariant odpowiednie ustawienie "Format regionalny", oddzielone myślnikiem.
+
+## navigator.globalization.dateToString
+
+Zwraca daty sformatowane jako ciąg regionalny klient i strefa czasowa.
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca datę sformatowaną `String` za pomocą `value` Właściwość z obiektu przekazane jako parametr`successCallback`.
+
+Przychodzących `date` parametr powinien być typu`Date`.
+
+Jeśli występuje błąd formatowania daty, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.FORMATTING_ERROR`.
+
+`options`Parametr jest opcjonalny, a jego wartości domyślne są:
+
+    {formatLength: "krótkie", wybór: "Data i czas"}
+    
+
+`options.formatLength`Może być `short` , `medium` , `long` , lub`full`.
+
+`options.selector`Może być `date` , `time` lub`date and time`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Jeśli przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to wyświetla okno dialogowe popup z tekst podobny do `date: 9/25/2012 4:21PM` przy użyciu opcji domyślnych:
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 dziwactwa
+
+*   `formatLength`Opcja obsługuje tylko `short` i `full` wartości.
+
+## navigator.globalization.getCurrencyPattern
+
+Zwraca ciąg wzór do formatu i analizy wartości walut według preferencji użytkownika klienta i kod waluty ISO 4217.
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### Opis
+
+Zwraca wzór do `successCallback` z `properties` obiektu jako parametr. Obiekt powinien zawierać następujące właściwości:
+
+*   **wzór**: wzór waluty wobec układ graficzny i analizy wartości waluty. Wzory wykonaj [techniczny Standard Unicode #35][1]. *(String)*
+
+*   **Kod**: kod waluty The ISO 4217 dla wzorca. *(String)*
+
+*   **frakcja**: liczba cyfr ułamkowych podczas analizowania i Formatowanie walutowe. *(Liczba)*
+
+*   **zaokrąglania**: Zaokrąglenie przyrost podczas analizowania i formatowanie. *(Liczba)*
+
+*   **dziesiętny**: symbolu dziesiętnego używać do analizowania i formatowanie. *(String)*
+
+*   **grupowanie**: symbol grupowania dla analizy i formatowanie. *(String)*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+Przychodzących `currencyCode` parametr powinien być `String` jednego z kodów ISO 4217 waluty, na przykład "USD".
+
+Jeśli występuje błąd uzyskania wzorzec, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.FORMATTING_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne i wybranej waluty dolarów amerykańskich, w tym przykładzie wyświetla okno dialogowe popup z tekstem podobne do wyników, które należy wykonać:
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+Oczekiwany wynik:
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+Zwraca tablicę nazwy miesięcy i dni tygodnia, w zależności od preferencji użytkownika klienta i kalendarz.
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca tablicę nazw do `successCallback` z `properties` obiektu jako parametr. Ten obiekt zawiera `value` Właściwość z `Array` z `String` wartości. Nazwy funkcji Tablica albo od pierwszego miesiąca w roku lub pierwszego dnia tygodnia, w zależności od wybranej opcji.
+
+Jeśli występuje błąd uzyskiwania nazwy, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.UNKNOWN_ERROR`.
+
+`options`Parametr jest opcjonalny, a jego wartości domyślne są:
+
+    {type:'wide', item:'months'}
+    
+
+Wartość `options.type` może być `narrow` lub`wide`.
+
+Wartość `options.item` może być `months` lub`days`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` ustawień regionalnych, w tym przykładzie wyświetla serię dwunastu lud dialogi, jeden raz na miesiąc, tekst podobny do `month: January` :
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+Zwraca ciąg wzór do formatu i analizy dat według preferencji użytkownika klienta.
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca wzór do `successCallback` . Obiekt przekazywana jako parametr zawiera następujące właściwości:
+
+*   **wzór**: data i godzina wzór do formatu i analizować daty. Wzory wykonaj [techniczny Standard Unicode #35][1]. *(String)*
+
+*   **strefa czasowa**: skróconą nazwę strefy czasowej na klienta. *(String)*
+
+*   **utc_offset**: aktualna różnica w sekundach między klienta strefy czasowej i skoordynowanego czasu uniwersalnego. *(Liczba)*
+
+*   **dst_offset**: bieżącego przesunięcie czasu w sekundach między klienta nie uwzględniaj w strefę czasową i klienta światło dzienne oszczędności w strefa czasowa. *(Liczba)*
+
+Jeśli występuje błąd uzyskiwania wzór, `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.PATTERN_ERROR`.
+
+`options`Parametr jest opcjonalny i domyślnie następujące wartości:
+
+    {formatLength: "krótkie", wybór: "Data i czas"}
+    
+
+`options.formatLength`Może być `short` , `medium` , `long` , lub `full` . `options.selector`Może być `date` , `time` lub`date and
+time`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, w tym przykładzie wyświetla okno dialogowe popup z tekstu, takich jak `pattern: M/d/yyyy h:mm a` :
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 dziwactwa
+
+*   `formatLength`Obsługuje tylko `short` i `full` wartości.
+
+*   `pattern`Dla `date and time` wzór zwraca tylko pełne datetime format.
+
+*   `timezone`Zwraca nazwę strefy w pełnym wymiarze czasu.
+
+*   `dst_offset`Właściwość nie jest obsługiwany, a zawsze zwraca wartość zero.
+
+## navigator.globalization.getFirstDayOfWeek
+
+Zwraca pierwszy dzień tygodnia według kalendarza i preferencje użytkownika klienta.
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### Opis
+
+Dni tygodnia są numerowane począwszy od 1, gdzie 1 zakłada się niedziela. Zwraca dzień do `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `value` Właściwość `Number` wartość.
+
+Jeśli występuje błąd uzyskania wzorzec, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.UNKNOWN_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to wyświetla okno dialogowe popup z tekst podobny do`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+Zwraca ciąg wzór do formatu i analizować liczby preferencji użytkownika klienta.
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca wzór do `successCallback` z `properties` obiektu jako parametr. Ten obiekt zawiera następujące właściwości:
+
+*   **wzór**: wzorzec numeru do formatu i analizowania liczb. Wzory wykonaj [techniczny Standard Unicode #35][1]. *(String)*
+
+*   **symbol**: symbolem podczas formatowania i analizy, takie jak procent lub waluta symbol. *(String)*
+
+*   **frakcja**: liczba cyfr ułamkowych podczas analizowania i formatowanie liczb. *(Liczba)*
+
+*   **zaokrąglania**: Zaokrąglenie przyrost podczas analizowania i formatowanie. *(Liczba)*
+
+*   **pozytywne**: symbol dla liczb dodatnich, gdy formatowanie i analizy. *(String)*
+
+*   **ujemna**: symbol liczb ujemnych podczas analizowania i formatowanie. *(String)*
+
+*   **dziesiętny**: symbolu dziesiętnego używać do analizowania i formatowanie. *(String)*
+
+*   **grupowanie**: symbol grupowania dla analizy i formatowanie. *(String)*
+
+Jeśli występuje błąd uzyskania wzorzec, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.PATTERN_ERROR`.
+
+`options`Parametr jest opcjonalny, a wartości domyślne są:
+
+    {Typ: dziesiętne'}
+    
+
+`options.type`Może być `decimal` , `percent` , lub`currency`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to należy wyświetlić wyskakujące okno z tekstem podobne do wyników, które należy wykonać:
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+Wyniki:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 dziwactwa
+
+*   `pattern`Właściwość nie jest obsługiwany, a retuens pusty ciąg.
+
+*   `fraction`Właściwość nie jest obsługiwany, a zwraca zero.
+
+## navigator.globalization.isDayLightSavingsTime
+
+Wskazuje, czy czas letni jest obowiązująca dla danej daty za pomocą klienta strefy czasowej i kalendarz.
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### Opis
+
+Wskazuje, czy czas letni jest w efekcie do `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `dst` Właściwość `Boolean` wartość. A `true` wartość oznacza, że czas letni jest obowiązująca dla danego dnia, i `false` wskazuje, że to nie jest.
+
+Parametr przychodzący `date` powinny być typu`Date`.
+
+Jeśli występuje błąd odczytu daty, a następnie `errorCallback` wykonuje. Oczekiwany kod błędu`GlobalizationError.UNKNOWN_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+W okresie letnim i jeśli przeglądarka jest ustawiona na DST-umożliwiał czasowa, to należy wyświetlić wyskakujące okno z tekstem podobne do `dst: true` :
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+Zwraca liczbę sformatowane jako ciąg preferencji użytkownika klienta.
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca sformatowany ciąg liczb do `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `value` Właściwość `String` wartość.
+
+Jeśli występuje błąd formatowanie numeru, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.FORMATTING_ERROR`.
+
+`options`Parametr jest opcjonalny, a jego wartości domyślne są:
+
+    {Typ: dziesiętne'}
+    
+
+`options.type`Może być "decimal", "procent" lub "Waluta".
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to wyświetla okno dialogowe popup z tekst podobny do `number: 3.142` :
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+Analizuje daty sformatowane jako ciąg, według kalendarza za pomocą klienta, strefa czasowa i preferencje użytkownika klienta i zwraca odpowiedni obiekt date.
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca datę do sukcesu wywołanie zwrotne z `properties` obiektu jako parametr. Obiekt powinien mieć następujące właściwości:
+
+*   **rok**: rok czterocyfrowy. *(Liczba)*
+
+*   **miesiąc**: miesiąc od (0-11). *(Liczba)*
+
+*   **dzień**: dzień z (1-31). *(Liczba)*
+
+*   **godziny**: godzina od (0-23). *(Liczba)*
+
+*   **odległości**: odległości od (0-59). *(Liczba)*
+
+*   **drugi**: drugi od (0-59). *(Liczba)*
+
+*   **milisekundy**: milisekund (od 0-999), nie jest dostępna na wszystkich platformach. *(Liczba)*
+
+Przychodzących `dateString` parametr powinien być typu`String`.
+
+`options`Parametr jest opcjonalny i domyślnie następujące wartości:
+
+    {formatLength: "krótkie", wybór: "Data i czas"}
+    
+
+`options.formatLength`Może być `short` , `medium` , `long` , lub `full` . `options.selector`Może być `date` , `time` lub`date and
+time`.
+
+Jeśli występuje błąd podczas analizowania ciągu daty, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.PARSING_ERROR`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to wyświetla okno dialogowe popup z tekst podobny do `month:8 day:25 year:2012` . Należy zauważyć, że miesiąc, liczba całkowita jest jeden mniej niż ciąg, jako miesiąc liczba całkowita reprezentuje indeks tablicy.
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 dziwactwa
+
+*   `formatLength`Opcja obsługuje tylko `short` i `full` wartości.
+
+## navigator.globalization.stringToNumber
+
+Analizuje liczby sformatowane jako ciąg preferencji użytkownika klienta i zwraca odpowiedni numer.
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### Opis
+
+Zwraca numer do `successCallback` z `properties` obiektu jako parametr. Obiekt powinien mieć `value` Właściwość `Number` wartość.
+
+Jeśli występuje błąd podczas analizowania ciągu liczb, a następnie `errorCallback` wykonuje z `GlobalizationError` obiektu jako parametr. Oczekiwany kod błędu`GlobalizationError.PARSING_ERROR`.
+
+`options`Parametr jest opcjonalny i domyślnie następujące wartości:
+
+    {Typ: dziesiętne'}
+    
+
+`options.type`Może być `decimal` , `percent` , lub`currency`.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+*   Windows Phone 8
+
+### Przykład
+
+Kiedy przeglądarka jest ustawiona na `en_US` Ustawienia regionalne, to należy wyświetlić wyskakujące okno z tekstem podobne do `number: 1234.56` :
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+Obiekt reprezentujący błąd z API globalizacji.
+
+### Właściwości
+
+*   **kod**: Jeden z następujących kodów oznaczających typ błędu *(Liczba)* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **wiadomość**: komunikatu tekstowego, który zawiera wyjaśnienie błędu lub szczegóły *(String)*
+
+### Opis
+
+Ten obiekt jest tworzona i wypełniane przez Cordova i wrócił do wywołania zwrotnego w przypadku błędu.
+
+### Obsługiwane platformy
+
+*   Amazon ogień OS
+*   Android
+*   iOS
+
+### Przykład
+
+Gdy błąd wywołania zwrotnego następujące wykonuje, wyświetla okno popup z tekst podobny do `code: 3` i`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
diff --git a/doc/zh/index.md b/doc/zh/index.md
new file mode 100644
index 0000000..990ea25
--- /dev/null
+++ b/doc/zh/index.md
@@ -0,0 +1,650 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.globalization
+
+這個外掛程式獲取的資訊，並執行操作特定于使用者的地區設定、 語言和時區。 注意到地區設定和語言之間的區別： 數位、 日期和時間的顯示方式為一個區域，雖然語言確定什麼語言文本的地區設定控制項顯示為，與地區設定無關。 開發人員經常使用的地區設定來設置這兩個設置，但使用者不能將她的語言設置為"英語"沒有理由但地區設定為"法語"這樣的文本顯示在英語但日期、 時間等，同時會顯示他們是在法國。 不幸的是，大多數移動平臺目前不做這些設置之間的區別。
+
+## 安裝
+
+    cordova plugin add org.apache.cordova.globalization
+    
+
+## 物件
+
+*   GlobalizationError
+
+## 方法
+
+*   navigator.globalization.getPreferredLanguage
+*   navigator.globalization.getLocaleName
+*   navigator.globalization.dateToString
+*   navigator.globalization.stringToDate
+*   navigator.globalization.getDatePattern
+*   navigator.globalization.getDateNames
+*   navigator.globalization.isDayLightSavingsTime
+*   navigator.globalization.getFirstDayOfWeek
+*   navigator.globalization.numberToString
+*   navigator.globalization.stringToNumber
+*   navigator.globalization.getNumberPattern
+*   navigator.globalization.getCurrencyPattern
+
+## navigator.globalization.getPreferredLanguage
+
+獲取用戶端的當前語言 BCP 47 語言標記。
+
+    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
+    
+
+### 說明
+
+返回的 BCP 47 相容的語言識別項標記 `successCallback` 與 `properties` 物件作為參數。 物件應具有 `value` 屬性與 `String` 的值。
+
+如果有出錯的語言，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.UNKNOWN_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en-US` 的語言，這應顯示彈出式功能表對話方塊的文本與 `language: en-US` ：
+
+    navigator.globalization.getPreferredLanguage(
+        function (language) {alert('language: ' + language.value + '\n');},
+        function () {alert('Error getting language\n');}
+    );
+    
+
+### Android 的怪癖
+
+*   返回的 ISO 639-1 雙字母語言代碼、 大寫 ISO 3166-1 國家代碼和由連字號分隔的變形。例子："en"、"EN-US"，"美國"
+
+### Windows Phone 8 怪癖
+
+*   返回 ISO 639-1 兩個字母語言代碼和相應的設置，由連字號分隔的"語言"區域變形的 ISO 3166-1 國家代碼。
+*   請注意的區域變體是的"語言"設置的屬性，並不由 Windows Phone 上的無關的"國家/地區"設置決定的。
+
+## navigator.globalization.getLocaleName
+
+返回用戶端的目前範圍設置的 BCP 47 符合標記。
+
+    navigator.globalization.getLocaleName(successCallback, errorCallback);
+    
+
+### 說明
+
+返回到的 BCP 47 符合地區設定識別碼字串 `successCallback` 與 `properties` 物件作為參數。 物件應具有 `value` 屬性與 `String` 的值。 Locale 標記將包括兩個字母小寫語言代碼、 國家代碼兩個字母大寫和 （未指定） 變數的代碼，由連字號分隔。
+
+如果有出錯的地區設定，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.UNKNOWN_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en-US` 的地區設定，這將顯示彈出式對話方塊中的文本`locale: en-US`.
+
+    navigator.globalization.getLocaleName(
+        function (locale) {alert('locale: ' + locale.value + '\n');},
+        function () {alert('Error getting locale\n');}
+    );
+    
+
+### Android 的怪癖
+
+*   JAVA 不區分設置"語言"和設置的"地區設定"，所以這種方法基本上是相同`navigator.globalizatin.getPreferredLanguage()`.
+
+### Windows Phone 8 怪癖
+
+*   返回 ISO 639-1 兩個字母語言代碼和區域 variant 類型的值對應于"區域格式"設置，以連字號分隔的 ISO 3166-1 國家代碼。
+
+## navigator.globalization.dateToString
+
+返回一個日期格式設置為一個字串，根據用戶端的地區設定和時區。
+
+    navigator.globalization.dateToString(date, successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回格式化的日期 `String` 通過 `value` 屬性可從該物件作為一個參數傳遞`successCallback`.
+
+入站 `date` 參數的類型應為`Date`.
+
+如果有錯誤格式日期，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.FORMATTING_ERROR`.
+
+`options`參數是可選的且其預設值：
+
+    {formatLength: '短'，選擇器： 日期和時間}
+    
+
+`options.formatLength`可以是 `short` ， `medium` ， `long` ，或`full`.
+
+`options.selector`可以是 `date` ， `time` 或`date and time`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+如果瀏覽器設置為 `en_US` 的地區設定，這將顯示一個彈出對話方塊與類似的文本 `date: 9/25/2012 4:21PM` 使用預設選項：
+
+    navigator.globalization.dateToString(
+        new Date(),
+        function (date) { alert('date: ' + date.value + '\n'); },
+        function () { alert('Error getting dateString\n'); },
+        { formatLength: 'short', selector: 'date and time' }
+    );
+    
+
+### Windows Phone 8 怪癖
+
+*   `formatLength`選項僅支援 `short` 和 `full` 的值。
+
+## navigator.globalization.getCurrencyPattern
+
+返回一個模式字串格式化和分析根據用戶端的使用者首選項和 ISO 4217 貨幣代碼貨幣值。
+
+     navigator.globalization.getCurrencyPattern(currencyCode, successCallback, errorCallback);
+    
+
+### 說明
+
+返回到模式 `successCallback` 與 `properties` 物件作為參數。該物件應包含以下屬性：
+
+*   **模式**： 要格式化和分析貨幣值的貨幣模式。 模式按照[Unicode 技術標準 #35][1]。 *（字串）*
+
+*   **代碼**： 模式的 ISO 4217 貨幣代碼。*（字串）*
+
+*   **分數**： 小數位數解析和貨幣的格式時要使用的數量。*（人數）*
+
+*   **舍**： 舍遞增時分析和格式設置使用。*（人數）*
+
+*   **十進位**： 小數點符號用於分析和格式設置。*（字串）*
+
+*   **分組**： 分組符號用於分析和格式設置。*（字串）*
+
+ [1]: http://unicode.org/reports/tr35/tr35-4.html
+
+入站 `currencyCode` 參數應該是 `String` 的 ISO 4217 貨幣代碼，例如 '美元' 之一。
+
+如果有錯誤獲得該模式，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.FORMATTING_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+
+### 示例
+
+當瀏覽器設置為 `en_US` 地區設定和所選的幣種是美元，本示例將顯示一個彈出對話方塊與類似的結果，請按照操作的文本：
+
+    navigator.globalization.getCurrencyPattern(
+        'USD',
+        function (pattern) {
+            alert('pattern: '  + pattern.pattern  + '\n' +
+                  'code: '     + pattern.code     + '\n' +
+                  'fraction: ' + pattern.fraction + '\n' +
+                  'rounding: ' + pattern.rounding + '\n' +
+                  'decimal: '  + pattern.decimal  + '\n' +
+                  'grouping: ' + pattern.grouping);
+        },
+        function () { alert('Error getting pattern\n'); }
+    );
+    
+
+預期的結果：
+
+    pattern: $#,##0.##;($#,##0.##)
+    code: USD
+    fraction: 2
+    rounding: 0
+    decimal: .
+    grouping: ,
+    
+
+## navigator.globalization.getDateNames
+
+返回一個陣列的幾個月的名稱或一周內，根據用戶端的使用者首選項和日曆天。
+
+    navigator.globalization.getDateNames(successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回的陣列的名稱為 `successCallback` 與 `properties` 物件作為參數。 該物件包含 `value` 屬性與 `Array` 的 `String` 的值。 從任一開始一年或一周內，根據所選的選項的第一天中的第一個月的陣列功能名稱。
+
+如果有錯誤取得名字，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.UNKNOWN_ERROR`.
+
+`options`參數是可選的且其預設值：
+
+    {type:'wide', item:'months'}
+    
+
+值 `options.type` 可以是 `narrow` 或`wide`.
+
+值 `options.item` 可以是 `months` 或`days`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，本示例顯示一系列的十二個彈出對話方塊，每個月，與類似的文本一個 `month: January` ：
+
+    navigator.globalization.getDateNames(
+        function (names) {
+            for (var i = 0; i < names.value.length; i++) {
+                alert('month: ' + names.value[i] + '\n');
+            }
+        },
+        function () { alert('Error getting names\n'); },
+        { type: 'wide', item: 'months' }
+    );
+    
+
+## navigator.globalization.getDatePattern
+
+返回一個模式字串格式化和解析日期根據用戶端的使用者首選項。
+
+    navigator.globalization.getDatePattern(successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回到模式 `successCallback` 。作為一個參數傳遞的物件包含以下屬性：
+
+*   **模式**： 要格式化和解析日期的日期和時間模式。 模式按照[Unicode 技術標準 #35][1]。 *（字串）*
+
+*   **時區**： 在用戶端上的時區的縮寫的名稱。*（字串）*
+
+*   **utc_offset**： 用戶端的時區和協調通用時間當前區別秒。*（人數）*
+
+*   **dst_offset**： 在用戶端的夏之間的秒數的當前夏令時偏移量的時區和用戶端的夏時制儲蓄的時區。*（人數）*
+
+如果您獲取該模式，錯誤 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.PATTERN_ERROR`.
+
+`options`參數是可選的並且預設為以下值：
+
+    {formatLength: '短'，選擇器： 日期和時間}
+    
+
+`options.formatLength`可以是 `short` ， `medium` ， `long` ，或 `full` 。 `options.selector`可以是 `date` ， `time` 或`date and
+time`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，此示例顯示彈出式對話方塊中的文本如 `pattern: M/d/yyyy h:mm a` ：
+
+    function checkDatePattern() {
+        navigator.globalization.getDatePattern(
+            function (date) { alert('pattern: ' + date.pattern + '\n'); },
+            function () { alert('Error getting pattern\n'); },
+            { formatLength: 'short', selector: 'date and time' }
+        );
+    }
+    
+
+### Windows Phone 8 怪癖
+
+*   `formatLength`僅支援 `short` 和 `full` 的值。
+
+*   `pattern`的 `date and time` 模式返回只完整的日期時間格式。
+
+*   `timezone`返回全時區名稱。
+
+*   `dst_offset`屬性不受支援，並且總是返回零。
+
+## navigator.globalization.getFirstDayOfWeek
+
+返回用戶端的使用者首選項和日曆星期的第一天。
+
+    navigator.globalization.getFirstDayOfWeek(successCallback, errorCallback);
+    
+
+### 說明
+
+周中天的編號 1，從開始位置 1 假定是星期日。 返回到天 `successCallback` 與 `properties` 物件作為參數。 物件應具有 `value` 屬性與 `Number` 的值。
+
+如果有錯誤獲得該模式，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.UNKNOWN_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，這將顯示一個彈出對話方塊與類似的文本`day: 1`.
+
+    navigator.globalization.getFirstDayOfWeek(
+        function (day) {alert('day: ' + day.value + '\n');},
+        function () {alert('Error getting day\n');}
+    );
+    
+
+## navigator.globalization.getNumberPattern
+
+返回一個模式字串格式化和分析數位根據用戶端的使用者首選項。
+
+    navigator.globalization.getNumberPattern(successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回到模式 `successCallback` 與 `properties` 物件作為參數。該物件包含以下屬性：
+
+*   **模式**： 要格式化和分析數位的數位模式。 模式按照[Unicode 技術標準 #35][1]。 *（字串）*
+
+*   **符號**： 符號格式設置和分析過程中，如 %或貨幣符號時使用。*（字串）*
+
+*   **分數**： 小數位數解析和設置數位格式時要使用的數量。*（人數）*
+
+*   **舍**： 舍遞增時分析和格式設置使用。*（人數）*
+
+*   **積極**： 積極數位分析和格式時要使用的符號。*（字串）*
+
+*   **負面**： 要為負數時分析和格式設置使用的符號。*（字串）*
+
+*   **十進位**： 小數點符號用於分析和格式設置。*（字串）*
+
+*   **分組**： 分組符號用於分析和格式設置。*（字串）*
+
+如果有錯誤獲得該模式，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.PATTERN_ERROR`.
+
+`options`參數是可選的並且預設值：
+
+    {類型： '十進位'}
+    
+
+`options.type`可以是 `decimal` ， `percent` ，或`currency`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，此時應顯示一個彈出對話方塊與類似的結果，請按照操作的文本：
+
+    navigator.globalization.getNumberPattern(
+        function (pattern) {alert('pattern: '  + pattern.pattern  + '\n' +
+                                  'symbol: '   + pattern.symbol   + '\n' +
+                                  'fraction: ' + pattern.fraction + '\n' +
+                                  'rounding: ' + pattern.rounding + '\n' +
+                                  'positive: ' + pattern.positive + '\n' +
+                                  'negative: ' + pattern.negative + '\n' +
+                                  'decimal: '  + pattern.decimal  + '\n' +
+                                  'grouping: ' + pattern.grouping);},
+        function () {alert('Error getting pattern\n');},
+        {type:'decimal'}
+    );
+    
+
+結果:
+
+    pattern: #,##0.###
+    symbol: .
+    fraction: 0
+    rounding: 0
+    positive:
+    negative: -
+    decimal: .
+    grouping: ,
+    
+
+### Windows Phone 8 怪癖
+
+*   `pattern`不支援屬性，和 retuens 為空字串。
+
+*   `fraction`不支援屬性，並返回零。
+
+## navigator.globalization.isDayLightSavingsTime
+
+指示是否夏令時生效是給定日期使用用戶端的時區和日曆。
+
+    navigator.globalization.isDayLightSavingsTime(date, successCallback, errorCallback);
+    
+
+### 說明
+
+指示是否夏令時生效的是 `successCallback` 與 `properties` 物件作為參數。 物件應具有 `dst` 屬性與 `Boolean` 的值。 A `true` 值指示夏令時實際上是對給定的日期，和 `false` 指示它不是。
+
+入站的參數 `date` 的類型應為`Date`.
+
+如果有錯誤讀取日期，然後 `errorCallback` 執行。錯誤的期望的代碼`GlobalizationError.UNKNOWN_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+在夏天的時候，如果瀏覽器被設置為啟用 DST 時區，這應顯示一個彈出式對話方塊與類似的文本和 `dst: true` ：
+
+    navigator.globalization.isDayLightSavingsTime(
+        new Date(),
+        function (date) {alert('dst: ' + date.dst + '\n');},
+        function () {alert('Error getting names\n');}
+    );
+    
+
+## navigator.globalization.numberToString
+
+返回一個數位的格式設置為根據用戶端的使用者首選項的字串。
+
+    navigator.globalization.numberToString(number, successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回到帶格式的數位字串 `successCallback` 與 `properties` 物件作為參數。 物件應具有 `value` 屬性與 `String` 的值。
+
+如果有錯誤格式數，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.FORMATTING_ERROR`.
+
+`options`參數是可選的且其預設值：
+
+    {類型： '十進位'}
+    
+
+`options.type`可以是 '十進位'、 '%' 或 '貨幣'。
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，這將顯示一個彈出對話方塊與類似的文本 `number: 3.142` ：
+
+    navigator.globalization.numberToString(
+        3.1415926,
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## navigator.globalization.stringToDate
+
+分析日期格式設置為一個字串，根據用戶端的使用者首選項和日曆使用時區的用戶端，並返回對應的 date 物件。
+
+    navigator.globalization.stringToDate(dateString, successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回的日期與成功回檔到 `properties` 物件作為參數。該物件應具有以下屬性：
+
+*   **一年**： 將四個數字的年份。*（人數）*
+
+*   **月**： 從 （0-11) 月。*（人數）*
+
+*   **一天**： 從 （1-31) 天。*（人數）*
+
+*   **小時**： 從 (0-23) 小時。*（人數）*
+
+*   **分鐘**： 從 (0-59) 分鐘。*（人數）*
+
+*   **第二**： 的第二位 (0-59)。*（人數）*
+
+*   **毫秒**： 的毫秒數 （從 0-999)，在所有平臺上不可用。*（人數）*
+
+入站 `dateString` 參數的類型應為`String`.
+
+`options`參數是可選的並且預設為以下值：
+
+    {formatLength: '短'，選擇器： 日期和時間}
+    
+
+`options.formatLength`可以是 `short` ， `medium` ， `long` ，或 `full` 。 `options.selector`可以是 `date` ， `time` 或`date and
+time`.
+
+如果有錯誤解析日期字串，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.PARSING_ERROR`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，這將顯示一個彈出對話方塊與類似的文本 `month:8 day:25 year:2012` 。 請注意，整數是一個月比少的字串，作為月整數代表陣列索引。
+
+    navigator.globalization.stringToDate(
+        '9/25/2012',
+        function (date) {alert('month:' + date.month +
+                               ' day:'  + date.day   +
+                               ' year:' + date.year  + '\n');},
+        function () {alert('Error getting date\n');},
+        {selector: 'date'}
+    );
+    
+
+### Windows Phone 8 怪癖
+
+*   `formatLength`選項僅支援 `short` 和 `full` 的值。
+
+## navigator.globalization.stringToNumber
+
+分析的數位格式化為根據用戶端的使用者首選項的字串並返回相應的號碼。
+
+    navigator.globalization.stringToNumber(string, successCallback, errorCallback, options);
+    
+
+### 說明
+
+返回到數 `successCallback` 與 `properties` 物件作為參數。物件應具有 `value` 屬性與 `Number` 的值。
+
+如果有錯誤解析的字串，然後 `errorCallback` 執行與 `GlobalizationError` 物件作為參數。 錯誤的期望的代碼`GlobalizationError.PARSING_ERROR`.
+
+`options`參數是可選的並且預設為以下值：
+
+    {類型： '十進位'}
+    
+
+`options.type`可以是 `decimal` ， `percent` ，或`currency`.
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+*   Windows Phone 8
+
+### 示例
+
+當瀏覽器設置為 `en_US` 的地區設定，此時應顯示與文本類似于彈出式對話方塊中 `number: 1234.56` ：
+
+    navigator.globalization.stringToNumber(
+        '1234.56',
+        function (number) {alert('number: ' + number.value + '\n');},
+        function () {alert('Error getting number\n');},
+        {type:'decimal'}
+    );
+    
+
+## GlobalizationError
+
+從全球化 API 表示一個錯誤的物件。
+
+### 屬性
+
+*   **代碼**： 表示錯誤類型的以下代碼之一 *（人數）* 
+    *   GlobalizationError.UNKNOWN_ERROR: 0
+    *   GlobalizationError.FORMATTING_ERROR: 1
+    *   GlobalizationError.PARSING_ERROR: 2
+    *   GlobalizationError.PATTERN_ERROR: 3
+*   **消息**： 一條文本消息，包括錯誤的解釋，和/或詳細說明*（字串）*
+
+### 說明
+
+此物件創建和填充的科爾多瓦，並返回到出現錯誤時的回檔。
+
+### 支援的平臺
+
+*   亞馬遜火 OS
+*   Android 系統
+*   iOS
+
+### 示例
+
+以下錯誤回檔執行時，它會顯示彈出式對話方塊中的文本類似于 `code: 3` 和`message:`
+
+    function errorCallback(error) {
+        alert('code: ' + error.code + '\n' +
+              'message: ' + error.message + '\n');
+    };
\ No newline at end of file
