diff --git a/doc/de/README.md b/doc/de/README.md
deleted file mode 100644
index c5be422..0000000
--- a/doc/de/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-Dieses Plugin ermöglicht den Zugriff auf das Gerät Kompass. Der Kompass ist ein Sensor, der erkennt die Richtung oder Position, dass das Gerät in der Regel von der Oberseite des Geräts gezeigt wird. Er misst die Überschrift im Grad von 0 bis 359.99, 0 wo Norden ist.
-
-Der Zugang ist über eine globale `navigator.compass`-Objekt.
-
-Obwohl das Objekt mit der globalen Gültigkeitsbereich `navigator` verbunden ist, steht es nicht bis nach dem `Deviceready`-Ereignis.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Browser
-  * Firefox OS
-  * iOS
-  * Tizen
-  * Windows Phone 7 und 8 (falls verfügbar in Hardware)
-  * Windows 8
-
-## Methoden
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Erhalten Sie aktuelle Kompassrichtung. Die Kompassrichtung wird über ein `CompassHeading`-Objekt mithilfe der `compassSuccess`-Callback-Funktion zurückgegeben.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Beispiel
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Ruft das Gerät an den aktuellen Kurs in regelmäßigen Abständen. Jedes Mal, wenn die Überschrift abgerufen wird, wird die Callback-Funktion `headingSuccess` ausgeführt.
-
-Die zurückgegebenen Watch-ID verweist das Kompass-Uhr-Intervall. Die Uhr ID mit `navigator.compass.clearWatch` einsetzbar, um gerade die navigator.compass zu stoppen.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` enthalten die folgenden Schlüssel:
-
-  * **Häufigkeit**: wie oft die Kompassrichtung in Millisekunden abrufen. *(Anzahl)* (Default: 100)
-  * **Filter**: die Veränderung der Grad benötigt, um einen WatchHeading Erfolg Rückruf initiiert. Wenn dieser Wert festgelegt ist, wird die **Häufigkeit** ignoriert. *(Anzahl)*
-
-### Beispiel
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Browser-Eigenheiten
-
-Werte für aktuelle Überschrift werden nach dem Zufallsprinzip generiert, um den Kompass zu simulieren.
-
-### iOS Macken
-
-Nur ein `watchHeading` kann in der Tat auf einmal in iOS sein. Wenn ein `watchHeading` einen Filter verwendet, wird durch Aufrufen von `getCurrentHeading` oder `watchHeading` den vorhandenen Filterwert Überschrift Änderungen angegeben. Überschrift Veränderungen beobachten, mit einem Filter ist effizienter als mit Zeitintervallen.
-
-### Amazon Fire OS Macken
-
-  * `filter`wird nicht unterstützt.
-
-### Android Eigenarten
-
-  * Keine Unterstützung für`filter`.
-
-### Firefox OS Macken
-
-  * Keine Unterstützung für`filter`.
-
-### Tizen Macken
-
-  * Keine Unterstützung für`filter`.
-
-### Windows Phone 7 und 8 Eigenarten
-
-  * Keine Unterstützung für`filter`.
-
-## navigator.compass.clearWatch
-
-Stoppen Sie, beobachten den Kompass auf der Watch-ID-Parameter verweist.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **WatchID**: die ID von zurückgegeben`navigator.compass.watchHeading`.
-
-### Beispiel
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Ein `CompassHeading`-Objekt wird an die `compassSuccess`-Callback-Funktion zurückgegeben.
-
-### Eigenschaften
-
-  * **MagneticHeading**: die Überschrift in Grad von 0-359.99 zu einem einzigen Zeitpunkt. *(Anzahl)*
-
-  * **TrueHeading**: die Überschrift im Verhältnis zu den geografischen Nordpol in Grad 0-359.99 zu einem einzigen Zeitpunkt. Ein negativer Wert bedeutet, dass die wahre Überschrift nicht bestimmt werden kann. *(Anzahl)*
-
-  * **HeadingAccuracy**: die Abweichung in Grad zwischen der gemeldeten Überschrift und die wahre Richtung. *(Anzahl)*
-
-  * **Timestamp**: die Zeit, an dem dieser Rubrik bestimmt war. *(Millisekunden)*
-
-### Amazon Fire OS Macken
-
-  * `trueHeading`wird nicht unterstützt, aber meldet den gleichen Wert wie`magneticHeading`
-
-  * `headingAccuracy`ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`
-
-### Android Eigenarten
-
-  * Die `trueHeading` -Eigenschaft wird nicht unterstützt, jedoch meldet den gleichen Wert wie`magneticHeading`.
-
-  * Die `headingAccuracy` -Eigenschaft ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`.
-
-### Firefox OS Macken
-
-  * Die `trueHeading` -Eigenschaft wird nicht unterstützt, jedoch meldet den gleichen Wert wie`magneticHeading`.
-
-  * Die `headingAccuracy` -Eigenschaft ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`.
-
-### iOS Macken
-
-  * Die `trueHeading` -Eigenschaft nur für Ortungsdienste aktiviert über zurückgegeben`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Ein `CompassError`-Objekt wird an die `compassError`-Callback-Funktion zurückgegeben, wenn ein Fehler auftritt.
-
-### Eigenschaften
-
-  * **Code**: einer der vordefinierten Fehlercodes aufgeführt.
-
-### Konstanten
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/de/index.md b/doc/de/index.md
deleted file mode 100644
index c13308e..0000000
--- a/doc/de/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Dieses Plugin ermöglicht den Zugriff auf das Gerät Kompass. Der Kompass ist ein Sensor, der erkennt die Richtung oder Position, dass das Gerät in der Regel von der Oberseite des Geräts gezeigt wird. Er misst die Überschrift im Grad von 0 bis 359.99, 0 wo Norden ist.
-
-Der Zugang ist über eine globale `navigator.compass`-Objekt.
-
-Obwohl das Objekt mit der globalen Gültigkeitsbereich `navigator` verbunden ist, steht es nicht bis nach dem `Deviceready`-Ereignis.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Browser
-*   Firefox OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 und 8 (falls verfügbar in Hardware)
-*   Windows 8
-
-## Methoden
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Erhalten Sie aktuelle Kompassrichtung. Die Kompassrichtung wird über ein `CompassHeading`-Objekt mithilfe der `compassSuccess`-Callback-Funktion zurückgegeben.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Beispiel
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Ruft das Gerät an den aktuellen Kurs in regelmäßigen Abständen. Jedes Mal, wenn die Überschrift abgerufen wird, wird die Callback-Funktion `headingSuccess` ausgeführt.
-
-Die zurückgegebenen Watch-ID verweist das Kompass-Uhr-Intervall. Die Uhr ID mit `navigator.compass.clearWatch` einsetzbar, um gerade die navigator.compass zu stoppen.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` enthalten die folgenden Schlüssel:
-
-*   **Häufigkeit**: wie oft die Kompassrichtung in Millisekunden abrufen. *(Anzahl)* (Default: 100)
-*   **Filter**: die Veränderung der Grad benötigt, um einen WatchHeading Erfolg Rückruf initiiert. Wenn dieser Wert festgelegt ist, wird die **Häufigkeit** ignoriert. *(Anzahl)*
-
-### Beispiel
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Browser-Eigenheiten
-
-Werte für aktuelle Überschrift werden nach dem Zufallsprinzip generiert, um den Kompass zu simulieren.
-
-### iOS Macken
-
-Nur ein `watchHeading` kann in der Tat auf einmal in iOS sein. Wenn ein `watchHeading` einen Filter verwendet, wird durch Aufrufen von `getCurrentHeading` oder `watchHeading` den vorhandenen Filterwert Überschrift Änderungen angegeben. Überschrift Veränderungen beobachten, mit einem Filter ist effizienter als mit Zeitintervallen.
-
-### Amazon Fire OS Macken
-
-*   `filter`wird nicht unterstützt.
-
-### Android Eigenarten
-
-*   Keine Unterstützung für`filter`.
-
-### Firefox OS Macken
-
-*   Keine Unterstützung für`filter`.
-
-### Tizen Macken
-
-*   Keine Unterstützung für`filter`.
-
-### Windows Phone 7 und 8 Eigenarten
-
-*   Keine Unterstützung für`filter`.
-
-## navigator.compass.clearWatch
-
-Stoppen Sie, beobachten den Kompass auf der Watch-ID-Parameter verweist.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **WatchID**: die ID von zurückgegeben`navigator.compass.watchHeading`.
-
-### Beispiel
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Ein `CompassHeading`-Objekt wird an die `compassSuccess`-Callback-Funktion zurückgegeben.
-
-### Eigenschaften
-
-*   **MagneticHeading**: die Überschrift in Grad von 0-359.99 zu einem einzigen Zeitpunkt. *(Anzahl)*
-
-*   **TrueHeading**: die Überschrift im Verhältnis zu den geografischen Nordpol in Grad 0-359.99 zu einem einzigen Zeitpunkt. Ein negativer Wert bedeutet, dass die wahre Überschrift nicht bestimmt werden kann. *(Anzahl)*
-
-*   **HeadingAccuracy**: die Abweichung in Grad zwischen der gemeldeten Überschrift und die wahre Richtung. *(Anzahl)*
-
-*   **Timestamp**: die Zeit, an dem dieser Rubrik bestimmt war. *(Millisekunden)*
-
-### Amazon Fire OS Macken
-
-*   `trueHeading`wird nicht unterstützt, aber meldet den gleichen Wert wie`magneticHeading`
-
-*   `headingAccuracy`ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`
-
-### Android Eigenarten
-
-*   Die `trueHeading` -Eigenschaft wird nicht unterstützt, jedoch meldet den gleichen Wert wie`magneticHeading`.
-
-*   Die `headingAccuracy` -Eigenschaft ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`.
-
-### Firefox OS Macken
-
-*   Die `trueHeading` -Eigenschaft wird nicht unterstützt, jedoch meldet den gleichen Wert wie`magneticHeading`.
-
-*   Die `headingAccuracy` -Eigenschaft ist immer 0 da es keinen Unterschied zwischen gibt der `magneticHeading` und`trueHeading`.
-
-### iOS Macken
-
-*   Die `trueHeading` -Eigenschaft nur für Ortungsdienste aktiviert über zurückgegeben`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Ein `CompassError`-Objekt wird an die `compassError`-Callback-Funktion zurückgegeben, wenn ein Fehler auftritt.
-
-### Eigenschaften
-
-*   **Code**: einer der vordefinierten Fehlercodes aufgeführt.
-
-### Konstanten
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/es/README.md b/doc/es/README.md
deleted file mode 100644
index 9ef441c..0000000
--- a/doc/es/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-Este plugin proporciona acceso al compás del dispositivo. La brújula es un sensor que detecta la dirección o rumbo que el dispositivo está apuntado, normalmente desde la parte superior del dispositivo. Mide el rumbo en grados de 0 a 359.99, donde 0 es el norte.
-
-El acceso es por un global `navigator.compass` objeto.
-
-Aunque el objeto está unido al ámbito global `navigator` , no estará disponible hasta después de la `deviceready` evento.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Instalación
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * BlackBerry 10
-  * Explorador
-  * Firefox OS
-  * iOS
-  * Tizen
-  * Windows Phone 7 y 8 (si está disponible en el hardware)
-  * Windows 8
-
-## Métodos
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Conseguir el actual rumbo de la brújula. El rumbo de la brújula es devuelto vía un `CompassHeading` objeto usando la `compassSuccess` función de callback.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Ejemplo
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Obtiene el título actual del dispositivo a intervalos regulares. Cada vez que se recupera el título, el `headingSuccess` se ejecuta la función callback.
-
-El identificador devuelto reloj referencias el intervalo reloj brújula. El reloj ID puede utilizarse con `navigator.compass.clearWatch` para dejar de ver la navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions`puede contener las siguientes claves:
-
-  * **frecuencia**: frecuencia con la que recuperar el rumbo de la brújula en milisegundos. *(Número)* (Por defecto: 100)
-  * **filtro**: el cambio de grados necesarios para iniciar una devolución de llamada de éxito watchHeading. Cuando se establece este valor, **frecuencia** es ignorado. *(Número)*
-
-### Ejemplo
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Navegador rarezas
-
-Los valores de partida actual son generados al azar para simular la brújula.
-
-### iOS rarezas
-
-Solamente un `watchHeading` puede ser en efecto a la vez en iOS. Si un `watchHeading` utiliza un filtro, llamando a `getCurrentHeading` o `watchHeading` utiliza el valor existente del filtro para especificar los cambios de rumbo. Observando los cambios de rumbo con un filtro es más eficiente que con intervalos de tiempo.
-
-### Amazon fuego OS rarezas
-
-  * `filter`No se admite.
-
-### Rarezas Android
-
-  * No hay soporte para`filter`.
-
-### Firefox OS rarezas
-
-  * No hay soporte para`filter`.
-
-### Rarezas Tizen
-
-  * No hay soporte para`filter`.
-
-### Windows Phone 7 y 8 rarezas
-
-  * No hay soporte para`filter`.
-
-## navigator.compass.clearWatch
-
-Deja de mirar la brújula al que hace referencia el parámetro ID de reloj.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**: el identificador devuelto por`navigator.compass.watchHeading`.
-
-### Ejemplo
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-A `CompassHeading` objeto es devuelto a la `compassSuccess` función de callback.
-
-### Propiedades
-
-  * **magneticHeading**: el rumbo en grados de 0-359.99 en un solo momento. *(Número)*
-
-  * **trueHeading**: el título en relación con el polo norte geográfico en grados 0-359.99 en un solo momento. Un valor negativo indica que no se puede determinar el rumbo verdadero. *(Número)*
-
-  * **headingAccuracy**: la desviación en grados entre el rumbo divulgado y el rumbo verdadero. *(Número)*
-
-  * **timestamp**: el momento en el cual se determinó esta partida. *(milisegundos)*
-
-### Amazon fuego OS rarezas
-
-  * `trueHeading`No es compatible, pero el mismo valor que los informes`magneticHeading`
-
-  * `headingAccuracy`es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`
-
-### Rarezas Android
-
-  * El `trueHeading` propiedad no es compatible, pero el mismo valor que los informes`magneticHeading`.
-
-  * El `headingAccuracy` propiedad es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`.
-
-### Firefox OS rarezas
-
-  * El `trueHeading` propiedad no es compatible, pero el mismo valor que los informes`magneticHeading`.
-
-  * El `headingAccuracy` propiedad es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`.
-
-### iOS rarezas
-
-  * El `trueHeading` propiedad es devuelto sólo para servicios de localización habilitados mediante`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-A `CompassError` objeto es devuelto a la `compassError` función de devolución de llamada cuando se produce un error.
-
-### Propiedades
-
-  * **code**: uno de los códigos de error predefinido enumerados a continuación.
-
-### Constantes
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/es/index.md b/doc/es/index.md
deleted file mode 100644
index 5939d00..0000000
--- a/doc/es/index.md
+++ /dev/null
@@ -1,189 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Este plugin proporciona acceso al compás del dispositivo. La brújula es un sensor que detecta la dirección o rumbo que el dispositivo está apuntado, normalmente desde la parte superior del dispositivo. Mide el rumbo en grados de 0 a 359.99, donde 0 es el norte.
-
-El acceso es por un global `navigator.compass` objeto.
-
-Aunque el objeto está unido al ámbito global `navigator` , no estará disponible hasta después de la `deviceready` evento.
-
-    document.addEventListener ("deviceready", onDeviceReady, false);
-    function onDeviceReady() {console.log(navigator.compass)};
-    
-
-## Instalación
-
-    Cordova plugin añade cordova-plugin-device-orientación
-    
-
-## Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   BlackBerry 10
-*   Explorador
-*   Firefox OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 y 8 (si está disponible en el hardware)
-*   Windows 8
-
-## Métodos
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Conseguir el actual rumbo de la brújula. El rumbo de la brújula es devuelto vía un `CompassHeading` objeto usando la `compassSuccess` función de callback.
-
-    navigator.compass.getCurrentHeading (compassSuccess, compassError);
-    
-
-### Ejemplo
-
-    function onSuccess(heading) {alert (' dirige: ' + heading.magneticHeading);};
-    
-    function onError(error) {alert ('CompassError: "+ error.code);};
-    
-    navigator.compass.getCurrentHeading (onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Obtiene el título actual del dispositivo a intervalos regulares. Cada vez que se recupera el título, el `headingSuccess` se ejecuta la función callback.
-
-El identificador devuelto reloj referencias el intervalo reloj brújula. El reloj ID puede utilizarse con `navigator.compass.clearWatch` para dejar de ver la navigator.compass.
-
-    var watchID = navigator.compass.watchHeading (compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions`puede contener las siguientes claves:
-
-*   **frecuencia**: frecuencia con la que recuperar el rumbo de la brújula en milisegundos. *(Número)* (Por defecto: 100)
-*   **filtro**: el cambio de grados necesarios para iniciar una devolución de llamada de éxito watchHeading. Cuando se establece este valor, **frecuencia** es ignorado. *(Número)*
-
-### Ejemplo
-
-    function onSuccess(heading) {var elemento = document.getElementById('heading');
-        element.innerHTML = ' Dirección: "+ heading.magneticHeading;
-    };
-    
-    function onError(compassError) {alert (' error del compás: ' + compassError.code);};
-    
-    var opciones = {
-        frequency: 3000
-    }; Actualizar cada 3 segundos var watchID = navigator.compass.watchHeading (onSuccess, onError, opciones);
-    
-
-### Navegador rarezas
-
-Los valores de partida actual son generados al azar para simular la brújula.
-
-### iOS rarezas
-
-Solamente un `watchHeading` puede ser en efecto a la vez en iOS. Si un `watchHeading` utiliza un filtro, llamando a `getCurrentHeading` o `watchHeading` utiliza el valor existente del filtro para especificar los cambios de rumbo. Observando los cambios de rumbo con un filtro es más eficiente que con intervalos de tiempo.
-
-### Amazon fuego OS rarezas
-
-*   `filter`No se admite.
-
-### Rarezas Android
-
-*   No hay soporte para`filter`.
-
-### Firefox OS rarezas
-
-*   No hay soporte para`filter`.
-
-### Rarezas Tizen
-
-*   No hay soporte para`filter`.
-
-### Windows Phone 7 y 8 rarezas
-
-*   No hay soporte para`filter`.
-
-## navigator.compass.clearWatch
-
-Deja de mirar la brújula al que hace referencia el parámetro ID de reloj.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: el identificador devuelto por`navigator.compass.watchHeading`.
-
-### Ejemplo
-
-    var watchID = navigator.compass.watchHeading (onSuccess, onError, opciones);
-    
-    ... adelante... navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-A `CompassHeading` objeto es devuelto a la `compassSuccess` función de callback.
-
-### Propiedades
-
-*   **magneticHeading**: el rumbo en grados de 0-359.99 en un solo momento. *(Número)*
-
-*   **trueHeading**: el título en relación con el polo norte geográfico en grados 0-359.99 en un solo momento. Un valor negativo indica que no se puede determinar el rumbo verdadero. *(Número)*
-
-*   **headingAccuracy**: la desviación en grados entre el rumbo divulgado y el rumbo verdadero. *(Número)*
-
-*   **timestamp**: el momento en el cual se determinó esta partida. *(milisegundos)*
-
-### Amazon fuego OS rarezas
-
-*   `trueHeading`No es compatible, pero el mismo valor que los informes`magneticHeading`
-
-*   `headingAccuracy`es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`
-
-### Rarezas Android
-
-*   El `trueHeading` propiedad no es compatible, pero el mismo valor que los informes`magneticHeading`.
-
-*   El `headingAccuracy` propiedad es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`.
-
-### Firefox OS rarezas
-
-*   El `trueHeading` propiedad no es compatible, pero el mismo valor que los informes`magneticHeading`.
-
-*   El `headingAccuracy` propiedad es siempre 0 porque no hay ninguna diferencia entre el `magneticHeading` y`trueHeading`.
-
-### iOS rarezas
-
-*   El `trueHeading` propiedad es devuelto sólo para servicios de localización habilitados mediante`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-A `CompassError` objeto es devuelto a la `compassError` función de devolución de llamada cuando se produce un error.
-
-### Propiedades
-
-*   **code**: uno de los códigos de error predefinido enumerados a continuación.
-
-### Constantes
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/fr/README.md b/doc/fr/README.md
deleted file mode 100644
index da61200..0000000
--- a/doc/fr/README.md
+++ /dev/null
@@ -1,191 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-Ce plugin permet d'accéder à la boussole de l'appareil. La boussole est un capteur qui détecte la direction ou la position que l'appareil est pointé, généralement par le haut de l'appareil. Il mesure la position en degrés de 0 à 359.99, où 0 est vers le Nord.
-
-Accès se fait par un global `navigator.compass` objet.
-
-Bien que l'objet est attaché à la portée globale `navigator` , il n'est pas disponible jusqu'après la `deviceready` événement.
-
-    document.addEventListener (« deviceready », onDeviceReady, false) ;
-    function onDeviceReady() {console.log(navigator.compass);}
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Navigateur
-  * Firefox OS
-  * iOS
-  * Paciarelli
-  * Windows Phone 7 et 8 (s'il est disponible dans le matériel)
-  * Windows 8
-
-## Méthodes
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Téléchargez la cours de la boussole. La boussole est renvoyé via un `CompassHeading` s'opposer à l'aide de la `compassSuccess` fonction de rappel.
-
-    navigator.compass.getCurrentHeading (compassSuccess, compassError) ;
-    
-
-### Exemple
-
-    function onSuccess(heading) {alert (' intitulé: "+ heading.magneticHeading);} ;
-    
-    function onError(error) {alert ('CompassError: ' + error.code);} ;
-    
-    navigator.compass.getCurrentHeading (onSuccess, onError) ;
-    
-
-## navigator.compass.watchHeading
-
-Obtient la position actuelle de l'appareil à intervalle régulier. Chaque fois que le titre est récupéré, la `headingSuccess` fonction de rappel est exécutée.
-
-Le code retourné montre fait référence à l'intervalle montre boussole. La montre ID peut être utilisé avec `navigator.compass.clearWatch` d'arrêter de regarder le navigator.compass.
-
-    var watchID = navigator.compass.watchHeading (compassSuccess, compassError, [compassOptions]) ;
-    
-
-`compassOptions`peut contenir les clés suivantes :
-
-  * **fréquence** : la fréquence de récupération de la boussole en millisecondes. *(Nombre)* (Par défaut : 100)
-  * **filtre**: le changement en degrés nécessaires pour lancer un rappel de succès watchHeading. Lorsque cette valeur est définie, la **fréquence** est ignoré. *(Nombre)*
-
-### Exemple
-
-    function onSuccess(heading) {var element = document.getElementById('heading') ;
-        element.innerHTML = "intitulé:" + heading.magneticHeading ;
-    };
-    
-    function onError(compassError) {alert (' erreur de boussole: "+ compassError.code);} ;
-    
-    options de var = {
-        frequency: 3000
-    } ; Mise à jour chaque 3 secondes var watchID = navigator.compass.watchHeading (onSuccess, onError, options) ;
-    
-
-### Bizarreries navigateur
-
-Valeurs pour la rubrique actuelle sont générés au hasard afin de simuler la boussole.
-
-### Notes au sujet d'iOS
-
-Seul `watchHeading` peut être en effet à un moment donné dans l'iOS. Si un `watchHeading` utilise un filtre, appeler `getCurrentHeading` ou `watchHeading` utilise la valeur existante de filtre pour spécifier des changements de position. En regardant les changements de position avec un filtre est plus efficace qu'avec des intervalles de temps.
-
-### Amazon Fire OS Quirks
-
-  * `filter`n'est pas pris en charge.
-
-### Quirks Android
-
-  * Pas de support pour`filter`.
-
-### Firefox OS Quirks
-
-  * Pas de support pour`filter`.
-
-### Bizarreries de paciarelli
-
-  * Pas de support pour`filter`.
-
-### Notes au sujet de Windows Phone 7 et 8
-
-  * Pas de support pour`filter`.
-
-## navigator.compass.clearWatch
-
-Arrêter de regarder la boussole référencée par le paramètre ID de montre.
-
-    navigator.compass.clearWatch(watchID) ;
-    
-
-  * **watchID**: l'ID retourné par`navigator.compass.watchHeading`.
-
-### Exemple
-
-    var watchID = navigator.compass.watchHeading (onSuccess, onError, options) ;
-    
-    ... plus tard... navigator.compass.clearWatch(watchID) ;
-    
-
-## CompassHeading
-
-A `CompassHeading` objet est retourné à la `compassSuccess` fonction de rappel.
-
-### Propriétés
-
-  * **magneticHeading**: la position en degrés de 0-359,99 à un instant donné. *(Nombre)*
-
-  * **trueHeading**: la position par rapport au pôle Nord géographique en degrés 0-359,99 à un instant donné. Une valeur négative indique que le cap vrai ne peut être déterminée. *(Nombre)*
-
-  * **headingAccuracy**: la déviation en degrés entre la direction signalée et la véritable direction. *(Nombre)*
-
-  * **horodatage**: l'heure à laquelle cette direction a été déterminée. *(millisecondes)*
-
-### Amazon Fire OS Quirks
-
-  * `trueHeading`n'est pas pris en charge, mais la même valeur que les rapports`magneticHeading`
-
-  * `headingAccuracy`est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`
-
-### Quirks Android
-
-  * La `trueHeading` propriété n'est pas pris en charge, mais la même valeur que des rapports`magneticHeading`.
-
-  * La `headingAccuracy` propriété est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`.
-
-### Firefox OS Quirks
-
-  * La `trueHeading` propriété n'est pas pris en charge, mais la même valeur que des rapports`magneticHeading`.
-
-  * La `headingAccuracy` propriété est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`.
-
-### Notes au sujet d'iOS
-
-  * La `trueHeading` propriété est retournée uniquement pour les services de localisation activées via`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-A `CompassError` objet est retourné à la `compassError` fonction de rappel lorsqu'une erreur survient.
-
-### Propriétés
-
-  * **code**: l'un des codes d'erreur prédéfinis énumérés ci-dessous.
-
-### Constantes
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/fr/index.md b/doc/fr/index.md
deleted file mode 100644
index f04a6a9..0000000
--- a/doc/fr/index.md
+++ /dev/null
@@ -1,189 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Ce plugin permet d'accéder à la boussole de l'appareil. La boussole est un capteur qui détecte la direction ou la position que l'appareil est pointé, généralement par le haut de l'appareil. Il mesure la position en degrés de 0 à 359.99, où 0 est vers le Nord.
-
-Accès se fait par un global `navigator.compass` objet.
-
-Bien que l'objet est attaché à la portée globale `navigator` , il n'est pas disponible jusqu'après la `deviceready` événement.
-
-    document.addEventListener (« deviceready », onDeviceReady, false) ;
-    function onDeviceReady() {console.log(navigator.compass);}
-    
-
-## Installation
-
-    Cordova plugin ajouter cordova-plugin-device-orientation
-    
-
-## Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Navigateur
-*   Firefox OS
-*   iOS
-*   Paciarelli
-*   Windows Phone 7 et 8 (s'il est disponible dans le matériel)
-*   Windows 8
-
-## Méthodes
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Téléchargez la cours de la boussole. La boussole est renvoyé via un `CompassHeading` s'opposer à l'aide de la `compassSuccess` fonction de rappel.
-
-    navigator.compass.getCurrentHeading (compassSuccess, compassError) ;
-    
-
-### Exemple
-
-    function onSuccess(heading) {alert (' intitulé: "+ heading.magneticHeading);} ;
-    
-    function onError(error) {alert ('CompassError: ' + error.code);} ;
-    
-    navigator.compass.getCurrentHeading (onSuccess, onError) ;
-    
-
-## navigator.compass.watchHeading
-
-Obtient la position actuelle de l'appareil à intervalle régulier. Chaque fois que le titre est récupéré, la `headingSuccess` fonction de rappel est exécutée.
-
-Le code retourné montre fait référence à l'intervalle montre boussole. La montre ID peut être utilisé avec `navigator.compass.clearWatch` d'arrêter de regarder le navigator.compass.
-
-    var watchID = navigator.compass.watchHeading (compassSuccess, compassError, [compassOptions]) ;
-    
-
-`compassOptions`peut contenir les clés suivantes :
-
-*   **fréquence** : la fréquence de récupération de la boussole en millisecondes. *(Nombre)* (Par défaut : 100)
-*   **filtre**: le changement en degrés nécessaires pour lancer un rappel de succès watchHeading. Lorsque cette valeur est définie, la **fréquence** est ignoré. *(Nombre)*
-
-### Exemple
-
-    function onSuccess(heading) {var element = document.getElementById('heading') ;
-        element.innerHTML = "intitulé:" + heading.magneticHeading ;
-    };
-    
-    function onError(compassError) {alert (' erreur de boussole: "+ compassError.code);} ;
-    
-    options de var = {
-        frequency: 3000
-    } ; Mise à jour chaque 3 secondes var watchID = navigator.compass.watchHeading (onSuccess, onError, options) ;
-    
-
-### Bizarreries navigateur
-
-Valeurs pour la rubrique actuelle sont générés au hasard afin de simuler la boussole.
-
-### iOS Quirks
-
-Seul `watchHeading` peut être en effet à un moment donné dans l'iOS. Si un `watchHeading` utilise un filtre, appeler `getCurrentHeading` ou `watchHeading` utilise la valeur existante de filtre pour spécifier des changements de position. En regardant les changements de position avec un filtre est plus efficace qu'avec des intervalles de temps.
-
-### Amazon Fire OS Quirks
-
-*   `filter`n'est pas pris en charge.
-
-### Quirks Android
-
-*   Pas de support pour`filter`.
-
-### Firefox OS Quirks
-
-*   Pas de support pour`filter`.
-
-### Bizarreries de paciarelli
-
-*   Pas de support pour`filter`.
-
-### Windows Phone 7 et 8 Quirks
-
-*   Pas de support pour`filter`.
-
-## navigator.compass.clearWatch
-
-Arrêter de regarder la boussole référencée par le paramètre ID de montre.
-
-    navigator.compass.clearWatch(watchID) ;
-    
-
-*   **watchID**: l'ID retourné par`navigator.compass.watchHeading`.
-
-### Exemple
-
-    var watchID = navigator.compass.watchHeading (onSuccess, onError, options) ;
-    
-    ... plus tard... navigator.compass.clearWatch(watchID) ;
-    
-
-## CompassHeading
-
-A `CompassHeading` objet est retourné à la `compassSuccess` fonction de rappel.
-
-### Propriétés
-
-*   **magneticHeading**: la position en degrés de 0-359,99 à un instant donné. *(Nombre)*
-
-*   **trueHeading**: la position par rapport au pôle Nord géographique en degrés 0-359,99 à un instant donné. Une valeur négative indique que le cap vrai ne peut être déterminée. *(Nombre)*
-
-*   **headingAccuracy**: la déviation en degrés entre la direction signalée et la véritable direction. *(Nombre)*
-
-*   **horodatage**: l'heure à laquelle cette direction a été déterminée. *(millisecondes)*
-
-### Amazon Fire OS Quirks
-
-*   `trueHeading`n'est pas pris en charge, mais la même valeur que les rapports`magneticHeading`
-
-*   `headingAccuracy`est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`
-
-### Quirks Android
-
-*   La `trueHeading` propriété n'est pas pris en charge, mais la même valeur que des rapports`magneticHeading`.
-
-*   La `headingAccuracy` propriété est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`.
-
-### Firefox OS Quirks
-
-*   La `trueHeading` propriété n'est pas pris en charge, mais la même valeur que des rapports`magneticHeading`.
-
-*   La `headingAccuracy` propriété est toujours 0 car il n'y a pas de différence entre la `magneticHeading` et`trueHeading`.
-
-### iOS Quirks
-
-*   La `trueHeading` propriété est retournée uniquement pour les services de localisation activées via`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-A `CompassError` objet est retourné à la `compassError` fonction de rappel lorsqu'une erreur survient.
-
-### Propriétés
-
-*   **code**: l'un des codes d'erreur prédéfinis énumérés ci-dessous.
-
-### Constantes
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/it/README.md b/doc/it/README.md
deleted file mode 100644
index 76133c1..0000000
--- a/doc/it/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-Questo plugin consente di accedere alla bussola del dispositivo. La bussola è un sensore che rileva la direzione o la voce che il dispositivo è puntato, in genere dalla parte superiore del dispositivo. Esso misura la rotta in gradi da 0 a 359.99, dove 0 è a nord.
-
-L'accesso avviene tramite un oggetto globale `navigator.compass`.
-
-Anche se l'oggetto è associato con ambito globale del `navigator`, non è disponibile fino a dopo l'evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Installazione
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * BlackBerry 10
-  * Browser
-  * Firefox OS
-  * iOS
-  * Tizen
-  * Windows Phone 7 e 8 (se disponibili nell'hardware)
-  * Windows 8
-
-## Metodi
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Ottenere la corrente della bussola. La bussola viene restituita tramite un oggetto `CompassHeading` utilizzando la funzione di callback `compassSuccess`.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Esempio
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Ottiene il titolo attuale del dispositivo a intervalli regolari. Ogni volta che viene recuperato il titolo, viene eseguita la funzione di callback `headingSuccess`.
-
-L'orologio restituito ID fa riferimento l'intervallo orologio bussola. L'ID di orologio utilizzabile con `navigator.compass.clearWatch` a smettere di guardare la navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` può contenere i seguenti tasti:
-
-  * **frequency**: la frequenza di recuperare la bussola in millisecondi. *(Numero)* (Default: 100)
-  * **filter**: il cambiamento in gradi necessari per avviare un callback di successo watchHeading. Quando questo valore è impostato, la **frequency** viene ignorata. *(Numero)*
-
-### Esempio
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Stranezze browser
-
-I valori per la rubrica attuale sono generati casualmente al fine di simulare la bussola.
-
-### iOS stranezze
-
-Solo un `watchHeading` può essere in effetti una volta in iOS. Se un `watchHeading` utilizza un filtro, chiamata `getCurrentHeading` o `watchHeading` utilizza il valore di filtro esistenti per specificare le modifiche intestazione. Guardando i cambiamenti di direzione con un filtro è più efficiente con intervalli di tempo.
-
-### Amazon fuoco OS stranezze
-
-  * `filter`non è supportato.
-
-### Stranezze Android
-
-  * Nessun supporto per`filter`.
-
-### Firefox OS stranezze
-
-  * Nessun supporto per`filter`.
-
-### Tizen stranezze
-
-  * Nessun supporto per`filter`.
-
-### Windows Phone 7 e 8 stranezze
-
-  * Nessun supporto per`filter`.
-
-## navigator.compass.clearWatch
-
-Smettere di guardare la bussola a cui fa riferimento il parametro ID orologio.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**: l'ID restituito da`navigator.compass.watchHeading`.
-
-### Esempio
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Alla funzione di callback `compassSuccess` viene restituito un oggetto `CompassHeading`.
-
-### Proprietà
-
-  * **magneticHeading**: la rotta in gradi da 0-359.99 in un unico momento. *(Numero)*
-
-  * **trueHeading**: la voce rispetto al Polo Nord geografico in gradi 0-359.99 in un unico momento. Un valore negativo indica che non è possibile determinare la vera voce. *(Numero)*
-
-  * **headingAccuracy**: lo scostamento in gradi tra il titolo segnalato e la vera voce. *(Numero)*
-
-  * **timestamp**: il tempo in cui questa voce è stata determinata. *(millisecondi)*
-
-### Amazon fuoco OS stranezze
-
-  * `trueHeading`non è supportato, ma riporta lo stesso valore`magneticHeading`
-
-  * `headingAccuracy`è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`
-
-### Stranezze Android
-
-  * La `trueHeading` proprietà non è supportata, ma riporta lo stesso valore`magneticHeading`.
-
-  * La `headingAccuracy` proprietà è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`.
-
-### Firefox OS stranezze
-
-  * La `trueHeading` proprietà non è supportata, ma riporta lo stesso valore`magneticHeading`.
-
-  * La `headingAccuracy` proprietà è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`.
-
-### iOS stranezze
-
-  * La `trueHeading` proprietà viene restituito solo per servizi di localizzazione attivate tramite`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Un oggetto `CompassError` viene restituito alla funzione di callback `compassError` quando si verifica un errore.
-
-### Proprietà
-
-  * **codice**: uno dei codici di errore predefiniti elencati di seguito.
-
-### Costanti
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/it/index.md b/doc/it/index.md
deleted file mode 100644
index 975b5e0..0000000
--- a/doc/it/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Questo plugin consente di accedere alla bussola del dispositivo. La bussola è un sensore che rileva la direzione o la voce che il dispositivo è puntato, in genere dalla parte superiore del dispositivo. Esso misura la rotta in gradi da 0 a 359.99, dove 0 è a nord.
-
-L'accesso avviene tramite un oggetto globale `navigator.compass`.
-
-Anche se l'oggetto è associato con ambito globale del `navigator`, non è disponibile fino a dopo l'evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Installazione
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   BlackBerry 10
-*   Browser
-*   Firefox OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 e 8 (se disponibili nell'hardware)
-*   Windows 8
-
-## Metodi
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Ottenere la corrente della bussola. La bussola viene restituita tramite un oggetto `CompassHeading` utilizzando la funzione di callback `compassSuccess`.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Esempio
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Ottiene il titolo attuale del dispositivo a intervalli regolari. Ogni volta che viene recuperato il titolo, viene eseguita la funzione di callback `headingSuccess`.
-
-L'orologio restituito ID fa riferimento l'intervallo orologio bussola. L'ID di orologio utilizzabile con `navigator.compass.clearWatch` a smettere di guardare la navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` può contenere i seguenti tasti:
-
-*   **frequency**: la frequenza di recuperare la bussola in millisecondi. *(Numero)* (Default: 100)
-*   **filter**: il cambiamento in gradi necessari per avviare un callback di successo watchHeading. Quando questo valore è impostato, la **frequency** viene ignorata. *(Numero)*
-
-### Esempio
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Stranezze browser
-
-I valori per la rubrica attuale sono generati casualmente al fine di simulare la bussola.
-
-### iOS stranezze
-
-Solo un `watchHeading` può essere in effetti una volta in iOS. Se un `watchHeading` utilizza un filtro, chiamata `getCurrentHeading` o `watchHeading` utilizza il valore di filtro esistenti per specificare le modifiche intestazione. Guardando i cambiamenti di direzione con un filtro è più efficiente con intervalli di tempo.
-
-### Amazon fuoco OS stranezze
-
-*   `filter`non è supportato.
-
-### Stranezze Android
-
-*   Nessun supporto per`filter`.
-
-### Firefox OS stranezze
-
-*   Nessun supporto per`filter`.
-
-### Tizen stranezze
-
-*   Nessun supporto per`filter`.
-
-### Windows Phone 7 e 8 stranezze
-
-*   Nessun supporto per`filter`.
-
-## navigator.compass.clearWatch
-
-Smettere di guardare la bussola a cui fa riferimento il parametro ID orologio.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: l'ID restituito da`navigator.compass.watchHeading`.
-
-### Esempio
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Alla funzione di callback `compassSuccess` viene restituito un oggetto `CompassHeading`.
-
-### Proprietà
-
-*   **magneticHeading**: la rotta in gradi da 0-359.99 in un unico momento. *(Numero)*
-
-*   **trueHeading**: la voce rispetto al Polo Nord geografico in gradi 0-359.99 in un unico momento. Un valore negativo indica che non è possibile determinare la vera voce. *(Numero)*
-
-*   **headingAccuracy**: lo scostamento in gradi tra il titolo segnalato e la vera voce. *(Numero)*
-
-*   **timestamp**: il tempo in cui questa voce è stata determinata. *(millisecondi)*
-
-### Amazon fuoco OS stranezze
-
-*   `trueHeading`non è supportato, ma riporta lo stesso valore`magneticHeading`
-
-*   `headingAccuracy`è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`
-
-### Stranezze Android
-
-*   La `trueHeading` proprietà non è supportata, ma riporta lo stesso valore`magneticHeading`.
-
-*   La `headingAccuracy` proprietà è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`.
-
-### Firefox OS stranezze
-
-*   La `trueHeading` proprietà non è supportata, ma riporta lo stesso valore`magneticHeading`.
-
-*   La `headingAccuracy` proprietà è sempre 0 perché non non c'è alcuna differenza tra la `magneticHeading` e`trueHeading`.
-
-### iOS stranezze
-
-*   La `trueHeading` proprietà viene restituito solo per servizi di localizzazione attivate tramite`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Un oggetto `CompassError` viene restituito alla funzione di callback `compassError` quando si verifica un errore.
-
-### Proprietà
-
-*   **codice**: uno dei codici di errore predefiniti elencati di seguito.
-
-### Costanti
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/ja/README.md b/doc/ja/README.md
deleted file mode 100644
index f129ddc..0000000
--- a/doc/ja/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-このプラグインは、デバイスのコンパスへのアクセスを提供します。 コンパスは方向またはというデバイスは、通常から指摘装置の上部の見出しを検出するセンサーです。 359.99、0 は北に 0 からの角度で見出しを測定します。
-
-アクセスは、グローバル `navigator.compass` オブジェクトを介して。
-
-オブジェクトは、グローバル スコープの `ナビゲーター` に添付、それがないまで `deviceready` イベントの後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## インストール
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * ブラックベリー 10
-  * ブラウザー
-  * Firefox の OS
-  * iOS
-  * Tizen
-  * Windows Phone 7 および 8 (可能な場合ハードウェアで)
-  * Windows 8
-
-## メソッド
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-現在のコンパス方位を取得します。コンパス針路が `compassSuccess` コールバック関数を使用して `CompassHeading` オブジェクトを介して返されます。
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 例
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-デバイスの定期的な間隔で現在の方位を取得します。見出しを取り出すたびに `headingSuccess` コールバック関数が実行されます。
-
-返される時計 ID コンパス時計腕時計間隔を参照します。時計 ID は、navigator.compass を見て停止する `navigator.compass.clearWatch` を使用できます。
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` は、次のキーを含めることができます。
-
-  * **周波数**: 多くの場合、コンパス針路 (ミリ秒単位) を取得する方法。*(数)*(デフォルト: 100)
-  * **フィルター**: watchHeading 成功時のコールバックを開始する必要度の変化。この値を設定すると、**頻度**は無視されます。*(数)*
-
-### 例
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### ブラウザーの癖
-
-現在の見出しの値は、コンパスをシミュレートするためにランダムに生成されます。
-
-### iOS の癖
-
-1 つだけ `watchHeading` は iOS の効果を同時にすることができます。 `watchHeading` はフィルターを使用して、`getCurrentHeading` または `watchHeading` を呼び出す見出しの変更を指定する既存のフィルター値を使用します。 フィルターを使用して見出しの変更を見て時間間隔よりも効率的にファイルです。
-
-### アマゾン火 OS 癖
-
-  * `filter`サポートされていません。
-
-### Android の癖
-
-  * サポートされていません`filter`.
-
-### Firefox OS 癖
-
-  * サポートされていません`filter`.
-
-### Tizen の癖
-
-  * サポートされていません`filter`.
-
-### Windows Phone 7 と 8 癖
-
-  * サポートされていません`filter`.
-
-## navigator.compass.clearWatch
-
-時計 ID パラメーターによって参照されるコンパスを見て停止します。
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**: によって返される ID`navigator.compass.watchHeading`.
-
-### 例
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassHeading` オブジェクトは、`compassSuccess` コールバック関数に返されます。
-
-### プロパティ
-
-  * **magneticHeading**: 1 つの時点で 0 359.99 から角度での見出し。*(数)*
-
-  * **trueHeading**: 度 0 359.99 で地理的な北極を基準にして、1 つの時点での見出し。 負の値は真針路を特定できないことを示します。 *(数)*
-
-  * **headingAccuracy**: 報告された見出しと真方位角度偏差。*(数)*
-
-  * **タイムスタンプ**: この見出しを決定した時。*(ミリ秒)*
-
-### アマゾン火 OS 癖
-
-  * `trueHeading`レポートと同じ値はサポートされていません`magneticHeading`
-
-  * `headingAccuracy`常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`
-
-### Android の癖
-
-  * `trueHeading`プロパティはサポートされていませんと同じ値を報告`magneticHeading`.
-
-  * `headingAccuracy`プロパティは常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`.
-
-### Firefox OS 癖
-
-  * `trueHeading`プロパティはサポートされていませんと同じ値を報告`magneticHeading`.
-
-  * `headingAccuracy`プロパティは常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`.
-
-### iOS の癖
-
-  * `trueHeading`経由で有効になっている位置情報サービスのプロパティが返されますのみ`navigator.geolocation.watchLocation()`.
- 
-## CompassError
-
-`CompassError` オブジェクトにエラーが発生したときに `compassError` コールバック関数に返されます。
-
-### プロパティ
-
-  * **コード**: 次のいずれかの定義済みのエラー コード。
-
-### 定数
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/ja/index.md b/doc/ja/index.md
deleted file mode 100644
index 82774cc..0000000
--- a/doc/ja/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-このプラグインは、デバイスのコンパスへのアクセスを提供します。 コンパスは方向またはというデバイスは、通常から指摘装置の上部の見出しを検出するセンサーです。 359.99、0 は北に 0 からの角度で見出しを測定します。
-
-アクセスは、グローバル `navigator.compass` オブジェクトを介して。
-
-オブジェクトは、グローバル スコープの `ナビゲーター` に添付、それがないまで `deviceready` イベントの後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## インストール
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   ブラックベリー 10
-*   ブラウザー
-*   Firefox の OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 および 8 (可能な場合ハードウェアで)
-*   Windows 8
-
-## メソッド
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-現在のコンパス方位を取得します。コンパス針路が `compassSuccess` コールバック関数を使用して `CompassHeading` オブジェクトを介して返されます。
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 例
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-デバイスの定期的な間隔で現在の方位を取得します。見出しを取り出すたびに `headingSuccess` コールバック関数が実行されます。
-
-返される時計 ID コンパス時計腕時計間隔を参照します。時計 ID は、navigator.compass を見て停止する `navigator.compass.clearWatch` を使用できます。
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` は、次のキーを含めることができます。
-
-*   **周波数**: 多くの場合、コンパス針路 (ミリ秒単位) を取得する方法。*(数)*(デフォルト: 100)
-*   **フィルター**: watchHeading 成功時のコールバックを開始する必要度の変化。この値を設定すると、**頻度**は無視されます。*(数)*
-
-### 例
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### ブラウザーの癖
-
-現在の見出しの値は、コンパスをシミュレートするためにランダムに生成されます。
-
-### iOS の癖
-
-1 つだけ `watchHeading` は iOS の効果を同時にすることができます。 `watchHeading` はフィルターを使用して、`getCurrentHeading` または `watchHeading` を呼び出す見出しの変更を指定する既存のフィルター値を使用します。 フィルターを使用して見出しの変更を見て時間間隔よりも効率的にファイルです。
-
-### アマゾン火 OS 癖
-
-*   `filter`サポートされていません。
-
-### Android の癖
-
-*   サポートされていません`filter`.
-
-### Firefox OS 癖
-
-*   サポートされていません`filter`.
-
-### Tizen の癖
-
-*   サポートされていません`filter`.
-
-### Windows Phone 7 と 8 癖
-
-*   サポートされていません`filter`.
-
-## navigator.compass.clearWatch
-
-時計 ID パラメーターによって参照されるコンパスを見て停止します。
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: によって返される ID`navigator.compass.watchHeading`.
-
-### 例
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassHeading` オブジェクトは、`compassSuccess` コールバック関数に返されます。
-
-### プロパティ
-
-*   **magneticHeading**: 1 つの時点で 0 359.99 から角度での見出し。*(数)*
-
-*   **trueHeading**: 度 0 359.99 で地理的な北極を基準にして、1 つの時点での見出し。 負の値は真針路を特定できないことを示します。 *(数)*
-
-*   **headingAccuracy**: 報告された見出しと真方位角度偏差。*(数)*
-
-*   **タイムスタンプ**: この見出しを決定した時。*(ミリ秒)*
-
-### アマゾン火 OS 癖
-
-*   `trueHeading`レポートと同じ値はサポートされていません`magneticHeading`
-
-*   `headingAccuracy`常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`
-
-### Android の癖
-
-*   `trueHeading`プロパティはサポートされていませんと同じ値を報告`magneticHeading`.
-
-*   `headingAccuracy`プロパティは常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`.
-
-### Firefox OS 癖
-
-*   `trueHeading`プロパティはサポートされていませんと同じ値を報告`magneticHeading`.
-
-*   `headingAccuracy`プロパティは常に 0 の間の違いはありませんので、 `magneticHeading` と`trueHeading`.
-
-### iOS の癖
-
-*   `trueHeading`経由で有効になっている位置情報サービスのプロパティが返されますのみ`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-`CompassError` オブジェクトにエラーが発生したときに `compassError` コールバック関数に返されます。
-
-### プロパティ
-
-*   **コード**: 次のいずれかの定義済みのエラー コード。
-
-### 定数
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/ko/README.md b/doc/ko/README.md
deleted file mode 100644
index 26388cb..0000000
--- a/doc/ko/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-이 플러그인 디바이스의 나침반에 대 한 액세스를 제공합니다. 나침반 방향 또는 표제는 장치 지적 이다, 일반적으로 장치 위에서 감지 하는 센서입니다. 359.99, 0가 북쪽을 0에서도에서 머리글을 측정 합니다.
-
-글로벌 `navigator.compass` 개체를 통해 액세스가입니다.
-
-개체 `navigator` 글로벌 범위 첨부 아니에요 때까지 사용할 수 있는 `deviceready` 이벤트 후.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## 설치
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * 블랙베리 10
-  * 브라우저
-  * Firefox 운영 체제
-  * iOS
-  * Tizen
-  * Windows Phone 7, 8 (사용 가능한 경우 하드웨어)
-  * 윈도우 8
-
-## 메서드
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-현재 나침반 제목 좀. 나침반 제목 `compassSuccess` 콜백 함수를 사용 하 여 `CompassHeading` 개체를 통해 반환 됩니다.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 예를 들어
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-정기적 장치의 현재 머리글을 가져옵니다. 제목 검색 때마다 `headingSuccess` 콜백 함수가 실행 됩니다.
-
-반환 된 시계 ID 나침반 시계 간격을 참조합니다. 시계 ID는 navigator.compass를 보는 중지 하 `navigator.compass.clearWatch`와 함께 사용할 수 있습니다.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions`는 다음 키를 포함할 수 있습니다.
-
-  * **frequency**: 자주 밀리초에서 나침반 머리글을 검색 하는 방법. *(수)* (기본값: 100)
-  * **filter**:도 watchHeading 성공 콜백을 시작 하는 데 필요한 변경. 이 값을 설정 하는 경우 **주파수** 는 무시 됩니다. *(수)*
-
-### 예를 들어
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### 브라우저 만지면
-
-현재 제목에 대 한 값은 나침반을 시뮬레이션 하기 위해 임의로 생성 됩니다.
-
-### iOS 단점
-
-하나의 `watchHeading` iOS에서 한 번에 적용에서 될 수 있습니다. `watchHeading` 필터를 사용 하는 경우 `getCurrentHeading` 또는 `watchHeading` 호출 사용 하 여 기존 필터 값 지정 제목 변경. 필터와 제목 변화를 보고 시간을 간격으로 보다 더 효율적입니다.
-
-### 아마존 화재 OS 단점
-
-  * `filter`지원 되지 않습니다.
-
-### 안 드 로이드 단점
-
-  * 대 한 지원`filter`.
-
-### 파이어 폭스 OS 단점
-
-  * 대 한 지원`filter`.
-
-### Tizen 특수
-
-  * 대 한 지원`filter`.
-
-### Windows Phone 7, 8 특수
-
-  * 대 한 지원`filter`.
-
-## navigator.compass.clearWatch
-
-시계 ID 매개 변수에서 참조 하는 나침반을 보고 중지 합니다.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**: ID 반환`navigator.compass.watchHeading`.
-
-### 예를 들어
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassHeading` 개체는 `compassSuccess` 콜백 함수에 반환 됩니다.
-
-### 속성
-
-  * **magneticHeading**: 단일 시점에서 0-359.99에서도 제목. *(수)*
-
-  * **trueHeading**: 단일 시점에서 0-359.99에서에서 지리적 북극을 기준으로 향하고. 음수 값을 나타냅니다 진정한 표제를 확인할 수 없습니다. *(수)*
-
-  * **headingAccuracy**: 보고 된 머리글 사이의 진정한 제목도 편차. *(수)*
-
-  * **타임 스탬프**:이 제목 결정 하는 시간. *(밀리초)*
-
-### 아마존 화재 OS 단점
-
-  * `trueHeading`지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`
-
-  * `headingAccuracy`항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`
-
-### 안 드 로이드 단점
-
-  * `trueHeading`속성은 지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`.
-
-  * `headingAccuracy`속성은 항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`.
-
-### 파이어 폭스 OS 단점
-
-  * `trueHeading`속성은 지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`.
-
-  * `headingAccuracy`속성은 항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`.
-
-### iOS 단점
-
-  * `trueHeading`속성을 통해 위치 서비스에 대 한 반환만`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-`CompassError` 개체는 오류가 발생 하면 `compassError` 콜백 함수에 반환 됩니다.
-
-### 속성
-
-  * **코드**: 미리 정의 된 오류 코드 중 하나가 아래에 나열 된.
-
-### 상수
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/ko/index.md b/doc/ko/index.md
deleted file mode 100644
index 38c9980..0000000
--- a/doc/ko/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-이 플러그인 디바이스의 나침반에 대 한 액세스를 제공합니다. 나침반 방향 또는 표제는 장치 지적 이다, 일반적으로 장치 위에서 감지 하는 센서입니다. 359.99, 0가 북쪽을 0에서도에서 머리글을 측정 합니다.
-
-글로벌 `navigator.compass` 개체를 통해 액세스가입니다.
-
-개체 `navigator` 글로벌 범위 첨부 아니에요 때까지 사용할 수 있는 `deviceready` 이벤트 후.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## 설치
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   블랙베리 10
-*   브라우저
-*   Firefox 운영 체제
-*   iOS
-*   Tizen
-*   Windows Phone 7, 8 (사용 가능한 경우 하드웨어)
-*   윈도우 8
-
-## 메서드
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-현재 나침반 제목 좀. 나침반 제목 `compassSuccess` 콜백 함수를 사용 하 여 `CompassHeading` 개체를 통해 반환 됩니다.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 예를 들어
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-정기적 장치의 현재 머리글을 가져옵니다. 제목 검색 때마다 `headingSuccess` 콜백 함수가 실행 됩니다.
-
-반환 된 시계 ID 나침반 시계 간격을 참조합니다. 시계 ID는 navigator.compass를 보는 중지 하 `navigator.compass.clearWatch`와 함께 사용할 수 있습니다.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions`는 다음 키를 포함할 수 있습니다.
-
-*   **frequency**: 자주 밀리초에서 나침반 머리글을 검색 하는 방법. *(수)* (기본값: 100)
-*   **filter**:도 watchHeading 성공 콜백을 시작 하는 데 필요한 변경. 이 값을 설정 하는 경우 **주파수** 는 무시 됩니다. *(수)*
-
-### 예를 들어
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### 브라우저 만지면
-
-현재 제목에 대 한 값은 나침반을 시뮬레이션 하기 위해 임의로 생성 됩니다.
-
-### iOS 단점
-
-하나의 `watchHeading` iOS에서 한 번에 적용에서 될 수 있습니다. `watchHeading` 필터를 사용 하는 경우 `getCurrentHeading` 또는 `watchHeading` 호출 사용 하 여 기존 필터 값 지정 제목 변경. 필터와 제목 변화를 보고 시간을 간격으로 보다 더 효율적입니다.
-
-### 아마존 화재 OS 단점
-
-*   `filter`지원 되지 않습니다.
-
-### 안 드 로이드 단점
-
-*   대 한 지원`filter`.
-
-### 파이어 폭스 OS 단점
-
-*   대 한 지원`filter`.
-
-### Tizen 특수
-
-*   대 한 지원`filter`.
-
-### Windows Phone 7, 8 특수
-
-*   대 한 지원`filter`.
-
-## navigator.compass.clearWatch
-
-시계 ID 매개 변수에서 참조 하는 나침반을 보고 중지 합니다.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: ID 반환`navigator.compass.watchHeading`.
-
-### 예를 들어
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassHeading` 개체는 `compassSuccess` 콜백 함수에 반환 됩니다.
-
-### 속성
-
-*   **magneticHeading**: 단일 시점에서 0-359.99에서도 제목. *(수)*
-
-*   **trueHeading**: 단일 시점에서 0-359.99에서에서 지리적 북극을 기준으로 향하고. 음수 값을 나타냅니다 진정한 표제를 확인할 수 없습니다. *(수)*
-
-*   **headingAccuracy**: 보고 된 머리글 사이의 진정한 제목도 편차. *(수)*
-
-*   **타임 스탬프**:이 제목 결정 하는 시간. *(밀리초)*
-
-### 아마존 화재 OS 단점
-
-*   `trueHeading`지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`
-
-*   `headingAccuracy`항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`
-
-### 안 드 로이드 단점
-
-*   `trueHeading`속성은 지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`.
-
-*   `headingAccuracy`속성은 항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`.
-
-### 파이어 폭스 OS 단점
-
-*   `trueHeading`속성은 지원 되지 않습니다 하지만 같은 값으로 보고`magneticHeading`.
-
-*   `headingAccuracy`속성은 항상 0 사이 차이가 있기 때문에 `magneticHeading` 와`trueHeading`.
-
-### iOS 단점
-
-*   `trueHeading`속성을 통해 위치 서비스에 대 한 반환만`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-`CompassError` 개체는 오류가 발생 하면 `compassError` 콜백 함수에 반환 됩니다.
-
-### 속성
-
-*   **코드**: 미리 정의 된 오류 코드 중 하나가 아래에 나열 된.
-
-### 상수
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/pl/README.md b/doc/pl/README.md
deleted file mode 100644
index 875fae7..0000000
--- a/doc/pl/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-Ten plugin umożliwia dostęp do urządzenia kompas. Kompas jest czujnik, który wykrywa kierunek lub pozycji, że urządzenie jest wskazywany, zazwyczaj z górnej części urządzenia. Mierzy on nagłówek w stopniach od 0 do 359.99, gdzie 0 jest północ.
-
-Dostęp odbywa się za pomocą obiektu globalnego `navigator.compass`.
-
-Mimo, że obiekt jest dołączony do globalnego zakresu `navigator`, to nie dostępne dopiero po zdarzeniu `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Instalacja
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Przeglądarka
-  * Firefox OS
-  * iOS
-  * Tizen
-  * Windows Phone 7 i 8 (jeśli jest dostępny w sprzęcie)
-  * Windows 8
-
-## Metody
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Uzyskać bieżącej pozycji kompas. Kompas pozycji jest zwracana za pośrednictwem obiektu `CompassHeading` za pomocą funkcji wywołania zwrotnego `compassSuccess`.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Przykład
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Pobiera bieżący nagłówek urządzenia w regularnych odstępach czasu. Każdym razem, gdy nagłówek jest źródło, funkcja wywołania zwrotnego `headingSuccess` jest wykonywany.
-
-Identyfikator zwrócony zegarek odwołuje interwał kompas zegarek. Oglądaj identyfikator może być używany z `navigator.compass.clearWatch`, aby przestać oglądać navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` może zawierać następujące klucze:
-
-  * **częstotliwość**: jak często pobrać kompas pozycji w milisekundach. *(Liczba)* (Domyślnie: 100)
-  * **Filtr**: zmiana stopni wymagane zainicjować wywołania zwrotnego watchHeading sukces. Gdy ta wartość jest ustawiona, **częstotliwość** jest ignorowana. *(Liczba)*
-
-### Przykład
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Quirks przeglądarki
-
-Wartości dla bieżącej pozycji są losowo generowane w celu symulacji kompas.
-
-### Dziwactwa iOS
-
-Tylko jeden `watchHeading` może być efekt w tym samym czasie w iOS. Jeśli `watchHeading` używa filtru, `getCurrentHeading` lub `watchHeading` używa istniejących wartości filtru określić zmiany pozycji. Obserwując zmiany pozycji z filtrem jest bardziej efektywne niż z odstępach czasu.
-
-### Amazon ogień OS dziwactwa
-
-  * `filter`nie jest obsługiwane.
-
-### Dziwactwa Androida
-
-  * Brak wsparcia dla`filter`.
-
-### Firefox OS dziwactwa
-
-  * Brak wsparcia dla`filter`.
-
-### Dziwactwa Tizen
-
-  * Brak wsparcia dla`filter`.
-
-### Windows Phone 7 i 8 dziwactwa
-
-  * Brak wsparcia dla`filter`.
-
-## navigator.compass.clearWatch
-
-Przestać oglądać określany przez parametr ID Zegarek kompas.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**: Identyfikator zwrócony przez`navigator.compass.watchHeading`.
-
-### Przykład
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Obiekt `CompassHeading` jest zwracany do funkcji wywołania zwrotnego `compassSuccess`.
-
-### Właściwości
-
-  * **magneticHeading**: pozycja w stopniach od 0-359.99 w jednym momencie. *(Liczba)*
-
-  * **trueHeading**: nagłówek do geograficznego Bieguna Północnego w stopniu 0-359.99 w jednym momencie. Wartość ujemna wskazuje, że prawda pozycji nie może być ustalona. *(Liczba)*
-
-  * **headingAccuracy**: odchylenie w stopniach między zgłoszonych pozycji i pozycji prawda. *(Liczba)*
-
-  * **sygnatura czasowa**: czas, w którym pozycja ta została ustalona. *(w milisekundach)*
-
-### Amazon ogień OS dziwactwa
-
-  * `trueHeading`nie jest obsługiwane, ale raporty taką samą wartość jak`magneticHeading`
-
-  * `headingAccuracy`jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`
-
-### Dziwactwa Androida
-
-  * `trueHeading`Właściwość nie jest obsługiwany, ale raporty taką samą wartość jak`magneticHeading`.
-
-  * `headingAccuracy`Właściwość jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`.
-
-### Firefox OS dziwactwa
-
-  * `trueHeading`Właściwość nie jest obsługiwany, ale raporty taką samą wartość jak`magneticHeading`.
-
-  * `headingAccuracy`Właściwość jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`.
-
-### Dziwactwa iOS
-
-  * `trueHeading`Właściwość jest zwracana tylko dla lokalizacji usług włączone za pomocą`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Gdy wystąpi błąd, funkcja wywołania zwrotnego `compassError` zwracany jest obiekt `CompassError`.
-
-### Właściwości
-
-  * **Kod**: jeden z kodów błędów wstępnie zdefiniowanych poniżej.
-
-### Stałe
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/pl/index.md b/doc/pl/index.md
deleted file mode 100644
index ae37966..0000000
--- a/doc/pl/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Ten plugin umożliwia dostęp do urządzenia kompas. Kompas jest czujnik, który wykrywa kierunek lub pozycji, że urządzenie jest wskazywany, zazwyczaj z górnej części urządzenia. Mierzy on nagłówek w stopniach od 0 do 359.99, gdzie 0 jest północ.
-
-Dostęp odbywa się za pomocą obiektu globalnego `navigator.compass`.
-
-Mimo, że obiekt jest dołączony do globalnego zakresu `navigator`, to nie dostępne dopiero po zdarzeniu `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## Instalacja
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Przeglądarka
-*   Firefox OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 i 8 (jeśli jest dostępny w sprzęcie)
-*   Windows 8
-
-## Metody
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Uzyskać bieżącej pozycji kompas. Kompas pozycji jest zwracana za pośrednictwem obiektu `CompassHeading` za pomocą funkcji wywołania zwrotnego `compassSuccess`.
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### Przykład
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Pobiera bieżący nagłówek urządzenia w regularnych odstępach czasu. Każdym razem, gdy nagłówek jest źródło, funkcja wywołania zwrotnego `headingSuccess` jest wykonywany.
-
-Identyfikator zwrócony zegarek odwołuje interwał kompas zegarek. Oglądaj identyfikator może być używany z `navigator.compass.clearWatch`, aby przestać oglądać navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` może zawierać następujące klucze:
-
-*   **częstotliwość**: jak często pobrać kompas pozycji w milisekundach. *(Liczba)* (Domyślnie: 100)
-*   **Filtr**: zmiana stopni wymagane zainicjować wywołania zwrotnego watchHeading sukces. Gdy ta wartość jest ustawiona, **częstotliwość** jest ignorowana. *(Liczba)*
-
-### Przykład
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Quirks przeglądarki
-
-Wartości dla bieżącej pozycji są losowo generowane w celu symulacji kompas.
-
-### Dziwactwa iOS
-
-Tylko jeden `watchHeading` może być efekt w tym samym czasie w iOS. Jeśli `watchHeading` używa filtru, `getCurrentHeading` lub `watchHeading` używa istniejących wartości filtru określić zmiany pozycji. Obserwując zmiany pozycji z filtrem jest bardziej efektywne niż z odstępach czasu.
-
-### Amazon ogień OS dziwactwa
-
-*   `filter`nie jest obsługiwane.
-
-### Dziwactwa Androida
-
-*   Brak wsparcia dla`filter`.
-
-### Firefox OS dziwactwa
-
-*   Brak wsparcia dla`filter`.
-
-### Dziwactwa Tizen
-
-*   Brak wsparcia dla`filter`.
-
-### Windows Phone 7 i 8 dziwactwa
-
-*   Brak wsparcia dla`filter`.
-
-## navigator.compass.clearWatch
-
-Przestać oglądać określany przez parametr ID Zegarek kompas.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: Identyfikator zwrócony przez`navigator.compass.watchHeading`.
-
-### Przykład
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-Obiekt `CompassHeading` jest zwracany do funkcji wywołania zwrotnego `compassSuccess`.
-
-### Właściwości
-
-*   **magneticHeading**: pozycja w stopniach od 0-359.99 w jednym momencie. *(Liczba)*
-
-*   **trueHeading**: nagłówek do geograficznego Bieguna Północnego w stopniu 0-359.99 w jednym momencie. Wartość ujemna wskazuje, że prawda pozycji nie może być ustalona. *(Liczba)*
-
-*   **headingAccuracy**: odchylenie w stopniach między zgłoszonych pozycji i pozycji prawda. *(Liczba)*
-
-*   **sygnatura czasowa**: czas, w którym pozycja ta została ustalona. *(w milisekundach)*
-
-### Amazon ogień OS dziwactwa
-
-*   `trueHeading`nie jest obsługiwane, ale raporty taką samą wartość jak`magneticHeading`
-
-*   `headingAccuracy`jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`
-
-### Dziwactwa Androida
-
-*   `trueHeading`Właściwość nie jest obsługiwany, ale raporty taką samą wartość jak`magneticHeading`.
-
-*   `headingAccuracy`Właściwość jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`.
-
-### Firefox OS dziwactwa
-
-*   `trueHeading`Właściwość nie jest obsługiwany, ale raporty taką samą wartość jak`magneticHeading`.
-
-*   `headingAccuracy`Właściwość jest zawsze 0, ponieważ nie ma żadnej różnicy między `magneticHeading` i`trueHeading`.
-
-### Dziwactwa iOS
-
-*   `trueHeading`Właściwość jest zwracana tylko dla lokalizacji usług włączone za pomocą`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-Gdy wystąpi błąd, funkcja wywołania zwrotnego `compassError` zwracany jest obiekt `CompassError`.
-
-### Właściwości
-
-*   **Kod**: jeden z kodów błędów wstępnie zdefiniowanych poniżej.
-
-### Stałe
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/ru/index.md b/doc/ru/index.md
deleted file mode 100644
index e66f94c..0000000
--- a/doc/ru/index.md
+++ /dev/null
@@ -1,192 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-Этот плагин обеспечивает доступ к устройства компас. Компас-это датчик, который определяет направление или заголовок, что устройство указывает, как правило в верхней части устройства. Он измеряет направление в градусах от 0 до 359,99 градусов, где 0 — север.
-
-## Установка
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Обозреватель
-*   Firefox OS
-*   iOS
-*   Tizen
-*   Windows Phone 7 и 8 (при наличии оборудования)
-*   Windows 8
-
-## Методы
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-Получите текущий курс. Курс возвращается через `CompassHeading` объекта с помощью `compassSuccess` функции обратного вызова.
-
-    navigator.compass.getCurrentHeading (compassSuccess, compassError);
-    
-
-### Пример
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-Получает текущий заголовок устройства в регулярном интервале. Каждый раз, когда извлекаются заголовок, `headingSuccess` выполняется функция обратного вызова.
-
-Идентификатор возвращаемой смотреть ссылки компас часы интервал. Часы, ID может быть использован с `navigator.compass.clearWatch` чтобы остановить просмотр navigator.compass.
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions`может содержать следующие разделы:
-
-*   **Частота**: как часто получить курс в миллисекундах. *(Число)* (По умолчанию: 100)
-*   **Фильтр**: изменения в градусах, требуемых для инициирования обратного вызова watchHeading успех. Если это значение задано, **Частота** учитывается. *(Число)*
-
-### Пример
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### Браузер причуды
-
-Для того, чтобы имитировать компас генерируются случайным образом значения для текущего заголовка.
-
-### Особенности iOS
-
-Только один `watchHeading` может быть в одно время эффекта в iOS. Если `watchHeading` использует фильтр, вызов `getCurrentHeading` или `watchHeading` для указания изменения заголовка используется существующее значение фильтра. Наблюдая изменения заголовка с помощью фильтра является более эффективным, чем с интервалов времени.
-
-### Особенности Amazon Fire OS
-
-*   `filter`не поддерживается.
-
-### Особенности Android
-
-*   Поддержка отсутствует`filter`.
-
-### Особенности Firefox OS
-
-*   Поддержка отсутствует`filter`.
-
-### Особенности Tizen
-
-*   Поддержка отсутствует`filter`.
-
-### Особенности Windows Phone 7 и 8
-
-*   Поддержка отсутствует`filter`.
-
-## navigator.compass.clearWatch
-
-Перестать смотреть компас, на который ссылается параметр ID смотреть.
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**: идентификатор, возвращенный`navigator.compass.watchHeading`.
-
-### Пример
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-A `CompassHeading` объект возвращается к `compassSuccess` функции обратного вызова.
-
-### Параметры
-
-*   **magneticHeading**: направление в градусах от 0-359,99 в один момент времени. *(Число)*
-
-*   **trueHeading**: заголовок относительно географического Северного полюса в градусах 0-359,99 в один момент времени. Отрицательное значение указывает, что заголовок правда не может быть определено. *(Число)*
-
-*   **headingAccuracy**: отклонение в градусах между сообщил заголовок и заголовок верно. *(Число)*
-
-*   **отметка времени**: время, на котором был определен этот заголовок. *(в миллисекундах)*
-
-### Особенности Amazon Fire OS
-
-*   `trueHeading`не поддерживается, но сообщает то же значение`magneticHeading`
-
-*   `headingAccuracy`Это всегда 0 потому, что нет никакой разницы между `magneticHeading` и`trueHeading`
-
-### Особенности Android
-
-*   `trueHeading`Свойство не поддерживается, но сообщает то же значение`magneticHeading`.
-
-*   `headingAccuracy`Свойство всегда имеет 0 потому, что нет никакой разницы между `magneticHeading` и`trueHeading`.
-
-### Особенности Firefox OS
-
-*   `trueHeading`Свойство не поддерживается, но сообщает то же значение`magneticHeading`.
-
-*   `headingAccuracy`Свойство всегда имеет 0 потому, что нет никакой разницы между `magneticHeading` и`trueHeading`.
-
-### Особенности iOS
-
-*   `trueHeading`Свойства возвращается только для служб определения местоположения включена через`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-A `CompassError` объект возвращается к `compassError` функцию обратного вызова при возникновении ошибки.
-
-### Параметры
-
-*   **code**: один из стандартных кодов ошибок, перечисленных ниже.
-
-### Константы
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
diff --git a/doc/zh/README.md b/doc/zh/README.md
deleted file mode 100644
index fd7a020..0000000
--- a/doc/zh/README.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!---
-# license: 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.
--->
-
-# cordova-plugin-device-orientation
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-device-orientation.svg)](https://travis-ci.org/apache/cordova-plugin-device-orientation)
-
-這個外掛程式提供了對設備的指南針的訪問。 羅盤是感應器，可檢測的方向或設備通常指從設備的頂部的標題。 它的措施中從 0 度到 359.99，其中 0 是北部的標題。
-
-訪問是通過一個全球 `navigator.compass` 物件。
-
-雖然該物件附加到全球範圍內 `導航器`，它不可用直到 `deviceready` 事件之後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## 安裝
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * 黑莓 10
-  * 瀏覽器
-  * 火狐瀏覽器作業系統
-  * iOS
-  * Tizen
-  * Windows Phone 7 和第 8 （如果在硬體中可用）
-  * Windows 8
-
-## 方法
-
-  * navigator.compass.getCurrentHeading
-  * navigator.compass.watchHeading
-  * navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-獲取當前的羅經航向。羅經航向被經由一個 `CompassHeading` 物件，使用 `compassSuccess` 回呼函數。
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 示例
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-獲取設備的當前標題的間隔時間定期。檢索到的標題，每次執行 `headingSuccess` 回呼函數。
-
-返回的表 ID 引用的指南針手錶的時間間隔。表 ID 可用於與 `navigator.compass.clearWatch` 停止看 navigator.compass。
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` 可能包含以下項：
-
-  * **frequency**： 經常如何檢索以毫秒為單位的羅經航向。*（Number）*（預設值： 100）
-  * **filter**： 啟動 watchHeading 成功回檔所需的度的變化。當設置此值時，**frequency**將被忽略。*（Number）*
-
-### 示例
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### 瀏覽器的怪癖
-
-隨機生成當前標題的值，以便類比羅盤。
-
-### iOS 的怪癖
-
-只有一個 `watchHeading` 可以在 iOS 中一次的效果。 如果 `watchHeading` 使用一個篩選器，致電 `getCurrentHeading` 或 `watchHeading` 使用現有的篩選器值來指定標題的變化。 帶有篩選器看標題的變化是與時間間隔比效率更高。
-
-### 亞馬遜火 OS 怪癖
-
-  * `filter`不受支援。
-
-### Android 的怪癖
-
-  * 不支援`filter`.
-
-### 火狐瀏覽器作業系統的怪癖
-
-  * 不支援`filter`.
-
-### Tizen 怪癖
-
-  * 不支援`filter`.
-
-### Windows Phone 7 和 8 怪癖
-
-  * 不支援`filter`.
-
-## navigator.compass.clearWatch
-
-別看手錶 ID 參數所引用的指南針。
-
-    navigator.compass.clearWatch(watchID);
-    
-
-  * **watchID**： 由返回的 ID`navigator.compass.watchHeading`.
-
-### 示例
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassSuccess` 回呼函數返回一個 `CompassHeading` 物件。
-
-### 屬性
-
-  * **magneticHeading**： 在某一時刻在時間中從 0-359.99 度的標題。*（人數）*
-
-  * **trueHeading**： 在某一時刻的時間與地理北極在 0-359.99 度標題。 負值表示不能確定真正的標題。 *（人數）*
-
-  * **headingAccuracy**： 中度報告的標題和真正標題之間的偏差。*（人數）*
-
-  * **timestamp**： 本項決定在其中的時間。*（毫秒）*
-
-### 亞馬遜火 OS 怪癖
-
-  * `trueHeading`不受支援，但報告相同的值`magneticHeading`
-
-  * `headingAccuracy`是始終為 0 因為有沒有區別 `magneticHeading` 和`trueHeading`
-
-### Android 的怪癖
-
-  * `trueHeading`屬性不受支援，但報告相同的值`magneticHeading`.
-
-  * `headingAccuracy`屬性始終是 0 因為有沒有區別 `magneticHeading` 和`trueHeading`.
-
-### 火狐瀏覽器作業系統的怪癖
-
-  * `trueHeading`屬性不受支援，但報告相同的值`magneticHeading`.
-
-  * `headingAccuracy`屬性始終是 0 因為有沒有區別 `magneticHeading` 和`trueHeading`.
-
-### iOS 的怪癖
-
-  * `trueHeading`屬性只返回位置服務通過以下方式啟用`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-當發生錯誤時，`compassError` 回呼函數情況下會返回一個 `CompassError` 物件。
-
-### 屬性
-
-  * **code**： 下面列出的預定義的錯誤代碼之一。
-
-### 常量
-
-  * `CompassError.COMPASS_INTERNAL_ERR`
-  * `CompassError.COMPASS_NOT_SUPPORTED`
\ No newline at end of file
diff --git a/doc/zh/index.md b/doc/zh/index.md
deleted file mode 100644
index 4ca2a59..0000000
--- a/doc/zh/index.md
+++ /dev/null
@@ -1,202 +0,0 @@
-<!---
-    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.
--->
-
-# cordova-plugin-device-orientation
-
-這個外掛程式提供了對設備的指南針的訪問。 羅盤是感應器，可檢測的方向或設備通常指從設備的頂部的標題。 它的措施中從 0 度到 359.99，其中 0 是北部的標題。
-
-訪問是通過一個全球 `navigator.compass` 物件。
-
-雖然該物件附加到全球範圍內 `導航器`，它不可用直到 `deviceready` 事件之後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(navigator.compass);
-    }
-    
-
-## 安裝
-
-    cordova plugin add cordova-plugin-device-orientation
-    
-
-## 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   黑莓 10
-*   瀏覽器
-*   火狐瀏覽器的作業系統
-*   iOS
-*   泰
-*   Windows Phone 7 和第 8 （如果在硬體中可用）
-*   Windows 8
-
-## 方法
-
-*   navigator.compass.getCurrentHeading
-*   navigator.compass.watchHeading
-*   navigator.compass.clearWatch
-
-## navigator.compass.getCurrentHeading
-
-獲取當前的羅經航向。羅經航向被經由一個 `CompassHeading` 物件，使用 `compassSuccess` 回呼函數。
-
-    navigator.compass.getCurrentHeading(compassSuccess, compassError);
-    
-
-### 示例
-
-    function onSuccess(heading) {
-        alert('Heading: ' + heading.magneticHeading);
-    };
-    
-    function onError(error) {
-        alert('CompassError: ' + error.code);
-    };
-    
-    navigator.compass.getCurrentHeading(onSuccess, onError);
-    
-
-## navigator.compass.watchHeading
-
-獲取設備的當前標題的間隔時間定期。檢索到的標題，每次執行 `headingSuccess` 回呼函數。
-
-返回的表 ID 引用的指南針手錶的時間間隔。表 ID 可用於與 `navigator.compass.clearWatch` 停止看 navigator.compass。
-
-    var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
-    
-
-`compassOptions` 可能包含以下項：
-
-*   **frequency**： 經常如何檢索以毫秒為單位的羅經航向。*（Number）*（預設值： 100）
-*   **filter**： 啟動 watchHeading 成功回檔所需的度的變化。當設置此值時，**frequency**將被忽略。*（Number）*
-
-### 示例
-
-    function onSuccess(heading) {
-        var element = document.getElementById('heading');
-        element.innerHTML = 'Heading: ' + heading.magneticHeading;
-    };
-    
-    function onError(compassError) {
-        alert('Compass error: ' + compassError.code);
-    };
-    
-    var options = {
-        frequency: 3000
-    }; // Update every 3 seconds
-    
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-
-### 瀏覽器的怪癖
-
-隨機生成當前標題的值，以便類比羅盤。
-
-### iOS 的怪癖
-
-只有一個 `watchHeading` 可以在 iOS 中一次的效果。 如果 `watchHeading` 使用一個篩選器，致電 `getCurrentHeading` 或 `watchHeading` 使用現有的篩選器值來指定標題的變化。 帶有篩選器看標題的變化是與時間間隔比效率更高。
-
-### 亞馬遜火 OS 怪癖
-
-*   `filter`不受支援。
-
-### Android 的怪癖
-
-*   不支援`filter`.
-
-### 火狐瀏覽器作業系統的怪癖
-
-*   不支援`filter`.
-
-### 泰怪癖
-
-*   不支援`filter`.
-
-### Windows Phone 7 和 8 的怪癖
-
-*   不支援`filter`.
-
-## navigator.compass.clearWatch
-
-別看手錶 ID 參數所引用的指南針。
-
-    navigator.compass.clearWatch(watchID);
-    
-
-*   **watchID**： 由返回的 ID`navigator.compass.watchHeading`.
-
-### 示例
-
-    var watchID = navigator.compass.watchHeading(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.compass.clearWatch(watchID);
-    
-
-## CompassHeading
-
-`CompassSuccess` 回呼函數返回一個 `CompassHeading` 物件。
-
-### 屬性
-
-*   **magneticHeading**： 在某一時刻在時間中從 0-359.99 度的標題。*（人數）*
-
-*   **trueHeading**： 在某一時刻的時間與地理北極在 0-359.99 度標題。 負值表示不能確定真正的標題。 *（人數）*
-
-*   **headingAccuracy**： 中度報告的標題和真正標題之間的偏差。*（人數）*
-
-*   **timestamp**： 本項決定在其中的時間。*（毫秒）*
-
-### 亞馬遜火 OS 怪癖
-
-*   `trueHeading`不受支援，但報告相同的值`magneticHeading`
-
-*   `headingAccuracy`是始終為 0 因為有沒有區別 `magneticHeading` 和`trueHeading`
-
-### Android 的怪癖
-
-*   `trueHeading`屬性不受支援，但報告相同的值`magneticHeading`.
-
-*   `headingAccuracy`屬性始終是 0 因為有沒有區別 `magneticHeading` 和`trueHeading`.
-
-### 火狐瀏覽器作業系統的怪癖
-
-*   `trueHeading`屬性不受支援，但報告相同的值`magneticHeading`.
-
-*   `headingAccuracy`屬性始終是 0 因為有沒有區別 `magneticHeading` 和`trueHeading`.
-
-### iOS 的怪癖
-
-*   `trueHeading`屬性只返回位置服務通過以下方式啟用`navigator.geolocation.watchLocation()`.
-
-## CompassError
-
-當發生錯誤時，`compassError` 回呼函數情況下會返回一個 `CompassError` 物件。
-
-### 屬性
-
-*   **code**： 下面列出的預定義的錯誤代碼之一。
-
-### 常量
-
-*   `CompassError.COMPASS_INTERNAL_ERR`
-*   `CompassError.COMPASS_NOT_SUPPORTED`
