diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfbd1e5
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,26 @@
+* text eol=lf
+
+#
+## These files are binary and should be left untouched
+#
+
+# (binary is a macro for -text -diff)
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.gif binary
+*.ico binary
+*.mov binary
+*.mp4 binary
+*.mp3 binary
+*.flv binary
+*.fla binary
+*.swf binary
+*.gz binary
+*.zip binary
+*.7z binary
+*.ttf binary
+*.eot binary
+*.woff binary
+*.pyc binary
+*.pdf binary
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..3220c25
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,42 @@
+<!--
+Please have a look at the issue templates you get when you click "New issue" in the GitHub UI.
+We very much prefer issues created by using one of these templates.
+-->
+
+### Issue Type
+<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->
+
+- [ ] Bug Report
+- [ ] Feature Request
+- [ ] Support Question
+
+## Description
+
+## Information
+<!-- Include all relevant information that might help understand and reproduce the problem -->
+
+### Command or Code
+<!-- What command or code is needed to reproduce the problem? -->
+
+### Environment, Platform, Device
+<!-- In what environment, on what platform or on which device are you experiencing the issue? -->
+
+
+
+### Version information
+<!-- 
+What are relevant versions you are using?
+For example:
+Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
+Other Frameworks: Ionic Framework and CLI version
+Operating System, Android Studio, Xcode etc.
+-->
+
+
+
+## Checklist
+<!-- Please check the boxes by putting an `x` in the `[ ]` like so: `[x]` -->
+
+- [ ] I searched for already existing GitHub issues about this
+- [ ] I updated all Cordova tooling to their most recent version
+- [ ] I included all the necessary information above
diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md
new file mode 100644
index 0000000..bd8a3ac
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md
@@ -0,0 +1,50 @@
+---
+name: 🐛 Bug Report
+about: If something isn't working as expected.
+
+---
+
+# Bug Report
+
+## Problem
+
+### What is expected to happen?
+
+
+
+### What does actually happen?
+
+
+
+## Information
+<!-- Include all relevant information that might help understand and reproduce the problem -->
+
+
+
+### Command or Code
+<!-- What command or code is needed to reproduce the problem? -->
+
+
+
+### Environment, Platform, Device
+<!-- In what environment, on what platform or on which device are you experiencing the issue? -->
+
+
+
+### Version information
+<!-- 
+What are relevant versions you are using?
+For example:
+Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
+Other Frameworks: Ionic Framework and CLI version
+Operating System, Android Studio, Xcode etc.
+-->
+
+
+
+## Checklist
+<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->
+
+- [ ] I searched for existing GitHub issues
+- [ ] I updated all Cordova tooling to most recent version
+- [ ] I included all the necessary information above
diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
new file mode 100644
index 0000000..381fc8a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
@@ -0,0 +1,29 @@
+---
+name: 🚀 Feature Request
+about: A suggestion for a new functionality
+
+---
+
+# Feature Request
+
+## Motivation Behind Feature
+<!-- Why should this feature be implemented? What problem does it solve? -->
+
+
+
+## Feature Description
+<!-- 
+Describe your feature request in detail
+Please provide any code examples or screenshots of what this feature would look like
+Are there any drawbacks? Will this break anything for existing users? 
+-->
+
+
+
+## Alternatives or Workarounds
+<!-- 
+Describe alternatives or workarounds you are currently using 
+Are there ways to do this with existing functionality?
+-->
+
+
diff --git a/.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md b/.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md
new file mode 100644
index 0000000..516c6e6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md
@@ -0,0 +1,27 @@
+---
+name: 💬 Support Question
+about: If you have a question, please check out our Slack or StackOverflow!
+
+---
+
+<!------------^ Click "Preview" for a nicer view! -->
+
+Apache Cordova uses GitHub Issues as a feature request and bug tracker _only_.
+For usage and support questions, please check out the resources below. Thanks!
+
+---
+
+You can get answers to your usage and support questions about **Apache Cordova** on:
+
+* Slack Community Chat: https://cordova.slack.com (you can sign-up at http://slack.cordova.io/)
+* StackOverflow: https://stackoverflow.com/questions/tagged/cordova using the tag `cordova`
+
+---
+
+If you are using a tool that uses Cordova internally, like e.g. Ionic, check their support channels:
+
+* **Ionic Framework**
+  * [Ionic Community Forum](https://forum.ionicframework.com/)
+  * [Ionic Worldwide Slack](https://ionicworldwide.herokuapp.com/)
+* **PhoneGap**
+  * [PhoneGap Developer Community](https://forums.adobe.com/community/phonegap)
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 91582f4..712b2ff 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,6 +1,5 @@
 <!--
-Please make sure the checklist boxes are all checked before submitting the PR. The checklist
-is intended as a quick reference, for complete details please see our Contributor Guidelines:
+Please make sure the checklist boxes are all checked before submitting the PR. The checklist is intended as a quick reference, for complete details please see our Contributor Guidelines:
 
 http://cordova.apache.org/contribute/contribute_guidelines.html
 
@@ -10,13 +9,27 @@
 ### Platforms affected
 
 
-### What does this PR do?
+
+### Motivation and Context
+<!-- Why is this change required? What problem does it solve? -->
+<!-- If it fixes an open issue, please link to the issue here. -->
 
 
-### What testing has been done on this change?
+
+### Description
+<!-- Describe your changes in detail -->
+
+
+
+### Testing
+<!-- Please describe in detail how you tested your changes. -->
+
 
 
 ### Checklist
-- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database
-- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected.
-- [ ] Added automated test coverage as appropriate for this change.
+
+- [ ] I've run the tests to see all new and existing tests pass
+- [ ] I added automated test coverage as appropriate for this change
+- [ ] Commit is prefixed with `(platform)` if this change only applies to one platform (e.g. `(android)`)
+- [ ] If this Pull Request resolves an issue, I linked to the issue in the text above (and used the correct [keyword to close issues using keywords](https://help.github.com/articles/closing-issues-using-keywords/))
+- [ ] I've updated the documentation if necessary
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..d71cbd7
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,16 @@
+# CI service configurations
+.travis.yml
+.appveyor.yml
+appveyor.yml
+
+# Testing, code coverage, and linting
+.eslintignore
+.eslintrc.yml
+
+# Git
+.git
+.gitattributes
+.gitignore
+
+# Github
+.github
diff --git a/.travis.yml b/.travis.yml
index cfe39b7..f717e54 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,101 +1,117 @@
+# This Travis configuration file is built after a Cordova Paramedic 
+# specific template with minimal modifications and adaptations:
+# https://github.com/apache/cordova-paramedic/blob/master/.travis.yml
+
 sudo: false
 
 addons:
   jwt:
+    # SAUCE_ACCESS_KEY
     secure: TZ88IEvAw1bsWPWxvDzXdpi2NK0i3PN4hG15+vDpIt6wXGVPknjxuXWJeLj7TqBpAIvP7XDfS8ZvHVPLe7fe8oOchZPLuiDw9VVIk6cnHjE6wpoavdGc/1mDJ3Bi4PDcHwRUr5ng5spYQqqlTwcECkH/q7iPgudiFM6rlOlGRyA=
 
 env:
   global:
-  - SAUCE_USERNAME=snay
-  - TRAVIS_NODE_VERSION="4.2"
+    - SAUCE_USERNAME=snay
+    - TRAVIS_NODE_VERSION=8
+    - ANDROID_API_LEVEL=28
+    - ANDROID_BUILD_TOOLS_VERSION=28.0.3
+
+language: node_js
+node_js: 8
+
+# yaml anchor/alias: https://medium.com/@tommyvn/travis-yml-dry-with-anchors-8b6a3ac1b027
+
+_ios: &_ios
+  os: osx
+  osx_image: xcode10.2
+
+_android: &_android
+  language: android
+  os: linux
+  jdk: oraclejdk8
+  android:
+    components:
+      - tools
+      - build-tools-$ANDROID_BUILD_TOOLS_VERSION
+      - android-$ANDROID_API_LEVEL
+    licenses:
+      - 'android-sdk-preview-license-.+'
+      - 'android-sdk-license-.+'
+      - 'google-gdk-license-.+'
 
 matrix:
   include:
-  - env: PLATFORM=browser-chrome
-    os: linux
-    language: node_js
-    node_js: '4.2'
-  - env: PLATFORM=browser-firefox
-    os: linux
-    language: node_js
-    node_js: '4.2'
-  - env: PLATFORM=browser-safari
-    os: linux
-    language: node_js
-    node_js: '4.2'
-  - env: PLATFORM=browser-edge
-    os: linux
-    language: node_js
-    node_js: '4.2'
-# iOS 9 not supported by iOS WKWebView implementation
-#  - env: PLATFORM=ios-9.3
-#    os: osx
-#    osx_image: xcode8.3
-#    language: node_js
-#    node_js: '4.2'
-  - env: PLATFORM=ios-10.0
-    os: osx
-    osx_image: xcode8.3
-    language: node_js
-    node_js: '4.2'
-  - env: PLATFORM=android-4.4
-    os: linux
-    language: android
-    jdk: oraclejdk8
-    android:
-      components:
-      - tools
-      - platform-tools
-      - tools
-      - build-tools-26.0.2
-  - env: PLATFORM=android-5.1
-    os: linux
-    language: android
-    jdk: oraclejdk8
-    android:
-      components:
-      - tools
-      - platform-tools
-      - tools
-      - build-tools-26.0.2
-  - env: PLATFORM=android-6.0
-    os: linux
-    language: android
-    jdk: oraclejdk8
-    android:
-      components:
-      - tools
-      - platform-tools
-      - tools
-      - build-tools-26.0.2
-  - env: PLATFORM=android-7.0
-    os: linux
-    language: android
-    jdk: oraclejdk8
-    android:
-      components:
-      - tools
-      - platform-tools
-      - tools
-      - build-tools-26.0.2
+    # local tests, without saucelabs
+    - env: PLATFORM=local/browser
+      <<: *_ios
+    - env: PLATFORM=local/ios-10.0
+      <<: *_ios
+
+    # many tests with saucelabs
+    - env: PLATFORM=browser-chrome
+    - env: PLATFORM=browser-firefox
+    - env: PLATFORM=browser-safari
+    - env: PLATFORM=browser-edge
+
+    - env: PLATFORM=ios-11.3
+      <<: *_ios
+    - env: PLATFORM=ios-12.0
+      <<: *_ios
+
+    - env: PLATFORM=android-5.1
+      <<: *_android
+    - env: PLATFORM=android-6.0
+      <<: *_android
+    - env: PLATFORM=android-7.0
+      <<: *_android
+    - env: PLATFORM=android-7.1
+      <<: *_android
+    - env: PLATFORM=android-8.0
+      <<: *_android
+    - env: PLATFORM=android-8.1
+      <<: *_android
+    - env: PLATFORM=android-9.0
+      <<: *_android
 
 before_install:
-- rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm
-  && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm
-  install $TRAVIS_NODE_VERSION
-- node --version
-- if [[ "$PLATFORM" =~ android ]]; then gradle --version; fi
-- if [[ "$PLATFORM" =~ ios ]]; then npm install -g ios-deploy; fi
-- if [[ "$PLATFORM" =~ android ]]; then echo y | android update sdk -u --filter android-22,android-23,android-24,android-25,android-26,android-27;
-  fi
-- git clone https://github.com/apache/cordova-paramedic /tmp/paramedic && pushd /tmp/paramedic
-  && npm install && popd
-- npm install -g cordova
+  # manually install Node for `language: android`
+  - if [[ "$PLATFORM" =~ android ]]; then nvm install $TRAVIS_NODE_VERSION; fi 
+  - node --version
+  - if [[ "$PLATFORM" =~ android ]]; then gradle --version; fi
+  - if [[ "$PLATFORM" =~ ios ]]; then npm install -g ios-deploy; fi
+  - npm install -g cordova
+  # install paramedic if not running on paramedic repo
+  - if ! [[ "$TRAVIS_REPO_SLUG" =~ cordova-paramedic ]]; then npm install -g github:apache/cordova-paramedic; fi 
 
 install:
-- npm install
+  - npm install
 
+before_script:
+  - |
+    if [[ "$TRAVIS_REPO_SLUG" =~ cordova-paramedic ]]; then 
+      # when used in the cordova-paramedic repo
+      TEST_COMMAND="npm run eslint"
+      PARAMEDIC_PLUGIN_TO_TEST="./spec/testable-plugin/"
+      PARAMEDIC_COMMAND="node main.js"
+    else 
+      # when used in any other (plugin) repo
+      TEST_COMMAND="npm test"
+      PARAMEDIC_PLUGIN_TO_TEST=$(pwd)
+      PARAMEDIC_COMMAND="cordova-paramedic"
+    fi
+  - PARAMEDIC_BUILDNAME=travis-$TRAVIS_REPO_SLUG-$TRAVIS_JOB_NUMBER
+  - |
+    echo "Variables now are set to:"
+    echo "TEST_COMMAND=$TEST_COMMAND"
+    echo "ADDITIONAL_TESTS=$ADDITIONAL_TESTS"
+    echo "PARAMEDIC_COMMAND=$PARAMEDIC_COMMAND"
+    echo "PLATFORM=$PLATFORM"
+    echo "PARAMEDIC_PLUGIN_TO_TEST=$PARAMEDIC_PLUGIN_TO_TEST"
+    echo "PARAMEDIC_BUILDNAME=$PARAMEDIC_BUILDNAME"
 script:
-- npm test
-- node /tmp/paramedic/main.js --config pr/$PLATFORM --plugin $(pwd) --shouldUseSauce
-  --buildName travis-plugin-inappbrowser-$TRAVIS_JOB_NUMBER
+  - $TEST_COMMAND
+  - if [[ "$ADDITIONAL_TESTS_DIR" != "" ]]; then
+      cd $ADDITIONAL_TESTS_DIR && npm install && npm test;
+    else 
+      $PARAMEDIC_COMMAND --config ./pr/$PLATFORM --plugin $PARAMEDIC_PLUGIN_TO_TEST --buildName $PARAMEDIC_BUILDNAME; 
+    fi
diff --git a/README.md b/README.md
index 708cc7e..8fe6440 100644
--- a/README.md
+++ b/README.md
@@ -35,6 +35,8 @@
 
     var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
 
+### `window.open`
+
 The `cordova.InAppBrowser.open()` function is defined to be a drop-in replacement
 for the `window.open()` function.  Existing `window.open()` calls can use the
 InAppBrowser window, by replacing window.open:
@@ -121,6 +123,7 @@
     - __hideurlbar__: set to `yes` to hide the url bar on the location toolbar, only has effect if user has location set to `yes`. The default value is `no`.
     - __navigationbuttoncolor__: set to a valid hex color string, for example: `#00ff00`, and it will change the color of both navigation buttons from default. Only has effect if user has location set to `yes` and not hidenavigationbuttons set to `yes`.
     - __toolbarcolor__: set to a valid hex color string, for example: `#00ff00`, and it will change the color the toolbar from default. Only has effect if user has location set to `yes`.
+    - __lefttoright__: Set to `yes` to swap positions of the navigation buttons and the close button. Specifically, navigation buttons go to the left and close button to the right.
     - __zoom__: set to `yes` to show Android browser's zoom controls, set to `no` to hide them.  Default value is `yes`.
     - __mediaPlaybackRequiresUserAction__: Set to `yes` to prevent HTML5 audio or video from autoplaying (defaults to `no`).
     - __shouldPauseOnSuspend__: Set to `yes` to make InAppBrowser WebView to pause/resume with the app to stop background audio (this may be required to avoid Google Play issues like described in [CB-11013](https://issues.apache.org/jira/browse/CB-11013)).
@@ -142,6 +145,7 @@
     - __toolbar__:  set to `yes` or `no` to turn the toolbar on or off for the InAppBrowser (defaults to `yes`)
     - __toolbarcolor__: set as a valid hex color string, for example: `#00ff00`, to change from the default color of the toolbar. Only applicable if toolbar is not disabled.
     - __toolbartranslucent__:  set to `yes` or `no` to make the toolbar translucent(semi-transparent)  (defaults to `yes`). Only applicable if toolbar is not disabled.
+    - __lefttoright__: Set to `yes` to swap positions of the navigation buttons and the close button. Specifically, close button goes to the right and navigation buttons to the left.
     - __enableViewportScale__:  Set to `yes` or `no` to prevent viewport scaling through a meta tag (defaults to `no`). Only applicable to UIWebView (`usewkwebview=no`) and WKWebView (`usewkwebview=yes`) on iOS 10+.
     - __mediaPlaybackRequiresUserAction__: Set to `yes` to prevent HTML5 audio or video from autoplaying (defaults to `no`). Applicable to UIWebView (`usewkwebview=no`) and WKWebView (`usewkwebview=yes`).
     - __allowInlineMediaPlayback__: Set to `yes` or `no` to allow in-line HTML5 media playback, displaying within the browser window rather than a device-specific playback interface. The HTML's `video` element must also include the `webkit-playsinline` attribute (defaults to `no`). Applicable to UIWebView (`usewkwebview=no`) and WKWebView (`usewkwebview=yes`).
@@ -295,7 +299,7 @@
 
 }
 
-function beforeloadCallback(params, callback) {
+function beforeloadCallBack(params, callback) {
 
     if (params.url.startsWith("http://www.example.com/")) {
 
@@ -309,7 +313,7 @@
 
 }
 
-function messageCallback(params){
+function messageCallBack(params){
     $('#status-message').text("message received: "+params.data.my_message);
 }
 
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 0812b8d..8bc041c 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -20,8 +20,46 @@
 -->
 # Release Notes
 
-### 3.1.0-dev (Unreleased)
-* CB-7179 (iOS): Add support to optionally use WKWebView for iOS
+### 3.1.0 (Jun 27, 2019)
+
+-   chore: fix repo and issue urls and license in package.json and plugin.xml ([`8edfb9e`](https://github.com/apache/cordova-plugin-inappbrowser/commit/8edfb9e))
+-   chore: unknown changes because of linebreak change in binary files ([`e44ad91`](https://github.com/apache/cordova-plugin-inappbrowser/commit/e44ad91))
+-   build: add `.npmignore` to remove unneeded files from npm package ([`0ec4a11`](https://github.com/apache/cordova-plugin-inappbrowser/commit/0ec4a11))
+-   build: add `.gitattributes` to force LF (instead of possible CRLF on Windows) ([`2751255`](https://github.com/apache/cordova-plugin-inappbrowser/commit/2751255))
+-   ci(travis): Update Travis CI configuration for new paramedic ([#478](https://github.com/apache/cordova-plugin-inappbrowser/issues/478)) ([`c2bb6c1`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c2bb6c1))
+-   docs: remove outdated translations ([`cc5ee00`](https://github.com/apache/cordova-plugin-inappbrowser/commit/cc5ee00))
+-   fix(android): Fix beforeload for Android &lt;= 7 ([#427](https://github.com/apache/cordova-plugin-inappbrowser/issues/427)) ([`94fec84`](https://github.com/apache/cordova-plugin-inappbrowser/commit/94fec84))
+-   ci(travis) Fix failing CI tests ([#460](https://github.com/apache/cordova-plugin-inappbrowser/issues/460)) ([`a162bd9`](https://github.com/apache/cordova-plugin-inappbrowser/commit/a162bd9))
+-   test: Fix test spec.5 to close inappbrowser after loadstop event ([#440](https://github.com/apache/cordova-plugin-inappbrowser/issues/440)) ([`5f1afbd`](https://github.com/apache/cordova-plugin-inappbrowser/commit/5f1afbd), [`af44235`](https://github.com/apache/cordova-plugin-inappbrowser/commit/af44235))
+-   fix(android): Prevent malformed callbackId from reaching app cordova view ([#436](https://github.com/apache/cordova-plugin-inappbrowser/issues/436)) ([`6861084`](https://github.com/apache/cordova-plugin-inappbrowser/commit/6861084), [`c95dbcb`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c95dbcb))
+-   feat: [CB-13969](https://issues.apache.org/jira/browse/CB-13969): Allow close button and navigation buttons positions to be swapped ([#262](https://github.com/apache/cordova-plugin-inappbrowser/issues/262)) ([`d01bd25`](https://github.com/apache/cordova-plugin-inappbrowser/commit/d01bd25), [`f861655`](https://github.com/apache/cordova-plugin-inappbrowser/commit/f861655), [`9c7c2f3`](https://github.com/apache/cordova-plugin-inappbrowser/commit/9c7c2f3), [`3c0a42e`](https://github.com/apache/cordova-plugin-inappbrowser/commit/3c0a42e), [`5359f6c`](https://github.com/apache/cordova-plugin-inappbrowser/commit/5359f6c), [`df84dda`](https://github.com/apache/cordova-plugin-inappbrowser/commit/df84dda), [`2bcec40`](https://github.com/apache/cordova-plugin-inappbrowser/commit/2bcec40), [`fc0c560`](https://github.com/apache/cordova-plugin-inappbrowser/commit/fc0c560), [`5ead1e6`](https://github.com/apache/cordova-plugin-inappbrowser/commit/5ead1e6), [`c7931fa`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c7931fa), [`e2adf1b`](https://github.com/apache/cordova-plugin-inappbrowser/commit/e2adf1b), [`4adf4c7`](https://github.com/apache/cordova-plugin-inappbrowser/commit/4adf4c7), [`cbe3a42`](https://github.com/apache/cordova-plugin-inappbrowser/commit/cbe3a42), [`74ccef1`](https://github.com/apache/cordova-plugin-inappbrowser/commit/74ccef1), [`ec6af56`](https://github.com/apache/cordova-plugin-inappbrowser/commit/ec6af56), [`b06ad8e`](https://github.com/apache/cordova-plugin-inappbrowser/commit/b06ad8e), [`313e0ae`](https://github.com/apache/cordova-plugin-inappbrowser/commit/313e0ae), [`05e37a1`](https://github.com/apache/cordova-plugin-inappbrowser/commit/05e37a1), [`0c6189e`](https://github.com/apache/cordova-plugin-inappbrowser/commit/0c6189e), [`d940b59`](https://github.com/apache/cordova-plugin-inappbrowser/commit/d940b59), [`f3d7f72`](https://github.com/apache/cordova-plugin-inappbrowser/commit/f3d7f72))
+-   docs: Add headline to window.open documentation ([#406](https://github.com/apache/cordova-plugin-inappbrowser/issues/406)) ([`92243cd`](https://github.com/apache/cordova-plugin-inappbrowser/commit/92243cd))
+-   fix(ios): Fix iframes in iOS/WKWebView which were broken by [#418](https://github.com/apache/cordova-plugin-inappbrowser/issues/418) ([#425](https://github.com/apache/cordova-plugin-inappbrowser/issues/425)) ([`388e3f6`](https://github.com/apache/cordova-plugin-inappbrowser/commit/388e3f6))
+-   chore(github): Add or update GitHub pull request and issue template ([`ae329bc`](https://github.com/apache/cordova-plugin-inappbrowser/commit/ae329bc))
+-   fix(ios): Handle non-default target attribute values (e.g. target=on links in WKWebView implementation on iOS ([#418](https://github.com/apache/cordova-plugin-inappbrowser/issues/418)) ([`9f4b729`](https://github.com/apache/cordova-plugin-inappbrowser/commit/9f4b729))
+-   fix(types): remove unused replace parameter ([#410](https://github.com/apache/cordova-plugin-inappbrowser/issues/410)) ([`6db2f2d`](https://github.com/apache/cordova-plugin-inappbrowser/commit/6db2f2d))
+-   documentation: Example documentation - Fix callBack function name ([#383](https://github.com/apache/cordova-plugin-inappbrowser/issues/383)) ([`a890e60`](https://github.com/apache/cordova-plugin-inappbrowser/commit/a890e60), [`2500b08`](https://github.com/apache/cordova-plugin-inappbrowser/commit/2500b08))
+-   fix: Fix beforeload to work with POST requests ([#367](https://github.com/apache/cordova-plugin-inappbrowser/issues/367)) ([`632a395`](https://github.com/apache/cordova-plugin-inappbrowser/commit/632a395))
+-   feat: (iOS & Android) Add postMessage API support ([#362](https://github.com/apache/cordova-plugin-inappbrowser/issues/362)) ([`c54d100`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c54d100))
+-   fix(ios): Fixes loadAfterBeforeload on iOS. ([#350](https://github.com/apache/cordova-plugin-inappbrowser/issues/350)) ([`0fd43ae`](https://github.com/apache/cordova-plugin-inappbrowser/commit/0fd43ae))
+-   fix(ios): Fix crashes when using WKWebView implementation on iOS 9. ([#337](https://github.com/apache/cordova-plugin-inappbrowser/issues/337)) ([`3b82c16`](https://github.com/apache/cordova-plugin-inappbrowser/commit/3b82c16))
+-   fix(ios): Fix iOS CDVWKInAppBrowser evaluateJavascript method randomly gets blocked on ios 12 ([#341](https://github.com/apache/cordova-plugin-inappbrowser/issues/341)) ([`978b147`](https://github.com/apache/cordova-plugin-inappbrowser/commit/978b147))
+-   docs: remove unwanted information in README table ([#308](https://github.com/apache/cordova-plugin-inappbrowser/issues/308)) ([`3eadde6`](https://github.com/apache/cordova-plugin-inappbrowser/commit/3eadde6))
+-   fix(ios): This lets the default window layering do it's thing. ([#336](https://github.com/apache/cordova-plugin-inappbrowser/issues/336)) ([`c24bb46`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c24bb46), [`27fe8ec`](https://github.com/apache/cordova-plugin-inappbrowser/commit/27fe8ec))
+-   feat(ios): [CB-7179](https://issues.apache.org/jira/browse/CB-7179) (iOS): Add optional WKWebView support for iOS ([#271](https://github.com/apache/cordova-plugin-inappbrowser/issues/271)) ([`10a0669`](https://github.com/apache/cordova-plugin-inappbrowser/commit/10a0669), [`3927b8f`](https://github.com/apache/cordova-plugin-inappbrowser/commit/3927b8f), [`8248215`](https://github.com/apache/cordova-plugin-inappbrowser/commit/8248215), [`61014dd`](https://github.com/apache/cordova-plugin-inappbrowser/commit/61014dd), [`c41f5b5`](https://github.com/apache/cordova-plugin-inappbrowser/commit/c41f5b5), [`19c6dfe`](https://github.com/apache/cordova-plugin-inappbrowser/commit/19c6dfe), [`7f5fa2a`](https://github.com/apache/cordova-plugin-inappbrowser/commit/7f5fa2a), [`5d2df21`](https://github.com/apache/cordova-plugin-inappbrowser/commit/5d2df21), [`86cc778`](https://github.com/apache/cordova-plugin-inappbrowser/commit/86cc778), [`cbfa195`](https://github.com/apache/cordova-plugin-inappbrowser/commit/cbfa195), [`52e3534`](https://github.com/apache/cordova-plugin-inappbrowser/commit/52e3534), [`8165232`](https://github.com/apache/cordova-plugin-inappbrowser/commit/8165232), [`e2210bd`](https://github.com/apache/cordova-plugin-inappbrowser/commit/e2210bd), [`dc7fa34`](https://github.com/apache/cordova-plugin-inappbrowser/commit/dc7fa34), [`b48e02f`](https://github.com/apache/cordova-plugin-inappbrowser/commit/b48e02f), [`27e6c67`](https://github.com/apache/cordova-plugin-inappbrowser/commit/27e6c67))
+-   docs: remove JIRA link ([`d9cafcd`](https://github.com/apache/cordova-plugin-inappbrowser/commit/d9cafcd))
+-   chore(types): [CB-12941](https://issues.apache.org/jira/browse/CB-12941): update typings ([#267](https://github.com/apache/cordova-plugin-inappbrowser/issues/267)) ([`a0c267f`](https://github.com/apache/cordova-plugin-inappbrowser/commit/a0c267f))
+-   feat: [CB-14188](https://issues.apache.org/jira/browse/CB-14188): add beforeload event, catching navigation before it happens ([#276](https://github.com/apache/cordova-plugin-inappbrowser/issues/276)) ([`228703a`](https://github.com/apache/cordova-plugin-inappbrowser/commit/228703a), [`eafaeda`](https://github.com/apache/cordova-plugin-inappbrowser/commit/eafaeda))
+-   ci(travis): reenable testing on all platforms ([`0ed0bf5`](https://github.com/apache/cordova-plugin-inappbrowser/commit/0ed0bf5))
+-   ci(travis): also accept terms for android sdk `android-27` ([`f8ad528`](https://github.com/apache/cordova-plugin-inappbrowser/commit/f8ad528))
+-   fix(android): [CB-10795](https://issues.apache.org/jira/browse/CB-10795): Exclude current app from external intent list ([#154](https://github.com/apache/cordova-plugin-inappbrowser/issues/154)) ([`a078337`](https://github.com/apache/cordova-plugin-inappbrowser/commit/a078337))
+-   fix(ios): [CB-14234](https://issues.apache.org/jira/browse/CB-14234): Don't call handleOpenURL for system URLs ([#278](https://github.com/apache/cordova-plugin-inappbrowser/issues/278)) ([`cf58b04`](https://github.com/apache/cordova-plugin-inappbrowser/commit/cf58b04))
+-   fix(ios): [CB-12875](https://issues.apache.org/jira/browse/CB-12875): (iOS) Pushes the inappbrowser window to a higher ui level than the existing apps window. ([#284](https://github.com/apache/cordova-plugin-inappbrowser/issues/284)) ([`dc5329d`](https://github.com/apache/cordova-plugin-inappbrowser/commit/dc5329d))
+-   ci: Quick CI fixes ([#277](https://github.com/apache/cordova-plugin-inappbrowser/issues/277))  ([`de86501`](https://github.com/apache/cordova-plugin-inappbrowser/commit/de86501), [`07d9a99`](https://github.com/apache/cordova-plugin-inappbrowser/commit/07d9a99), [`81f1437`](https://github.com/apache/cordova-plugin-inappbrowser/commit/81f1437), [`a464ea6`](https://github.com/apache/cordova-plugin-inappbrowser/commit/a464ea6), [`e75fe14`](https://github.com/apache/cordova-plugin-inappbrowser/commit/e75fe14), [`eb245ec`](https://github.com/apache/cordova-plugin-inappbrowser/commit/eb245ec))
+-   fix(ios): [CB-12922](https://issues.apache.org/jira/browse/CB-12922) (ios): fix In-app browser does not cede control ([#272](https://github.com/apache/cordova-plugin-inappbrowser/issues/272)) ([`dac06aa`](https://github.com/apache/cordova-plugin-inappbrowser/commit/dac06aa), [`9cc7f69`](https://github.com/apache/cordova-plugin-inappbrowser/commit/9cc7f69))
+-   fix(android): [CB-14061](https://issues.apache.org/jira/browse/CB-14061): (android) comply with RFC 3986 for custom URL scheme handling ([#269](https://github.com/apache/cordova-plugin-inappbrowser/issues/269)) ([`f57ede9`](https://github.com/apache/cordova-plugin-inappbrowser/commit/f57ede9), [`26cf6e4`](https://github.com/apache/cordova-plugin-inappbrowser/commit/26cf6e4))
+-   fix(android): [CB-14048](https://issues.apache.org/jira/browse/CB-14048): (android) allowedSchemes check empty string fix ([#268](https://github.com/apache/cordova-plugin-inappbrowser/issues/268)) ([`57eda78`](https://github.com/apache/cordova-plugin-inappbrowser/commit/57eda78), [`33aff11`](https://github.com/apache/cordova-plugin-inappbrowser/commit/33aff11))
+
 
 ### 3.0.0 (Apr 12, 2018)
 * [CB-13659](https://issues.apache.org/jira/browse/CB-13659) **iOS** Add hidespinner option
diff --git a/doc/de/README.md b/doc/de/README.md
deleted file mode 100644
index 2ee92f8..0000000
--- a/doc/de/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-Dieses Plugin bietet eine Web-Browser-Ansicht, die beim Aufruf von `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Die `cordova.InAppBrowser.open()` Funktion ist definiert als Ersatz für die `window.open()` Funktion. InAppBrowser Fenster, können vorhandene `window.open()` Aufrufe durch window.open ersetzen:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-Das InAppBrowser-Fenster verhält sich wie einen standard-Webbrowser und Cordova APIs kann nicht zugegriffen werden kann. Aus diesem Grund empfiehlt sich die InAppBrowser Wenn Sie von Drittanbietern (nicht vertrauenswürdige) Inhalte, statt zu laden, die in den wichtigsten Cordova Webview laden müssen. Die InAppBrowser unterliegt nicht der weißen Liste, noch ist Links in der Systembrowser öffnen.
-
-Die InAppBrowser bietet standardmäßig eine eigene GUI-Steuerelemente für den Benutzer (zurück, vor, erledigt).
-
-Für rückwärts Kompatibilität, dieses Plugin auch `window.open` Haken. Jedoch kann der Plugin installiert Haken der `window.open` haben unbeabsichtigte Nebenwirkungen (vor allem, wenn dieses Plugin nur als eine Abhängigkeit von einem anderen Plugin enthalten ist). Der Haken der `window.open` wird in einer zukünftigen Version entfernt. Bis der Haken aus dem Plugin entfernt wird, können die Vorgabe von apps manuell wiederherstellen:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` im globalen Gültigkeitsbereich ist zwar InAppBrowser nicht verfügbar bis nach dem `deviceready`-Ereignis.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Wenn Sie alle Seite Lasten in Ihrer Anwendung durch die InAppBrowser gehen möchten, können Sie einfach `window.open` während der Initialisierung Haken. Zum Beispiel:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Öffnet eine URL in eine neue `InAppBrowser`-Instanz, die aktuelle Browserinstanz oder der Systembrowser.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **Ref**: Bezugnahme auf das `InAppBrowser` Fenster. *(InAppBrowser)*
-
-  * **URL**: die URL um den *(String)* zu laden. Rufen Sie `encodeURI()` auf, wenn die URL Unicode-Zeichen enthält.
-
-  * **target**: das Ziel in welchem die URL geladen werden soll. Standardmäßig entspricht dieser Wert `_self` . *(String)*
-    
-      * `_self`: Öffnet sich in der Cordova WebView wenn der URL in der Whitelist ist, andernfalls es öffnet sich in der`InAppBrowser`.
-      * `_blank`: Öffnet den`InAppBrowser`.
-      * `_system`: Öffnet in den System-Web-Browser.
-
-  * **options**: Optionen für die `InAppBrowser` . Optional, säumige an: `location=yes` . *(String)*
-    
-    Die `options` Zeichenfolge muss keine Leerstelle enthalten, und jede Funktion Name/Wert-Paare müssen durch ein Komma getrennt werden. Featurenamen Groß-/Kleinschreibung. Alle Plattformen unterstützen die anderen Werte:
-    
-      * **location**: Legen Sie auf `yes` oder `no` , machen die `InAppBrowser` der Adressleiste ein- oder ausschalten.
-    
-    Nur Android:
-    
-      * **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-      * **clearcache**: Legen Sie auf `yes` , der Browser ist Cookiecache gelöscht, bevor das neue Fenster geöffnet wird
-      * **clearsessioncache**: Legen Sie auf `yes` zu der Session Cookie Cache gelöscht, bevor das neue Fenster geöffnet wird
-      * **zoom**: Legen Sie auf `yes` zu zeigen Android Browser-Zoom-Steuerelementen, die auf `no` festlegen, um sie zu verbergen. Standardwert ist `yes`.
-      * **hardwareback**: auf `yes` festlegen, um die Zurück-Taste verwenden, um die `InAppBrowser`Geschichte rückwärts navigieren. Wenn es keine vorherige Seite, wird der `InAppBrowser` geschlossen. Der Standardwert ist `yes`, so dass Sie es auf `no` festlegen müssen, wenn Sie die Schaltfläche "zurück", die InAppBrowser einfach zu schließen möchten.
-    
-    iOS nur:
-    
-      * **closebuttoncaption**: Legen Sie auf eine Zeichenfolge als Beschriftung der **fertig** -Schaltfläche verwenden. Beachten Sie, dass Sie diesen Wert selbst zu lokalisieren müssen.
-      * **disallowoverscroll**: Legen Sie auf `yes` oder `no` (Standard ist `no` ). Aktiviert/deaktiviert die UIWebViewBounce-Eigenschaft.
-      * **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-      * **clearcache**: Legen Sie auf `yes` , der Browser ist Cookiecache gelöscht, bevor das neue Fenster geöffnet wird
-      * **clearsessioncache**: Legen Sie auf `yes` zu der Session Cookie Cache gelöscht, bevor das neue Fenster geöffnet wird
-      * **toolbar**: Legen Sie auf `yes` oder `no` Aktivieren Sie die Symbolleiste ein- oder Ausschalten für InAppBrowser (Standard:`yes`)
-      * **enableViewportScale**: Legen Sie auf `yes` oder `no` , Viewport Skalierung durch ein Meta-Tag (standardmäßig zu verhindern`no`).
-      * **mediaPlaybackRequiresUserAction**: Legen Sie auf `yes` oder `no` , HTML5 audio oder video von automatisches Abspielen (standardmäßig zu verhindern`no`).
-      * **allowInlineMediaPlayback**: Legen Sie auf `yes` oder `no` Inline-HTML5-Media-Wiedergabe, Darstellung im Browser-Fenster, sondern in eine gerätespezifische Wiedergabe-Schnittstelle ermöglichen. Des HTML `video` Element muss auch die `webkit-playsinline` Attribut (Standard:`no`)
-      * **keyboardDisplayRequiresUserAction**: Legen Sie auf `yes` oder `no` um die Tastatur zu öffnen, wenn Formularelemente Fokus per JavaScript erhalten `focus()` Anruf (Standard:`yes`).
-      * **suppressesIncrementalRendering**: Legen Sie auf `yes` oder `no` zu warten, bis alle neuen anzeigen-Inhalte empfangen wird, bevor Sie wiedergegeben wird (standardmäßig`no`).
-      * **presentationstyle**: Legen Sie auf `pagesheet` , `formsheet` oder `fullscreen` [Präsentationsstil](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (standardmäßig fest`fullscreen`).
-      * **transitionstyle**: Legen Sie auf `fliphorizontal` , `crossdissolve` oder `coververtical` [Übergangsstil](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (standardmäßig fest`coververtical`).
-      * **toolbarposition**: Legen Sie auf `top` oder `bottom` (Standard ist `bottom` ). Bewirkt, dass die Symbolleiste am oberen oder unteren Rand des Fensters sein.
-    
-    Nur Windows:
-    
-      * **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-      * **fullscreen**: auf `yes` festlegen, um das WebBrowser-Steuerelement ohne Rahmen drumherum zu erstellen. Bitte beachten Sie, dass bei **location=no** wird auch angegeben, gibt es keine Kontrolle, die Benutzer zum IAB-Fenster schließen.
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Firefox OS
-  * iOS
-  * Windows 8 und 8.1
-  * Windows Phone 7 und 8
-  * Browser
-
-### Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS Macken
-
-Als Plugin jedes Design erzwingen nicht besteht die Notwendigkeit, einige CSS-Regeln hinzuzufügen, wenn bei `target='_blank'`. Die Regeln könnte wie diese aussehen.
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Windows-Eigenheiten
-
-Ähnlich wie Firefox OS IAB Fenster visuelle Verhalten kann überschrieben werden, über `InAppBrowserWrap`/`InAppBrowserWrapFullscreen` -CSS-Klassen
-
-### Browser-Eigenheiten
-
-  * Plugin wird per Iframe implementiert,
-
-  * Navigationsverlauf (Schaltflächen`zurück` und `Vorwärts` in LocationBar) ist nicht implementiert.
-
-## InAppBrowser
-
-Bei einem Aufruf von `cordova.InAppBrowser.open` zurückgegebene Objekt..
-
-### Methoden
-
-  * addEventListener
-  * removeEventListener
-  * Schließen
-  * Karte
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> Fügt einen Listener für eine Veranstaltung aus der`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-  * **EventName**: das Ereignis zu warten *(String)*
-    
-      * **Loadstart**: Ereignis wird ausgelöst, wenn die `InAppBrowser` beginnt, eine URL zu laden.
-      * **Loadstop**: Ereignis wird ausgelöst, wenn der `InAppBrowser` beendet ist, eine URL laden.
-      * **LoadError**: Ereignis wird ausgelöst, wenn der `InAppBrowser` ein Fehler auftritt, wenn Sie eine URL zu laden.
-      * **Ausfahrt**: Ereignis wird ausgelöst, wenn das `InAppBrowser` -Fenster wird geschlossen.
-
-  * **Rückruf**: die Funktion, die ausgeführt wird, wenn das Ereignis ausgelöst wird. Die Funktion übergeben wird ein `InAppBrowserEvent` -Objekt als Parameter.
-
-### InAppBrowserEvent Eigenschaften
-
-  * **Typ**: Eventname, entweder `loadstart` , `loadstop` , `loaderror` , oder `exit` . *(String)*
-
-  * **URL**: die URL, die geladen wurde. *(String)*
-
-  * **Code**: der Fehler-Code, nur im Fall von `loaderror` . *(Anzahl)*
-
-  * **Nachricht**: die Fehlermeldung angezeigt, nur im Fall von `loaderror` . *(String)*
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 und 8.1
-  * Windows Phone 7 und 8
-  * Browser
-
-### Browser-Eigenheiten
-
-`loadstart` und `loaderror` Ereignisse werden nicht ausgelöst wird.
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Entfernt einen Listener für eine Veranstaltung aus der`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **Ref**: Bezugnahme auf die `InAppBrowser` Fenster. *(InAppBrowser)*
-
-  * **EventName**: das Ereignis zu warten. *(String)*
-    
-      * **Loadstart**: Ereignis wird ausgelöst, wenn die `InAppBrowser` beginnt, eine URL zu laden.
-      * **Loadstop**: Ereignis wird ausgelöst, wenn der `InAppBrowser` beendet ist, eine URL laden.
-      * **LoadError**: Ereignis wird ausgelöst, wenn die `InAppBrowser` trifft einen Fehler beim Laden einer URLs.
-      * **Ausfahrt**: Ereignis wird ausgelöst, wenn das `InAppBrowser` -Fenster wird geschlossen.
-
-  * **Rückruf**: die Funktion ausgeführt, wenn das Ereignis ausgelöst wird. Die Funktion übergeben wird ein `InAppBrowserEvent` Objekt.
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 und 8.1
-  * Windows Phone 7 und 8
-  * Browser
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## Schließen
-
-> Schließt die `InAppBrowser` Fenster.
-
-    ref.close();
-    
-
-  * **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * Firefox OS
-  * iOS
-  * Windows 8 und 8.1
-  * Windows Phone 7 und 8
-  * Browser
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## Karte
-
-> Zeigt ein InAppBrowser-Fenster, das geöffnet wurde, versteckt. Aufrufen, dies hat keine Auswirkungen, wenn die InAppBrowser schon sichtbar war.
-
-    ref.show();
-    
-
-  * **Ref**: Verweis auf die (InAppBrowser) Fenster`InAppBrowser`)
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 und 8.1
-  * Browser
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Fügt JavaScript-Code in das `InAppBrowser` Fenster
-
-    ref.executeScript(details, callback);
-    
-
-  * **Ref**: Bezugnahme auf die `InAppBrowser` Fenster. *(InAppBrowser)*
-
-  * **InjectDetails**: Informationen über das Skript ausgeführt, angeben, entweder ein `file` oder `code` Schlüssel. *(Objekt)*
-    
-      * **Datei**: URL des Skripts zu injizieren.
-      * **Code**: Text des Skripts zu injizieren.
-
-  * **Rückruf**: die Funktion, die ausgeführt wird, nachdem der JavaScript-Code injiziert wird.
-    
-      * Wenn das eingefügte Skript vom Typ ist `code` , der Rückruf führt mit einen einzelnen Parameter, der der Rückgabewert des Skripts ist, umwickelt ein `Array` . Bei Multi-Line-Skripten ist der Rückgabewert von der letzten Anweisung oder den letzten Ausdruck ausgewertet.
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 und 8.1
-  * Browser
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### Browser-Eigenheiten
-
-  * **code** -Schlüssel wird unterstützt.
-
-### Windows-Eigenheiten
-
-Aufgrund der [MSDN-Dokumentation](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) das aufgerufene Skript kehren nur Zeichenfolgenwerte, andernfalls des Parameters, an **Rückruf** übergeben werden `[null]`.
-
-## insertCSS
-
-> Injiziert CSS in der `InAppBrowser` Fenster.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-  * **InjectDetails**: Informationen über das Skript ausgeführt, angeben, entweder ein `file` oder `code` Schlüssel. *(Objekt)*
-    
-      * **Datei**: URL des Stylesheets zu injizieren.
-      * **Code**: Text des Stylesheets zu injizieren.
-
-  * **Rückruf**: die Funktion, die ausgeführt wird, nachdem die CSS injiziert wird.
-
-### Unterstützte Plattformen
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/de/index.md b/doc/de/index.md
deleted file mode 100644
index d2b29d5..0000000
--- a/doc/de/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-Dieses Plugin bietet eine Web-Browser-Ansicht, die beim Aufruf von `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Die `cordova.InAppBrowser.open()` Funktion ist definiert als Ersatz für die `window.open()` Funktion. InAppBrowser Fenster, können vorhandene `window.open()` Aufrufe durch window.open ersetzen:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-Das InAppBrowser-Fenster verhält sich wie einen standard-Webbrowser und Cordova APIs kann nicht zugegriffen werden kann. Aus diesem Grund empfiehlt sich die InAppBrowser Wenn Sie von Drittanbietern (nicht vertrauenswürdige) Inhalte, statt zu laden, die in den wichtigsten Cordova Webview laden müssen. Die InAppBrowser unterliegt nicht der weißen Liste, noch ist Links in der Systembrowser öffnen.
-
-Die InAppBrowser bietet standardmäßig eine eigene GUI-Steuerelemente für den Benutzer (zurück, vor, erledigt).
-
-Für rückwärts Kompatibilität, dieses Plugin auch `window.open` Haken. Jedoch kann der Plugin installiert Haken der `window.open` haben unbeabsichtigte Nebenwirkungen (vor allem, wenn dieses Plugin nur als eine Abhängigkeit von einem anderen Plugin enthalten ist). Der Haken der `window.open` wird in einer zukünftigen Version entfernt. Bis der Haken aus dem Plugin entfernt wird, können die Vorgabe von apps manuell wiederherstellen:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` im globalen Gültigkeitsbereich ist zwar InAppBrowser nicht verfügbar bis nach dem `deviceready`-Ereignis.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Wenn Sie alle Seite Lasten in Ihrer Anwendung durch die InAppBrowser gehen möchten, können Sie einfach `window.open` während der Initialisierung Haken. Zum Beispiel:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Öffnet eine URL in eine neue `InAppBrowser`-Instanz, die aktuelle Browserinstanz oder der Systembrowser.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **Ref**: Bezugnahme auf das `InAppBrowser` Fenster. *(InAppBrowser)*
-
-*   **URL**: die URL um den *(String)* zu laden. Rufen Sie `encodeURI()` auf, wenn die URL Unicode-Zeichen enthält.
-
-*   **target**: das Ziel in welchem die URL geladen werden soll. Standardmäßig entspricht dieser Wert `_self` . *(String)*
-    
-    *   `_self`: Öffnet sich in der Cordova WebView wenn der URL in der Whitelist ist, andernfalls es öffnet sich in der`InAppBrowser`.
-    *   `_blank`: Öffnet den`InAppBrowser`.
-    *   `_system`: Öffnet in den System-Web-Browser.
-
-*   **options**: Optionen für die `InAppBrowser` . Optional, säumige an: `location=yes` . *(String)*
-    
-    Die `options` Zeichenfolge muss keine Leerstelle enthalten, und jede Funktion Name/Wert-Paare müssen durch ein Komma getrennt werden. Featurenamen Groß-/Kleinschreibung. Alle Plattformen unterstützen die anderen Werte:
-    
-    *   **location**: Legen Sie auf `yes` oder `no` , machen die `InAppBrowser` der Adressleiste ein- oder ausschalten.
-    
-    Nur Android:
-    
-    *   **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-    *   **clearcache**: Legen Sie auf `yes` , der Browser ist Cookiecache gelöscht, bevor das neue Fenster geöffnet wird
-    *   **clearsessioncache**: Legen Sie auf `yes` zu der Session Cookie Cache gelöscht, bevor das neue Fenster geöffnet wird
-    
-    iOS nur:
-    
-    *   **closebuttoncaption**: Legen Sie auf eine Zeichenfolge als Beschriftung der **fertig** -Schaltfläche verwenden. Beachten Sie, dass Sie diesen Wert selbst zu lokalisieren müssen.
-    *   **disallowoverscroll**: Legen Sie auf `yes` oder `no` (Standard ist `no` ). Aktiviert/deaktiviert die UIWebViewBounce-Eigenschaft.
-    *   **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-    *   **clearcache**: Legen Sie auf `yes` , der Browser ist Cookiecache gelöscht, bevor das neue Fenster geöffnet wird
-    *   **clearsessioncache**: Legen Sie auf `yes` zu der Session Cookie Cache gelöscht, bevor das neue Fenster geöffnet wird
-    *   **toolbar**: Legen Sie auf `yes` oder `no` Aktivieren Sie die Symbolleiste ein- oder Ausschalten für InAppBrowser (Standard:`yes`)
-    *   **enableViewportScale**: Legen Sie auf `yes` oder `no` , Viewport Skalierung durch ein Meta-Tag (standardmäßig zu verhindern`no`).
-    *   **mediaPlaybackRequiresUserAction**: Legen Sie auf `yes` oder `no` , HTML5 audio oder video von automatisches Abspielen (standardmäßig zu verhindern`no`).
-    *   **allowInlineMediaPlayback**: Legen Sie auf `yes` oder `no` Inline-HTML5-Media-Wiedergabe, Darstellung im Browser-Fenster, sondern in eine gerätespezifische Wiedergabe-Schnittstelle ermöglichen. Des HTML `video` Element muss auch die `webkit-playsinline` Attribut (Standard:`no`)
-    *   **keyboardDisplayRequiresUserAction**: Legen Sie auf `yes` oder `no` um die Tastatur zu öffnen, wenn Formularelemente Fokus per JavaScript erhalten `focus()` Anruf (Standard:`yes`).
-    *   **suppressesIncrementalRendering**: Legen Sie auf `yes` oder `no` zu warten, bis alle neuen anzeigen-Inhalte empfangen wird, bevor Sie wiedergegeben wird (standardmäßig`no`).
-    *   **presentationstyle**: Legen Sie auf `pagesheet` , `formsheet` oder `fullscreen` [Präsentationsstil][1] (standardmäßig fest`fullscreen`).
-    *   **transitionstyle**: Legen Sie auf `fliphorizontal` , `crossdissolve` oder `coververtical` [Übergangsstil][2] (standardmäßig fest`coververtical`).
-    *   **toolbarposition**: Legen Sie auf `top` oder `bottom` (Standard ist `bottom` ). Bewirkt, dass die Symbolleiste am oberen oder unteren Rand des Fensters sein.
-    
-    Nur Windows:
-    
-    *   **hidden**: Legen Sie auf `yes` um den Browser zu erstellen und laden Sie die Seite, aber nicht zeigen. Das Loadstop-Ereignis wird ausgelöst, wenn der Ladevorgang abgeschlossen ist. Weglassen oder auf `no` (Standard), den Browser öffnen und laden normalerweise zu haben.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 und 8.1
-*   Windows Phone 7 und 8
-
-### Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS Macken
-
-Als Plugin jedes Design erzwingen nicht besteht die Notwendigkeit, einige CSS-Regeln hinzuzufügen, wenn bei `target='_blank'`. Die Regeln könnte wie diese aussehen.
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-Bei einem Aufruf von `cordova.InAppBrowser.open` zurückgegebene Objekt..
-
-### Methoden
-
-*   addEventListener
-*   removeEventListener
-*   Schließen
-*   Karte
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> Fügt einen Listener für eine Veranstaltung aus der`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-*   **EventName**: das Ereignis zu warten *(String)*
-    
-    *   **Loadstart**: Ereignis wird ausgelöst, wenn die `InAppBrowser` beginnt, eine URL zu laden.
-    *   **Loadstop**: Ereignis wird ausgelöst, wenn der `InAppBrowser` beendet ist, eine URL laden.
-    *   **LoadError**: Ereignis wird ausgelöst, wenn der `InAppBrowser` ein Fehler auftritt, wenn Sie eine URL zu laden.
-    *   **Ausfahrt**: Ereignis wird ausgelöst, wenn das `InAppBrowser` -Fenster wird geschlossen.
-
-*   **Rückruf**: die Funktion, die ausgeführt wird, wenn das Ereignis ausgelöst wird. Die Funktion übergeben wird ein `InAppBrowserEvent` -Objekt als Parameter.
-
-### InAppBrowserEvent Eigenschaften
-
-*   **Typ**: Eventname, entweder `loadstart` , `loadstop` , `loaderror` , oder `exit` . *(String)*
-
-*   **URL**: die URL, die geladen wurde. *(String)*
-
-*   **Code**: der Fehler-Code, nur im Fall von `loaderror` . *(Anzahl)*
-
-*   **Nachricht**: die Fehlermeldung angezeigt, nur im Fall von `loaderror` . *(String)*
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 und 8.1
-*   Windows Phone 7 und 8
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Entfernt einen Listener für eine Veranstaltung aus der`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **Ref**: Bezugnahme auf die `InAppBrowser` Fenster. *(InAppBrowser)*
-
-*   **EventName**: das Ereignis zu warten. *(String)*
-    
-    *   **Loadstart**: Ereignis wird ausgelöst, wenn die `InAppBrowser` beginnt, eine URL zu laden.
-    *   **Loadstop**: Ereignis wird ausgelöst, wenn der `InAppBrowser` beendet ist, eine URL laden.
-    *   **LoadError**: Ereignis wird ausgelöst, wenn die `InAppBrowser` trifft einen Fehler beim Laden einer URLs.
-    *   **Ausfahrt**: Ereignis wird ausgelöst, wenn das `InAppBrowser` -Fenster wird geschlossen.
-
-*   **Rückruf**: die Funktion ausgeführt, wenn das Ereignis ausgelöst wird. Die Funktion übergeben wird ein `InAppBrowserEvent` Objekt.
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 und 8.1
-*   Windows Phone 7 und 8
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## Schließen
-
-> Schließt die `InAppBrowser` Fenster.
-
-    ref.close();
-    
-
-*   **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 und 8.1
-*   Windows Phone 7 und 8
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## Karte
-
-> Zeigt ein InAppBrowser-Fenster, das geöffnet wurde, versteckt. Aufrufen, dies hat keine Auswirkungen, wenn die InAppBrowser schon sichtbar war.
-
-    ref.show();
-    
-
-*   **Ref**: Verweis auf die (InAppBrowser) Fenster`InAppBrowser`)
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 und 8.1
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Fügt JavaScript-Code in das `InAppBrowser` Fenster
-
-    ref.executeScript(details, callback);
-    
-
-*   **Ref**: Bezugnahme auf die `InAppBrowser` Fenster. *(InAppBrowser)*
-
-*   **InjectDetails**: Informationen über das Skript ausgeführt, angeben, entweder ein `file` oder `code` Schlüssel. *(Objekt)*
-    
-    *   **Datei**: URL des Skripts zu injizieren.
-    *   **Code**: Text des Skripts zu injizieren.
-
-*   **Rückruf**: die Funktion, die ausgeführt wird, nachdem der JavaScript-Code injiziert wird.
-    
-    *   Wenn das eingefügte Skript vom Typ ist `code` , der Rückruf führt mit einen einzelnen Parameter, der der Rückgabewert des Skripts ist, umwickelt ein `Array` . Bei Multi-Line-Skripten ist der Rückgabewert von der letzten Anweisung oder den letzten Ausdruck ausgewertet.
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 und 8.1
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Injiziert CSS in der `InAppBrowser` Fenster.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **Ref**: Bezugnahme auf die `InAppBrowser` Fenster *(InAppBrowser)*
-
-*   **InjectDetails**: Informationen über das Skript ausgeführt, angeben, entweder ein `file` oder `code` Schlüssel. *(Objekt)*
-    
-    *   **Datei**: URL des Stylesheets zu injizieren.
-    *   **Code**: Text des Stylesheets zu injizieren.
-
-*   **Rückruf**: die Funktion, die ausgeführt wird, nachdem die CSS injiziert wird.
-
-### Unterstützte Plattformen
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-
-### Kurzes Beispiel
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/es/README.md b/doc/es/README.md
deleted file mode 100644
index 811439a..0000000
--- a/doc/es/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-Este plugin proporciona una vista de navegador web que se muestra cuando se llama a `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-El `cordova.InAppBrowser.open()` función se define como un reemplazo de sobreponer para la función `window.Open ()`. Llamadas existentes `window.Open ()` pueden utilizar la ventana InAppBrowser, mediante la sustitución de window.open:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La ventana de InAppBrowser se comporta como un navegador web estándar y no puede acceder a Cordova APIs. Por este motivo, se recomienda la InAppBrowser si necesita cargar contenido de terceros (confianza), en lugar de que cargar en el principal webview Cordova. El InAppBrowser no está sujeta a la lista blanca, ni va a abrir enlaces en el navegador del sistema.
-
-El InAppBrowser proporciona por defecto sus propios controles GUI para el usuario (atras, adelante, hacer).
-
-Para atrás compatibilidad, este plugin también ganchos `window.open`. Sin embargo, el gancho de `window.open` plugin instalado puede tener efectos secundarios no deseados (especialmente si este plugin está incluido únicamente como una dependencia de otro plugin). El gancho de `window.open` se quitará en una versión futura de principal. Hasta que el gancho se ha extraído el plugin, aplicaciones pueden restaurar manualmente el comportamiento por defecto:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Aunque `window.open` es en el ámbito global, InAppBrowser no está disponible hasta después del evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Instalación
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Si quieres todas las cargas de página en su aplicación para ir a través de la InAppBrowser, simplemente puedes conectar `window.open` durante la inicialización. Por ejemplo:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Se abre una dirección URL en una nueva instancia de `InAppBrowser`, en la instancia actual del navegador o el navegador del sistema.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref**: referencia a la `InAppBrowser` ventana. *(InAppBrowser)*
-
-  * **url**: el URL para cargar *(String)*. Llame a `encodeURI()` en esto si la URL contiene caracteres Unicode.
-
-  * **target**: el objetivo en el que se carga la URL, un parámetro opcional que se utiliza de forma predeterminada `_self`. *(String)*
-    
-      * `_self`: se abre en el Cordova WebView si la URL está en la lista blanca, de lo contrario se abre en el `InAppBrowser`.
-      * `_blank`: abre en el `InAppBrowser`.
-      * `_system`: se abre en el navegador del sistema.
-
-  * **options**: opciones para el `InAppBrowser`. Opcional, contumaz a: `location=yes`. *(String)*
-    
-    La cadena de `options` no debe contener ningún espacio en blanco, y los pares de nombre y valor de cada característica deben estar separados por una coma. Los nombres de función son minúsculas. Todas las plataformas admiten el valor siguiente:
-    
-      * **location**: se establece en `yes` o `no` para activar o desactivar la barra de ubicación de la `InAppBrowser`.
-    
-    Sólo Android:
-    
-      * **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o a `no` (por defecto) para que el navegador abra y carga normalmente.
-      * **clearcache**: a `yes` para que el navegador es caché de galleta despejado antes de que se abra la nueva ventana
-      * **clearsessioncache**: a `yes` que la caché de cookie de sesión despejado antes de que se abra la nueva ventana
-      * **zoom**: establezca en `sí` para mostrar los controles de zoom del navegador de Android, a `no` para ocultarlas. El valor predeterminado es `sí`.
-      * **hardwareback**: se establece en `sí` para utilizar el botón back de hardware para navegar hacia atrás a través de la historia de la `InAppBrowser`. Si no hay ninguna página anterior, se cerrará el `InAppBrowser` . El valor predeterminado es `sí`, por lo que se debe establecer en `no` si desea que el botón back para simplemente cerrar el InAppBrowser.
-    
-    Sólo iOS:
-    
-      * **closebuttoncaption**: establecer una cadena para usar como título del botón **hecho** . Tenga en cuenta que necesitas localizar este valor por sí mismo.
-      * **disallowoverscroll**: A `yes` o `no` (valor por defecto es `no` ). Activa/desactiva la propiedad UIWebViewBounce.
-      * **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o a `no` (por defecto) para que el navegador abra y carga normalmente.
-      * **clearcache**: a `yes` para que el navegador es caché de galleta despejado antes de que se abra la nueva ventana
-      * **clearsessioncache**: a `yes` que la caché de cookie de sesión despejado antes de que se abra la nueva ventana
-      * **barra de herramientas**: a `yes` o `no` para activar la barra de herramientas on u off para el InAppBrowser (por defecto`yes`)
-      * **enableViewportScale**: Set a `yes` o `no` para evitar viewport escalar a través de una etiqueta meta (por defecto a `no`).
-      * **mediaPlaybackRequiresUserAction**: Set a `yes` o `no` para evitar HTML5 audio o vídeo de reproducción automática (por defecto a `no`).
-      * **allowInlineMediaPlayback**: A `yes` o `no` para permitir la reproducción de los medios de comunicación en línea HTML5, mostrando en la ventana del navegador en lugar de una interfaz específica del dispositivo de reproducción. Elemento `video` de HTML también debe incluir el atributo de `webkit-playsinline` (por defecto a `no`)
-      * **keyboardDisplayRequiresUserAction**: se establece en `yes` o `no` para abrir el teclado cuando elementos de formulario reciben el foco mediante llamada de JavaScript de `focus()` (por defecto a `yes`).
-      * **suppressesIncrementalRendering**: se establece en `yes` o `no` para esperar hasta que todos los nuevos contenidos de vista se recibieron antes de ser prestados (por defecto a `no`).
-      * **presentationstyle**: se establece en `pagesheet`, `formsheet` o `fullscreen` para definir el [estilo de la presentación](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (por defecto a `fullscreen`).
-      * **transitionstyle**: se establece en `fliphorizontal`, `crossdissolve` o `coververtical` para definir el [estilo de transición](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (por defecto `coververtical`).
-      * **toolbarposition**: A `top` o `bottom` (valor por defecto es `bottom` ). Hace que la barra de herramientas en la parte superior o inferior de la ventana.
-    
-    Sólo Windows:
-    
-      * **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o a `no` (por defecto) para que el navegador abra y carga normalmente.
-      * **fullscreen**: se establece en `sí` para crear el control del navegador sin un borde alrededor de él. Por favor tenga en cuenta que si **location=no** también se especifica, no habrá ningún control presentado al usuario para cerrar la ventana IAB.
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * BlackBerry 10
-  * Firefox OS
-  * iOS
-  * Windows 8 y 8.1
-  * Windows Phone 7 y 8
-  * Explorador
-
-### Ejemplo
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS rarezas
-
-Como plugin no cumplir cualquier diseño es necesario añadir algunas reglas CSS si abre con `target = '_blank'`. Las reglas pueden parecerse a estos
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Windows rarezas
-
-Similar al comportamiento visual de la ventana de Firefox OS IAB puede anularse mediante `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` clases CSS
-
-### Navegador rarezas
-
-  * Plugin se implementa mediante iframe,
-
-  * Historial de navegación (botones`atrás` y `adelante` en LocationBar) no está implementado.
-
-## InAppBrowser
-
-El objeto devuelto desde una llamada a `cordova.InAppBrowser.open`.
-
-### Métodos
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> Añade un detector para un evento de la `InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-  * **eventName**: el evento para escuchar *(String)*
-    
-      * **loadstart**: evento se desencadena cuando el `InAppBrowser` comienza a cargar una dirección URL.
-      * **loadstop**: evento desencadena cuando los acabados `InAppBrowser` cargar una dirección URL.
-      * **loaderror**: evento se desencadena cuando el `InAppBrowser` encuentra un error al cargar una dirección URL.
-      * **exit**: evento se desencadena cuando se cierra la ventana de `InAppBrowser`.
-
-  * **callback**: la función que se ejecuta cuando se desencadene el evento. La función se pasa un objeto `InAppBrowserEvent` como un parámetro.
-
-### InAppBrowserEvent propiedades
-
-  * **type**: eventname, `loadstart`, `loadstop`, `loaderror` o `exit`. *(String)*
-
-  * **url**: la URL que se cargó. *(String)*
-
-  * **code**: el código de error, sólo en el caso de `loaderror`. *(Número)*
-
-  * **message**: el mensaje de error, sólo en el caso de `loaderror`. *(String)*
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * iOS
-  * Windows 8 y 8.1
-  * Windows Phone 7 y 8
-  * Explorador
-
-### Navegador rarezas
-
-eventos `loadstart` y `loaderror` no son alimentados.
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Elimina un detector para un evento de la `InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **ref**: referencia a la ventana de `InAppBrowser`. *(InAppBrowser)*
-
-  * **eventName**: dejar de escuchar para el evento. *(String)*
-    
-      * **loadstart**: evento se desencadena cuando el `InAppBrowser` comienza a cargar una dirección URL.
-      * **loadstop**: evento desencadena cuando los acabados `InAppBrowser` cargar una dirección URL.
-      * **loaderror**: evento se desencadena cuando el `InAppBrowser` se encuentra con un error al cargar una dirección URL.
-      * **exit**: evento se desencadena cuando se cierra la ventana de `InAppBrowser`.
-
-  * **callback**: la función a ejecutar cuando se desencadene el evento. La función se pasa un objeto `InAppBrowserEvent`.
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * iOS
-  * Windows 8 y 8.1
-  * Windows Phone 7 y 8
-  * Explorador
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Cierra la ventana de `InAppBrowser`.
-
-    ref.close();
-    
-
-  * **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * Firefox OS
-  * iOS
-  * Windows 8 y 8.1
-  * Windows Phone 7 y 8
-  * Explorador
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Muestra una ventana InAppBrowser que abrió sus puertas ocultada. Esto no tiene efecto si el InAppBrowser ya era visible.
-
-    ref.show();
-    
-
-  * **ref**: referencia a la (ventana) InAppBrowser`InAppBrowser`)
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * iOS
-  * Windows 8 y 8.1
-  * Explorador
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Inyecta código JavaScript en la ventana de `InAppBrowser`
-
-    ref.executeScript(details, callback);
-    
-
-  * **ref**: referencia a la ventana de `InAppBrowser`. *(InAppBrowser)*
-
-  * **injectDetails**: detalles de la secuencia de comandos para ejecutar, o especificar un `file` o `code` clave. *(Objeto)*
-    
-      * **file**: URL del script para inyectar.
-      * **code**: texto de la escritura para inyectar.
-
-  * **devolución de llamada**: la función que se ejecuta después de inyecta el código JavaScript.
-    
-      * Si el script inyectado es del tipo de `code`, la devolución de llamada se ejecuta con un solo parámetro, que es el valor devuelto del guión, envuelto en una `Array`. Para scripts multilíneas, este es el valor devuelto de la última declaración, o la última expresión evaluada.
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * iOS
-  * Windows 8 y 8.1
-  * Explorador
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### Navegador rarezas
-
-  * sólo **code** es compatible.
-
-### Windows rarezas
-
-Debido a la [documentación MSDN](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) el script invocado puede devolver únicamente valores de cadena, de lo contrario el parámetro, pasa al **callback** será `[null]`.
-
-## insertCSS
-
-> Inyecta CSS en la ventana de `InAppBrowser`.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-  * **injectDetails**: detalles de la secuencia de comandos para ejecutar, o especificar un `file` o `code` clave. *(Objeto)*
-    
-      * **file**: URL de la hoja de estilos para inyectar.
-      * **code**: texto de la hoja de estilos para inyectar.
-
-  * **callback**: la función que se ejecuta después de inyectar el CSS.
-
-### Plataformas soportadas
-
-  * Amazon fire OS
-  * Android
-  * iOS
-  * Windows
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/es/index.md b/doc/es/index.md
deleted file mode 100644
index fc5b7b1..0000000
--- a/doc/es/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-Este plugin proporciona una vista de navegador web que se muestra cuando se llama a `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-El `cordova.InAppBrowser.open()` función se define como un reemplazo de sobreponer para la función `window.Open ()`. Llamadas existentes `window.Open ()` pueden utilizar la ventana InAppBrowser, mediante la sustitución de window.open:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La ventana de InAppBrowser se comporta como un navegador web estándar y no puede acceder a Cordova APIs. Por este motivo, se recomienda la InAppBrowser si necesita cargar contenido de terceros (confianza), en lugar de que cargar en el principal webview Cordova. El InAppBrowser no está sujeta a la lista blanca, ni va a abrir enlaces en el navegador del sistema.
-
-El InAppBrowser proporciona por defecto sus propios controles GUI para el usuario (atras, adelante, hacer).
-
-Para atrás compatibilidad, este plugin también ganchos `window.open`. Sin embargo, el gancho de `window.open` plugin instalado puede tener efectos secundarios no deseados (especialmente si este plugin está incluido únicamente como una dependencia de otro plugin). El gancho de `window.open` se quitará en una versión futura de principal. Hasta que el gancho se ha extraído el plugin, aplicaciones pueden restaurar manualmente el comportamiento por defecto:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Aunque `window.open` es en el ámbito global, InAppBrowser no está disponible hasta después del evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Instalación
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Si quieres todas las cargas de página en su aplicación para ir a través de la InAppBrowser, simplemente puedes conectar `window.open` durante la inicialización. Por ejemplo:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Se abre una dirección URL en una nueva instancia de `InAppBrowser`, en la instancia actual del navegador o el navegador del sistema.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref**: referencia a la `InAppBrowser` ventana. *(InAppBrowser)*
-
-*   **url**: el URL para cargar *(String)*. Llame a `encodeURI()` en esto si la URL contiene caracteres Unicode.
-
-*   **target**: el objetivo en el que se carga la URL, un parámetro opcional que se utiliza de forma predeterminada `_self`. *(String)*
-    
-    *   `_self`: se abre en el Cordova WebView si la URL está en la lista blanca, de lo contrario se abre en el `InAppBrowser`.
-    *   `_blank`: abre en el `InAppBrowser`.
-    *   `_system`: se abre en el navegador del sistema.
-
-*   **options**: opciones para el `InAppBrowser`. Opcional, contumaz a: `location=yes`. *(String)*
-    
-    La cadena de `options` no debe contener ningún espacio en blanco, y los pares de nombre y valor de cada característica deben estar separados por una coma. Los nombres de función son minúsculas. Todas las plataformas admiten el valor siguiente:
-    
-    *   **location**: se establece en `yes` o `no` para activar o desactivar la barra de ubicación de la `InAppBrowser`.
-    
-    Sólo Android:
-    
-    *   **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o establecer en `no` (por defecto) para que el navegador abra y carga normalmente.
-    *   **clearcache**: a `yes` para que el navegador es caché de galleta despejado antes de que se abra la nueva ventana
-    *   **clearsessioncache**: a `yes` que la caché de cookie de sesión despejado antes de que se abra la nueva ventana
-    
-    Sólo iOS:
-    
-    *   **closebuttoncaption**: establecer una cadena para usar como título del botón **hecho** . Tenga en cuenta que necesitas localizar este valor por sí mismo.
-    *   **disallowoverscroll**: A `yes` o `no` (valor por defecto es `no` ). Activa/desactiva la propiedad UIWebViewBounce.
-    *   **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o a `no` (por defecto) para que el navegador abra y carga normalmente.
-    *   **clearcache**: a `yes` para que el navegador es caché de galleta despejado antes de que se abra la nueva ventana
-    *   **clearsessioncache**: a `yes` que la caché de cookie de sesión despejado antes de que se abra la nueva ventana
-    *   **barra de herramientas**: a `yes` o `no` para activar la barra de herramientas on u off para el InAppBrowser (por defecto`yes`)
-    *   **enableViewportScale**: Set a `yes` o `no` para evitar viewport escalar a través de una etiqueta meta (por defecto a `no`).
-    *   **mediaPlaybackRequiresUserAction**: Set a `yes` o `no` para evitar HTML5 audio o vídeo de reproducción automática (por defecto a `no`).
-    *   **allowInlineMediaPlayback**: A `yes` o `no` para permitir la reproducción de los medios de comunicación en línea HTML5, mostrando en la ventana del navegador en lugar de una interfaz específica del dispositivo de reproducción. Elemento `video` de HTML también debe incluir el atributo de `webkit-playsinline` (por defecto a `no`)
-    *   **keyboardDisplayRequiresUserAction**: se establece en `yes` o `no` para abrir el teclado cuando elementos de formulario reciben el foco mediante llamada de JavaScript de `focus()` (por defecto a `yes`).
-    *   **suppressesIncrementalRendering**: se establece en `yes` o `no` para esperar hasta que todos los nuevos contenidos de vista se recibieron antes de ser prestados (por defecto a `no`).
-    *   **presentationstyle**: se establece en `pagesheet`, `formsheet` o `fullscreen` para definir el [estilo de la presentación][1] (por defecto a `fullscreen`).
-    *   **transitionstyle**: se establece en `fliphorizontal`, `crossdissolve` o `coververtical` para definir el [estilo de transición][2] (por defecto `coververtical`).
-    *   **toolbarposition**: A `top` o `bottom` (valor por defecto es `bottom` ). Hace que la barra de herramientas en la parte superior o inferior de la ventana.
-    
-    Sólo Windows:
-    
-    *   **oculta**: a `yes` para crear el navegador y cargar la página, pero no lo demuestra. El evento loadstop se desencadena cuando termine la carga. Omitir o a `no` (por defecto) para que el navegador abra y carga normalmente.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 y 8.1
-*   Windows Phone 7 y 8
-
-### Ejemplo
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS rarezas
-
-Como plugin no cumplir cualquier diseño es necesario añadir algunas reglas CSS si abre con `target = '_blank'`. Las reglas pueden parecerse a estos
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-El objeto devuelto desde una llamada a `cordova.InAppBrowser.open`.
-
-### Métodos
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> Añade un detector para un evento de la `InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-*   **eventName**: el evento para escuchar *(String)*
-    
-    *   **loadstart**: evento se desencadena cuando el `InAppBrowser` comienza a cargar una dirección URL.
-    *   **loadstop**: evento desencadena cuando los acabados `InAppBrowser` cargar una dirección URL.
-    *   **loaderror**: evento se desencadena cuando el `InAppBrowser` encuentra un error al cargar una dirección URL.
-    *   **exit**: evento se desencadena cuando se cierra la ventana de `InAppBrowser`.
-
-*   **callback**: la función que se ejecuta cuando se desencadene el evento. La función se pasa un objeto `InAppBrowserEvent` como un parámetro.
-
-### InAppBrowserEvent propiedades
-
-*   **type**: eventname, `loadstart`, `loadstop`, `loaderror` o `exit`. *(String)*
-
-*   **url**: la URL que se cargó. *(String)*
-
-*   **code**: el código de error, sólo en el caso de `loaderror`. *(Número)*
-
-*   **message**: el mensaje de error, sólo en el caso de `loaderror`. *(String)*
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   iOS
-*   Windows 8 y 8.1
-*   Windows Phone 7 y 8
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Elimina un detector para un evento de la `InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ref**: referencia a la ventana de `InAppBrowser`. *(InAppBrowser)*
-
-*   **eventName**: dejar de escuchar para el evento. *(String)*
-    
-    *   **loadstart**: evento se desencadena cuando el `InAppBrowser` comienza a cargar una dirección URL.
-    *   **loadstop**: evento desencadena cuando los acabados `InAppBrowser` cargar una dirección URL.
-    *   **loaderror**: evento se desencadena cuando el `InAppBrowser` se encuentra con un error al cargar una dirección URL.
-    *   **exit**: evento se desencadena cuando se cierra la ventana de `InAppBrowser`.
-
-*   **callback**: la función a ejecutar cuando se desencadene el evento. La función se pasa un objeto `InAppBrowserEvent`.
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   iOS
-*   Windows 8 y 8.1
-*   Windows Phone 7 y 8
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Cierra la ventana de `InAppBrowser`.
-
-    ref.close();
-    
-
-*   **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 y 8.1
-*   Windows Phone 7 y 8
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Muestra una ventana InAppBrowser que abrió sus puertas ocultada. Esto no tiene efecto si el InAppBrowser ya era visible.
-
-    ref.show();
-    
-
-*   **ref**: referencia a la (ventana) InAppBrowser`InAppBrowser`)
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   iOS
-*   Windows 8 y 8.1
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Inyecta código JavaScript en la ventana de `InAppBrowser`
-
-    ref.executeScript(details, callback);
-    
-
-*   **ref**: referencia a la ventana de `InAppBrowser`. *(InAppBrowser)*
-
-*   **injectDetails**: detalles de la secuencia de comandos para ejecutar, o especificar un `file` o `code` clave. *(Objeto)*
-    
-    *   **file**: URL del script para inyectar.
-    *   **code**: texto de la escritura para inyectar.
-
-*   **devolución de llamada**: la función que se ejecuta después de inyecta el código JavaScript.
-    
-    *   Si el script inyectado es del tipo de `code`, la devolución de llamada se ejecuta con un solo parámetro, que es el valor devuelto del guión, envuelto en una `Array`. Para scripts multilíneas, este es el valor devuelto de la última declaración, o la última expresión evaluada.
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   iOS
-*   Windows 8 y 8.1
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Inyecta CSS en la ventana de `InAppBrowser`.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **ref**: referencia a la ventana de `InAppBrowser` *(InAppBrowser)*
-
-*   **injectDetails**: detalles de la secuencia de comandos para ejecutar, o especificar un `file` o `code` clave. *(Objeto)*
-    
-    *   **file**: URL de la hoja de estilos para inyectar.
-    *   **code**: texto de la hoja de estilos para inyectar.
-
-*   **callback**: la función que se ejecuta después de inyectar el CSS.
-
-### Plataformas soportadas
-
-*   Amazon fire OS
-*   Android
-*   iOS
-
-### Ejemplo rápido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/fr/README.md b/doc/fr/README.md
deleted file mode 100644
index 73812fe..0000000
--- a/doc/fr/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-Ce module fournit une vue de navigateur web qui s'affiche lorsque vous appelez `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Le `cordova.InAppBrowser.open()` fonction est définie pour être un remplacement rapide de la fonction `window.open()`. Les appels existants `window.open()` peuvent utiliser la fenêtre de InAppBrowser, en remplaçant window.open :
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La fenêtre de InAppBrowser se comporte comme un navigateur web standard et ne peut pas accéder aux APIs Cordova. Pour cette raison, le InAppBrowser est recommandé si vous devez charger le contenu de tiers (non approuvé), au lieu de chargement que dans le principaux webview Cordova. Le InAppBrowser n'est pas soumis à la liste blanche, ni s'ouvre les liens dans le navigateur de système.
-
-Le InAppBrowser fournit par défaut ses propres contrôles de GUI pour l'utilisateur (arrière, avant, fait).
-
-Pour vers l'arrière la compatibilité, ce plugin crochets également `window.open`. Cependant, le plugin installé crochet de `window.open` peut avoir des effets secondaires involontaires (surtout si ce plugin est inclus uniquement comme une dépendance d'un autre plugin). Le crochet de `window.open` sera supprimé dans une future version majeure. Jusqu'à ce que le crochet est supprimé de la plugin, apps peuvent restaurer manuellement le comportement par défaut :
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Bien que `window.open` est dans la portée globale, InAppBrowser n'est pas disponible jusqu'à ce qu'après l'événement `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Si vous souhaitez que toutes les charges de la page dans votre application de passer par le InAppBrowser, vous pouvez simplement accrocher `window.open` pendant l'initialisation. Par exemple :
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Ouvre une URL dans une nouvelle instance de `InAppBrowser`, l'instance de navigateur actuelle ou dans l'Explorateur du système.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-  * **url** : l'URL à charger *(String)*. À encoder au préalable via `encodeURI()` si celle-ci contient des caractères Unicode.
-
-  * **target** : la cible du chargement de l'URL, ce paramètre est optionnel, sa valeur par défaut est `_self`. *(String)*
-    
-      * `_self` : dirige le chargement vers la WebView Cordova si l'URL figure dans la liste blanche, sinon dans une fenêtre `InAppBrowser`.
-      * `_blank` : dirige le chargement vers une fenêtre `InAppBrowser`.
-      * `_system` : dirige le chargement vers le navigateur Web du système.
-
-  * **options** : permet de personnaliser la fenêtre `InAppBrowser`. Paramètre facultatif dont la valeur par défaut est `location=yes`. *(String)*
-    
-    La chaîne `options` ne doit contenir aucun caractère vide, chaque paire nom/valeur représentant une fonctionnalité doit être séparée de la précédente par une virgule. Les noms de fonctionnalités sont sensibles à la casse. Toutes les plates-formes prennent en charge la valeur ci-dessous :
-    
-      * **location** : régler à `yes` ou `no` afin d'afficher ou masquer la barre d'adresse de la fenêtre `InAppBrowser`.
-    
-    Android uniquement :
-    
-      * **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-      * **ClearCache**: la valeur `yes` pour que le navigateur du cache de cookie effacé, avant l'ouverture de la nouvelle fenêtre
-      * **clearsessioncache**: la valeur `yes` pour avoir le cache de cookie de session autorisé avant l'ouverture de la nouvelle fenêtre
-      * **zoom**: la valeur `yes` pour afficher les commandes de zoom du navigateur Android, affectez `no` de les cacher. Valeur par défaut est `yes`.
-      * **hardwareback**: utilisez le bouton de retour de matériel pour naviguer vers l'arrière à travers l'histoire de `InAppBrowser`de la valeur `Oui` . S'il n'y a aucune page précédente, `InAppBrowser` fermera. La valeur par défaut est `yes`, alors vous devez le définir à `no` si vous souhaitez que le bouton back de simplement fermer la InAppBrowser.
-    
-    iOS uniquement :
-    
-      * **closebuttoncaption**: affectez une chaîne à utiliser comme la **fait** légende du bouton. Notez que vous devrez localiser cette valeur vous-même.
-      * **disallowoverscroll**: la valeur `yes` ou `no` (valeur par défaut est `no` ). Active/désactive la propriété UIWebViewBounce.
-      * **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-      * **ClearCache**: la valeur `yes` pour que le navigateur du cache de cookie effacé, avant l'ouverture de la nouvelle fenêtre
-      * **clearsessioncache**: la valeur `yes` pour avoir le cache de cookie de session autorisé avant l'ouverture de la nouvelle fenêtre
-      * **barre d'outils**: la valeur `yes` ou `no` pour activer la barre d'outils ou désactiver pour le InAppBrowser (par défaut,`yes`)
-      * **enableViewportScale**: la valeur `yes` ou `no` pour empêcher la fenêtre de mise à l'échelle par une balise meta (par défaut,`no`).
-      * **mediaPlaybackRequiresUserAction**: la valeur `yes` ou `no` pour empêcher le HTML5 audio ou vidéo de la lecture automatique (par défaut,`no`).
-      * **allowInlineMediaPlayback**: la valeur `yes` ou `no` pour permettre la lecture du média en ligne HTML5, affichage dans la fenêtre du navigateur plutôt que d'une interface de lecture spécifique au périphérique. L'HTML `video` élément doit également inclure la `webkit-playsinline` attribut (par défaut,`no`)
-      * **keyboardDisplayRequiresUserAction**: la valeur `yes` ou `no` pour ouvrir le clavier lorsque les éléments reçoivent le focus par l'intermédiaire de JavaScript `focus()` appel (par défaut,`yes`).
-      * **suppressesIncrementalRendering**: la valeur `yes` ou `no` d'attendre que toutes les nouveautés de vue sont reçue avant d'être restitué (par défaut,`no`).
-      * **presentationstyle**: la valeur `pagesheet` , `formsheet` ou `fullscreen` pour définir le [style de présentation](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (par défaut,`fullscreen`).
-      * **transitionstyle**: la valeur `fliphorizontal` , `crossdissolve` ou `coververtical` pour définir le [style de transition](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (par défaut,`coververtical`).
-      * **toolbarposition**: la valeur `top` ou `bottom` (valeur par défaut est `bottom` ). Causes de la barre d'outils être en haut ou en bas de la fenêtre.
-    
-    Windows uniquement :
-    
-      * **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-      * **fullscreen**: défini à `yes` pour créer le contrôle de navigateur sans bordure autour d'elle. Veuillez noter que si **location=no** est également spécifiée, il n'y n'aura aucun contrôle a présenté à l'utilisateur de fermer la fenêtre du CCI.
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Firefox OS
-  * iOS
-  * Windows 8 et 8.1
-  * Windows Phone 7 et 8
-  * Navigateur
-
-### Exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS Quirks
-
-Comme plugin n'est pas appliquer n'importe quelle conception il est nécessaire d'ajouter quelques règles CSS si ouvert avec `target= _blank`. Les règles pourraient ressembler à ces
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Bizarreries de Windows
-
-Semblable à un comportement visuel fenêtre Firefox OS CCI peut être substituée par l'intermédiaire de `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` des classes CSS
-
-### Bizarreries navigateur
-
-  * Plugin est implémentée via iframe,
-
-  * Historique de navigation (boutons`back` et `forward` dans LocationBar) n'est pas implémentée.
-
-## InAppBrowser
-
-L'objet retourné par un appel à `cordova.InAppBrowser.open`.
-
-### Méthodes
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> Ajoute un écouteur pour un évènement de la fenêtre `InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-  * **eventname** : l'évènement à écouter *(String)*
-    
-      * **loadstart** : évènement déclenché lorsque le chargement d'une URL débute dans la fenêtre `InAppBrowser`.
-      * **loadstop** : évènement déclenché lorsque la fenêtre `InAppBrowser` finit de charger une URL.
-      * **loaderror** : évènement déclenché si la fenêtre `InAppBrowser` rencontre une erreur lors du chargement d'une URL.
-      * **exit** : évènement déclenché lorsque la fenêtre `InAppBrowser` est fermée.
-
-  * **callback** : la fonction à exécuter lorsque l'évènement se déclenche. Un objet `InAppBrowserEvent` lui est transmis comme paramètre.
-
-### Propriétés de InAppBrowserEvent
-
-  * **type** : le nom de l'évènement, soit `loadstart`, `loadstop`, `loaderror` ou `exit`. *(String)*
-
-  * **url** : l'URL ayant été chargée. *(String)*
-
-  * **code** : le code d'erreur, seulement pour `loaderror`. *(Number)*
-
-  * **message** : un message d'erreur, seulement pour `loaderror`. *(String)*
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 et 8.1
-  * Windows Phone 7 et 8
-  * Navigateur
-
-### Bizarreries navigateur
-
-les événements `loadstart` et `loaderror` ne sont pas déclenchés.
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Supprime un écouteur pour un évènement de la fenêtre `InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-  * **eventname** : l'évènement pour lequel arrêter l'écoute. *(String)*
-    
-      * **loadstart** : évènement déclenché lorsque le chargement d'une URL débute dans la fenêtre `InAppBrowser`.
-      * **loadstop** : évènement déclenché lorsque la fenêtre `InAppBrowser` finit de charger une URL.
-      * **loaderror** : évènement déclenché si la fenêtre `InAppBrowser` rencontre une erreur lors du chargement d'une URL.
-      * **exit** : évènement déclenché lorsque la fenêtre `InAppBrowser` est fermée.
-
-  * **callback** : la fonction à exécuter lorsque l'évènement se déclenche. Un objet `InAppBrowserEvent` lui est transmis comme paramètre.
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 et 8.1
-  * Windows Phone 7 et 8
-  * Navigateur
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Ferme la fenêtre `InAppBrowser`.
-
-    ref.close();
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * Firefox OS
-  * iOS
-  * Windows 8 et 8.1
-  * Windows Phone 7 et 8
-  * Navigateur
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Affiche une fenêtre InAppBrowser qui a été ouverte cachée. Appeler cette méthode n'a aucun effet si la fenêtre en question est déjà visible.
-
-    ref.show();
-    
-
-  * **Réf**: référence à la fenêtre () InAppBrowser`InAppBrowser`)
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 et 8.1
-  * Navigateur
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Injecte du code JavaScript dans la fenêtre `InAppBrowser`
-
-    ref.executeScript(details, callback);
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-  * **injectDetails** : détails du script à exécuter, requérant une propriété `file` ou `code`. *(Object)*
-    
-      * **file** : URL du script à injecter.
-      * **code** : texte du script à injecter.
-
-  * **callback** : une fonction exécutée après l'injection du code JavaScript.
-    
-      * Si le script injecté est de type `code`, un seul paramètre est transmis à la fonction callback, correspondant à la valeur de retour du script enveloppée dans un `Array`. Pour les scripts multilignes, il s'agit de la valeur renvoyée par la dernière instruction ou la dernière expression évaluée.
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 et 8.1
-  * Navigateur
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### Bizarreries navigateur
-
-  * clef de **code** uniquement est pris en charge.
-
-### Bizarreries de Windows
-
-En raison de la [documentation MSDN](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) le script appelé peut retourner uniquement les valeurs de chaîne, sinon le paramètre, passé au **rappel** sera `[null]`.
-
-## insertCSS
-
-> Injecte des règles CSS dans la fenêtre `InAppBrowser`.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-  * **injectDetails** : détails du script à exécuter, requérant une propriété `file` ou `code`. *(Object)*
-    
-      * **file** : URL de la feuille de style à injecter.
-      * **code** : contenu de la feuille de style à injecter.
-
-  * **callback** : une fonction exécutée après l'injection du fichier CSS.
-
-### Plates-formes supportées
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows
-
-### Exemple court
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/fr/index.md b/doc/fr/index.md
deleted file mode 100644
index 4f22d13..0000000
--- a/doc/fr/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-Ce module fournit une vue de navigateur web qui s'affiche lorsque vous appelez `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Le `cordova.InAppBrowser.open()` fonction est définie pour être un remplacement rapide de la fonction `window.open()`. Les appels existants `window.open()` peuvent utiliser la fenêtre de InAppBrowser, en remplaçant window.open :
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La fenêtre de InAppBrowser se comporte comme un navigateur web standard et ne peut pas accéder aux APIs Cordova. Pour cette raison, le InAppBrowser est recommandé si vous devez charger le contenu de tiers (non approuvé), au lieu de chargement que dans le principaux webview Cordova. Le InAppBrowser n'est pas soumis à la liste blanche, ni s'ouvre les liens dans le navigateur de système.
-
-Le InAppBrowser fournit par défaut ses propres contrôles de GUI pour l'utilisateur (arrière, avant, fait).
-
-Pour vers l'arrière la compatibilité, ce plugin crochets également `window.open`. Cependant, le plugin installé crochet de `window.open` peut avoir des effets secondaires involontaires (surtout si ce plugin est inclus uniquement comme une dépendance d'un autre plugin). Le crochet de `window.open` sera supprimé dans une future version majeure. Jusqu'à ce que le crochet est supprimé de la plugin, apps peuvent restaurer manuellement le comportement par défaut :
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Bien que `window.open` est dans la portée globale, InAppBrowser n'est pas disponible jusqu'à ce qu'après l'événement `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installation
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Si vous souhaitez que toutes les charges de la page dans votre application de passer par le InAppBrowser, vous pouvez simplement accrocher `window.open` pendant l'initialisation. Par exemple :
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Ouvre une URL dans une nouvelle instance de `InAppBrowser`, l'instance de navigateur actuelle ou dans l'Explorateur du système.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-*   **url** : l'URL à charger *(String)*. À encoder au préalable via `encodeURI()` si celle-ci contient des caractères Unicode.
-
-*   **target** : la cible du chargement de l'URL, ce paramètre est optionnel, sa valeur par défaut est `_self`. *(String)*
-    
-    *   `_self` : dirige le chargement vers la WebView Cordova si l'URL figure dans la liste blanche, sinon dans une fenêtre `InAppBrowser`.
-    *   `_blank` : dirige le chargement vers une fenêtre `InAppBrowser`.
-    *   `_system` : dirige le chargement vers le navigateur Web du système.
-
-*   **options** : permet de personnaliser la fenêtre `InAppBrowser`. Paramètre facultatif dont la valeur par défaut est `location=yes`. *(String)*
-    
-    La chaîne `options` ne doit contenir aucun caractère vide, chaque paire nom/valeur représentant une fonctionnalité doit être séparée de la précédente par une virgule. Les noms de fonctionnalités sont sensibles à la casse. Toutes les plates-formes prennent en charge la valeur ci-dessous :
-    
-    *   **location** : régler à `yes` ou `no` afin d'afficher ou masquer la barre d'adresse de la fenêtre `InAppBrowser`.
-    
-    Android uniquement :
-    
-    *   **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-    *   **ClearCache**: la valeur `yes` pour que le navigateur du cache de cookie effacé, avant l'ouverture de la nouvelle fenêtre
-    *   **clearsessioncache**: la valeur `yes` pour avoir le cache de cookie de session autorisé avant l'ouverture de la nouvelle fenêtre
-    
-    iOS uniquement :
-    
-    *   **closebuttoncaption**: affectez une chaîne à utiliser comme la **fait** légende du bouton. Notez que vous devrez localiser cette valeur vous-même.
-    *   **disallowoverscroll**: la valeur `yes` ou `no` (valeur par défaut est `no` ). Active/désactive la propriété UIWebViewBounce.
-    *   **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-    *   **ClearCache**: la valeur `yes` pour que le navigateur du cache de cookie effacé, avant l'ouverture de la nouvelle fenêtre
-    *   **clearsessioncache**: la valeur `yes` pour avoir le cache de cookie de session autorisé avant l'ouverture de la nouvelle fenêtre
-    *   **barre d'outils**: la valeur `yes` ou `no` pour activer la barre d'outils ou désactiver pour le InAppBrowser (par défaut,`yes`)
-    *   **enableViewportScale**: la valeur `yes` ou `no` pour empêcher la fenêtre de mise à l'échelle par une balise meta (par défaut,`no`).
-    *   **mediaPlaybackRequiresUserAction**: la valeur `yes` ou `no` pour empêcher le HTML5 audio ou vidéo de la lecture automatique (par défaut,`no`).
-    *   **allowInlineMediaPlayback**: la valeur `yes` ou `no` pour permettre la lecture du média en ligne HTML5, affichage dans la fenêtre du navigateur plutôt que d'une interface de lecture spécifique au périphérique. L'HTML `video` élément doit également inclure la `webkit-playsinline` attribut (par défaut,`no`)
-    *   **keyboardDisplayRequiresUserAction**: la valeur `yes` ou `no` pour ouvrir le clavier lorsque les éléments reçoivent le focus par l'intermédiaire de JavaScript `focus()` appel (par défaut,`yes`).
-    *   **suppressesIncrementalRendering**: la valeur `yes` ou `no` d'attendre que toutes les nouveautés de vue sont reçue avant d'être restitué (par défaut,`no`).
-    *   **presentationstyle**: la valeur `pagesheet` , `formsheet` ou `fullscreen` pour définir le [style de présentation][1] (par défaut,`fullscreen`).
-    *   **transitionstyle**: la valeur `fliphorizontal` , `crossdissolve` ou `coververtical` pour définir le [style de transition][2] (par défaut,`coververtical`).
-    *   **toolbarposition**: la valeur `top` ou `bottom` (valeur par défaut est `bottom` ). Causes de la barre d'outils être en haut ou en bas de la fenêtre.
-    
-    Windows uniquement :
-    
-    *   **caché**: la valeur `yes` pour créer le navigateur et charger la page, mais ne pas le montrer. L'événement loadstop est déclenché lorsque le chargement est terminé. Omettre ou la valeur `no` (par défaut) pour que le navigateur ouvrir et charger normalement.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 et 8.1
-*   Windows Phone 7 et 8
-
-### Exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS Quirks
-
-Comme plugin n'est pas appliquer n'importe quelle conception il est nécessaire d'ajouter quelques règles CSS si ouvert avec `target= _blank`. Les règles pourraient ressembler à ces
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-L'objet retourné par un appel à `cordova.InAppBrowser.open`.
-
-### Méthodes
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> Ajoute un écouteur pour un évènement de la fenêtre `InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-*   **eventname** : l'évènement à écouter *(String)*
-    
-    *   **loadstart** : évènement déclenché lorsque le chargement d'une URL débute dans la fenêtre `InAppBrowser`.
-    *   **loadstop** : évènement déclenché lorsque la fenêtre `InAppBrowser` finit de charger une URL.
-    *   **loaderror** : évènement déclenché si la fenêtre `InAppBrowser` rencontre une erreur lors du chargement d'une URL.
-    *   **exit** : évènement déclenché lorsque la fenêtre `InAppBrowser` est fermée.
-
-*   **callback** : la fonction à exécuter lorsque l'évènement se déclenche. Un objet `InAppBrowserEvent` lui est transmis comme paramètre.
-
-### Propriétés de InAppBrowserEvent
-
-*   **type** : le nom de l'évènement, soit `loadstart`, `loadstop`, `loaderror` ou `exit`. *(String)*
-
-*   **url** : l'URL ayant été chargée. *(String)*
-
-*   **code** : le code d'erreur, seulement pour `loaderror`. *(Number)*
-
-*   **message** : un message d'erreur, seulement pour `loaderror`. *(String)*
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 et 8.1
-*   Windows Phone 7 et 8
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Supprime un écouteur pour un évènement de la fenêtre `InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ref** : référence à la fenêtre `InAppBrowser`. *(InAppBrowser)*
-
-*   **eventname** : l'évènement pour lequel arrêter l'écoute. *(String)*
-    
-    *   **loadstart**: événement déclenche quand le `InAppBrowser` commence à charger une URL.
-    *   **loadstop**: événement déclenche lorsque la `InAppBrowser` finit de charger une URL.
-    *   **loaderror** : évènement déclenché si la fenêtre `InAppBrowser` rencontre une erreur lors du chargement d'une URL.
-    *   **sortie**: événement déclenche quand le `InAppBrowser` fenêtre est fermée.
-
-*   **callback** : la fonction à exécuter lorsque l'évènement se déclenche. Un objet `InAppBrowserEvent` lui est transmis comme paramètre.
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 et 8.1
-*   Windows Phone 7 et 8
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Ferme la fenêtre `InAppBrowser`.
-
-    ref.close();
-    
-
-*   **Réf**: référence à la `InAppBrowser` fenêtre *(InAppBrowser)*
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 et 8.1
-*   Windows Phone 7 et 8
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Affiche une fenêtre InAppBrowser qui a été ouverte cachée. Appeler cette méthode n'a aucun effet si la fenêtre en question est déjà visible.
-
-    ref.show();
-    
-
-*   **Réf**: référence à la fenêtre () InAppBrowser`InAppBrowser`)
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 et 8.1
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Injecte du code JavaScript dans la fenêtre `InAppBrowser`
-
-    ref.executeScript(details, callback);
-    
-
-*   **Réf**: référence à la `InAppBrowser` fenêtre. *(InAppBrowser)*
-
-*   **injectDetails** : détails du script à exécuter, requérant une propriété `file` ou `code`. *(Object)*
-    
-    *   **file** : URL du script à injecter.
-    *   **code** : texte du script à injecter.
-
-*   **callback** : une fonction exécutée après l'injection du code JavaScript.
-    
-    *   Si le script injecté est de type `code`, un seul paramètre est transmis à la fonction callback, correspondant à la valeur de retour du script enveloppée dans un `Array`. Pour les scripts multilignes, il s'agit de la valeur renvoyée par la dernière instruction ou la dernière expression évaluée.
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 et 8.1
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Injecte des règles CSS dans la fenêtre `InAppBrowser`.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **Réf**: référence à la `InAppBrowser` fenêtre *(InAppBrowser)*
-
-*   **injectDetails**: Détails du script à exécuter, spécifiant soit un `file` ou `code` clés. *(Objet)*
-    
-    *   **file** : URL de la feuille de style à injecter.
-    *   **code** : contenu de la feuille de style à injecter.
-
-*   **callback** : une fonction exécutée après l'injection du fichier CSS.
-
-### Plates-formes prises en charge
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-
-### Petit exemple
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/it/README.md b/doc/it/README.md
deleted file mode 100644
index 4e06888..0000000
--- a/doc/it/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-Questo plugin fornisce una vista di browser web che viene visualizzato quando si chiama `di cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Il `cordova.InAppBrowser.open()` funzione è definita per essere un rimpiazzo per la funzione `window.open`. Esistenti chiamate `Window` possono utilizzare la finestra di InAppBrowser, sostituendo window.open():
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La finestra di InAppBrowser si comporta come un browser web standard e non può accedere a Cordova APIs. Per questo motivo, è consigliabile la InAppBrowser se è necessario caricare il contenuto (non attendibile) di terze parti, invece di caricamento che in webview Cordova principale. Il InAppBrowser non è soggetto alla whitelist, né sta aprendo il link nel browser di sistema.
-
-La InAppBrowser fornisce di default propri controlli GUI per l'utente (indietro, avanti, fatto).
-
-Per indietro la compatibilità, questo plugin ganci anche `window.open`. Tuttavia, il plugin installato gancio di `window.open` può avere effetti collaterali indesiderati (soprattutto se questo plugin è incluso solo come dipendenza di un altro plugin). Il gancio di `window. open` verrà rimosso in una futura release principale. Fino a quando il gancio è rimosso dal plugin, apps può ripristinare manualmente il comportamento predefinito:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Sebbene `window.open` sia in ambito globale, InAppBrowser non è disponibile fino a dopo l'evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installazione
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Se si desidera che tutti i carichi di pagina nell'app di passare attraverso il InAppBrowser, si può semplicemente collegare `window.open` durante l'inizializzazione. Per esempio:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Apre un URL in una nuova istanza di `InAppBrowser`, l'istanza corrente del browser o il browser di sistema.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-  * **url**: l'URL da caricare *(String)*. Chiamare `encodeURI()` su questo, se l'URL contiene caratteri Unicode.
-
-  * **target**: la destinazione in cui caricare l'URL, un parametro facoltativo che il valore predefinito è `_self` . *(String)*
-    
-      * `_self`: Si apre in Cordova WebView se l'URL è nella lista bianca, altrimenti si apre nella`InAppBrowser`.
-      * `_blank`: Apre il`InAppBrowser`.
-      * `_system`: Si apre nel browser web del sistema.
-
-  * **options**: opzioni per il `InAppBrowser` . Opzionale, inadempiente a: `location=yes` . *(String)*
-    
-    Il `options` stringa non deve contenere alcun spazio vuoto, e coppie nome/valore ogni funzionalità devono essere separate da una virgola. Caratteristica nomi sono tra maiuscole e minuscole. Tutte le piattaforme supportano il valore riportato di seguito:
-    
-      * **posizione**: impostata su `yes` o `no` per trasformare il `InAppBrowser` di barra di posizione on o off.
-    
-    Solo su Android:
-    
-      * **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-      * **ClearCache**: impostare su `yes` per avere il browser cache cookie ha lasciata prima dell'apertura della nuova finestra
-      * **clearsessioncache**: impostare su `yes` per avere la cache cookie di sessione cancellata prima dell'apertura della nuova finestra
-      * **zoom**: impostare su `yes` per mostrare i controlli di zoom del browser Android, impostata su `no` per nasconderli. Valore predefinito è `yes`.
-      * **hardwareback**: impostare `yes` per utilizzare il pulsante Indietro hardware per spostarsi all'indietro tra il `InAppBrowser`di storia. Se esiste una pagina precedente, si chiuderà il `InAppBrowser` . Il valore predefinito è `yes`, quindi è necessario impostare a `no` , se si desidera che il pulsante indietro per chiudere semplicemente il InAppBrowser.
-    
-    solo iOS:
-    
-      * **closebuttoncaption**: impostare una stringa da utilizzare come didascalia del pulsante **fatto** . Si noti che è necessario localizzare questo valore a te stesso.
-      * **disallowoverscroll**: impostare su `yes` o `no` (default è `no` ). Attiva/disattiva la proprietà UIWebViewBounce.
-      * **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-      * **ClearCache**: impostare su `yes` per avere il browser cache cookie ha lasciata prima dell'apertura della nuova finestra
-      * **clearsessioncache**: impostare su `yes` per avere la cache cookie di sessione cancellata prima dell'apertura della nuova finestra
-      * **Toolbar**: impostare su `yes` o `no` per attivare la barra degli strumenti o disattivare per il InAppBrowser (default`yes`)
-      * **enableViewportScale**: impostare su `yes` o `no` per impedire la viewport ridimensionamento tramite un tag meta (default`no`).
-      * **mediaPlaybackRequiresUserAction**: impostare su `yes` o `no` per impedire HTML5 audio o video da AutoPlay (default`no`).
-      * **allowInlineMediaPlayback**: impostare su `yes` o `no` per consentire la riproduzione dei supporti HTML5 in linea, visualizzare all'interno della finestra del browser, piuttosto che un'interfaccia specifica del dispositivo di riproduzione. L'HTML `video` elemento deve includere anche il `webkit-playsinline` (default di attributo`no`)
-      * **keyboardDisplayRequiresUserAction**: impostare su `yes` o `no` per aprire la tastiera quando elementi form ricevano lo stato attivo tramite di JavaScript `focus()` chiamata (default`yes`).
-      * **suppressesIncrementalRendering**: impostare su `yes` o `no` aspettare fino a quando tutti i nuovi contenuti di vista viene ricevuto prima il rendering (default`no`).
-      * **presentationstyle**: impostare su `pagesheet` , `formsheet` o `fullscreen` per impostare lo [stile di presentazione](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (default`fullscreen`).
-      * **transitionstyle**: impostare su `fliphorizontal` , `crossdissolve` o `coververtical` per impostare lo [stile di transizione](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (default`coververtical`).
-      * **toolbarposition**: impostare su `top` o `bottom` (default è `bottom` ). Provoca la barra degli strumenti sia nella parte superiore o inferiore della finestra.
-    
-    Solo per Windows:
-    
-      * **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-      * **fullscreen**: impostata su `yes` per creare il controllo browser senza un bordo attorno ad esso. Siete pregati di notare che se **location=no** viene specificato, non ci sarà nessun controllo presentato all'utente per chiudere la finestra IAB.
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * BlackBerry 10
-  * Firefox OS
-  * iOS
-  * Windows 8 e 8.1
-  * Windows Phone 7 e 8
-  * Browser
-
-### Esempio
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS stranezze
-
-Come plugin non imporre alcun disegno c'è bisogno di aggiungere alcune regole CSS se aperto con `target='_blank'`. Le regole potrebbero apparire come questi
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Stranezze di Windows
-
-Simile al comportamento visivo finestra di Firefox OS IAB può essere sottoposto a override tramite `inAppBrowserWrap`/ classi CSS`inAppBrowserWrapFullscreen`
-
-### Stranezze browser
-
-  * Plugin viene implementato tramite iframe,
-
-  * Cronologia di navigazione (pulsanti`indietro` e `Avanti` in LocationBar) non è implementato.
-
-## InAppBrowser
-
-L'oggetto restituito da una chiamata a `di cordova.InAppBrowser.open`.
-
-### Metodi
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> Aggiunge un listener per un evento dal`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-  * **EventName**: l'evento per l'ascolto *(String)*
-    
-      * **loadstart**: evento viene generato quando il `InAppBrowser` comincia a caricare un URL.
-      * **loadstop**: evento viene generato quando il `InAppBrowser` termina il caricamento di un URL.
-      * **LoadError**: evento viene generato quando il `InAppBrowser` rileva un errore durante il caricamento di un URL.
-      * **uscita**: evento viene generato quando il `InAppBrowser` finestra è chiusa.
-
-  * **richiamata**: la funzione che viene eseguito quando viene generato l'evento. La funzione viene passata un `InAppBrowserEvent` oggetto come parametro.
-
-### Proprietà InAppBrowserEvent
-
-  * **tipo**: il eventname, o `loadstart` , `loadstop` , `loaderror` , o `exit` . *(String)*
-
-  * **URL**: l'URL che è stato caricato. *(String)*
-
-  * **codice**: il codice di errore, solo nel caso di `loaderror` . *(Numero)*
-
-  * **messaggio**: il messaggio di errore, solo nel caso di `loaderror` . *(String)*
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * iOS
-  * Windows 8 e 8.1
-  * Windows Phone 7 e 8
-  * Browser
-
-### Stranezze browser
-
-eventi `onloadstart` e `loaderror` non sono stati licenziati.
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Rimuove un listener per un evento dal`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **Rif**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-  * **EventName**: interrompere l'attesa per l'evento. *(String)*
-    
-      * **loadstart**: evento viene generato quando il `InAppBrowser` comincia a caricare un URL.
-      * **loadstop**: evento viene generato quando il `InAppBrowser` termina il caricamento di un URL.
-      * **LoadError**: evento viene generato quando il `InAppBrowser` rileva un errore di caricamento di un URL.
-      * **uscita**: evento viene generato quando il `InAppBrowser` finestra è chiusa.
-
-  * **richiamata**: la funzione da eseguire quando viene generato l'evento. La funzione viene passata un `InAppBrowserEvent` oggetto.
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * iOS
-  * Windows 8 e 8.1
-  * Windows Phone 7 e 8
-  * Browser
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Chiude la `InAppBrowser` finestra.
-
-    ref.close();
-    
-
-  * **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * Firefox OS
-  * iOS
-  * Windows 8 e 8.1
-  * Windows Phone 7 e 8
-  * Browser
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Visualizza una finestra di InAppBrowser che è stato aperto nascosta. Questa chiamata non ha effetto se la InAppBrowser era già visibile.
-
-    ref.show();
-    
-
-  * **Rif**: riferimento per il InAppBrowser finestra (`InAppBrowser`)
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * iOS
-  * Windows 8 e 8.1
-  * Browser
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Inserisce il codice JavaScript nella `InAppBrowser` finestra
-
-    ref.executeScript(details, callback);
-    
-
-  * **Rif**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-  * **injectDetails**: dettagli dello script da eseguire, specificando un `file` o `code` chiave. *(Oggetto)*
-    
-      * **file**: URL dello script da iniettare.
-      * **codice**: testo dello script da iniettare.
-
-  * **richiamata**: la funzione che viene eseguito dopo che il codice JavaScript viene iniettato.
-    
-      * Se lo script iniettato è di tipo `code` , il callback viene eseguita con un singolo parametro, che è il valore restituito del copione, avvolto in un `Array` . Per gli script multi-linea, questo è il valore restituito dell'ultima istruzione, o l'ultima espressione valutata.
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * iOS
-  * Windows 8 e 8.1
-  * Browser
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### Stranezze browser
-
-  * è supportato solo il **code** chiave.
-
-### Stranezze di Windows
-
-A causa di [documenti MSDN](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) lo script richiamato può restituire solo i valori di stringa, altrimenti il parametro, passato al **callback** sarà `[null]`.
-
-## insertCSS
-
-> Inietta CSS nella `InAppBrowser` finestra.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-  * **injectDetails**: dettagli dello script da eseguire, specificando un `file` o `code` chiave. *(Oggetto)*
-    
-      * **file**: URL del foglio di stile per iniettare.
-      * **codice**: testo del foglio di stile per iniettare.
-
-  * **richiamata**: la funzione che viene eseguito dopo che il CSS viene iniettato.
-
-### Piattaforme supportate
-
-  * Amazon fuoco OS
-  * Android
-  * iOS
-  * Windows
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/it/index.md b/doc/it/index.md
deleted file mode 100644
index 7365462..0000000
--- a/doc/it/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-Questo plugin fornisce una vista di browser web che viene visualizzato quando si chiama `di cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-Il `cordova.InAppBrowser.open()` funzione è definita per essere un rimpiazzo per la funzione `window.open`. Esistenti chiamate `Window` possono utilizzare la finestra di InAppBrowser, sostituendo window.open():
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-La finestra di InAppBrowser si comporta come un browser web standard e non può accedere a Cordova APIs. Per questo motivo, è consigliabile la InAppBrowser se è necessario caricare il contenuto (non attendibile) di terze parti, invece di caricamento che in webview Cordova principale. Il InAppBrowser non è soggetto alla whitelist, né sta aprendo il link nel browser di sistema.
-
-La InAppBrowser fornisce di default propri controlli GUI per l'utente (indietro, avanti, fatto).
-
-Per indietro la compatibilità, questo plugin ganci anche `window.open`. Tuttavia, il plugin installato gancio di `window.open` può avere effetti collaterali indesiderati (soprattutto se questo plugin è incluso solo come dipendenza di un altro plugin). Il gancio di `window. open` verrà rimosso in una futura release principale. Fino a quando il gancio è rimosso dal plugin, apps può ripristinare manualmente il comportamento predefinito:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Sebbene `window.open` sia in ambito globale, InAppBrowser non è disponibile fino a dopo l'evento `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Installazione
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Se si desidera che tutti i carichi di pagina nell'app di passare attraverso il InAppBrowser, si può semplicemente collegare `window.open` durante l'inizializzazione. Per esempio:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Apre un URL in una nuova istanza di `InAppBrowser`, l'istanza corrente del browser o il browser di sistema.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-*   **url**: l'URL da caricare *(String)*. Chiamare `encodeURI()` su questo, se l'URL contiene caratteri Unicode.
-
-*   **target**: la destinazione in cui caricare l'URL, un parametro facoltativo che il valore predefinito è `_self` . *(String)*
-    
-    *   `_self`: Si apre in Cordova WebView se l'URL è nella lista bianca, altrimenti si apre nella`InAppBrowser`.
-    *   `_blank`: Apre il`InAppBrowser`.
-    *   `_system`: Si apre nel browser web del sistema.
-
-*   **options**: opzioni per il `InAppBrowser` . Opzionale, inadempiente a: `location=yes` . *(String)*
-    
-    Il `options` stringa non deve contenere alcun spazio vuoto, e coppie nome/valore ogni funzionalità devono essere separate da una virgola. Caratteristica nomi sono tra maiuscole e minuscole. Tutte le piattaforme supportano il valore riportato di seguito:
-    
-    *   **posizione**: impostata su `yes` o `no` per trasformare il `InAppBrowser` di barra di posizione on o off.
-    
-    Solo su Android:
-    
-    *   **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-    *   **ClearCache**: impostare su `yes` per avere il browser cache cookie ha lasciata prima dell'apertura della nuova finestra
-    *   **clearsessioncache**: impostare su `yes` per avere la cache cookie di sessione cancellata prima dell'apertura della nuova finestra
-    
-    solo iOS:
-    
-    *   **closebuttoncaption**: impostare una stringa da utilizzare come didascalia del pulsante **fatto** . Si noti che è necessario localizzare questo valore a te stesso.
-    *   **disallowoverscroll**: impostare su `yes` o `no` (default è `no` ). Attiva/disattiva la proprietà UIWebViewBounce.
-    *   **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-    *   **ClearCache**: impostare su `yes` per avere il browser cache cookie ha lasciata prima dell'apertura della nuova finestra
-    *   **clearsessioncache**: impostare su `yes` per avere la cache cookie di sessione cancellata prima dell'apertura della nuova finestra
-    *   **Toolbar**: impostare su `yes` o `no` per attivare la barra degli strumenti o disattivare per il InAppBrowser (default`yes`)
-    *   **enableViewportScale**: impostare su `yes` o `no` per impedire la viewport ridimensionamento tramite un tag meta (default`no`).
-    *   **mediaPlaybackRequiresUserAction**: impostare su `yes` o `no` per impedire HTML5 audio o video da AutoPlay (default`no`).
-    *   **allowInlineMediaPlayback**: impostare su `yes` o `no` per consentire la riproduzione dei supporti HTML5 in linea, visualizzare all'interno della finestra del browser, piuttosto che un'interfaccia specifica del dispositivo di riproduzione. L'HTML `video` elemento deve includere anche il `webkit-playsinline` (default di attributo`no`)
-    *   **keyboardDisplayRequiresUserAction**: impostare su `yes` o `no` per aprire la tastiera quando elementi form ricevano lo stato attivo tramite di JavaScript `focus()` chiamata (default`yes`).
-    *   **suppressesIncrementalRendering**: impostare su `yes` o `no` aspettare fino a quando tutti i nuovi contenuti di vista viene ricevuto prima il rendering (default`no`).
-    *   **presentationstyle**: impostare su `pagesheet` , `formsheet` o `fullscreen` per impostare lo [stile di presentazione][1] (default`fullscreen`).
-    *   **transitionstyle**: impostare su `fliphorizontal` , `crossdissolve` o `coververtical` per impostare lo [stile di transizione][2] (default`coververtical`).
-    *   **toolbarposition**: impostare su `top` o `bottom` (default è `bottom` ). Provoca la barra degli strumenti sia nella parte superiore o inferiore della finestra.
-    
-    Solo per Windows:
-    
-    *   **nascosti**: impostare su `yes` per creare il browser e caricare la pagina, ma non mostrarlo. L'evento loadstop viene generato quando il caricamento è completato. Omettere o impostata su `no` (impostazione predefinita) per avere il browser aperto e caricare normalmente.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 e 8.1
-*   Windows Phone 7 e 8
-
-### Esempio
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS stranezze
-
-Come plugin non imporre alcun disegno c'è bisogno di aggiungere alcune regole CSS se aperto con `target='_blank'`. Le regole potrebbero apparire come questi
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-L'oggetto restituito da una chiamata a `di cordova.InAppBrowser.open`.
-
-### Metodi
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> Aggiunge un listener per un evento dal`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-*   **EventName**: l'evento per l'ascolto *(String)*
-    
-    *   **loadstart**: evento viene generato quando il `InAppBrowser` comincia a caricare un URL.
-    *   **loadstop**: evento viene generato quando il `InAppBrowser` termina il caricamento di un URL.
-    *   **LoadError**: evento viene generato quando il `InAppBrowser` rileva un errore durante il caricamento di un URL.
-    *   **uscita**: evento viene generato quando il `InAppBrowser` finestra è chiusa.
-
-*   **richiamata**: la funzione che viene eseguito quando viene generato l'evento. La funzione viene passata un `InAppBrowserEvent` oggetto come parametro.
-
-### Proprietà InAppBrowserEvent
-
-*   **tipo**: il eventname, o `loadstart` , `loadstop` , `loaderror` , o `exit` . *(String)*
-
-*   **URL**: l'URL che è stato caricato. *(String)*
-
-*   **codice**: il codice di errore, solo nel caso di `loaderror` . *(Numero)*
-
-*   **messaggio**: il messaggio di errore, solo nel caso di `loaderror` . *(String)*
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   iOS
-*   Windows 8 e 8.1
-*   Windows Phone 7 e 8
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Rimuove un listener per un evento dal`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **Rif**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-*   **EventName**: interrompere l'attesa per l'evento. *(String)*
-    
-    *   **loadstart**: evento viene generato quando il `InAppBrowser` comincia a caricare un URL.
-    *   **loadstop**: evento viene generato quando il `InAppBrowser` termina il caricamento di un URL.
-    *   **LoadError**: evento viene generato quando il `InAppBrowser` rileva un errore di caricamento di un URL.
-    *   **uscita**: evento viene generato quando il `InAppBrowser` finestra è chiusa.
-
-*   **richiamata**: la funzione da eseguire quando viene generato l'evento. La funzione viene passata un `InAppBrowserEvent` oggetto.
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   iOS
-*   Windows 8 e 8.1
-*   Windows Phone 7 e 8
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Chiude la `InAppBrowser` finestra.
-
-    ref.close();
-    
-
-*   **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 e 8.1
-*   Windows Phone 7 e 8
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Visualizza una finestra di InAppBrowser che è stato aperto nascosta. Questa chiamata non ha effetto se la InAppBrowser era già visibile.
-
-    ref.show();
-    
-
-*   **Rif**: riferimento per il InAppBrowser finestra (`InAppBrowser`)
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   iOS
-*   Windows 8 e 8.1
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Inserisce il codice JavaScript nella `InAppBrowser` finestra
-
-    ref.executeScript(details, callback);
-    
-
-*   **Rif**: fare riferimento alla `InAppBrowser` finestra. *(InAppBrowser)*
-
-*   **injectDetails**: dettagli dello script da eseguire, specificando un `file` o `code` chiave. *(Oggetto)*
-    
-    *   **file**: URL dello script da iniettare.
-    *   **codice**: testo dello script da iniettare.
-
-*   **richiamata**: la funzione che viene eseguito dopo che il codice JavaScript viene iniettato.
-    
-    *   Se lo script iniettato è di tipo `code` , il callback viene eseguita con un singolo parametro, che è il valore restituito del copione, avvolto in un `Array` . Per gli script multi-linea, questo è il valore restituito dell'ultima istruzione, o l'ultima espressione valutata.
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   iOS
-*   Windows 8 e 8.1
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Inietta CSS nella `InAppBrowser` finestra.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **Rif**: fare riferimento alla `InAppBrowser` finestra *(InAppBrowser)*
-
-*   **injectDetails**: dettagli dello script da eseguire, specificando un `file` o `code` chiave. *(Oggetto)*
-    
-    *   **file**: URL del foglio di stile per iniettare.
-    *   **codice**: testo del foglio di stile per iniettare.
-
-*   **richiamata**: la funzione che viene eseguito dopo che il CSS viene iniettato.
-
-### Piattaforme supportate
-
-*   Amazon fuoco OS
-*   Android
-*   iOS
-
-### Esempio rapido
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/ja/README.md b/doc/ja/README.md
deleted file mode 100644
index 40f631b..0000000
--- a/doc/ja/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-このプラグインは `コルドバを呼び出すときに表示される web ブラウザーのビューを提供します。InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`コルドバ。InAppBrowser.open()` `window.open()` 関数との交換を定義する関数。 既存の `window.open()` 呼び出しは、window.open を置き換えることによって InAppBrowser ウィンドウを使用できます。
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser ウィンドウは標準的な web ブラウザーのように動作し、コルドバ Api にアクセスできません。 この理由から、InAppBrowser お勧めする場合はメインのコルドバの webview を読み込むのではなくサード パーティ (信頼されていない) コンテンツをロードする必要があります。 InAppBrowser、ホワイト リストの対象ではないも、システムのブラウザーでリンクを開くです。
-
-InAppBrowser を提供しますデフォルトで GUI コントロール (戻る、進む、行う)。
-
-後方互換性、このプラグインは、また `window.open` をフックのため。 ただし、`window.open` のプラグイン インストール フックを持つことができます意図しない副作用 （特に場合は、このプラグインは別のプラグインの依存関係としてのみ含まれています)。 `window.open` のフックは、将来のメジャー リリースで削除されます。 プラグインから、フックが削除されるまでアプリはデフォルトの動作を手動で復元できます。
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` はグローバル スコープでは、InAppBrowser は、`deviceready` イベントの後まで利用できません。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## インストール
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-InAppBrowser を通過するアプリですべてのページの読み込みをする場合は初期化中に `window.open` を単にフックできます。たとえば。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-新しい `InAppBrowser` インスタンスを現在のブラウザー インスタンスまたはシステムのブラウザーで URL を開きます。
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-  * **url**: *(文字列)*をロードする URL。電話 `encodeURI()` 場合は、この上の URL は Unicode 文字を含みます。
-
-  * **ターゲット**: ターゲット URL は、既定値は、省略可能なパラメーターをロードするを `_self` 。*(文字列)*
-    
-      * `_self`: コルドバ WebView URL がホワイト リストにある場合で開きます、それ以外の場合で開きます、`InAppBrowser`.
-      * `_blank`: で開きます、`InAppBrowser`.
-      * `_system`: システムの web ブラウザーで開きます。
-
-  * **オプション**: おぷしょん、 `InAppBrowser` 。省略可能にする: `location=yes` 。*(文字列)*
-    
-    `options`文字列にはする必要があります任意の空白スペースが含まれていないと、各機能の名前と値のペアをコンマで区切る必要があります。 機能名では大文字小文字を区別します。 以下の値をサポートするプラットフォーム。
-    
-      * **場所**： に設定 `yes` または `no` を有効にする、 `InAppBrowser` の場所バー オンまたはオフにします。
-    
-    アンドロイドのみ：
-    
-      * **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-      * **clearcache**: に設定されている `yes` 、ブラウザーのクッキー キャッシュ クリア新しいウィンドウが開く前に
-      * **clearsessioncache**： に設定されている `yes` はセッション cookie のキャッシュをオフにすると、新しいウィンドウが開く前に
-      * **zoom**:`yes`Android ブラウザーのズーム コントロールの表示を`no`に設定すると、それらを非表示に設定します。 既定値は`yes`.
-      * **hardwareback**: `InAppBrowser`の履歴を後方に移動するのにハードウェアの戻るボタンを使用して`yes`に設定します。 前のページがない場合は、 `InAppBrowser`が終了します。 既定値は`はい`、ため場合は、単に、InAppBrowser を閉じる戻るボタン`なし`を設定する必要があります。
-    
-    iOS のみ:
-    
-      * **closebuttoncaption**: [**完了**] ボタンのキャプションとして使用する文字列に設定します。自分でこの値をローカライズする必要があることに注意してください。
-      * **disallowoverscroll**： に設定されている `yes` または `no` (既定値は `no` )。/UIWebViewBounce プロパティをオフにします。
-      * **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-      * **clearcache**: に設定されている `yes` 、ブラウザーのクッキー キャッシュ クリア新しいウィンドウが開く前に
-      * **clearsessioncache**： に設定されている `yes` はセッション cookie のキャッシュをオフにすると、新しいウィンドウが開く前に
-      * **ツールバー**: に設定されている `yes` または `no` InAppBrowser (デフォルトのツールバーのオンまたはオフを有効にするには`yes`)
-      * **enableViewportScale**： に設定されている `yes` または `no` を (デフォルトではメタタグを介してスケーリング ビューポートを防ぐために`no`).
-      * **mediaPlaybackRequiresUserAction**： に設定されている `yes` または `no` を HTML5 オーディオまたはビデオを自動再生 （初期設定から防ぐために`no`).
-      * **allowInlineMediaPlayback**： に設定されている `yes` または `no` ラインで HTML5 メディア再生には、デバイス固有再生インターフェイスではなく、ブラウザー ウィンドウ内に表示するようにします。 HTML の `video` 要素を含める必要がありますまた、 `webkit-playsinline` 属性 (デフォルトは`no`)
-      * **keyboardDisplayRequiresUserAction**： に設定されている `yes` または `no` をフォーム要素の JavaScript を介してフォーカスを受け取るときに、キーボードを開く `focus()` コール （デフォルトは`yes`).
-      * **suppressesIncrementalRendering**： に設定されている `yes` または `no` (デフォルトでは表示される前にビューのすべての新しいコンテンツを受信するまで待機するには`no`).
-      * **presentationstyle**： に設定されている `pagesheet` 、 `formsheet` または `fullscreen` (デフォルトでは、[プレゼンテーション スタイル](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle)を設定するには`fullscreen`).
-      * **transitionstyle**： に設定されている `fliphorizontal` 、 `crossdissolve` または `coververtical` (デフォルトでは、[トランジションのスタイル](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle)を設定するには`coververtical`).
-      * **toolbarposition**： に設定されている `top` または `bottom` (既定値は `bottom` )。上部またはウィンドウの下部にツールバーが発生します。
-    
-    Windows のみ：
-    
-      * **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-      * **fullscreen**: 周りに境界線なしブラウザー コントロールを作成する`[yes]`に設定します。 その場合に注意してください**location=no**指定また、IAB ウィンドウを閉じるためにユーザーに提示はコントロールされます。
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * ブラックベリー 10
-  * Firefox の OS
-  * iOS
-  * Windows 8 および 8.1
-  * Windows Phone 7 と 8
-  * ブラウザー
-
-### 例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS 癖
-
-開かれた場合にいくつかの CSS ルールを追加する必要があるプラグインは任意のデザインを適用しないと `target ='_blank'`。これらのような規則になります。
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Windows の癖
-
-`InAppBrowserWrap`経由で Firefox OS IAB ウィンドウの視覚的動作に似ていますをオーバーライドできます/`inAppBrowserWrapFullscreen` CSS クラス
-
-### ブラウザーの癖
-
-  * Iframe を介してプラグインを実装します。
-
-  * ナビゲーション履歴 (LocationBar の`進む`と`戻る`ボタン) は実装されていません。
-
-## InAppBrowser
-
-`コルドバへの呼び出しから返されるオブジェクト。InAppBrowser.open`.
-
-### メソッド
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> イベントのリスナーを追加します、`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-  * **eventname**: *(文字列)*をリッスンするイベント
-    
-      * ****： イベントが発生するとき、 `InAppBrowser` の URL の読み込みが開始します。
-      * **loadstop**： イベントが発生するとき、 `InAppBrowser` URL の読み込みが完了します。
-      * **loaderror**： イベントが発生するとき、 `InAppBrowser` URL の読み込みでエラーが発生します。
-      * **終了**: イベントが発生するとき、 `InAppBrowser` ウィンドウが閉じられます。
-
-  * **コールバック**: イベントが発生したときに実行される関数。関数に渡されますが、 `InAppBrowserEvent` オブジェクトをパラメーターとして。
-
-### InAppBrowserEvent プロパティ
-
-  * **タイプ**: eventname どちらか `loadstart` 、 `loadstop` 、 `loaderror` 、または `exit` 。*(文字列)*
-
-  * **url**: URL が読み込まれました。*(文字列)*
-
-  * **コード**: の場合にのみ、エラー コード `loaderror` 。*(数)*
-
-  * **メッセージ**: の場合にのみ、エラー メッセージ `loaderror` 。*(文字列)*
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * iOS
-  * Windows 8 および 8.1
-  * Windows Phone 7 と 8
-  * ブラウザー
-
-### ブラウザーの癖
-
-`loadstart` `loaderror`イベントが発生していません。
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> イベントのリスナーを削除します、`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-  * **eventname**: イベントのリッスンを停止します。*(文字列)*
-    
-      * ****： イベントが発生するとき、 `InAppBrowser` の URL の読み込みが開始します。
-      * **loadstop**： イベントが発生するとき、 `InAppBrowser` URL の読み込みが完了します。
-      * **loaderror**： イベントが発生するとき、 `InAppBrowser` URL の読み込みエラーが発生します。
-      * **終了**: イベントが発生するとき、 `InAppBrowser` ウィンドウが閉じられます。
-
-  * **コールバック**: イベントが発生するときに実行する関数。関数に渡されますが、 `InAppBrowserEvent` オブジェクト。
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * iOS
-  * Windows 8 および 8.1
-  * Windows Phone 7 と 8
-  * ブラウザー
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 閉じる、 `InAppBrowser` ウィンドウ。
-
-    ref.close();
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * Firefox の OS
-  * iOS
-  * Windows 8 および 8.1
-  * Windows Phone 7 と 8
-  * ブラウザー
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 隠された開かれた InAppBrowser ウィンドウが表示されます。この関数を呼び出すは影響しません、InAppBrowser が既に表示されている場合。
-
-    ref.show();
-    
-
-  * **ref**: InAppBrowser ウィンドウ (への参照`InAppBrowser`)
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * iOS
-  * Windows 8 および 8.1
-  * ブラウザー
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> JavaScript コードに挿入します、 `InAppBrowser` ウィンドウ
-
-    ref.executeScript(details, callback);
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-  * **injectDetails**： 詳細を実行するスクリプトのいずれかを指定する、 `file` または `code` キー。*(オブジェクト)*
-    
-      * **ファイル**： スクリプトの URL を注入します。
-      * **コード**: スクリプトのテキストを挿入します。
-
-  * **コールバック**: JavaScript コードを注入した後に実行される関数。
-    
-      * 挿入されたスクリプトが型の場合 `code` 、スクリプトの戻り値は、1 つのパラメーターでコールバックを実行するのに包まれて、 `Array` 。 マルチライン スクリプトについては、最後のステートメントでは、または評価した最後の式の戻り値です。
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * iOS
-  * Windows 8 および 8.1
-  * ブラウザー
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### ブラウザーの癖
-
-  * **code**キーのみをサポートします。
-
-### Windows の癖
-
-[MSDN ドキュメント](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx)のため呼び出されたスクリプト パラメーターを返す文字列値のみそれ以外の場合は、**コールバック**に渡される`[null]`になります.
-
-## insertCSS
-
-> CSS に注入する、 `InAppBrowser` ウィンドウ。
-
-    ref.insertCSS(details, callback);
-    
-
-  * **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-  * **injectDetails**： 詳細を実行するスクリプトのいずれかを指定する、 `file` または `code` キー。*(オブジェクト)*
-    
-      * **ファイル**: 注入するスタイル シートの URL。
-      * **コード**: 注入するスタイル シートのテキスト。
-
-  * **コールバック**: CSS の注入後に実行される関数。
-
-### サポートされているプラットフォーム
-
-  * アマゾン火 OS
-  * アンドロイド
-  * iOS
-  * Windows
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/ja/index.md b/doc/ja/index.md
deleted file mode 100644
index a1b6854..0000000
--- a/doc/ja/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-このプラグインは `コルドバを呼び出すときに表示される web ブラウザーのビューを提供します。InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`コルドバ。InAppBrowser.open()` `window.open()` 関数との交換を定義する関数。 既存の `window.open()` 呼び出しは、window.open を置き換えることによって InAppBrowser ウィンドウを使用できます。
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser ウィンドウは標準的な web ブラウザーのように動作し、コルドバ Api にアクセスできません。 この理由から、InAppBrowser お勧めする場合はメインのコルドバの webview を読み込むのではなくサード パーティ (信頼されていない) コンテンツをロードする必要があります。 InAppBrowser、ホワイト リストの対象ではないも、システムのブラウザーでリンクを開くです。
-
-InAppBrowser を提供しますデフォルトで GUI コントロール (戻る、進む、行う)。
-
-後方互換性、このプラグインは、また `window.open` をフックのため。 ただし、`window.open` のプラグイン インストール フックを持つことができます意図しない副作用 （特に場合は、このプラグインは別のプラグインの依存関係としてのみ含まれています)。 `window.open` のフックは、将来のメジャー リリースで削除されます。 プラグインから、フックが削除されるまでアプリはデフォルトの動作を手動で復元できます。
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` はグローバル スコープでは、InAppBrowser は、`deviceready` イベントの後まで利用できません。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## インストール
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-InAppBrowser を通過するアプリですべてのページの読み込みをする場合は初期化中に `window.open` を単にフックできます。たとえば。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-新しい `InAppBrowser` インスタンスを現在のブラウザー インスタンスまたはシステムのブラウザーで URL を開きます。
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-*   **url**: *(文字列)*をロードする URL。電話 `encodeURI()` 場合は、この上の URL は Unicode 文字を含みます。
-
-*   **ターゲット**: ターゲット URL は、既定値は、省略可能なパラメーターをロードするを `_self` 。*(文字列)*
-    
-    *   `_self`: コルドバ WebView URL がホワイト リストにある場合で開きます、それ以外の場合で開きます、`InAppBrowser`.
-    *   `_blank`: で開きます、`InAppBrowser`.
-    *   `_system`: システムの web ブラウザーで開きます。
-
-*   **オプション**: おぷしょん、 `InAppBrowser` 。省略可能にする: `location=yes` 。*(文字列)*
-    
-    `options`文字列にはする必要があります任意の空白スペースが含まれていないと、各機能の名前と値のペアをコンマで区切る必要があります。 機能名では大文字小文字を区別します。 以下の値をサポートするプラットフォーム。
-    
-    *   **場所**： に設定 `yes` または `no` を有効にする、 `InAppBrowser` の場所バー オンまたはオフにします。
-    
-    アンドロイドのみ：
-    
-    *   **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-    *   **clearcache**: に設定されている `yes` 、ブラウザーのクッキー キャッシュ クリア新しいウィンドウが開く前に
-    *   **clearsessioncache**： に設定されている `yes` はセッション cookie のキャッシュをオフにすると、新しいウィンドウが開く前に
-    
-    iOS のみ:
-    
-    *   **closebuttoncaption**: [**完了**] ボタンのキャプションとして使用する文字列に設定します。自分でこの値をローカライズする必要があることに注意してください。
-    *   **disallowoverscroll**： に設定されている `yes` または `no` (既定値は `no` )。/UIWebViewBounce プロパティをオフにします。
-    *   **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-    *   **clearcache**: に設定されている `yes` 、ブラウザーのクッキー キャッシュ クリア新しいウィンドウが開く前に
-    *   **clearsessioncache**： に設定されている `yes` はセッション cookie のキャッシュをオフにすると、新しいウィンドウが開く前に
-    *   **ツールバー**: に設定されている `yes` または `no` InAppBrowser (デフォルトのツールバーのオンまたはオフを有効にするには`yes`)
-    *   **enableViewportScale**： に設定されている `yes` または `no` を (デフォルトではメタタグを介してスケーリング ビューポートを防ぐために`no`).
-    *   **mediaPlaybackRequiresUserAction**： に設定されている `yes` または `no` を HTML5 オーディオまたはビデオを自動再生 （初期設定から防ぐために`no`).
-    *   **allowInlineMediaPlayback**： に設定されている `yes` または `no` ラインで HTML5 メディア再生には、デバイス固有再生インターフェイスではなく、ブラウザー ウィンドウ内に表示するようにします。 HTML の `video` 要素を含める必要がありますまた、 `webkit-playsinline` 属性 (デフォルトは`no`)
-    *   **keyboardDisplayRequiresUserAction**： に設定されている `yes` または `no` をフォーム要素の JavaScript を介してフォーカスを受け取るときに、キーボードを開く `focus()` コール （デフォルトは`yes`).
-    *   **suppressesIncrementalRendering**： に設定されている `yes` または `no` (デフォルトでは表示される前にビューのすべての新しいコンテンツを受信するまで待機するには`no`).
-    *   **presentationstyle**： に設定されている `pagesheet` 、 `formsheet` または `fullscreen` (デフォルトでは、[プレゼンテーション スタイル][1]を設定するには`fullscreen`).
-    *   **transitionstyle**： に設定されている `fliphorizontal` 、 `crossdissolve` または `coververtical` (デフォルトでは、[トランジションのスタイル][2]を設定するには`coververtical`).
-    *   **toolbarposition**： に設定されている `top` または `bottom` (既定値は `bottom` )。上部またはウィンドウの下部にツールバーが発生します。
-    
-    Windows のみ：
-    
-    *   **非表示**: 設定 `yes` ブラウザーを作成して、ページの読み込みが表示されません。 Loadstop イベントは、読み込みが完了すると発生します。 省略するか設定 `no` (既定値) を開くし、通常読み込みブラウザーを持っています。
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   ブラックベリー 10
-*   Firefox の OS
-*   iOS
-*   Windows 8 および 8.1
-*   Windows Phone 7 と 8
-
-### 例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS 癖
-
-開かれた場合にいくつかの CSS ルールを追加する必要があるプラグインは任意のデザインを適用しないと `target ='_blank'`。これらのような規則になります。
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-`コルドバへの呼び出しから返されるオブジェクト。InAppBrowser.open`.
-
-### メソッド
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> イベントのリスナーを追加します、`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-*   **eventname**: *(文字列)*をリッスンするイベント
-    
-    *   ****： イベントが発生するとき、 `InAppBrowser` の URL の読み込みが開始します。
-    *   **loadstop**： イベントが発生するとき、 `InAppBrowser` URL の読み込みが完了します。
-    *   **loaderror**： イベントが発生するとき、 `InAppBrowser` URL の読み込みでエラーが発生します。
-    *   **終了**: イベントが発生するとき、 `InAppBrowser` ウィンドウが閉じられます。
-
-*   **コールバック**: イベントが発生したときに実行される関数。関数に渡されますが、 `InAppBrowserEvent` オブジェクトをパラメーターとして。
-
-### InAppBrowserEvent プロパティ
-
-*   **タイプ**: eventname どちらか `loadstart` 、 `loadstop` 、 `loaderror` 、または `exit` 。*(文字列)*
-
-*   **url**: URL が読み込まれました。*(文字列)*
-
-*   **コード**: の場合にのみ、エラー コード `loaderror` 。*(数)*
-
-*   **メッセージ**: の場合にのみ、エラー メッセージ `loaderror` 。*(文字列)*
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   iOS
-*   Windows 8 および 8.1
-*   Windows Phone 7 と 8
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> イベントのリスナーを削除します、`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-*   **eventname**: イベントのリッスンを停止します。*(文字列)*
-    
-    *   ****： イベントが発生するとき、 `InAppBrowser` の URL の読み込みが開始します。
-    *   **loadstop**： イベントが発生するとき、 `InAppBrowser` URL の読み込みが完了します。
-    *   **loaderror**： イベントが発生するとき、 `InAppBrowser` URL の読み込みエラーが発生します。
-    *   **終了**: イベントが発生するとき、 `InAppBrowser` ウィンドウが閉じられます。
-
-*   **コールバック**: イベントが発生するときに実行する関数。関数に渡されますが、 `InAppBrowserEvent` オブジェクト。
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   iOS
-*   Windows 8 および 8.1
-*   Windows Phone 7 と 8
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 閉じる、 `InAppBrowser` ウィンドウ。
-
-    ref.close();
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   Firefox の OS
-*   iOS
-*   Windows 8 および 8.1
-*   Windows Phone 7 と 8
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 隠された開かれた InAppBrowser ウィンドウが表示されます。この関数を呼び出すは影響しません、InAppBrowser が既に表示されている場合。
-
-    ref.show();
-    
-
-*   **ref**: InAppBrowser ウィンドウ (への参照`InAppBrowser`)
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   iOS
-*   Windows 8 および 8.1
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> JavaScript コードに挿入します、 `InAppBrowser` ウィンドウ
-
-    ref.executeScript(details, callback);
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ。*(InAppBrowser)*
-
-*   **injectDetails**： 詳細を実行するスクリプトのいずれかを指定する、 `file` または `code` キー。*(オブジェクト)*
-    
-    *   **ファイル**： スクリプトの URL を注入します。
-    *   **コード**: スクリプトのテキストを挿入します。
-
-*   **コールバック**: JavaScript コードを注入した後に実行される関数。
-    
-    *   挿入されたスクリプトが型の場合 `code` 、スクリプトの戻り値は、1 つのパラメーターでコールバックを実行するのに包まれて、 `Array` 。 マルチライン スクリプトについては、最後のステートメントでは、または評価した最後の式の戻り値です。
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   iOS
-*   Windows 8 および 8.1
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> CSS に注入する、 `InAppBrowser` ウィンドウ。
-
-    ref.insertCSS(details, callback);
-    
-
-*   **ref**: への参照を `InAppBrowser` ウィンドウ*(InAppBrowser)*
-
-*   **injectDetails**： 詳細を実行するスクリプトのいずれかを指定する、 `file` または `code` キー。*(オブジェクト)*
-    
-    *   **ファイル**: 注入するスタイル シートの URL。
-    *   **コード**: 注入するスタイル シートのテキスト。
-
-*   **コールバック**: CSS の注入後に実行される関数。
-
-### サポートされているプラットフォーム
-
-*   アマゾン火 OS
-*   アンドロイド
-*   iOS
-
-### 簡単な例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/ko/README.md b/doc/ko/README.md
deleted file mode 100644
index 13511ad..0000000
--- a/doc/ko/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-이 플러그인 `코르도바를 호출할 때 표시 하는 웹 브라우저 보기를 제공 합니다.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`코르도바입니다.InAppBrowser.open()` 함수 `window.open ()` 함수에 대 한 대체품 정의 됩니다. 기존의 `window.open ()` 호출 window.open을 대체 하 여 InAppBrowser 윈도우를 사용할 수 있습니다.
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser 창 표준 웹 브라우저 처럼 동작 및 코르도바 Api에 액세스할 수 없습니다. 이 이유는 InAppBrowser는 것이 좋습니다는 주요 코르도바 webview로 로드 하는 대신 제 3 자 (신뢰할 수 없는) 콘텐츠를 로드 해야 할 경우. InAppBrowser는 허용 될 수도 시스템 브라우저에서 링크를 여는.
-
-사용자에 대 한 자체 GUI 컨트롤에서 기본적으로 제공 된 InAppBrowser (뒤로, 앞으로, 완료).
-
-대 한 뒤 호환성,이 플러그인도 `window.open` 후크. 그러나, `window.open`의 플러그인 설치 후크를 가질 수 있습니다 의도 하지 않은 부작용 (특히 경우이 플러그인이 다른 플러그인 종속성 으로만 포함). `window.open` 후크 주요 릴리스에서 제거 됩니다. 후크 플러그인에서 제거 될 때까지 애플 리 케이 션 수 있습니다 수동으로 기본 동작을 복원 하 게 됩니다.
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` 전역 범위에 있지만 InAppBrowser 제공 되지 않습니다 때까지 `deviceready` 이벤트 후.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## 설치
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-InAppBrowser를 통해가 서 당신의 애플 리 케이 션에서 모든 페이지를 로드 하려는 경우 초기화 하는 동안 `window.open` 간단 하 게 연결할 수 있습니다. 예를 들어:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-새 `InAppBrowser` 인스턴스, 현재 브라우저 인스턴스 또는 시스템 브라우저에서 URL을 엽니다.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-  * **url**: *(문자열)를*로드 하는 URL. 전화 `encodeURI()` 이 경우에는 URL 유니코드 문자를 포함 합니다.
-
-  * **대상**: 대상 URL, 기본적으로 선택적 매개 변수를 로드 하는 `_self` . *(문자열)*
-    
-      * `_self`: URL 화이트 리스트에 있으면 코르도바 WebView에서 열리고, 그렇지 않으면 열에`InAppBrowser`.
-      * `_blank`: 준공에`InAppBrowser`.
-      * `_system`: 시스템의 웹 브라우저에서 엽니다.
-
-  * **옵션**: 옵션은 `InAppBrowser` . 선택적, 디폴트에: `location=yes` . *(문자열)*
-    
-    `options`문자열 텅 빈 어떤 스페이스 포함 해서는 안 그리고 쉼표 각 기능의 이름/값 쌍을 구분 합니다. 기능 이름은 대/소문자입니다. 모든 플랫폼 지원 아래 값:
-    
-      * **위치**: 설정 `yes` 또는 `no` 설정 하는 `InAppBrowser` 의 위치 표시줄 켜거나 끕니다.
-    
-    안 드 로이드만:
-    
-      * **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-      * **clearcache**: 설정 `yes` 브라우저를 쿠키 캐시 삭제 하기 전에 새 창이 열립니다
-      * **clearsessioncache**: 설정 `yes` 세션 쿠키 캐시를 삭제 하기 전에 새 창이 열립니다
-      * **zoom/축소**: `네` 안 드 로이드 브라우저의 확대/축소 컨트롤을 표시, 그들을 숨길 수 `없는` 로 설정으로 설정. 기본값은 `네`.
-      * **hardwareback**: 하드웨어 뒤로 버튼을 사용 하 여 `InAppBrowser`의 역사를 통해 뒤로 이동 하려면 `예` 로 설정. 이전 페이지 없음이 있는 경우에, `InAppBrowser` 닫힙니다. 기본 값 이므로 `yes`, 뒤로 버튼을 간단 하 게는 InAppBrowser를 하려면 `no` 로 설정 해야 합니다.
-    
-    iOS만:
-    
-      * **closebuttoncaption**: **수행** 하는 단추의 캡션으로 사용할 문자열을 설정 합니다. 참고 직접이 값을 지역화 해야 합니다.
-      * **disallowoverscroll**: 설정 `yes` 또는 `no` (기본값은 `no` ). 회전 온/오프 UIWebViewBounce 속성입니다.
-      * **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-      * **clearcache**: 설정 `yes` 브라우저를 쿠키 캐시 삭제 하기 전에 새 창이 열립니다
-      * **clearsessioncache**: 설정 `yes` 세션 쿠키 캐시를 삭제 하기 전에 새 창이 열립니다
-      * **도구 모음**: 설정 `yes` 또는 `no` InAppBrowser (기본값:에 대 한 도구 모음 온 / 오프를 돌기 위하여`yes`)
-      * **enableViewportScale**: 설정 `yes` 또는 `no` 뷰포트 메타 태그 (기본값:를 통해 확장을 방지 하기 위해`no`).
-      * **mediaPlaybackRequiresUserAction**: 설정 `yes` 또는 `no` HTML5 오디오 또는 비디오 자동 재생 (기본값에서에서 방지 하기 위해`no`).
-      * **allowInlineMediaPlayback**: 설정 `yes` 또는 `no` 인라인 HTML5 미디어 재생, 장치 전용 재생 인터페이스 보다는 브라우저 창 내에서 표시할 수 있도록 합니다. HTML의 `video` 요소가 포함 되어야 합니다는 `webkit-playsinline` 특성 (기본값:`no`)
-      * **keyboardDisplayRequiresUserAction**: 설정 `yes` 또는 `no` 양식 요소는 자바 스크립트를 통해 포커스를 받을 때 키보드를 열고 `focus()` 전화 (기본값:`yes`).
-      * **suppressesIncrementalRendering**: 설정 `yes` 또는 `no` (기본값을 렌더링 하기 전에 모든 새로운 보기 콘텐츠를 받을 때까지 기다려야`no`).
-      * **presentationstyle**: 설정 `pagesheet` , `formsheet` 또는 `fullscreen` [프레 젠 테이 션 스타일](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (기본값을 설정 하려면`fullscreen`).
-      * **transitionstyle**: 설정 `fliphorizontal` , `crossdissolve` 또는 `coververtical` [전환 스타일](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (기본값을 설정 하려면`coververtical`).
-      * **toolbarposition**: 설정 `top` 또는 `bottom` (기본값은 `bottom` ). 위쪽 또는 아래쪽 창에 도구 모음을 발생 합니다.
-    
-    Windows에만 해당:
-    
-      * **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-      * **fullscreen**: 주위 테두리 없이 브라우저 컨트롤을 만드는 `yes` 를 설정. 참고로 만약 **location=no** 지정, 통제 내 사 창 닫기를 사용자에 게 표시 될 것입니다.
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * 블랙베리 10
-  * Firefox 운영 체제
-  * iOS
-  * 윈도우 8과 8.1
-  * Windows Phone 7과 8
-  * 브라우저
-
-### 예를 들어
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### 파이어 폭스 OS 단점
-
-플러그인 어떤 디자인을 적용 하지 않는 경우 열 일부 CSS의 규칙을 추가할 필요가 있다 `target='_blank'`. 이 같이 규칙
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### 윈도우 특수
-
-파이어 폭스 OS 내 사 창 시각적 행동 비슷한 `inAppBrowserWrap`통해 재정의할 수 /`inAppBrowserWrapFullscreen` CSS 클래스
-
-### 브라우저 만지면
-
-  * 플러그인은 iframe을 통해 구현
-
-  * 탐색 기록 (LocationBar에서`뒤로` 및 `앞으로` 단추)은 구현 되지 않습니다.
-
-## InAppBrowser
-
-`Cordova에 대 한 호출에서 반환 하는 개체.InAppBrowser.open`.
-
-### 메서드
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> 이벤트에 대 한 수신기를 추가 합니다`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-  * **eventname**: *(문자열)를* 수신 하도록 이벤트
-    
-      * **loadstart**: 이벤트 발생 때는 `InAppBrowser` URL 로드를 시작 합니다.
-      * **loadstop**: 이벤트가 발생 시기는 `InAppBrowser` URL 로드 완료.
-      * **loaderror**: 이벤트 발생 때는 `InAppBrowser` URL을 로드할 때 오류가 발생 합니다.
-      * **종료**: 이벤트가 발생 시기는 `InAppBrowser` 창이 닫힙니다.
-
-  * **콜백**: 이벤트가 발생 될 때 실행 되는 함수. 함수는 전달 된 `InAppBrowserEvent` 개체를 매개 변수로 합니다.
-
-### InAppBrowserEvent 속성
-
-  * **유형**: eventname, 중 `loadstart` , `loadstop` , `loaderror` , 또는 `exit` . *(문자열)*
-
-  * **url**: URL 로드 된. *(문자열)*
-
-  * **코드**: 오류 코드의 경우에만 `loaderror` . *(수)*
-
-  * **메시지**: 오류 메시지의 경우에만 `loaderror` . *(문자열)*
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * iOS
-  * 윈도우 8과 8.1
-  * Windows Phone 7과 8
-  * 브라우저
-
-### 브라우저 만지면
-
-`loadstart` 및 `loaderror` 이벤트 해 고는 되 고.
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> 이벤트에 대 한 수신기를 제거 합니다`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-  * **eventname**: 이벤트 수신 대기를 중지 합니다. *(문자열)*
-    
-      * **loadstart**: 이벤트 발생 때는 `InAppBrowser` URL 로드를 시작 합니다.
-      * **loadstop**: 이벤트가 발생 시기는 `InAppBrowser` URL 로드 완료.
-      * **loaderror**: 이벤트 발생 때는 `InAppBrowser` URL 로드 오류가 발생 합니다.
-      * **종료**: 이벤트가 발생 시기는 `InAppBrowser` 창이 닫힙니다.
-
-  * **콜백**: 이벤트가 발생 하면 실행할 함수. 함수는 전달 된 `InAppBrowserEvent` 개체.
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * iOS
-  * 윈도우 8과 8.1
-  * Windows Phone 7과 8
-  * 브라우저
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 종료는 `InAppBrowser` 창.
-
-    ref.close();
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * Firefox 운영 체제
-  * iOS
-  * 윈도우 8과 8.1
-  * Windows Phone 7과 8
-  * 브라우저
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 숨겨진 열은 한 InAppBrowser 창을 표시 합니다. 전화는 InAppBrowser가 이미 보이는 경우는 효과가 없습니다.
-
-    ref.show();
-    
-
-  * **ref**: InAppBrowser 창 (참조`InAppBrowser`)
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * iOS
-  * 윈도우 8과 8.1
-  * 브라우저
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> 에 자바 스크립트 코드를 삽입는 `InAppBrowser` 창
-
-    ref.executeScript(details, callback);
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-  * **injectDetails**: 스크립트 실행의 세부 사항 중 하나를 지정 하는 `file` 또는 `code` 키. *(개체)*
-    
-      * **파일**: 삽입 하는 스크립트의 URL.
-      * **코드**: 스크립트 텍스트를 삽입 합니다.
-
-  * **콜백**: 자바 스크립트 코드를 주입 후 실행 기능.
-    
-      * 삽입 된 스크립트 유형의 경우 `code` , 스크립트의 반환 값은 단일 매개 변수는 콜백 실행에 싸여 있는 `Array` . 여러 줄 스크립트에 대 한 마지막 문 또는 평가 마지막 식의 반환 값입니다.
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * iOS
-  * 윈도우 8과 8.1
-  * 브라우저
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### 브라우저 만지면
-
-  * **code** 키만 지원 됩니다.
-
-### 윈도우 특수
-
-[MSDN 문서](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) 인해 호출된 스크립트 반환할 수 있습니다 문자열 값만 그렇지 않으면 매개 변수, **콜백** 전달 `[null]` 될 것입니다..
-
-## insertCSS
-
-> 주사로 CSS는 `InAppBrowser` 창.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-  * **injectDetails**: 스크립트 실행의 세부 사항 중 하나를 지정 하는 `file` 또는 `code` 키. *(개체)*
-    
-      * **파일**: 삽입 하는 스타일 시트의 URL.
-      * **코드**: 삽입 하는 스타일 시트의 텍스트.
-
-  * **콜백**: CSS 주입 후 실행 기능.
-
-### 지원 되는 플랫폼
-
-  * 아마존 화재 운영 체제
-  * 안 드 로이드
-  * iOS
-  * 윈도우
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/ko/index.md b/doc/ko/index.md
deleted file mode 100644
index d1b3ddb..0000000
--- a/doc/ko/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-이 플러그인 `코르도바를 호출할 때 표시 하는 웹 브라우저 보기를 제공 합니다.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`코르도바입니다.InAppBrowser.open()` 함수 `window.open ()` 함수에 대 한 대체품 정의 됩니다. 기존의 `window.open ()` 호출 window.open을 대체 하 여 InAppBrowser 윈도우를 사용할 수 있습니다.
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser 창 표준 웹 브라우저 처럼 동작 및 코르도바 Api에 액세스할 수 없습니다. 이 이유는 InAppBrowser는 것이 좋습니다는 주요 코르도바 webview로 로드 하는 대신 제 3 자 (신뢰할 수 없는) 콘텐츠를 로드 해야 할 경우. InAppBrowser는 허용 될 수도 시스템 브라우저에서 링크를 여는.
-
-사용자에 대 한 자체 GUI 컨트롤에서 기본적으로 제공 된 InAppBrowser (뒤로, 앞으로, 완료).
-
-대 한 뒤 호환성,이 플러그인도 `window.open` 후크. 그러나, `window.open`의 플러그인 설치 후크를 가질 수 있습니다 의도 하지 않은 부작용 (특히 경우이 플러그인이 다른 플러그인 종속성 으로만 포함). `window.open` 후크 주요 릴리스에서 제거 됩니다. 후크 플러그인에서 제거 될 때까지 애플 리 케이 션 수 있습니다 수동으로 기본 동작을 복원 하 게 됩니다.
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-`window.open` 전역 범위에 있지만 InAppBrowser 제공 되지 않습니다 때까지 `deviceready` 이벤트 후.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## 설치
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-InAppBrowser를 통해가 서 당신의 애플 리 케이 션에서 모든 페이지를 로드 하려는 경우 초기화 하는 동안 `window.open` 간단 하 게 연결할 수 있습니다. 예를 들어:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-새 `InAppBrowser` 인스턴스, 현재 브라우저 인스턴스 또는 시스템 브라우저에서 URL을 엽니다.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-*   **url**: *(문자열)를*로드 하는 URL. 전화 `encodeURI()` 이 경우에는 URL 유니코드 문자를 포함 합니다.
-
-*   **대상**: 대상 URL, 기본적으로 선택적 매개 변수를 로드 하는 `_self` . *(문자열)*
-    
-    *   `_self`: URL 화이트 리스트에 있으면 코르도바 WebView에서 열리고, 그렇지 않으면 열에`InAppBrowser`.
-    *   `_blank`: 준공에`InAppBrowser`.
-    *   `_system`: 시스템의 웹 브라우저에서 엽니다.
-
-*   **옵션**: 옵션은 `InAppBrowser` . 선택적, 디폴트에: `location=yes` . *(문자열)*
-    
-    `options`문자열 텅 빈 어떤 스페이스 포함 해서는 안 그리고 쉼표 각 기능의 이름/값 쌍을 구분 합니다. 기능 이름은 대/소문자입니다. 모든 플랫폼 지원 아래 값:
-    
-    *   **위치**: 설정 `yes` 또는 `no` 설정 하는 `InAppBrowser` 의 위치 표시줄 켜거나 끕니다.
-    
-    안 드 로이드만:
-    
-    *   **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-    *   **clearcache**: 설정 `yes` 브라우저를 쿠키 캐시 삭제 하기 전에 새 창이 열립니다
-    *   **clearsessioncache**: 설정 `yes` 세션 쿠키 캐시를 삭제 하기 전에 새 창이 열립니다
-    
-    iOS만:
-    
-    *   **closebuttoncaption**: **수행** 하는 단추의 캡션으로 사용할 문자열을 설정 합니다. 참고 직접이 값을 지역화 해야 합니다.
-    *   **disallowoverscroll**: 설정 `yes` 또는 `no` (기본값은 `no` ). 회전 온/오프 UIWebViewBounce 속성입니다.
-    *   **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-    *   **clearcache**: 설정 `yes` 브라우저를 쿠키 캐시 삭제 하기 전에 새 창이 열립니다
-    *   **clearsessioncache**: 설정 `yes` 세션 쿠키 캐시를 삭제 하기 전에 새 창이 열립니다
-    *   **도구 모음**: 설정 `yes` 또는 `no` InAppBrowser (기본값:에 대 한 도구 모음 온 / 오프를 돌기 위하여`yes`)
-    *   **enableViewportScale**: 설정 `yes` 또는 `no` 뷰포트 메타 태그 (기본값:를 통해 확장을 방지 하기 위해`no`).
-    *   **mediaPlaybackRequiresUserAction**: 설정 `yes` 또는 `no` HTML5 오디오 또는 비디오 자동 재생 (기본값에서에서 방지 하기 위해`no`).
-    *   **allowInlineMediaPlayback**: 설정 `yes` 또는 `no` 인라인 HTML5 미디어 재생, 장치 전용 재생 인터페이스 보다는 브라우저 창 내에서 표시할 수 있도록 합니다. HTML의 `video` 요소가 포함 되어야 합니다는 `webkit-playsinline` 특성 (기본값:`no`)
-    *   **keyboardDisplayRequiresUserAction**: 설정 `yes` 또는 `no` 양식 요소는 자바 스크립트를 통해 포커스를 받을 때 키보드를 열고 `focus()` 전화 (기본값:`yes`).
-    *   **suppressesIncrementalRendering**: 설정 `yes` 또는 `no` (기본값을 렌더링 하기 전에 모든 새로운 보기 콘텐츠를 받을 때까지 기다려야`no`).
-    *   **presentationstyle**: 설정 `pagesheet` , `formsheet` 또는 `fullscreen` [프레 젠 테이 션 스타일][1] (기본값을 설정 하려면`fullscreen`).
-    *   **transitionstyle**: 설정 `fliphorizontal` , `crossdissolve` 또는 `coververtical` [전환 스타일][2] (기본값을 설정 하려면`coververtical`).
-    *   **toolbarposition**: 설정 `top` 또는 `bottom` (기본값은 `bottom` ). 위쪽 또는 아래쪽 창에 도구 모음을 발생 합니다.
-    
-    Windows에만 해당:
-    
-    *   **숨겨진**: 설정 `yes` 브라우저를 만들 페이지를 로드 하면, 하지만 그것을 보여주지. Loadstop 이벤트는 로드가 완료 되 면 발생 합니다. 생략 하거나 설정 `no` (기본값) 브라우저 열고 정상적으로 로드 해야 합니다.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   블랙베리 10
-*   Firefox 운영 체제
-*   iOS
-*   윈도우 8과 8.1
-*   Windows Phone 7과 8
-
-### 예를 들어
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### 파이어 폭스 OS 단점
-
-플러그인 어떤 디자인을 적용 하지 않는 경우 열 일부 CSS의 규칙을 추가할 필요가 있다 `target='_blank'`. 이 같이 규칙
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-`Cordova에 대 한 호출에서 반환 하는 개체.InAppBrowser.open`.
-
-### 메서드
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> 이벤트에 대 한 수신기를 추가 합니다`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-*   **eventname**: *(문자열)를* 수신 하도록 이벤트
-    
-    *   **loadstart**: 이벤트 발생 때는 `InAppBrowser` URL 로드를 시작 합니다.
-    *   **loadstop**: 이벤트가 발생 시기는 `InAppBrowser` URL 로드 완료.
-    *   **loaderror**: 이벤트 발생 때는 `InAppBrowser` URL을 로드할 때 오류가 발생 합니다.
-    *   **종료**: 이벤트가 발생 시기는 `InAppBrowser` 창이 닫힙니다.
-
-*   **콜백**: 이벤트가 발생 될 때 실행 되는 함수. 함수는 전달 된 `InAppBrowserEvent` 개체를 매개 변수로 합니다.
-
-### InAppBrowserEvent 속성
-
-*   **유형**: eventname, 중 `loadstart` , `loadstop` , `loaderror` , 또는 `exit` . *(문자열)*
-
-*   **url**: URL 로드 된. *(문자열)*
-
-*   **코드**: 오류 코드의 경우에만 `loaderror` . *(수)*
-
-*   **메시지**: 오류 메시지의 경우에만 `loaderror` . *(문자열)*
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   iOS
-*   윈도우 8과 8.1
-*   Windows Phone 7과 8
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> 이벤트에 대 한 수신기를 제거 합니다`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-*   **eventname**: 이벤트 수신 대기를 중지 합니다. *(문자열)*
-    
-    *   **loadstart**: 이벤트 발생 때는 `InAppBrowser` URL 로드를 시작 합니다.
-    *   **loadstop**: 이벤트가 발생 시기는 `InAppBrowser` URL 로드 완료.
-    *   **loaderror**: 이벤트 발생 때는 `InAppBrowser` URL 로드 오류가 발생 합니다.
-    *   **종료**: 이벤트가 발생 시기는 `InAppBrowser` 창이 닫힙니다.
-
-*   **콜백**: 이벤트가 발생 하면 실행할 함수. 함수는 전달 된 `InAppBrowserEvent` 개체.
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   iOS
-*   윈도우 8과 8.1
-*   Windows Phone 7과 8
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 종료는 `InAppBrowser` 창.
-
-    ref.close();
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   Firefox 운영 체제
-*   iOS
-*   윈도우 8과 8.1
-*   Windows Phone 7과 8
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 숨겨진 열은 한 InAppBrowser 창을 표시 합니다. 전화는 InAppBrowser가 이미 보이는 경우는 효과가 없습니다.
-
-    ref.show();
-    
-
-*   **ref**: InAppBrowser 창 (참조`InAppBrowser`)
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   iOS
-*   윈도우 8과 8.1
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> 에 자바 스크립트 코드를 삽입는 `InAppBrowser` 창
-
-    ref.executeScript(details, callback);
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창. *(InAppBrowser)*
-
-*   **injectDetails**: 스크립트 실행의 세부 사항 중 하나를 지정 하는 `file` 또는 `code` 키. *(개체)*
-    
-    *   **파일**: 삽입 하는 스크립트의 URL.
-    *   **코드**: 스크립트 텍스트를 삽입 합니다.
-
-*   **콜백**: 자바 스크립트 코드를 주입 후 실행 기능.
-    
-    *   삽입 된 스크립트 유형의 경우 `code` , 스크립트의 반환 값은 단일 매개 변수는 콜백 실행에 싸여 있는 `Array` . 여러 줄 스크립트에 대 한 마지막 문 또는 평가 마지막 식의 반환 값입니다.
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   iOS
-*   윈도우 8과 8.1
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> 주사로 CSS는 `InAppBrowser` 창.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **심판**:에 대 한 참조는 `InAppBrowser` 창 *(InAppBrowser)*
-
-*   **injectDetails**: 스크립트 실행의 세부 사항 중 하나를 지정 하는 `file` 또는 `code` 키. *(개체)*
-    
-    *   **파일**: 삽입 하는 스타일 시트의 URL.
-    *   **코드**: 삽입 하는 스타일 시트의 텍스트.
-
-*   **콜백**: CSS 주입 후 실행 기능.
-
-### 지원 되는 플랫폼
-
-*   아마존 화재 운영 체제
-*   안 드 로이드
-*   iOS
-
-### 빠른 예제
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/pl/README.md b/doc/pl/README.md
deleted file mode 100644
index 5ff58ad..0000000
--- a/doc/pl/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-Plugin daje widok przeglądarki sieci web, które są wyświetlane podczas wywoływania `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`cordova.InAppBrowser.open()` funkcja jest definiowana jako zamiennik dla funkcji `window.open()`. Istniejące wywołania `window.open()` służy okno InAppBrowser, zastępując window.open:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-Okna InAppBrowser zachowuje się jak standardowe przeglądarki i nie ma dostępu do API Cordova. Z tego powodu zaleca się InAppBrowser jeśli ty potrzebować wobec ciężar (niezaufanej) treści osób trzecich, a nie że wczytywanie głównym webview Cordova. InAppBrowser nie jest biała, ani nie jest otwieranie linków w przeglądarce systemu.
-
-InAppBrowser zawiera domyślnie kontrole GUI dla użytkownika (tył, przód, zrobić).
-
-Do tyłu zgodności, ten plugin również haki `window.open`. Jednak może mieć zainstalowane wtyczki haka `window.open` niezamierzone skutki uboczne (zwłaszcza, jeśli ten plugin jest włączone tylko jako część innej wtyczki). Hak `window.open` zostaną usunięte w przyszłej wersji głównych. Dopóki hak jest usuwany z wtyczki, aplikacje można ręcznie przywrócić domyślne zachowanie:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Chociaż `window.open` w globalnym zasięgu, InAppBrowser nie jest dostępne dopiero po zdarzeniu `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Instalacja
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Jeśli chcesz wszystko stronica ładunki w swojej aplikacji, aby przejść przez InAppBrowser, można po prostu podłączyć `window.open` podczas inicjowania. Na przykład:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Otwiera URL w nowe wystąpienie `InAppBrowser`, bieżące wystąpienie przeglądarki lub przeglądarki systemu.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-  * **adres**: adres URL do ładowania *(ciąg)*. Wywołanie `encodeURI()` na to, czy adres URL zawiera znaki Unicode.
-
-  * **miejsce docelowe**: miejsce docelowe, w którym wobec ciężar ten URL parametr opcjonalny, który domyślnie `_self` . *(String)*
-    
-      * `_self`: Otwiera w Cordova WebView, jeśli adres URL jest na białej liście, inaczej ono otwiera w`InAppBrowser`.
-      * `_blank`: Otwiera w`InAppBrowser`.
-      * `_system`: Otwiera w przeglądarce internetowej systemu.
-
-  * **Opcje**: opcje dla `InAppBrowser` . Opcjonalnie, nie stawiła się: `location=yes` . *(String)*
-    
-    `options`Ciąg nie może zawierać żadnych spacji, i pary nazwa/wartość każdej funkcji muszą być oddzielone przecinkami. Nazwy funkcji jest rozróżniana. Wszystkich platform obsługuje wartości poniżej:
-    
-      * **Lokalizacja**: zestaw `yes` lub `no` Aby włączyć `InAppBrowser` na pasek lub wyłączyć.
-    
-    Android:
-    
-      * **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-      * **ClearCache**: zestaw `yes` do przeglądarki w pamięci podręcznej plików cookie wyczyszczone zanim otworzy się nowe okno
-      * **clearsessioncache**: zestaw `yes` mieć w pamięci podręcznej plików cookie sesji wyczyszczone zanim otworzy się nowe okno
-      * **zoom**: `yes` aby pokazać formantami powiększania Android przeglądarka, ustawiona na `nie` aby je ukryć. Wartość domyślna to `tak`.
-      * **hardwareback**: zestaw do `yes` , aby użyć przycisk Wstecz sprzętu do nawigacji wstecz historii `InAppBrowser`. Jeśli nie ma żadnej poprzedniej strony, `InAppBrowser` zostanie zamknięta. Wartością domyślną jest `yes`, więc należy ustawić ją na `no` jeśli chcesz przycisk Wstecz, aby po prostu zamknąć InAppBrowser.
-    
-    tylko iOS:
-    
-      * **closebuttoncaption**: aby użyć jak **zrobić** przycisk Podpis ustawiona na ciąg. Należy pamiętać, że trzeba zlokalizować tę wartość siebie.
-      * **disallowoverscroll**: zestaw `yes` lub `no` (domyślnie `no` ). Włącza/wyłącza właściwość UIWebViewBounce.
-      * **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-      * **ClearCache**: zestaw `yes` do przeglądarki w pamięci podręcznej plików cookie wyczyszczone zanim otworzy się nowe okno
-      * **clearsessioncache**: zestaw `yes` mieć w pamięci podręcznej plików cookie sesji wyczyszczone zanim otworzy się nowe okno
-      * **pasek narzędzi**: zestaw `yes` lub `no` Aby włączyć pasek narzędzi lub wyłączyć dla InAppBrowser (domyślnie`yes`)
-      * **enableViewportScale**: zestaw `yes` lub `no` Aby zapobiec rzutni skalowanie za pomocą tagu meta (domyślnie`no`).
-      * **mediaPlaybackRequiresUserAction**: zestaw `yes` lub `no` Aby zapobiec HTML5 audio lub wideo z Autoodtwarzanie (domyślnie`no`).
-      * **allowInlineMediaPlayback**: zestaw `yes` lub `no` Aby w linii HTML5 odtwarzanie, wyświetlanie w oknie przeglądarki, a nie interfejs odtwarzanie specyficzne dla urządzenia. HTML `video` również musi zawierać element `webkit-playsinline` atrybut (domyślnie`no`)
-      * **keyboardDisplayRequiresUserAction**: zestaw `yes` lub `no` Aby otworzyć klawiaturę ekranową, gdy elementy formularza ostrości za pomocą JavaScript `focus()` połączenia (domyślnie`yes`).
-      * **suppressesIncrementalRendering**: zestaw `yes` lub `no` czekać, aż wszystkie nowe widok zawartości jest otrzymane przed renderowany (domyślnie`no`).
-      * **presentationstyle**: zestaw `pagesheet` , `formsheet` lub `fullscreen` Aby ustawić [styl prezentacji](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle) (domyślnie`fullscreen`).
-      * **transitionstyle**: zestaw `fliphorizontal` , `crossdissolve` lub `coververtical` Aby ustawić [styl przejścia](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle) (domyślnie`coververtical`).
-      * **toolbarposition**: zestaw `top` lub `bottom` (domyślnie `bottom` ). Powoduje, że pasek ma być na górze lub na dole okna.
-    
-    Windows tylko:
-    
-      * **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-      * **fullscreen**: zestaw do `yes` , aby utworzyć formant przeglądarki bez obramowania wokół niego. Należy pamiętać, że jeśli **location=no** również jest określony, nie będzie żadnej kontroli przedstawione do użytkownika, aby zamknąć okno IAB.
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * BlackBerry 10
-  * Firefox OS
-  * iOS
-  * Windows 8 i 8.1
-  * Windows Phone 7 i 8
-  * Przeglądarka
-
-### Przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS dziwactwa
-
-Jak plugin nie wymuszać każdy projekt to trzeba dodać pewne reguły CSS jeśli otwarty z `target = "_blank"`. Zasady może wyglądać jak te
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Windows dziwactwa
-
-Podobne do Firefox OS IAB okno wizualne zachowanie może być zastąpiona przez `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` klas CSS
-
-### Quirks przeglądarki
-
-  * Plugin jest realizowane za pośrednictwem iframe,
-
-  * Historia nawigacji (przyciski`wstecz` i `do przodu` w LocationBar) nie jest zaimplementowana.
-
-## InAppBrowser
-
-Obiekt zwrócony z wywołania `cordova.InAppBrowser.open`.
-
-### Metody
-
-  * metody addEventListener
-  * removeEventListener
-  * Zamknij
-  * Pokaż
-  * executeScript
-  * insertCSS
-
-## metody addEventListener
-
-> Dodaje detektor zdarzenia z`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-  * **EventName**: zdarzenie słuchać *(String)*
-    
-      * **loadstart**: zdarzenie gdy odpalam `InAppBrowser` zaczyna się ładować adresu URL.
-      * **loadstop**: zdarzenie gdy odpalam `InAppBrowser` zakończeniu ładowania adresu URL.
-      * **LoadError**: zdarzenie odpala gdy `InAppBrowser` napotka błąd podczas ładowania adresu URL.
-      * **wyjście**: zdarzenie gdy odpalam `InAppBrowser` okno jest zamknięte.
-
-  * **wywołania zwrotnego**: funkcja, która wykonuje, gdy zdarzenie. Funkcja jest przekazywany `InAppBrowserEvent` obiektu jako parametr.
-
-### Właściwości InAppBrowserEvent
-
-  * **Typ**: eventname, albo `loadstart` , `loadstop` , `loaderror` , lub `exit` . *(String)*
-
-  * **adres**: adres URL, który został załadowany. *(String)*
-
-  * **Kod**: kod błędu, tylko w przypadku `loaderror` . *(Liczba)*
-
-  * **wiadomość**: komunikat o błędzie, tylko w przypadku `loaderror` . *(String)*
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 i 8.1
-  * Windows Phone 7 i 8
-  * Przeglądarka
-
-### Quirks przeglądarki
-
-wydarzenia `loadstart` i `loaderror` nie są być opalane.
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Usuwa detektor zdarzenia z`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-  * **EventName**: zdarzenie przestanie słuchać. *(String)*
-    
-      * **loadstart**: zdarzenie gdy odpalam `InAppBrowser` zaczyna się ładować adresu URL.
-      * **loadstop**: zdarzenie gdy odpalam `InAppBrowser` zakończeniu ładowania adresu URL.
-      * **LoadError**: zdarzenie odpala gdy `InAppBrowser` napotka błąd ładowania adresu URL.
-      * **wyjście**: zdarzenie gdy odpalam `InAppBrowser` okno jest zamknięte.
-
-  * **wywołania zwrotnego**: funkcja do wykonania, gdy zdarzenie. Funkcja jest przekazywany `InAppBrowserEvent` obiektu.
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 i 8.1
-  * Windows Phone 7 i 8
-  * Przeglądarka
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## Zamknij
-
-> Zamyka `InAppBrowser` okna.
-
-    ref.close();
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * Firefox OS
-  * iOS
-  * Windows 8 i 8.1
-  * Windows Phone 7 i 8
-  * Przeglądarka
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## Pokaż
-
-> Wyświetla InAppBrowser okno, który został otwarty ukryte. Zawód ten jest ignorowany, jeśli InAppBrowser już był widoczny.
-
-    ref.show();
-    
-
-  * **ref**: odwołanie do InAppBrowser (okno`InAppBrowser`)
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 i 8.1
-  * Przeglądarka
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Wstrzykuje kod JavaScript w `InAppBrowser` okna
-
-    ref.executeScript(details, callback);
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-  * **injectDetails**: Szczegóły dotyczące skryptu, określając albo `file` lub `code` klucz. *(Obiekt)*
-    
-      * **plik**: adres URL skryptu, aby wstrzyknąć.
-      * **Kod**: tekst skryptu, aby wstrzyknąć.
-
-  * **wywołania zwrotnego**: funkcja, która wykonuje po kod JavaScript jest wstrzykiwany.
-    
-      * Jeśli taki skrypt jest typu `code` , wykonuje wywołanie zwrotne z pojedynczym parametrem, który jest wartość zwracana przez skrypt, owinięte w `Array` . Dla wielu linii skrypty to wartość zwracana ostatniej instrukcja, lub ostatni wyrażenie oceniane.
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows 8 i 8.1
-  * Przeglądarka
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### Quirks przeglądarki
-
-  * obsługiwany jest tylko **code** klucza.
-
-### Windows dziwactwa
-
-Ze względu na [MSDN dokumenty](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) wywołany skrypt może zwracać tylko wartości ciągów, inaczej parametr, przekazywany do **wywołania zwrotnego** będzie `[null]`.
-
-## insertCSS
-
-> Wstrzykuje CSS w `InAppBrowser` okna.
-
-    ref.insertCSS(details, callback);
-    
-
-  * **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-  * **injectDetails**: Szczegóły dotyczące skryptu, określając albo `file` lub `code` klucz. *(Obiekt)*
-    
-      * **plik**: URL arkusza stylów do wsuwania.
-      * **Kod**: tekst z arkusza stylów do wstrzykiwania.
-
-  * **wywołania zwrotnego**: funkcja, która wykonuje po CSS jest wstrzykiwany.
-
-### Obsługiwane platformy
-
-  * Amazon Fire OS
-  * Android
-  * iOS
-  * Windows
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/pl/index.md b/doc/pl/index.md
deleted file mode 100644
index dff9bf0..0000000
--- a/doc/pl/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-Plugin daje widok przeglądarki sieci web, które są wyświetlane podczas wywoływania `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`cordova.InAppBrowser.open()` funkcja jest definiowana jako zamiennik dla funkcji `window.open()`. Istniejące wywołania `window.open()` służy okno InAppBrowser, zastępując window.open:
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-Okna InAppBrowser zachowuje się jak standardowe przeglądarki i nie ma dostępu do API Cordova. Z tego powodu zaleca się InAppBrowser jeśli ty potrzebować wobec ciężar (niezaufanej) treści osób trzecich, a nie że wczytywanie głównym webview Cordova. InAppBrowser nie jest biała, ani nie jest otwieranie linków w przeglądarce systemu.
-
-InAppBrowser zawiera domyślnie kontrole GUI dla użytkownika (tył, przód, zrobić).
-
-Do tyłu zgodności, ten plugin również haki `window.open`. Jednak może mieć zainstalowane wtyczki haka `window.open` niezamierzone skutki uboczne (zwłaszcza, jeśli ten plugin jest włączone tylko jako część innej wtyczki). Hak `window.open` zostaną usunięte w przyszłej wersji głównych. Dopóki hak jest usuwany z wtyczki, aplikacje można ręcznie przywrócić domyślne zachowanie:
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-Chociaż `window.open` w globalnym zasięgu, InAppBrowser nie jest dostępne dopiero po zdarzeniu `deviceready`.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## Instalacja
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-Jeśli chcesz wszystko stronica ładunki w swojej aplikacji, aby przejść przez InAppBrowser, można po prostu podłączyć `window.open` podczas inicjowania. Na przykład:
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-Otwiera URL w nowe wystąpienie `InAppBrowser`, bieżące wystąpienie przeglądarki lub przeglądarki systemu.
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-*   **adres**: adres URL do ładowania *(ciąg)*. Wywołanie `encodeURI()` na to, czy adres URL zawiera znaki Unicode.
-
-*   **miejsce docelowe**: miejsce docelowe, w którym wobec ciężar ten URL parametr opcjonalny, który domyślnie `_self` . *(String)*
-    
-    *   `_self`: Otwiera w Cordova WebView, jeśli adres URL jest na białej liście, inaczej ono otwiera w`InAppBrowser`.
-    *   `_blank`: Otwiera w`InAppBrowser`.
-    *   `_system`: Otwiera w przeglądarce internetowej systemu.
-
-*   **Opcje**: opcje dla `InAppBrowser` . Opcjonalnie, nie stawiła się: `location=yes` . *(String)*
-    
-    `options`Ciąg nie może zawierać żadnych spacji, i pary nazwa/wartość każdej funkcji muszą być oddzielone przecinkami. Nazwy funkcji jest rozróżniana. Wszystkich platform obsługuje wartości poniżej:
-    
-    *   **Lokalizacja**: zestaw `yes` lub `no` Aby włączyć `InAppBrowser` na pasek lub wyłączyć.
-    
-    Android:
-    
-    *   **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-    *   **ClearCache**: zestaw `yes` do przeglądarki w pamięci podręcznej plików cookie wyczyszczone zanim otworzy się nowe okno
-    *   **clearsessioncache**: zestaw `yes` mieć w pamięci podręcznej plików cookie sesji wyczyszczone zanim otworzy się nowe okno
-    
-    tylko iOS:
-    
-    *   **closebuttoncaption**: aby użyć jak **zrobić** przycisk Podpis ustawiona na ciąg. Należy pamiętać, że trzeba zlokalizować tę wartość siebie.
-    *   **disallowoverscroll**: zestaw `yes` lub `no` (domyślnie `no` ). Włącza/wyłącza właściwość UIWebViewBounce.
-    *   **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-    *   **ClearCache**: zestaw `yes` do przeglądarki w pamięci podręcznej plików cookie wyczyszczone zanim otworzy się nowe okno
-    *   **clearsessioncache**: zestaw `yes` mieć w pamięci podręcznej plików cookie sesji wyczyszczone zanim otworzy się nowe okno
-    *   **pasek narzędzi**: zestaw `yes` lub `no` Aby włączyć pasek narzędzi lub wyłączyć dla InAppBrowser (domyślnie`yes`)
-    *   **enableViewportScale**: zestaw `yes` lub `no` Aby zapobiec rzutni skalowanie za pomocą tagu meta (domyślnie`no`).
-    *   **mediaPlaybackRequiresUserAction**: zestaw `yes` lub `no` Aby zapobiec HTML5 audio lub wideo z Autoodtwarzanie (domyślnie`no`).
-    *   **allowInlineMediaPlayback**: zestaw `yes` lub `no` Aby w linii HTML5 odtwarzanie, wyświetlanie w oknie przeglądarki, a nie interfejs odtwarzanie specyficzne dla urządzenia. HTML `video` również musi zawierać element `webkit-playsinline` atrybut (domyślnie`no`)
-    *   **keyboardDisplayRequiresUserAction**: zestaw `yes` lub `no` Aby otworzyć klawiaturę ekranową, gdy elementy formularza ostrości za pomocą JavaScript `focus()` połączenia (domyślnie`yes`).
-    *   **suppressesIncrementalRendering**: zestaw `yes` lub `no` czekać, aż wszystkie nowe widok zawartości jest otrzymane przed renderowany (domyślnie`no`).
-    *   **presentationstyle**: zestaw `pagesheet` , `formsheet` lub `fullscreen` Aby ustawić [styl prezentacji][1] (domyślnie`fullscreen`).
-    *   **transitionstyle**: zestaw `fliphorizontal` , `crossdissolve` lub `coververtical` Aby ustawić [styl przejścia][2] (domyślnie`coververtical`).
-    *   **toolbarposition**: zestaw `top` lub `bottom` (domyślnie `bottom` ). Powoduje, że pasek ma być na górze lub na dole okna.
-    
-    Windows tylko:
-    
-    *   **ukryte**: zestaw `yes` do stworzenia przeglądarki i ładowania strony, ale nie pokazuje go. Loadstop zdarzenie fires po zakończeniu ładowania. Pominąć lub zestaw `no` (domyślnie) do przeglądarki otworzyć i załadować normalnie.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 i 8.1
-*   Windows Phone 7 i 8
-
-### Przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Firefox OS dziwactwa
-
-Jak plugin nie wymuszać każdy projekt to trzeba dodać pewne reguły CSS jeśli otwarty z `target = "_blank"`. Zasady może wyglądać jak te
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-Obiekt zwrócony z wywołania `cordova.InAppBrowser.open`.
-
-### Metody
-
-*   metody addEventListener
-*   removeEventListener
-*   Zamknij
-*   Pokaż
-*   executeScript
-*   insertCSS
-
-## metody addEventListener
-
-> Dodaje detektor zdarzenia z`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-*   **EventName**: zdarzenie słuchać *(String)*
-    
-    *   **loadstart**: zdarzenie gdy odpalam `InAppBrowser` zaczyna się ładować adresu URL.
-    *   **loadstop**: zdarzenie gdy odpalam `InAppBrowser` zakończeniu ładowania adresu URL.
-    *   **LoadError**: zdarzenie odpala gdy `InAppBrowser` napotka błąd podczas ładowania adresu URL.
-    *   **wyjście**: zdarzenie gdy odpalam `InAppBrowser` okno jest zamknięte.
-
-*   **wywołania zwrotnego**: funkcja, która wykonuje, gdy zdarzenie. Funkcja jest przekazywany `InAppBrowserEvent` obiektu jako parametr.
-
-### Właściwości InAppBrowserEvent
-
-*   **Typ**: eventname, albo `loadstart` , `loadstop` , `loaderror` , lub `exit` . *(String)*
-
-*   **adres**: adres URL, który został załadowany. *(String)*
-
-*   **Kod**: kod błędu, tylko w przypadku `loaderror` . *(Liczba)*
-
-*   **wiadomość**: komunikat o błędzie, tylko w przypadku `loaderror` . *(String)*
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 i 8.1
-*   Windows Phone 7 i 8
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> Usuwa detektor zdarzenia z`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-*   **EventName**: zdarzenie przestanie słuchać. *(String)*
-    
-    *   **loadstart**: zdarzenie gdy odpalam `InAppBrowser` zaczyna się ładować adresu URL.
-    *   **loadstop**: zdarzenie gdy odpalam `InAppBrowser` zakończeniu ładowania adresu URL.
-    *   **LoadError**: zdarzenie odpala gdy `InAppBrowser` napotka błąd ładowania adresu URL.
-    *   **wyjście**: zdarzenie gdy odpalam `InAppBrowser` okno jest zamknięte.
-
-*   **wywołania zwrotnego**: funkcja do wykonania, gdy zdarzenie. Funkcja jest przekazywany `InAppBrowserEvent` obiektu.
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 i 8.1
-*   Windows Phone 7 i 8
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## Zamknij
-
-> Zamyka `InAppBrowser` okna.
-
-    ref.close();
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 i 8.1
-*   Windows Phone 7 i 8
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## Pokaż
-
-> Wyświetla InAppBrowser okno, który został otwarty ukryte. Zawód ten jest ignorowany, jeśli InAppBrowser już był widoczny.
-
-    ref.show();
-    
-
-*   **ref**: odwołanie do InAppBrowser (okno`InAppBrowser`)
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 i 8.1
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Wstrzykuje kod JavaScript w `InAppBrowser` okna
-
-    ref.executeScript(details, callback);
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna. *(InAppBrowser)*
-
-*   **injectDetails**: Szczegóły dotyczące skryptu, określając albo `file` lub `code` klucz. *(Obiekt)*
-    
-    *   **plik**: adres URL skryptu, aby wstrzyknąć.
-    *   **Kod**: tekst skryptu, aby wstrzyknąć.
-
-*   **wywołania zwrotnego**: funkcja, która wykonuje po kod JavaScript jest wstrzykiwany.
-    
-    *   Jeśli taki skrypt jest typu `code` , wykonuje wywołanie zwrotne z pojedynczym parametrem, który jest wartość zwracana przez skrypt, owinięte w `Array` . Dla wielu linii skrypty to wartość zwracana ostatniej instrukcja, lub ostatni wyrażenie oceniane.
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 i 8.1
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Wstrzykuje CSS w `InAppBrowser` okna.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **ref**: odniesienie do `InAppBrowser` okna *(InAppBrowser)*
-
-*   **injectDetails**: Szczegóły dotyczące skryptu, określając albo `file` lub `code` klucz. *(Obiekt)*
-    
-    *   **plik**: URL arkusza stylów do wsuwania.
-    *   **Kod**: tekst z arkusza stylów do wstrzykiwania.
-
-*   **wywołania zwrotnego**: funkcja, która wykonuje po CSS jest wstrzykiwany.
-
-### Obsługiwane platformy
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-
-### Szybki przykład
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/ru/index.md b/doc/ru/index.md
deleted file mode 100644
index 3b4e967..0000000
--- a/doc/ru/index.md
+++ /dev/null
@@ -1,330 +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-inappbrowser
-
-Этот плагин обеспечивает представление веб-браузера, что показывает при вызове`window.open()`.
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    
-
-**Примечание**: InAppBrowser окно ведет себя как стандартный веб-браузер и не может доступ API Cordova.
-
-## Установка
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-## window.open
-
-Открывает URL-адрес в новом `InAppBrowser` например, текущий экземпляр браузера или браузера системы.
-
-    var ref = window.open(url, target, options);
-    
-
-*   **ссылка**: ссылка для `InAppBrowser` окно. *(InAppBrowser)*
-
-*   **URL**: URL-адрес для загрузки *(String)*. Вызвать `encodeURI()` на это, если URL-адрес содержит символы Unicode.
-
-*   **Цель**: цель для загрузки URL-адреса, необязательный параметр, по умолчанию `_self` . *(Строка)*
-    
-    *   `_self`: Открывается в Cordova WebView, если URL-адрес в белый список, в противном случае он открывается в`InAppBrowser`.
-    *   `_blank`: Открывает в`InAppBrowser`.
-    *   `_system`: Открывается в веб-браузера системы.
-
-*   **опции**: параметры для `InAppBrowser` . Необязательный параметр, виновная в: `location=yes` . *(Строка)*
-    
-    `options`Строка не должна содержать каких-либо пустое пространство, и каждая функция пар имя/значение должны быть разделены запятой. Функция имена нечувствительны к регистру. Все платформы поддерживают исходное значение:
-    
-    *   **Расположение**: равным `yes` или `no` превратить `InAppBrowser` в адресную строку или выключить.
-    
-    Только андроид:
-    
-    *   **closebuttoncaption**: задайте строку для использования в качестве заголовка кнопки **сделали** .
-    *   **скрытые**: значение `yes` для создания браузера и загрузки страницы, но не показать его. Событие loadstop возникает, когда загрузка завершена. Опустить или набор `no` (по умолчанию), чтобы браузер открыть и загрузить нормально.
-    *   **ClearCache**: набор `yes` иметь браузера куки кэш очищен перед открытием нового окна
-    *   **clearsessioncache**: значение `yes` иметь кэш cookie сеанса очищается перед открытием нового окна
-    
-    только iOS:
-    
-    *   **closebuttoncaption**: задайте строку для использования в качестве заголовка кнопки **сделали** . Обратите внимание, что вам нужно самостоятельно локализовать это значение.
-    *   **disallowoverscroll**: значение `yes` или `no` (по умолчанию `no` ). Включает/отключает свойство UIWebViewBounce.
-    *   **скрытые**: значение `yes` для создания браузера и загрузки страницы, но не показать его. Событие loadstop возникает, когда загрузка завершена. Опустить или набор `no` (по умолчанию), чтобы браузер открыть и загрузить нормально.
-    *   **ClearCache**: набор `yes` иметь браузера куки кэш очищен перед открытием нового окна
-    *   **clearsessioncache**: значение `yes` иметь кэш cookie сеанса очищается перед открытием нового окна
-    *   **панели инструментов**: набор `yes` или `no` для включения панели инструментов или выключить InAppBrowser (по умолчанию`yes`)
-    *   **enableViewportScale**: значение `yes` или `no` для предотвращения просмотра, масштабирования через тег meta (по умолчанию`no`).
-    *   **mediaPlaybackRequiresUserAction**: значение `yes` или `no` для предотвращения HTML5 аудио или видео от Автовоспроизведение (по умолчанию`no`).
-    *   **allowInlineMediaPlayback**: значение `yes` или `no` чтобы разрешить воспроизведение мультимедиа HTML5 в строки, отображения в окне браузера, а не конкретного устройства воспроизведения интерфейс. HTML `video` элемент должен также включать `webkit-playsinline` атрибут (по умолчанию`no`)
-    *   **keyboardDisplayRequiresUserAction**: значение `yes` или `no` чтобы открыть клавиатуру, когда формы элементы получают фокус через JavaScript в `focus()` вызов (по умолчанию`yes`).
-    *   **suppressesIncrementalRendering**: значение `yes` или `no` ждать, пока все новое содержание представление получено до визуализации (по умолчанию`no`).
-    *   **presentationstyle**: набор `pagesheet` , `formsheet` или `fullscreen` чтобы задать [стиль презентации][1] (по умолчанию`fullscreen`).
-    *   **transitionstyle**: набор `fliphorizontal` , `crossdissolve` или `coververtical` чтобы задать [стиль перехода][2] (по умолчанию`coververtical`).
-    *   **toolbarposition**: значение `top` или `bottom` (по умолчанию `bottom` ). Вызывает панели инструментов, чтобы быть в верхней или нижней части окна.
-    
-    Windows только:
-    
-    *   **скрытые**: значение `yes` для создания браузера и загрузки страницы, но не показать его. Событие loadstop возникает, когда загрузка завершена. Опустить или набор `no` (по умолчанию), чтобы браузер открыть и загрузить нормально.
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   BlackBerry 10
-*   Firefox OS
-*   iOS
-*   Windows 8 и 8.1
-*   Windows Phone 7 и 8
-
-### Пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = window.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### Особенности Firefox OS
-
-Как плагин не применять любой дизайн есть необходимость добавить некоторые правила CSS, если открыт с `target='_blank'` . Правила может выглядеть как эти
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## Внутренний браузер
-
-Объект, возвращаемый из вызова`window.open`.
-
-### Методы
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> Добавляет прослушиватель для события от`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ссылка**: ссылка для `InAppBrowser` окно *(InAppBrowser)*
-
-*   **EventName**: событие для прослушивания *(String)*
-    
-    *   **loadstart**: событие возникает, когда `InAppBrowser` начинает для загрузки URL-адреса.
-    *   **loadstop**: событие возникает, когда `InAppBrowser` завершит загрузку URL-адреса.
-    *   **loaderror**: событие возникает, когда `InAppBrowser` обнаруживает ошибку при загрузке URL-адреса.
-    *   **выход**: возникает событие, когда `InAppBrowser` окно закрыто.
-
-*   **обратного вызова**: функция, которая выполняется, когда возникает событие. Функция передается `InAppBrowserEvent` объект в качестве параметра.
-
-### InAppBrowserEvent свойства
-
-*   **тип**: eventname, либо `loadstart` , `loadstop` , `loaderror` , или `exit` . *(Строка)*
-
-*   **URL**: URL-адрес, который был загружен. *(Строка)*
-
-*   **код**: код ошибки, только в случае `loaderror` . *(Число)*
-
-*   **сообщение**: сообщение об ошибке, только в случае `loaderror` . *(Строка)*
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 и 8.1
-*   Windows Phone 7 и 8
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## метод removeEventListener
-
-> Удаляет прослушиватель для события от`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ссылка**: ссылка для `InAppBrowser` окно. *(InAppBrowser)*
-
-*   **EventName**: событие прекратить прослушивание. *(Строка)*
-    
-    *   **loadstart**: событие возникает, когда `InAppBrowser` начинает для загрузки URL-адреса.
-    *   **loadstop**: событие возникает, когда `InAppBrowser` завершит загрузку URL-адреса.
-    *   **loaderror**: событие возникает, когда `InAppBrowser` обнаруживает ошибку загрузки URL-адреса.
-    *   **выход**: возникает событие, когда `InAppBrowser` окно закрывается.
-
-*   **обратного вызова**: функция, выполняемая когда это событие наступает. Функция передается `InAppBrowserEvent` объект.
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 и 8.1
-*   Windows Phone 7 и 8
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> Закрывает `InAppBrowser` окно.
-
-    Ref.Close();
-    
-
-*   **ссылка**: ссылка на `InAppBrowser` окно *(InAppBrowser)*
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   Firefox OS
-*   iOS
-*   Windows 8 и 8.1
-*   Windows Phone 7 и 8
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> Отображается окно InAppBrowser, был открыт скрытые. Вызов это не имеет эффекта при InAppBrowser уже был виден.
-
-    Ref.Show();
-    
-
-*   **ссылка**: ссылка на окно (InAppBrowser`InAppBrowser`)
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 и 8.1
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> Вставляет код JavaScript в `InAppBrowser` окно
-
-    ref.executeScript(details, callback);
-    
-
-*   **ссылка**: ссылка на `InAppBrowser` окно. *(InAppBrowser)*
-
-*   **injectDetails**: подробности сценария для запуска, указав либо `file` или `code` ключ. *(Объект)*
-    
-    *   **файл**: URL-адрес сценария вставки.
-    *   **код**: текст сценария для вставки.
-
-*   **обратного вызова**: функция, которая выполняет после вводят JavaScript-код.
-    
-    *   Если введенный скрипт имеет тип `code` , обратный вызов выполняется с одним параметром, который является возвращаемое значение сценария, завернутые в `Array` . Для многострочных сценариев это возвращаемое значение последнего оператора, или последнее вычисленное выражение.
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-*   Windows 8 и 8.1
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> Внедряет CSS в `InAppBrowser` окно.
-
-    ref.insertCSS(details, callback);
-    
-
-*   **ссылка**: ссылка на `InAppBrowser` окно *(InAppBrowser)*
-
-*   **injectDetails**: детали сценария для запуска, указав либо `file` или `code` ключ. *(Объект)*
-    
-    *   **файл**: URL-адрес таблицы стилей для вставки.
-    *   **код**: текст таблицы стилей для вставки.
-
-*   **обратного вызова**: функция, которая выполняет после вводят CSS.
-
-### Поддерживаемые платформы
-
-*   Amazon Fire OS
-*   Android
-*   iOS
-
-### Краткий пример
-
-    var ref = window.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/doc/zh/README.md b/doc/zh/README.md
deleted file mode 100644
index 7d33d89..0000000
--- a/doc/zh/README.md
+++ /dev/null
@@ -1,388 +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-inappbrowser
-
-[![Build Status](https://travis-ci.org/apache/cordova-plugin-inappbrowser.svg)](https://travis-ci.org/apache/cordova-plugin-inappbrowser)
-
-這個外掛程式提供了一個 web 瀏覽器視圖，顯示在調用 `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`cordova.InAppBrowser.open()` 函數被定義為一個臨時替代 `window.open ()` 函數。 現有 `window.open ()` 調用，可以通過替換 window.open 使用 InAppBrowser 視窗：
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser 視窗像一個標準的 web 瀏覽器中，並且無法訪問科爾多瓦 Api。 為此，建議 InAppBrowser 如果您需要載入協力廠商 （不可信） 的內容，而不是載入，進入主要的科爾多瓦 web 視圖。 InAppBrowser 是不受白名單中，也不在系統瀏覽器中打開的連結。
-
-InAppBrowser 預設情況下它自己的 GUI 控制項為使用者提供 （後退、 前進、 完成）。
-
-為向後相容性，此外掛程式還鉤 `window.open`。 然而，`window.open` 外掛程式安裝鉤子可以有副作用 （尤其是如果這個外掛程式是只列為另一個外掛程式的依賴項）。 在未來的主要發行版本中，將刪除 `window.open` 鉤。 一直至從該外掛程式鉤子後，應用程式可以手動還原預設行為：
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-雖然 `window.open` 在全球範圍內，InAppBrowser 不可用直到 `deviceready` 事件之後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## 安裝
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-如果您希望所有頁面載入中您的應用程式要通過 InAppBrowser，你可以簡單地在初始化過程中鉤 `window.open`。舉個例子：
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-在新的 `InAppBrowser` 實例，當前的瀏覽器實例或系統瀏覽器中打開的 URL。
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-  * **url**： 要載入*（字串）*的 URL。調用 `encodeURI()` 這個如果 URL 包含 Unicode 字元。
-
-  * **target**： 目標在其中載入的 URL，可選參數，預設值為 `_self` 。*（字串）*
-    
-      * `_self`： 打開在科爾多瓦 web 視圖如果 URL 是在白名單中，否則它在打開`InAppBrowser`.
-      * `_blank`： 在打開`InAppBrowser`.
-      * `_system`： 在該系統的 web 瀏覽器中打開。
-
-  * **options**： 選項為 `InAppBrowser` 。可選，拖欠到： `location=yes` 。*（字串）*
-    
-    `options`字串必須不包含任何空白的空間，和必須用逗號分隔每個功能的名稱/值對。 功能名稱區分大小寫。 所有平臺都支援下面的值：
-    
-      * **location**： 設置為 `yes` 或 `no` ，打開 `InAppBrowser` 的位置欄打開或關閉。
-    
-    Android 系統只有：
-    
-      * **hidden**： 將設置為 `yes` ，創建瀏覽器和載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或設置為 `no` （預設值），有的瀏覽器打開，然後以正常方式載入。
-      * **clearcache**： 將設置為 `yes` 有瀏覽器的 cookie 清除緩存之前打開新視窗
-      * **clearsessioncache**： 將設置為 `yes` 有會話 cookie 緩存清除之前打開新視窗
-      * **zoom**: 設置為`yes`，顯示 Android 瀏覽器的縮放控制項，設置為`no`，以隱藏它們。 `預設值是`.
-      * **hardwareback**: 設置為`yes`要使用硬體後退按鈕通過`InAppBrowser`的歷史向後導航。 如果沒有前一頁， `InAppBrowser`將會關閉。 預設值是的`yes`所以你必須將其設置為`no`，如果你想要的後退按鈕，只需關閉 InAppBrowser。
-    
-    只有 iOS：
-    
-      * **closebuttoncaption**: 設置為一個字串，以用作**做**按鈕的標題。請注意您需要對此值進行當地語系化你自己。
-      * **disallowoverscroll**： 將設置為 `yes` 或 `no` （預設值是 `no` ）。打開/關閉的 UIWebViewBounce 屬性。
-      * **hidden**： 將設置為 `yes` ，創建瀏覽器和載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或設置為 `no` （預設值），有的瀏覽器打開，然後以正常方式載入。
-      * **clearcache**： 將設置為 `yes` 有瀏覽器的 cookie 清除緩存之前打開新視窗
-      * **clearsessioncache**： 將設置為 `yes` 有會話 cookie 緩存清除之前打開新視窗
-      * **toolbar**： 設置為 `yes` 或 `no` ，為 InAppBrowser （預設為打開或關閉工具列`yes`)
-      * **enableViewportScale**： 將設置為 `yes` 或 `no` ，防止通過 meta 標記 （預設為縮放的視區`no`).
-      * **mediaPlaybackRequiresUserAction**： 將設置為 `yes` 或 `no` ，防止 HTML5 音訊或視頻從 autoplaying （預設為`no`).
-      * **allowInlineMediaPlayback**： 將設置為 `yes` 或 `no` ，讓線在 HTML5 播放媒體，在瀏覽器視窗中，而不是特定于設備播放介面內顯示。 HTML 的 `video` 元素還必須包括 `webkit-playsinline` 屬性 （預設為`no`)
-      * **keyboardDisplayRequiresUserAction**： 將設置為 `yes` 或 `no` 時，要打開鍵盤表單元素接收焦點通過 JavaScript 的 `focus()` 調用 （預設為`yes`).
-      * **suppressesIncrementalRendering**： 將設置為 `yes` 或 `no` 等待，直到所有新查看的內容正在呈現 （預設為前收到`no`).
-      * **presentationstyle**： 將設置為 `pagesheet` ， `formsheet` 或 `fullscreen` 來設置[演示文稿樣式](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle)(預設為`fullscreen`).
-      * **transitionstyle**： 將設置為 `fliphorizontal` ， `crossdissolve` 或 `coververtical` 設置[過渡樣式](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle)(預設為`coververtical`).
-      * **toolbarposition**： 將設置為 `top` 或 `bottom` （預設值是 `bottom` ）。使工具列，則在頂部或底部的視窗。
-    
-    僅限 Windows：
-    
-      * **hidden**： 將設置為 `yes` ，創建瀏覽器和載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或設置為 `no` （預設值），有的瀏覽器打開，然後以正常方式載入。
-      * **fullscreen**: 設置為`yes`，以創建無邊框的瀏覽器控制項。 請注意，如果**location=no**同時指定，則將呈現給使用者到密切 IAB 視窗沒有控制。
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * 黑莓 10
-  * 火狐瀏覽器作業系統
-  * iOS
-  * Windows 8 和 8.1
-  * Windows Phone 7 和 8
-  * 瀏覽器
-
-### 示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### 火狐瀏覽器作業系統的怪癖
-
-外掛程式不會強制任何設計是需要添加一些 CSS 規則，如果打開與 `target=_blank`。規則 》 可能看起來像這些
-
-```css
-.inAppBrowserWrap {
-  background-color: rgba(0,0,0,0.75);
-  color: rgba(235,235,235,1.0);
-}
-.inAppBrowserWrap menu {
-  overflow: auto;
-  list-style-type: none;
-  padding-left: 0;
-}
-.inAppBrowserWrap menu li {
-  font-size: 25px;
-  height: 25px;
-  float: left;
-  margin: 0 10px;
-  padding: 3px 10px;
-  text-decoration: none;
-  color: #ccc;
-  display: block;
-  background: rgba(30,30,30,0.50);
-}
-.inAppBrowserWrap menu li.disabled {
-    color: #777;
-}
-```
-
-### Windows 的怪癖
-
-類似于 Firefox OS IAB 視窗視覺行為可以重寫通過`inAppBrowserWrap`/`inAppBrowserWrapFullscreen`的 CSS 類
-
-### 瀏覽器的怪癖
-
-  * 外掛程式是通過 iframe，執行
-
-  * 未實現導航歷史記錄 (在 LocationBar 的`回顧`與`展望`按鈕)。
-
-## InAppBrowser
-
-對 `科爾多瓦的調用返回的物件。InAppBrowser.open`.
-
-### 方法
-
-  * addEventListener
-  * removeEventListener
-  * close
-  * show
-  * executeScript
-  * insertCSS
-
-## addEventListener
-
-> 為事件添加一個攔截器`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-  * **eventname**： 事件偵聽*（字串）*
-    
-      * **loadstart**： 當觸發事件 `InAppBrowser` 開始載入一個 URL。
-      * **loadstop**： 當觸發事件 `InAppBrowser` 完成載入一個 URL。
-      * **loaderror**： 當觸發事件 `InAppBrowser` 載入 URL 時遇到錯誤。
-      * **exit**： 當觸發事件 `InAppBrowser` 關閉視窗。
-
-  * **callback**： 執行時觸發該事件的函數。該函數通過 `InAppBrowserEvent` 物件作為參數。
-
-### InAppBrowserEvent 屬性
-
-  * **type**： eventname，或者 `loadstart` ， `loadstop` ， `loaderror` ，或 `exit` 。*（字串）*
-
-  * **url**: 已載入的 URL。*（字串）*
-
-  * **code**： 僅中的情況的錯誤代碼 `loaderror` 。*（人數）*
-
-  * **message**： 該錯誤訊息，只有在的情況下 `loaderror` 。*（字串）*
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * iOS
-  * Windows 8 和 8.1
-  * Windows Phone 7 和 8
-  * 瀏覽器
-
-### 瀏覽器的怪癖
-
-`loadstart`和`loaderror`的事件不會被觸發。
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> 移除的事件攔截器`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-  * **eventname**： 要停止偵聽的事件。*（字串）*
-    
-      * **loadstart**： 當觸發事件 `InAppBrowser` 開始載入一個 URL。
-      * **loadstop**： 當觸發事件 `InAppBrowser` 完成載入一個 URL。
-      * **loaderror**： 當觸發事件 `InAppBrowser` 遇到錯誤載入一個 URL。
-      * **exit**： 當觸發事件 `InAppBrowser` 關閉視窗。
-
-  * **callback**: 要在事件觸發時執行的函數。該函數通過 `InAppBrowserEvent` 物件。
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * iOS
-  * Windows 8 和 8.1
-  * Windows Phone 7 和 8
-  * 瀏覽器
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 關閉 `InAppBrowser` 視窗。
-
-    ref.close();
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * 火狐瀏覽器作業系統
-  * iOS
-  * Windows 8 和 8.1
-  * Windows Phone 7 和 8
-  * 瀏覽器
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 顯示打開了隱藏的 InAppBrowser 視窗。調用這沒有任何影響，如果 InAppBrowser 是已經可見。
-
-    ref.show();
-    
-
-  * **ref**： InAppBrowser 視窗 (參考`InAppBrowser`)
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * iOS
-  * Windows 8 和 8.1
-  * 瀏覽器
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> 注入到 JavaScript 代碼 `InAppBrowser` 視窗
-
-    ref.executeScript(details, callback);
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-  * **injectDetails**: 要運行的腳本的詳細資訊或指定 `file` 或 `code` 的關鍵。*（物件）*
-    
-      * **檔**： 腳本的 URL 來注入。
-      * **代碼**： 要注入腳本的文本。
-
-  * **回檔**： 執行後注入的 JavaScript 代碼的函數。
-    
-      * 如果插入的腳本的類型 `code` ，回檔執行使用單個參數，這是該腳本的傳回值，裹在 `Array` 。 對於多行腳本，這是最後一條語句或最後計算的運算式的傳回值。
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * iOS
-  * Windows 8 和 8.1
-  * 瀏覽器
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-### 瀏覽器的怪癖
-
-  * 只有**code**關鍵被支援。
-
-### Windows 的怪癖
-
-由於[MSDN 文檔](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx)調用的腳本可以返回唯一字串值，否則該參數，傳遞給**回檔**將是`[null]`.
-
-## insertCSS
-
-> 注入到 CSS `InAppBrowser` 視窗。
-
-    ref.insertCSS(details, callback);
-    
-
-  * **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-  * **injectDetails**: 要運行的腳本的詳細資訊或指定 `file` 或 `code` 的關鍵。*（物件）*
-    
-      * **file**： 樣式表的 URL 來注入。
-      * **code**： 文本樣式表的注入。
-
-  * **callback**： 在 CSS 注射後執行的函數。
-
-### 支援的平臺
-
-  * 亞馬遜火 OS
-  * Android 系統
-  * iOS
-  * Windows
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
\ No newline at end of file
diff --git a/doc/zh/index.md b/doc/zh/index.md
deleted file mode 100644
index c12c046..0000000
--- a/doc/zh/index.md
+++ /dev/null
@@ -1,357 +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-inappbrowser
-
-這個外掛程式提供了一個 web 瀏覽器視圖，顯示在調用 `cordova.InAppBrowser.open()`.
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    
-
-`cordova.InAppBrowser.open()` 函數被定義為一個臨時替代 `window.open ()` 函數。 現有 `window.open ()` 調用，可以通過替換 window.open 使用 InAppBrowser 視窗：
-
-    window.open = cordova.InAppBrowser.open;
-    
-
-InAppBrowser 視窗像一個標準的 web 瀏覽器中，並且無法訪問科爾多瓦 Api。 為此，建議 InAppBrowser 如果您需要載入協力廠商 （不可信） 的內容，而不是載入，進入主要的科爾多瓦 web 視圖。 InAppBrowser 是不受白名單中，也不在系統瀏覽器中打開的連結。
-
-InAppBrowser 預設情況下它自己的 GUI 控制項為使用者提供 （後退、 前進、 完成）。
-
-為向後相容性，此外掛程式還鉤 `window.open`。 然而，`window.open` 外掛程式安裝鉤子可以有副作用 （尤其是如果這個外掛程式是只列為另一個外掛程式的依賴項）。 在未來的主要發行版本中，將刪除 `window.open` 鉤。 一直至從該外掛程式鉤子後，應用程式可以手動還原預設行為：
-
-    delete window.open // Reverts the call back to it's prototype's default
-    
-
-雖然 `window.open` 在全球範圍內，InAppBrowser 不可用直到 `deviceready` 事件之後。
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log("window.open works well");
-    }
-    
-
-## 安裝
-
-    cordova plugin add cordova-plugin-inappbrowser
-    
-
-如果您希望所有頁面載入中您的應用程式要通過 InAppBrowser，你可以簡單地在初始化過程中鉤 `window.open`。舉個例子：
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        window.open = cordova.InAppBrowser.open;
-    }
-    
-
-## cordova.InAppBrowser.open
-
-在新的 `InAppBrowser` 實例，當前的瀏覽器實例或系統瀏覽器中打開的 URL。
-
-    var ref = cordova.InAppBrowser.open(url, target, options);
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-*   **url**： 要載入*（字串）*的 URL。調用 `encodeURI()` 這個如果 URL 包含 Unicode 字元。
-
-*   **target**： 目標在其中載入的 URL，可選參數，預設值為 `_self` 。*（字串）*
-    
-    *   `_self`： 打開在科爾多瓦 web 視圖如果 URL 是在白名單中，否則它在打開`InAppBrowser`.
-    *   `_blank`： 在打開`InAppBrowser`.
-    *   `_system`： 在該系統的 web 瀏覽器中打開。
-
-*   **options**： 選項為 `InAppBrowser` 。可選，拖欠到： `location=yes` 。*（字串）*
-    
-    `options`字串必須不包含任何空白的空間，和必須用逗號分隔每個功能的名稱/值對。 功能名稱區分大小寫。 所有平臺都支援下面的值：
-    
-    *   **location**： 設置為 `yes` 或 `no` ，打開 `InAppBrowser` 的位置欄打開或關閉。
-    
-    Android 系統只有：
-    
-    *   **hidden**： 將設置為 `yes` ，創建瀏覽器和載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或設置為 `no` （預設值），有的瀏覽器打開，然後以正常方式載入。
-    *   **clearcache**： 將設置為 `yes` 有瀏覽器的 cookie 清除緩存之前打開新視窗
-    *   **clearsessioncache**： 將設置為 `yes` 有會話 cookie 緩存清除之前打開新視窗
-    
-    只有 iOS：
-    
-    *   **closebuttoncaption**: 設置為一個字串，以用作**做**按鈕的標題。請注意您需要對此值進行當地語系化你自己。
-    *   **disallowoverscroll**： 將設置為 `yes` 或 `no` （預設值是 `no` ）。打開/關閉的 UIWebViewBounce 屬性。
-    *   **hidden**： 將設置為 `yes` ，創建瀏覽器和載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或設置為 `no` （預設值），有的瀏覽器打開，然後以正常方式載入。
-    *   **clearcache**： 將設置為 `yes` 有瀏覽器的 cookie 清除緩存之前打開新視窗
-    *   **clearsessioncache**： 將設置為 `yes` 有會話 cookie 緩存清除之前打開新視窗
-    *   **toolbar**： 設置為 `yes` 或 `no` ，為 InAppBrowser （預設為打開或關閉工具列`yes`)
-    *   **enableViewportScale**： 將設置為 `yes` 或 `no` ，防止通過 meta 標記 （預設為縮放的視區`no`).
-    *   **mediaPlaybackRequiresUserAction**： 將設置為 `yes` 或 `no` ，防止 HTML5 音訊或視頻從 autoplaying （預設為`no`).
-    *   **allowInlineMediaPlayback**： 將設置為 `yes` 或 `no` ，讓線在 HTML5 播放媒體，在瀏覽器視窗中，而不是特定于設備播放介面內顯示。 HTML 的 `video` 元素還必須包括 `webkit-playsinline` 屬性 （預設為`no`)
-    *   **keyboardDisplayRequiresUserAction**： 將設置為 `yes` 或 `no` 時，要打開鍵盤表單元素接收焦點通過 JavaScript 的 `focus()` 調用 （預設為`yes`).
-    *   **suppressesIncrementalRendering**： 將設置為 `yes` 或 `no` 等待，直到所有新查看的內容正在呈現 （預設為前收到`no`).
-    *   **presentationstyle**： 將設置為 `pagesheet` ， `formsheet` 或 `fullscreen` 來設置[演示文稿樣式][1](預設為`fullscreen`).
-    *   **transitionstyle**： 將設置為 `fliphorizontal` ， `crossdissolve` 或 `coververtical` 設置[過渡樣式][2](預設為`coververtical`).
-    *   **toolbarposition**： 將設置為 `top` 或 `bottom` （預設值是 `bottom` ）。使工具列，則在頂部或底部的視窗。
-    
-    僅限 Windows：
-    
-    *   **hidden**： 將設置為 `yes` ，創建瀏覽器並載入頁面，但不是顯示它。 載入完成時，將觸發 loadstop 事件。 省略或被設置為 `no` （預設值），有的瀏覽器打開，以正常方式載入。
-
- [1]: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalPresentationStyle
- [2]: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/modalTransitionStyle
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   黑莓 10
-*   火狐瀏覽器的作業系統
-*   iOS
-*   Windows 8 和 8.1
-*   Windows Phone 7 和 8
-
-### 示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
-    
-
-### 火狐瀏覽器作業系統的怪癖
-
-外掛程式不會強制任何設計是需要添加一些 CSS 規則，如果打開與 `target=_blank`。規則 》 可能看起來像這些
-
-     css
-    .inAppBrowserWrap {
-      background-color: rgba(0,0,0,0.75);
-      color: rgba(235,235,235,1.0);
-    }
-    .inAppBrowserWrap menu {
-      overflow: auto;
-      list-style-type: none;
-      padding-left: 0;
-    }
-    .inAppBrowserWrap menu li {
-      font-size: 25px;
-      height: 25px;
-      float: left;
-      margin: 0 10px;
-      padding: 3px 10px;
-      text-decoration: none;
-      color: #ccc;
-      display: block;
-      background: rgba(30,30,30,0.50);
-    }
-    .inAppBrowserWrap menu li.disabled {
-        color: #777;
-    }
-    
-
-## InAppBrowser
-
-對 `科爾多瓦的調用返回的物件。InAppBrowser.open`.
-
-### 方法
-
-*   addEventListener
-*   removeEventListener
-*   close
-*   show
-*   executeScript
-*   insertCSS
-
-## addEventListener
-
-> 為事件添加一個攔截器`InAppBrowser`.
-
-    ref.addEventListener(eventname, callback);
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-*   **eventname**： 事件偵聽*（字串）*
-    
-    *   **loadstart**： 當觸發事件 `InAppBrowser` 開始載入一個 URL。
-    *   **loadstop**： 當觸發事件 `InAppBrowser` 完成載入一個 URL。
-    *   **loaderror**： 當觸發事件 `InAppBrowser` 載入 URL 時遇到錯誤。
-    *   **exit**： 當觸發事件 `InAppBrowser` 關閉視窗。
-
-*   **callback**： 執行時觸發該事件的函數。該函數通過 `InAppBrowserEvent` 物件作為參數。
-
-### InAppBrowserEvent 屬性
-
-*   **type**： eventname，或者 `loadstart` ， `loadstop` ， `loaderror` ，或 `exit` 。*（字串）*
-
-*   **url**: 已載入的 URL。*（字串）*
-
-*   **code**： 僅中的情況的錯誤代碼 `loaderror` 。*（人數）*
-
-*   **message**： 該錯誤訊息，只有在的情況下 `loaderror` 。*（字串）*
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   iOS
-*   Windows 8 和 8.1
-*   Windows Phone 7 和 8
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstart', function(event) { alert(event.url); });
-    
-
-## removeEventListener
-
-> 移除的事件攔截器`InAppBrowser`.
-
-    ref.removeEventListener(eventname, callback);
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-*   **eventname**： 要停止偵聽的事件。*（字串）*
-    
-    *   **loadstart**： 當觸發事件 `InAppBrowser` 開始載入一個 URL。
-    *   **loadstop**： 當觸發事件 `InAppBrowser` 完成載入一個 URL。
-    *   **loaderror**： 當觸發事件 `InAppBrowser` 遇到錯誤載入一個 URL。
-    *   **exit**： 當觸發事件 `InAppBrowser` 關閉視窗。
-
-*   **callback**: 要在事件觸發時執行的函數。該函數通過 `InAppBrowserEvent` 物件。
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   iOS
-*   Windows 8 和 8.1
-*   Windows Phone 7 和 8
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    var myCallback = function(event) { alert(event.url); }
-    ref.addEventListener('loadstart', myCallback);
-    ref.removeEventListener('loadstart', myCallback);
-    
-
-## close
-
-> 關閉 `InAppBrowser` 視窗。
-
-    ref.close();
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   火狐瀏覽器的作業系統
-*   iOS
-*   Windows 8 和 8.1
-*   Windows Phone 7 和 8
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.close();
-    
-
-## show
-
-> 顯示打開了隱藏的 InAppBrowser 視窗。調用這沒有任何影響，如果 InAppBrowser 是已經可見。
-
-    ref.show();
-    
-
-*   **ref**： InAppBrowser 視窗 (參考`InAppBrowser`)
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   iOS
-*   Windows 8 和 8.1
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
-    // some time later...
-    ref.show();
-    
-
-## executeScript
-
-> 注入到 JavaScript 代碼 `InAppBrowser` 視窗
-
-    ref.executeScript(details, callback);
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗。*() InAppBrowser*
-
-*   **injectDetails**: 要運行的腳本的詳細資訊或指定 `file` 或 `code` 的關鍵。*（物件）*
-    
-    *   **檔**： 腳本的 URL 來注入。
-    *   **代碼**： 要注入腳本的文本。
-
-*   **回檔**： 執行後注入的 JavaScript 代碼的函數。
-    
-    *   如果插入的腳本的類型 `code` ，回檔執行使用單個參數，這是該腳本的傳回值，裹在 `Array` 。 對於多行腳本，這是最後一條語句或最後計算的運算式的傳回值。
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   iOS
-*   Windows 8 和 8.1
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.executeScript({file: "myscript.js"});
-    });
-    
-
-## insertCSS
-
-> 注入到 CSS `InAppBrowser` 視窗。
-
-    ref.insertCSS(details, callback);
-    
-
-*   **ref**： 參考 `InAppBrowser` 視窗*(InAppBrowser)*
-
-*   **injectDetails**: 要運行的腳本的詳細資訊或指定 `file` 或 `code` 的關鍵。*（物件）*
-    
-    *   **file**： 樣式表的 URL 來注入。
-    *   **code**： 文本樣式表的注入。
-
-*   **callback**： 在 CSS 注射後執行的函數。
-
-### 支援的平臺
-
-*   亞馬遜火 OS
-*   Android 系統
-*   iOS
-
-### 快速的示例
-
-    var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
-    ref.addEventListener('loadstop', function() {
-        ref.insertCSS({file: "mystyles.css"});
-    });
diff --git a/package.json b/package.json
index f3be23f..a743735 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cordova-plugin-inappbrowser",
-  "version": "3.1.0-dev",
+  "version": "3.1.1-dev",
   "description": "Cordova InAppBrowser Plugin",
   "types": "./types/index.d.ts",
   "cordova": {
@@ -18,7 +18,7 @@
     "url": "https://github.com/apache/cordova-plugin-inappbrowser"
   },
   "bugs": {
-    "url": "https://issues.apache.org/jira/browse/CB"
+    "url": "https://github.com/apache/cordova-plugin-inappbrowser/issues"
   },
   "keywords": [
     "cordova",
diff --git a/plugin.xml b/plugin.xml
index 8775d61..6209002 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -20,14 +20,14 @@
 
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
            id="cordova-plugin-inappbrowser"
-      version="3.1.0-dev">
+      version="3.1.1-dev">
 
     <name>InAppBrowser</name>
     <description>Cordova InAppBrowser Plugin</description>
     <license>Apache 2.0</license>
     <keywords>cordova,in,app,browser,inappbrowser</keywords>
-    <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git</repo>
-    <issue>https://issues.apache.org/jira/browse/CB/component/12320641</issue>
+    <repo>https://github.com/apache/cordova-plugin-inappbrowser</repo>
+    <issue>https://github.com/apache/cordova-plugin-inappbrowser/issues</issue>
 
     <engines>
       <engine name="cordova" version=">=3.1.0" /><!-- Needs cordova/urlutil -->
@@ -49,7 +49,7 @@
         <source-file src="src/android/InAppBrowserDialog.java" target-dir="src/org/apache/cordova/inappbrowser" />
         <source-file src="src/android/InAppChromeClient.java" target-dir="src/org/apache/cordova/inappbrowser" />
 
-        <!--  drawable src/android/resources -->
+        <!-- drawable src/android/resources -->
         <resource-file src="src/android/res/drawable-hdpi/ic_action_next_item.png" target="res/drawable-hdpi/ic_action_next_item.png" />
         <resource-file src="src/android/res/drawable-mdpi/ic_action_next_item.png" target="res/drawable-mdpi/ic_action_next_item.png" />
         <resource-file src="src/android/res/drawable-xhdpi/ic_action_next_item.png" target="res/drawable-xhdpi/ic_action_next_item.png" />
@@ -101,7 +101,6 @@
 	    <header-file src="src/ios/CDVWKInAppBrowserUIDelegate.h" />
 	    <source-file src="src/ios/CDVWKInAppBrowserUIDelegate.m" />
 
-
 	    <framework src="CoreGraphics.framework" />
     </platform>
 
@@ -121,7 +120,7 @@
         <source-file src="src/osx/CDVInAppBrowser.m" />
     </platform>
 
-    <!-- windows universal apps (Windows 8.1, Windows Phone 8.1, Windows 8.0) -->
+    <!-- windows -->
     <platform name="windows">
         <js-module src="www/inappbrowser.js" name="inappbrowser">
             <clobbers target="cordova.InAppBrowser.open" />
diff --git a/src/android/InAppBrowser.java b/src/android/InAppBrowser.java
index 895b543..0603302 100644
--- a/src/android/InAppBrowser.java
+++ b/src/android/InAppBrowser.java
@@ -110,6 +110,7 @@
     private static final String TOOLBAR_COLOR = "toolbarcolor";
     private static final String CLOSE_BUTTON_CAPTION = "closebuttoncaption";
     private static final String CLOSE_BUTTON_COLOR = "closebuttoncolor";
+    private static final String LEFT_TO_RIGHT = "lefttoright";
     private static final String HIDE_NAVIGATION = "hidenavigationbuttons";
     private static final String NAVIGATION_COLOR = "navigationbuttoncolor";
     private static final String HIDE_URL = "hideurlbar";
@@ -138,6 +139,7 @@
     private final static int FILECHOOSER_REQUESTCODE_LOLLIPOP = 2;
     private String closeButtonCaption = "";
     private String closeButtonColor = "";
+    private boolean leftToRight = false;
     private int toolbarColor = android.graphics.Color.LTGRAY;
     private boolean hideNavigationButtons = false;
     private String navigationButtonColor = "";
@@ -146,6 +148,7 @@
     private String footerColor = "";
     private String beforeload = "";
     private String[] allowedSchemes;
+    private InAppBrowserClient currentClient;
 
     /**
      * Executes the request and returns PluginResult.
@@ -262,7 +265,12 @@
                 @SuppressLint("NewApi")
                 @Override
                 public void run() {
-                    ((InAppBrowserClient)inAppWebView.getWebViewClient()).waitForBeforeload = false;
+                    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
+                        currentClient.waitForBeforeload = false;
+                        inAppWebView.setWebViewClient(currentClient);
+                    } else {
+                        ((InAppBrowserClient)inAppWebView.getWebViewClient()).waitForBeforeload = false;
+                    }
                     inAppWebView.loadUrl(url);
                 }
             });
@@ -679,6 +687,10 @@
             if (closeButtonColorSet != null) {
                 closeButtonColor = closeButtonColorSet;
             }
+            String leftToRightSet = features.get(LEFT_TO_RIGHT);
+            if (leftToRightSet != null) {
+                leftToRight = leftToRightSet.equals("yes") ? true : false;
+            }
             String toolbarColorSet = features.get(TOOLBAR_COLOR);
             if (toolbarColorSet != null) {
                 toolbarColor = android.graphics.Color.parseColor(toolbarColorSet);
@@ -746,7 +758,8 @@
                 }
 
                 RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
-                closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+                if (leftToRight) closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
+                else closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                 _close.setLayoutParams(closeLayoutParams);
 
                 if (Build.VERSION.SDK_INT >= 16)
@@ -777,6 +790,7 @@
                 dialog = new InAppBrowserDialog(cordova.getActivity(), android.R.style.Theme_NoTitleBar);
                 dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog;
                 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+                dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                 dialog.setCancelable(true);
                 dialog.setInAppBroswer(getInAppBrowser());
 
@@ -790,15 +804,22 @@
                 toolbar.setBackgroundColor(toolbarColor);
                 toolbar.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44)));
                 toolbar.setPadding(this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2));
-                toolbar.setHorizontalGravity(Gravity.LEFT);
+                if (leftToRight) {
+                    toolbar.setHorizontalGravity(Gravity.LEFT);
+                } else {
+                    toolbar.setHorizontalGravity(Gravity.RIGHT);
+                }
                 toolbar.setVerticalGravity(Gravity.TOP);
 
                 // Action Button Container layout
                 RelativeLayout actionButtonContainer = new RelativeLayout(cordova.getActivity());
-                actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+                RelativeLayout.LayoutParams actionButtonLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+                if (leftToRight) actionButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+                else actionButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
+                actionButtonContainer.setLayoutParams(actionButtonLayoutParams);
                 actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
                 actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
-                actionButtonContainer.setId(Integer.valueOf(1));
+                actionButtonContainer.setId(leftToRight ? Integer.valueOf(5) : Integer.valueOf(1));
 
                 // Back button
                 ImageButton back = new ImageButton(cordova.getActivity());
@@ -878,7 +899,8 @@
 
 
                 // Header Close/Done button
-                View close = createCloseButton(5);
+                int closeButtonId = leftToRight ? 1 : 5;
+                View close = createCloseButton(closeButtonId);
                 toolbar.addView(close);
 
                 // Footer
@@ -948,8 +970,8 @@
                     }
 
                 });
-                WebViewClient client = new InAppBrowserClient(thatWebView, edittext, beforeload);
-                inAppWebView.setWebViewClient(client);
+                currentClient = new InAppBrowserClient(thatWebView, edittext, beforeload);
+                inAppWebView.setWebViewClient(currentClient);
                 WebSettings settings = inAppWebView.getSettings();
                 settings.setJavaScriptEnabled(true);
                 settings.setJavaScriptCanOpenWindowsAutomatically(true);
@@ -1184,7 +1206,9 @@
             boolean useBeforeload = false;
             String errorMessage = null;
 
-            if(beforeload.equals("yes")
+            if (beforeload.equals("yes") && method == null) {
+                useBeforeload = true;
+            }else if(beforeload.equals("yes")
                     //TODO handle POST requests then this condition can be removed:
                     && !method.equals("POST"))
             {
diff --git a/src/android/InAppChromeClient.java b/src/android/InAppChromeClient.java
index a2145e6..fe5dd34 100644
--- a/src/android/InAppChromeClient.java
+++ b/src/android/InAppChromeClient.java
@@ -104,7 +104,7 @@
             if(defaultValue.startsWith("gap-iab://")) {
                 PluginResult scriptResult;
                 String scriptCallbackId = defaultValue.substring(10);
-                if (scriptCallbackId.startsWith("InAppBrowser")) {
+                if (scriptCallbackId.matches("^InAppBrowser[0-9]{1,10}$")) {
                     if(message == null || message.length() == 0) {
                         scriptResult = new PluginResult(PluginResult.Status.OK, new JSONArray());
                     } else {
@@ -118,9 +118,14 @@
                     result.confirm("");
                     return true;
                 }
+                else {
+                    // Anything else that doesn't look like InAppBrowser0123456789 should end up here
+                    LOG.w(LOG_TAG, "InAppBrowser callback called with invalid callbackId : "+ scriptCallbackId);
+                    result.cancel();
+                    return true;
+                }
             }
-            else
-            {
+            else {
                 // Anything else with a gap: prefix should get this message
                 LOG.w(LOG_TAG, "InAppBrowser does not support Cordova API calls: " + url + " " + defaultValue); 
                 result.cancel();
diff --git a/src/ios/CDVInAppBrowserOptions.h b/src/ios/CDVInAppBrowserOptions.h
index 29fd6e1..d9f46bf 100644
--- a/src/ios/CDVInAppBrowserOptions.h
+++ b/src/ios/CDVInAppBrowserOptions.h
@@ -25,6 +25,7 @@
 @property (nonatomic, assign) BOOL toolbar;
 @property (nonatomic, copy) NSString* closebuttoncaption;
 @property (nonatomic, copy) NSString* closebuttoncolor;
+@property (nonatomic, assign) BOOL lefttoright;
 @property (nonatomic, copy) NSString* toolbarposition;
 @property (nonatomic, copy) NSString* toolbarcolor;
 @property (nonatomic, assign) BOOL toolbartranslucent;
diff --git a/src/ios/CDVInAppBrowserOptions.m b/src/ios/CDVInAppBrowserOptions.m
index 60e45fc..4e62539 100644
--- a/src/ios/CDVInAppBrowserOptions.m
+++ b/src/ios/CDVInAppBrowserOptions.m
@@ -44,6 +44,7 @@
         self.disallowoverscroll = NO;
         self.hidenavigationbuttons = NO;
         self.closebuttoncolor = nil;
+        self.lefttoright = false;
         self.toolbarcolor = nil;
         self.toolbartranslucent = YES;
         self.beforeload = @"";
diff --git a/src/ios/CDVUIInAppBrowser.h b/src/ios/CDVUIInAppBrowser.h
index a545833..0a58d2b 100644
--- a/src/ios/CDVUIInAppBrowser.h
+++ b/src/ios/CDVUIInAppBrowser.h
@@ -84,7 +84,7 @@
 - (void)navigateTo:(NSURL*)url;
 - (void)showLocationBar:(BOOL)show;
 - (void)showToolBar:(BOOL)show : (NSString *) toolbarPosition;
-- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString;
+- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString : (int) buttonIndex;
 
 - (id)initWithUserAgent:(NSString*)userAgent prevUserAgent:(NSString*)prevUserAgent browserOptions: (CDVInAppBrowserOptions*) browserOptions;
 
diff --git a/src/ios/CDVUIInAppBrowser.m b/src/ios/CDVUIInAppBrowser.m
index d2cea12..68070c7 100644
--- a/src/ios/CDVUIInAppBrowser.m
+++ b/src/ios/CDVUIInAppBrowser.m
@@ -172,7 +172,8 @@
     [self.inAppBrowserViewController showLocationBar:browserOptions.location];
     [self.inAppBrowserViewController showToolBar:browserOptions.toolbar :browserOptions.toolbarposition];
     if (browserOptions.closebuttoncaption != nil || browserOptions.closebuttoncolor != nil) {
-        [self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption :browserOptions.closebuttoncolor];
+        int closeButtonIndex = browserOptions.lefttoright ? (browserOptions.hidenavigationbuttons ? 1 : 4) : 0;
+        [self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption :browserOptions.closebuttoncolor :closeButtonIndex];
     }
     // Set Presentation Style
     UIModalPresentationStyle presentationStyle = UIModalPresentationFullScreen; // default
@@ -763,9 +764,15 @@
 
     // Filter out Navigation Buttons if user requests so
     if (_browserOptions.hidenavigationbuttons) {
-      [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];
+        if (_browserOptions.lefttoright) {
+            [self.toolbar setItems:@[flexibleSpaceButton, self.closeButton]];
+        } else {
+            [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];
+        }
+    } else if (_browserOptions.lefttoright) {
+        [self.toolbar setItems:@[self.backButton, fixedSpaceButton, self.forwardButton, flexibleSpaceButton, self.closeButton]];
     } else {
-      [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
+        [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
     }
 
     self.view.backgroundColor = [UIColor grayColor];
@@ -779,7 +786,7 @@
     [self.webView setFrame:frame];
 }
 
-- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString
+- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString : (int) buttonIndex
 {
     // the advantage of using UIBarButtonSystemItemDone is the system will localize it for you automatically
     // but, if you want to set this yourself, knock yourself out (we can't set the title for a system Done button, so we have to create a new one)
@@ -791,7 +798,7 @@
     self.closeButton.tintColor = colorString != nil ? [self colorFromHexString:colorString] : [UIColor colorWithRed:60.0 / 255.0 green:136.0 / 255.0 blue:230.0 / 255.0 alpha:1];
 
     NSMutableArray* items = [self.toolbar.items mutableCopy];
-    [items replaceObjectAtIndex:0 withObject:self.closeButton];
+    [items replaceObjectAtIndex:buttonIndex withObject:self.closeButton];
     [self.toolbar setItems:items];
 }
 
diff --git a/src/ios/CDVWKInAppBrowser.h b/src/ios/CDVWKInAppBrowser.h
index 0015cea..7fddf9c 100644
--- a/src/ios/CDVWKInAppBrowser.h
+++ b/src/ios/CDVWKInAppBrowser.h
@@ -27,6 +27,8 @@
 @class CDVWKInAppBrowserViewController;
 
 @interface CDVWKInAppBrowser : CDVPlugin {
+    UIWindow * tmpWindow;
+
     @private
     NSString* _beforeload;
     BOOL _waitForBeforeload;
@@ -73,7 +75,7 @@
 - (void)navigateTo:(NSURL*)url;
 - (void)showLocationBar:(BOOL)show;
 - (void)showToolBar:(BOOL)show : (NSString *) toolbarPosition;
-- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString;
+- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString : (int) buttonIndex;
 
 - (id)initWithUserAgent:(NSString*)userAgent prevUserAgent:(NSString*)prevUserAgent browserOptions: (CDVInAppBrowserOptions*) browserOptions;
 
diff --git a/src/ios/CDVWKInAppBrowser.m b/src/ios/CDVWKInAppBrowser.m
index 121223f..f937714 100644
--- a/src/ios/CDVWKInAppBrowser.m
+++ b/src/ios/CDVWKInAppBrowser.m
@@ -80,6 +80,7 @@
         NSLog(@"IAB.close() called but it was already closed.");
         return;
     }
+    
     // Things are cleaned up in browserExit.
     [self.inAppBrowserViewController close];
 }
@@ -228,7 +229,8 @@
     [self.inAppBrowserViewController showLocationBar:browserOptions.location];
     [self.inAppBrowserViewController showToolBar:browserOptions.toolbar :browserOptions.toolbarposition];
     if (browserOptions.closebuttoncaption != nil || browserOptions.closebuttoncolor != nil) {
-        [self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption :browserOptions.closebuttoncolor];
+        int closeButtonIndex = browserOptions.lefttoright ? (browserOptions.hidenavigationbuttons ? 1 : 4) : 0;
+        [self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption :browserOptions.closebuttoncolor :closeButtonIndex];
     }
     // Set Presentation Style
     UIModalPresentationStyle presentationStyle = UIModalPresentationFullScreen; // default
@@ -274,7 +276,9 @@
     _waitForBeforeload = ![_beforeload isEqualToString:@""];
     
     [self.inAppBrowserViewController navigateTo:url];
-    [self show:nil withNoAnimate:browserOptions.hidden];
+    if (!browserOptions.hidden) {
+        [self show:nil withNoAnimate:browserOptions.hidden];
+    }
 }
 
 - (void)show:(CDVInvokedUrlCommand*)command{
@@ -313,19 +317,21 @@
     dispatch_async(dispatch_get_main_queue(), ^{
         if (weakSelf.inAppBrowserViewController != nil) {
             float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
-            CGRect frame = [[UIScreen mainScreen] bounds];
-            if(initHidden && osVersion < 11){
-                frame.origin.x = -10000;
+            __strong __typeof(weakSelf) strongSelf = weakSelf;
+            if (!strongSelf->tmpWindow) {
+                CGRect frame = [[UIScreen mainScreen] bounds];
+                if(initHidden && osVersion < 11){
+                   frame.origin.x = -10000;
+                }
+                strongSelf->tmpWindow = [[UIWindow alloc] initWithFrame:frame];
             }
-            
-            UIWindow *tmpWindow = [[UIWindow alloc] initWithFrame:frame];
             UIViewController *tmpController = [[UIViewController alloc] init];
-            
-            [tmpWindow setRootViewController:tmpController];
-            [tmpWindow setWindowLevel:UIWindowLevelNormal];
-            
+
+            [strongSelf->tmpWindow setRootViewController:tmpController];
+            [strongSelf->tmpWindow setWindowLevel:UIWindowLevelNormal];
+
             if(!initHidden || osVersion < 11){
-            [tmpWindow makeKeyAndVisible];
+                [self->tmpWindow makeKeyAndVisible];
             }
             [tmpController presentViewController:nav animated:!noAnimate completion:nil];
         }
@@ -334,6 +340,10 @@
 
 - (void)hide:(CDVInvokedUrlCommand*)command
 {
+    // Set tmpWindow to hidden to make main webview responsive to touch again
+    // https://stackoverflow.com/questions/4544489/how-to-remove-a-uiwindow
+    self->tmpWindow.hidden = YES;
+
     if (self.inAppBrowserViewController == nil) {
         NSLog(@"Tried to hide IAB after it was closed.");
         return;
@@ -573,7 +583,14 @@
     }
     
     if(shouldStart){
-        decisionHandler(WKNavigationActionPolicyAllow);
+        // Fix GH-417 & GH-424: Handle non-default target attribute
+        // Based on https://stackoverflow.com/a/25713070/777265
+        if (!navigationAction.targetFrame){
+            [theWebView loadRequest:navigationAction.request];
+            decisionHandler(WKNavigationActionPolicyCancel);
+        }else{
+            decisionHandler(WKNavigationActionPolicyAllow);
+        }
     }else{
         decisionHandler(WKNavigationActionPolicyCancel);
     }
@@ -682,6 +699,10 @@
     // Set navigationDelegate to nil to ensure no callbacks are received from it.
     self.inAppBrowserViewController.navigationDelegate = nil;
     self.inAppBrowserViewController = nil;
+
+    // Set tmpWindow to hidden to make main webview responsive to touch again
+    // Based on https://stackoverflow.com/questions/4544489/how-to-remove-a-uiwindow
+    self->tmpWindow.hidden = YES;
     
     if (IsAtLeastiOSVersion(@"7.0")) {
         if (_previousStatusBarStyle != -1) {
@@ -778,7 +799,7 @@
     
 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
    if (@available(iOS 11.0, *)) {
-	   [self.webView.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
+       [self.webView.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
 #endif
     
@@ -877,9 +898,15 @@
 
     // Filter out Navigation Buttons if user requests so
     if (_browserOptions.hidenavigationbuttons) {
-      [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];
+        if (_browserOptions.lefttoright) {
+            [self.toolbar setItems:@[flexibleSpaceButton, self.closeButton]];
+        } else {
+            [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];
+        }
+    } else if (_browserOptions.lefttoright) {
+        [self.toolbar setItems:@[self.backButton, fixedSpaceButton, self.forwardButton, flexibleSpaceButton, self.closeButton]];
     } else {
-      [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
+        [self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
     }
     
     self.view.backgroundColor = [UIColor grayColor];
@@ -893,7 +920,7 @@
     [self.webView setFrame:frame];
 }
 
-- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString
+- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString : (int) buttonIndex
 {
     // the advantage of using UIBarButtonSystemItemDone is the system will localize it for you automatically
     // but, if you want to set this yourself, knock yourself out (we can't set the title for a system Done button, so we have to create a new one)
@@ -905,7 +932,7 @@
     self.closeButton.tintColor = colorString != nil ? [self colorFromHexString:colorString] : [UIColor colorWithRed:60.0 / 255.0 green:136.0 / 255.0 blue:230.0 / 255.0 alpha:1];
     
     NSMutableArray* items = [self.toolbar.items mutableCopy];
-    [items replaceObjectAtIndex:0 withObject:self.closeButton];
+    [items replaceObjectAtIndex:buttonIndex withObject:self.closeButton];
     [self.toolbar setItems:items];
 }
 
diff --git a/tests/package.json b/tests/package.json
index 7c05778..631f0fc 100644
--- a/tests/package.json
+++ b/tests/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cordova-plugin-inappbrowser-tests",
-  "version": "1.7.1-dev",
+  "version": "3.1.1-dev",
   "description": "",
   "cordova": {
     "id": "cordova-plugin-inappbrowser-tests",
@@ -10,5 +10,5 @@
     "ecosystem:cordova"
   ],
   "author": "",
-  "license": "Apache 2.0"
+  "license": "Apache-2.0"
 }
diff --git a/tests/plugin.xml b/tests/plugin.xml
index 3afbb95..ec16638 100644
--- a/tests/plugin.xml
+++ b/tests/plugin.xml
@@ -20,7 +20,7 @@
 
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
     id="cordova-plugin-inappbrowser-tests"
-    version="3.0.1-dev">
+    version="3.1.1-dev">
     <name>Cordova InAppBrowser Plugin Tests</name>
     <license>Apache 2.0</license>
 
diff --git a/tests/tests.js b/tests/tests.js
index 1a0619d..b4d2e68 100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@ -136,8 +136,10 @@
                     verifyEvent(evt, 'exit');
                     done();
                 });
-                iabInstance.close();
-                iabInstance = null;
+                iabInstance.addEventListener('loadstop', function (evt) {
+                    iabInstance.close();
+                    iabInstance = null;
+                });
             });
 
             it('inappbrowser.spec.6 should support loaderror event', function (done) {
diff --git a/types/index.d.ts b/types/index.d.ts
index b2dd0da..fa9e529 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -17,7 +17,7 @@
      *                 The options string must not contain any blank space, and each feature's
      *                 name/value pairs must be separated by a comma. Feature names are case insensitive.
      */
-    open(url: string, target?: string, options?: string, replace?: boolean): InAppBrowser;
+    open(url: string, target?: string, options?: string): InAppBrowser;
 }
 
 /**
