diff --git a/HISTORY.md b/HISTORY.md
index a9a8505d7a..37318fe7f2 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -213,6 +213,23 @@
* chore: prepare 15.0 alpha (#4129)
+## 14.0.243 beta 2021-02-12
+
+* change(ios/app): Generate offline help from markdown (#4470)
+* fix(windows): tsysinfox64 not signed (#4486)
+* chore(android/app): Update help formatting and images (#4485)
+* fix(android/engine): Display welcome.htm help within the app (#4477)
+* fix(ios): tutorial's link to "Add a Keyboard" links directly to keyboard search (#4491)
+* feat(linux): Improve output of km-package-list-installed (#4481)
+
+## 14.0.242 beta 2021-02-11
+
+* fix(android/engine): Display online keyboard help (#4462)
+* fix(windows): Track modifier changes in UWP apps (#4468)
+* fix(common/resources): Fix help.keyman.com path for commit (#4469)
+* fix(common): create GitHub comments serially (#4472)
+* fix(linux): Fix dependencies on packages (#4464)
+
## 14.0.241 beta 2021-02-10
* fix(common/resources): Just use master branch for help.keyman.com (#4459)
diff --git a/VERSION.md b/VERSION.md
index e63595d7c0..2c81c0f477 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -1 +1 @@
-15.0.17
\ No newline at end of file
+15.0.17
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeyboardSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeyboardSettingsActivity.java
index 2d0b9bbc25..6094dab1b2 100644
--- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeyboardSettingsActivity.java
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeyboardSettingsActivity.java
@@ -1,9 +1,8 @@
/*
- * Copyright (C) 2019 SIL International. All rights reserved.
+ * Copyright (C) 2019-2021 SIL International. All rights reserved.
*/
package com.tavultesoft.kmapro;
-import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
@@ -11,18 +10,14 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.app.DialogFragment;
-import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
-import androidx.core.content.FileProvider;
-import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ImageView;
@@ -31,21 +26,14 @@ import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
-import android.widget.Toast;
import com.tavultesoft.kmea.ConfirmDialogFragment;
+import com.tavultesoft.kmea.KMHelpFileActivity;
import com.tavultesoft.kmea.KMManager;
import com.tavultesoft.kmea.KMKeyboardDownloaderActivity;
-import com.tavultesoft.kmea.cloud.CloudApiTypes;
-import com.tavultesoft.kmea.cloud.CloudDownloadMgr;
-import com.tavultesoft.kmea.cloud.impl.CloudKeyboardPackageDownloadCallback;
-import com.tavultesoft.kmea.cloud.impl.CloudLexicalPackageDownloadCallback;
-import com.tavultesoft.kmea.data.CloudRepository;
-import com.tavultesoft.kmea.data.Dataset;
import com.tavultesoft.kmea.data.Keyboard;
import com.tavultesoft.kmea.util.FileUtils;
import com.tavultesoft.kmea.util.FileProviderUtils;
-import com.tavultesoft.kmea.util.HelpFile;
import com.tavultesoft.kmea.util.KMLog;
import com.tavultesoft.kmea.util.MapCompat;
import com.tavultesoft.kmea.util.QRCodeUtil;
@@ -177,11 +165,11 @@ public final class KeyboardSettingsActivity extends AppCompatActivity {
} else if (itemTitle.equals(getString(R.string.help_link))) {
if (FileUtils.isWelcomeFile(customHelpLink)) {
// Display local welcome.htm help file, including associated assets
- Intent i = HelpFile.toActionView(context, customHelpLink, packageID);
-
- if (FileProviderUtils.exists(context) || KMManager.isTestMode()) {
- startActivity(i);
- }
+ Intent i = new Intent(context, KMHelpFileActivity.class);
+ // Have to use package ID since we don't store the package name
+ i.putExtra(KMManager.KMKey_PackageID, packageID);
+ i.putExtra(KMManager.KMKey_CustomHelpLink, customHelpLink);
+ startActivity(i);
} else {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(customHelpLink));
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
index 7019af1c94..15200b4bb1 100644
--- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java
@@ -18,6 +18,7 @@ import java.util.List;
import java.util.Map;
import com.tavultesoft.kmea.BaseActivity;
+import com.tavultesoft.kmea.KMHelpFileActivity;
import com.tavultesoft.kmea.KMKeyboardDownloaderActivity;
import com.tavultesoft.kmea.KMManager;
import com.tavultesoft.kmea.KMManager.KeyboardType;
@@ -35,7 +36,6 @@ import com.tavultesoft.kmea.util.FileProviderUtils;
import com.tavultesoft.kmea.util.FileUtils;
import com.tavultesoft.kmea.util.DownloadFileUtils;
import com.tavultesoft.kmea.util.DownloadIntentService;
-import com.tavultesoft.kmea.util.HelpFile;
import com.tavultesoft.kmea.util.KMLog;
import com.tavultesoft.kmea.util.KMPLink;
@@ -967,11 +967,11 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
if (customHelpLink != null && !customHelpLink.isEmpty() &&
packageID != null && !packageID.isEmpty() && FileUtils.isWelcomeFile(customHelpLink)) {
// Display local welcome.htm help file, including associated assets
- Intent i = HelpFile.toActionView(context, customHelpLink, packageID);
-
- if (FileProviderUtils.exists(context)) {
- startActivity(i);
- }
+ Intent i = new Intent(this, KMHelpFileActivity.class);
+ // Have to use packageID since we don't store the package name
+ i.putExtra(KMManager.KMKey_PackageID, packageID);
+ i.putExtra(KMManager.KMKey_CustomHelpLink, customHelpLink);
+ startActivity(i);
}
}
diff --git a/android/KMAPro/kMAPro/src/main/res/values-ann/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-ann/strings.xml
index 1ba8da1447..163349f5fe 100644
--- a/android/KMAPro/kMAPro/src/main/res/values-ann/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values-ann/strings.xml
@@ -105,8 +105,6 @@
Kpekọt isan̄a isibiWop Uwot-nge
-
- Onu me %1$sWop Ikpa-usem
diff --git a/android/KMAPro/kMAPro/src/main/res/values-de-rDE/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-de-rDE/strings.xml
index 71767f4fa8..6fae23d0b9 100644
--- a/android/KMAPro/kMAPro/src/main/res/values-de-rDE/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values-de-rDE/strings.xml
@@ -105,8 +105,6 @@
Entpacken fehlgeschlagenTastatur installieren
-
- Willkommen bei %1$sWörterbuch installieren
diff --git a/android/KMAPro/kMAPro/src/main/res/values-fr-rFR/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-fr-rFR/strings.xml
index e1c788b4e8..106dbc741c 100644
--- a/android/KMAPro/kMAPro/src/main/res/values-fr-rFR/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values-fr-rFR/strings.xml
@@ -107,8 +107,6 @@
Échec de l\'extractionInstaller un clavier
-
- Bienvenue à %1$sInstallez un dictionnaire
diff --git a/android/KMAPro/kMAPro/src/main/res/values-km-rKH/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-km-rKH/strings.xml
index e3a757c63b..2baba5b78f 100644
--- a/android/KMAPro/kMAPro/src/main/res/values-km-rKH/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values-km-rKH/strings.xml
@@ -104,8 +104,6 @@
មិនអាចស្រង់ចេញបានទេដំឡើងក្ដារចុច
-
- ស្វាគមន៍មកកាន់ %1$sដំឡើងបញ្ជីពាក្យ
diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml
index 1285c9f2e7..772d3f0589 100644
--- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml
@@ -174,9 +174,6 @@
Install Keyboard
-
- Welcome to %1$s
-
Install Dictionary
diff --git a/android/KMEA/app/src/main/AndroidManifest.xml b/android/KMEA/app/src/main/AndroidManifest.xml
index aab539f437..fe795afa30 100644
--- a/android/KMEA/app/src/main/AndroidManifest.xml
+++ b/android/KMEA/app/src/main/AndroidManifest.xml
@@ -29,6 +29,12 @@
android:label=""
android:theme="@style/Theme.AppCompat.Light.Dialog">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/layout/titlebar.xml b/android/KMEA/app/src/main/res/layout/titlebar.xml
similarity index 100%
rename from android/KMAPro/kMAPro/src/main/res/layout/titlebar.xml
rename to android/KMEA/app/src/main/res/layout/titlebar.xml
diff --git a/android/KMEA/app/src/main/res/values-ann/strings.xml b/android/KMEA/app/src/main/res/values-ann/strings.xml
index 5a73b08c3d..11c7ba2c31 100644
--- a/android/KMEA/app/src/main/res/values-ann/strings.xml
+++ b/android/KMEA/app/src/main/res/values-ann/strings.xml
@@ -63,6 +63,8 @@
[aya] %1$s Gwuku iman̄ yi kè òbọkọ\nuwot-nge yi me ofifi okwukwut
+
+ Onu me %1$sWèek ikpa-usem òje me lek bọkọ tap
diff --git a/android/KMEA/app/src/main/res/values-de-rDE/strings.xml b/android/KMEA/app/src/main/res/values-de-rDE/strings.xml
index b9a06bd466..452d732bf2 100644
--- a/android/KMEA/app/src/main/res/values-de-rDE/strings.xml
+++ b/android/KMEA/app/src/main/res/values-de-rDE/strings.xml
@@ -63,6 +63,8 @@
[neu] %1$s Scannen Sie diesen Code, um diese\nTastatur auf einem anderen Gerät zu laden
+
+ Willkommen bei %1$sSuche nach zugehörigem Wörterbuch zum Herunterladen
diff --git a/android/KMEA/app/src/main/res/values-fr-rFR/strings.xml b/android/KMEA/app/src/main/res/values-fr-rFR/strings.xml
index b5d6816e82..58e4805793 100644
--- a/android/KMEA/app/src/main/res/values-fr-rFR/strings.xml
+++ b/android/KMEA/app/src/main/res/values-fr-rFR/strings.xml
@@ -63,6 +63,8 @@
[nouveau] %1$s Scannez ce code pour charger ce clavier\nsur un autre appareil
+
+ Bienvenue à %1$sVérification du dictionnaire associé à télécharger
diff --git a/android/KMEA/app/src/main/res/values-km-rKH/strings.xml b/android/KMEA/app/src/main/res/values-km-rKH/strings.xml
index 42a7a39dfc..f6b833b134 100644
--- a/android/KMEA/app/src/main/res/values-km-rKH/strings.xml
+++ b/android/KMEA/app/src/main/res/values-km-rKH/strings.xml
@@ -60,6 +60,8 @@
លុបក្ដារចុច[ថ្មី] %1$s
+
+ ស្វាគមន៍មកកាន់ %1$s ស្កេនកូដនេះដើម្បីផ្ទុកក្ដារចុចនេះ\nនៅលើឧបករណ៍ផ្សេង
diff --git a/android/KMEA/app/src/main/res/values/strings.xml b/android/KMEA/app/src/main/res/values/strings.xml
index 43c626951f..982a3cc79b 100644
--- a/android/KMEA/app/src/main/res/values/strings.xml
+++ b/android/KMEA/app/src/main/res/values/strings.xml
@@ -102,6 +102,11 @@
Scan this code to load this\nkeyboard on another device
+
+
+ Welcome to %1$s
+
+
Checking for associated dictionary to download
diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java
index 21fcec27cc..e0e23b58ed 100644
--- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java
+++ b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java
@@ -9,6 +9,7 @@ import android.widget.ListView;
import androidx.test.core.app.ApplicationProvider;
import com.tavultesoft.kmea.KMManager;
+import com.tavultesoft.kmea.KMHelpFileActivity;
import com.tavultesoft.kmea.KeyboardInfoActivity;
import com.tavultesoft.kmea.KeyboardPickerActivity;
import com.tavultesoft.kmea.R;
@@ -183,7 +184,7 @@ public class KeyboardPickerTest {
// check result intent to be a weblink to open
Intent actual2 = Shadows.shadowOf(_info).getNextStartedActivity();
Assert.assertNotNull(actual2);
- Assert.assertEquals(actual2.getAction(),Intent.ACTION_VIEW);
+ Assert.assertEquals("com.tavultesoft.kmea.KMHelpFileActivity", actual2.getComponent().getClassName());
}
finally {
if(_controller2!=null)
diff --git a/android/README.md b/android/README.md
index a1e5b6703b..c1af6669ee 100644
--- a/android/README.md
+++ b/android/README.md
@@ -4,6 +4,7 @@
* Android Studio 4.1+
* Java SE Development Kit 8
* [Node.js](https://nodejs.org/) 8.9+ (for building KeymanWeb)
+* [Pandoc](#Install-Pandoc) for generating offline help
## Install Java
It is recommended to use openJDK because of oracle license issues.
diff --git a/android/build-help.sh b/android/build-help.sh
index 91e6eb5c18..02e236e903 100644
--- a/android/build-help.sh
+++ b/android/build-help.sh
@@ -71,7 +71,7 @@ displayInfo "" \
cd $KEYMAN_ROOT/android/help
-MDLUA="$THIS_DIR/htmlink.lua"
+MDLUA="$KEYMAN_ROOT/resources/build/htmlink.lua"
MD=`find -name "*.md"`
DESTHTM="$THIS_DIR/KMAPro/kMAPro/src/main/assets/info"
diff --git a/android/help/android_images/dist-readme-ap.png b/android/help/android_images/dist-readme-ap.png
deleted file mode 100644
index 1a8d116863..0000000000
Binary files a/android/help/android_images/dist-readme-ap.png and /dev/null differ
diff --git a/android/help/android_images/dist-readme-at.png b/android/help/android_images/dist-readme-at.png
deleted file mode 100644
index d6af1b5c84..0000000000
Binary files a/android/help/android_images/dist-readme-at.png and /dev/null differ
diff --git a/android/help/android_images/dist-welcome-ap.png b/android/help/android_images/dist-welcome-ap.png
deleted file mode 100644
index 8d753979b1..0000000000
Binary files a/android/help/android_images/dist-welcome-ap.png and /dev/null differ
diff --git a/android/help/android_images/dist-welcome-at.png b/android/help/android_images/dist-welcome-at.png
deleted file mode 100644
index 9ef2ce4b37..0000000000
Binary files a/android/help/android_images/dist-welcome-at.png and /dev/null differ
diff --git a/android/help/android_images/dl-success-ap.png b/android/help/android_images/dl-success-ap.png
index 847ba5e4ee..a8ba037415 100644
Binary files a/android/help/android_images/dl-success-ap.png and b/android/help/android_images/dl-success-ap.png differ
diff --git a/android/help/android_images/dl-success-at.png b/android/help/android_images/dl-success-at.png
deleted file mode 100644
index d47af615e8..0000000000
Binary files a/android/help/android_images/dl-success-at.png and /dev/null differ
diff --git a/android/help/android_images/khmer-readme-a.png b/android/help/android_images/khmer-readme-a.png
index 3d6d1799df..6ed6c1ae72 100644
Binary files a/android/help/android_images/khmer-readme-a.png and b/android/help/android_images/khmer-readme-a.png differ
diff --git a/android/help/android_images/khmer-welcome-a.png b/android/help/android_images/khmer-welcome-a.png
index faeeff79e1..63db0dc29c 100644
Binary files a/android/help/android_images/khmer-welcome-a.png and b/android/help/android_images/khmer-welcome-a.png differ
diff --git a/android/help/android_images/settings-language-ap.png b/android/help/android_images/settings-language-ap.png
index c8c678d94e..fdb386571a 100644
Binary files a/android/help/android_images/settings-language-ap.png and b/android/help/android_images/settings-language-ap.png differ
diff --git a/android/help/basic/installing-custom-packages.md b/android/help/basic/installing-custom-packages.md
index 9b3ab55400..dc2971db99 100644
--- a/android/help/basic/installing-custom-packages.md
+++ b/android/help/basic/installing-custom-packages.md
@@ -42,7 +42,7 @@ This will be displayed at the confirmation to install the keyboard package.
If "readme.htm" is not included, a generic page with the package ID and package version will be shown. Click the
**"Install"** button to install the entire keyboard package.
-
+
Step 5) All the keyboards in the package are installed as a group. In this example, the package only has the
"Khmer Angkor" keyboard, so it becomes the active keyboard. For custom dictionary packages, only one dictionary
@@ -51,7 +51,7 @@ will be installed.
If the keyboard package includes Welcome documentation, it will be displayed after the keyboard package is installed.
This documentation helps you to get started using the keyboard.
-
+
Click the **"OK"** button to finish installing the keyboard. You should be able to select it from the Keyman globe
and start typing with it in any app.
diff --git a/android/help/context/menu-phone.md b/android/help/context/menu-phone.md
index 2288644cbb..6db638c3d8 100644
--- a/android/help/context/menu-phone.md
+++ b/android/help/context/menu-phone.md
@@ -2,7 +2,7 @@
title: Keyman for Android (Phone Layout)
---
-| | Keyboard Keys (Keyboard Present) |
+| | Keyboard Keys (Keyboard Present) |
|---|---|
|  | Select another language/keyboard |
|  | Hide the keyboard |
@@ -11,6 +11,11 @@ title: Keyman for Android (Phone Layout)
|  | Shift key. Long press this key to access the CTRL, ALT and CTRLALT keys (which can access additional key layers) |
|  | Keys with a small dot in the top right corner indicate a long press key. Access further functionality by long pressing the key |
|  | Share your text with other apps like Messages, Gmail, or Twitter. Some versions of Android also let you copy your text to the clipboard. |
+
+----
+
+| | Toolbar Icons
+|---|---|
|  | Open the Keyman Browser to use the web in your language |
|  | Open the menu for additional options |
|  | Adjust the font size |
diff --git a/android/help/context/menu-tablet.md b/android/help/context/menu-tablet.md
index 30c46c8f05..cebf6bfda1 100644
--- a/android/help/context/menu-tablet.md
+++ b/android/help/context/menu-tablet.md
@@ -2,7 +2,7 @@
title: Keyman for Android (Tablet Layout)
---
-| | Keyboard Keys (Keyboard Present) |
+| | Keyboard Keys (Keyboard Present) |
|---|---|
|  | Select another language/keyboard |
|  | Hide the keyboard |
@@ -10,6 +10,11 @@ title: Keyman for Android (Tablet Layout)
|  | Return |
|  | Shift key. Long press this key to access the CTRL, ALT and CTRLALT keys (which can access additional key layers) |
|  | Keys with a small dot in the top right corner indicate a long press key. Access further functionality by long pressing the key |
+
+----
+
+| | Toolbar Icons
+|---|---|
|  | Share your text with other atps like Messages, Gmail, or Twitter. Some versions of Android also let you copy your text to the clipboard. |
|  | Open the Keyman Browser to use the web in your language |
|  | Open the menu for additional options |
diff --git a/common/core/web/keyboard-processor/src/text/outputTarget.ts b/common/core/web/keyboard-processor/src/text/outputTarget.ts
index 87c0382ab6..64c12ea5cf 100644
--- a/common/core/web/keyboard-processor/src/text/outputTarget.ts
+++ b/common/core/web/keyboard-processor/src/text/outputTarget.ts
@@ -288,7 +288,8 @@ namespace com.keyman.text {
this.text = text ? text : "";
var defaultLength = this.text._kmwLength();
- this.caretIndex = caretPos ? caretPos : defaultLength;
+ // Ensures that `caretPos == 0` is handled correctly.
+ this.caretIndex = typeof caretPos == "number" ? caretPos : defaultLength;
}
// Clones the state of an existing EditableElement, creating a Mock version of its state.
diff --git a/ios/.gitignore b/ios/.gitignore
index 2f451173f7..ff589919ee 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -17,9 +17,12 @@ engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/keyman-sentr
Keyman 2*
Carthage
+# Generated offline help
+keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources
+
# Explicitly ignores just the SWKeyboard scheme; testing against different
# targets makes a lot of noise.
**/SWKeyboard.scheme
# Ignores exported localization files.
-en.xcloc
\ No newline at end of file
+en.xcloc
diff --git a/ios/README.md b/ios/README.md
index 107ce7725d..dd5ff1afdf 100644
--- a/ios/README.md
+++ b/ios/README.md
@@ -3,13 +3,20 @@
## Prerequisites
* Xcode 9.1
* iOS 8+
+* [Node.js](https://nodejs.org/) 8.9+ (for building the embedded KeymanWeb engine)
* SwiftLint (`brew install swiftlint`)
* Carthage (`brew install carthage`)
-* [Node.js](https://nodejs.org/) 8.9+ (for building KeymanWeb)
+ - If using Xcode 12 or later, note that you may need to use the instructions found at https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md
+ - We plan to update to use of Carthage 0.37's .xcframeworks solution early in the 15.0 development cycle once 14.0 has successfully released, which will negate the need for the workaround mentioned above.
+* Pandoc (`brew install pandoc`)
+ - Used solely to generate offline help.
* Coreutils (`brew install coreutils`)
* sentry-cli (`brew install getsentry/tools/sentry-cli`) to utilize Sentry-based error reporting
* jq (`brew install jq`)
+Note that the `brew` command mentioned above is Homebrew, which may be found at https://brew.sh/.
+While not strictly necessary, it certainly simplifies installing the prerequisites above.
+
## Keyman App
The source for our published iOS Keyman app is found within the **keyman/** subdirectory. This project only contains
diff --git a/ios/build-help.sh b/ios/build-help.sh
index 6dbd8408d6..1049226306 100755
--- a/ios/build-help.sh
+++ b/ios/build-help.sh
@@ -1,47 +1,108 @@
#!/bin/bash
-# Uses the open-source `wget` utility to create an embedding-friendly offline mirror
-# equivalent of the online iOS help.
+# Set sensible script defaults:
+# set -e: Terminate script if a command returns an error
+set -e
+# set -u: Terminate script if an unset variable is used
+set -u
-HELP_ROOT=keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources
+## START STANDARD BUILD SCRIPT INCLUDE
+# adjust relative paths as necessary
+THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")"
+. "$(dirname "$THIS_SCRIPT")/../resources/build/build-utils.sh"
+## END STANDARD BUILD SCRIPT INCLUDE
-VERSION=`cat ../resources/VERSION.md`
+QUIET=0
-# If TIER is set to "alpha", use the previous version. Help is usually only updated during
-# the "beta" process.
-if [ -z $TIER ]; then
- # Prevents an error message on the next check. Also, manual runs will likely be during beta.
- TIER=beta
+. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
+
+THIS_DIR="$(dirname "$THIS_SCRIPT")"
+
+display_usage() {
+ echo "build.sh [--no-clean] target [...target]"
+ echo "Builds help documentation for Keyman for iPhone and iPad"
+ echo "Targets:"
+ echo " * htm or html: convert documentation to html using pandoc"
+ echo
+ echo " --no-clean: don't clean target folder before building"
+}
+
+DO_HTM=false
+DO_CLEAN=true
+
+# Debug flags
+DO_HTM_CONVERSION=true
+
+#
+# Parse args
+#
+
+shopt -s nocasematch
+
+while [[ $# -gt 0 ]] ; do
+ key="$1"
+ case $key in
+ htm | html)
+ DO_HTM=true
+ ;;
+ --no-clean)
+ DO_CLEAN=false
+ ;;
+ *)
+ display_usage
+ exit 1
+ esac
+ shift # past argument
+done
+
+if ! $DO_HTM ; then
+ display_usage
+ exit 1
fi
-if [ $TIER = "alpha" ]; then
- # More readable: (major).minor
- [[ "$VERSION" =~ ([0-9]+)\.[0-9]+ ]]
- # Construct a decremented version string with .minor set to .0
- VERSION="$((${BASH_REMATCH[1]}-1)).0"
+displayInfo "" \
+ "DO_HTM: $DO_HTM" \
+ "DO_CLEAN: $DO_CLEAN" \
+ ""
+
+#
+# Compile all .md to .html
+#
+
+cd $KEYMAN_ROOT/ios/help
+
+MDLUA="$KEYMAN_ROOT/resources/build/htmlink.lua"
+MD=`find . -name "*.md"`
+DESTHTM="$THIS_DIR/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources"
+
+if $DO_HTM; then
+ #
+ # Clean existing folder
+ #
+
+ if $DO_CLEAN; then
+ rm -rf "$DESTHTM" || true # We don't want to die when we clean an empty folder
+ fi
+ mkdir -p "$DESTHTM"
+
+ #
+ # Generate HTML files from Markdown
+ #
+
+ if $DO_HTM_CONVERSION; then
+ for INFILE in $MD; do
+ OUTFILE="$DESTHTM/${INFILE%.md}.html"
+ echo "Processing $INFILE to $(basename "$OUTFILE")"
+ mkdir -p "$(dirname "$OUTFILE")"
+ pandoc -s --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE
+ done
+ fi
+
+ #
+ # Copy Images
+ #
+ cd $KEYMAN_ROOT/ios/help/
+ mkdir -p "$DESTHTM/ios_images"
+ cp ios_images/* "$DESTHTM/ios_images/"
+
fi
-
-# Clear previous help file downloads (if they exist)
-if [ -d "$HELP_ROOT" ]; then
- rm -r "$HELP_ROOT"
-fi
-
-# Create local mirror of the help page subdirectory.
-# We don't need /font/deploy folder resources, so they're excluded here.
-# One of the .css files auto-includes them otherwise.
-wget --mirror \
- --convert-links \
- --wait=2 \
- --keep-session-cookies \
- --page-requisites \
- --no-parent \
- --restrict-file-names=windows \
- --exclude-directories /font/deploy \
- --directory-prefix="$HELP_ROOT" \
- --no-directories \
- --default-page=index.php \
- --adjust-extension \
- "help.keyman.com/products/iphone-and-ipad/$VERSION/index.php?embed=ios"
-
-# Results in a flat-structured mirror of the iphone-and-ipad/$VERSION folder,
-# together with all needed resources within the 'site' folder.
diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift
index 019b86d0c6..359e2f283e 100644
--- a/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift
+++ b/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift
@@ -439,8 +439,8 @@ public class InstalledLanguagesViewController: UITableViewController, UIAlertVie
}
extension InstalledLanguagesViewController {
-
- @objc func addClicked(_ sender: Any) {
+
+ public func launchKeyboardSearch() {
let keyboardSearchVC = KeyboardSearchViewController(keyboardSelectionBlock: KeyboardSearchViewController.defaultDownloadClosure() { result in
switch result {
case .cancelled:
@@ -459,5 +459,9 @@ extension InstalledLanguagesViewController {
navigationController!.pushViewController(keyboardSearchVC, animated: true)
}
+
+ @objc func addClicked(_ sender: Any) {
+ launchKeyboardSearch()
+ }
}
diff --git a/ios/help/about/history.md b/ios/help/about/history.md
new file mode 100644
index 0000000000..3a0b9af3a6
--- /dev/null
+++ b/ios/help/about/history.md
@@ -0,0 +1,8 @@
+---
+title: Version History
+---
+
+A frequent updated changelog for Keyman is kept at [help.keyman.com/version-history](https://help.keyman.com/version-history/) on the Keyman Help website.
+
+## Related Topics
+* [What's New](whatsnew)
diff --git a/ios/help/about/index.md b/ios/help/about/index.md
new file mode 100644
index 0000000000..71ead99252
--- /dev/null
+++ b/ios/help/about/index.md
@@ -0,0 +1,8 @@
+---
+title: About Keyman
+---
+
+* [Welcome to Keyman](welcome)
+* [What's New](whatsnew)
+* [System Requirements](system-requirements)
+* [Version History](history)
diff --git a/ios/help/about/system-requirements.md b/ios/help/about/system-requirements.md
new file mode 100644
index 0000000000..183545ac5f
--- /dev/null
+++ b/ios/help/about/system-requirements.md
@@ -0,0 +1,9 @@
+---
+title: System Requirements - Keyman for iPhone and iPad Help
+---
+
+## Minimum System Requirements
+
+### Minimum iOS Version
+Keyman for iPhone and iPad will run on Apple iPhones and iPads that have a minimum version of
+iOS 9.
diff --git a/ios/help/about/welcome.md b/ios/help/about/welcome.md
new file mode 100644
index 0000000000..0835b4ca28
--- /dev/null
+++ b/ios/help/about/welcome.md
@@ -0,0 +1,11 @@
+---
+title: Welcome to Keyman
+---
+
+Thank you for installing Keyman for iPhone and iPad. Whether you're a new or returning user,
+we believe you will appreciate the significant enhancements in this latest version of Keyman for iPhone and iPad.
+
+## What is Keyman for iPhone and iPad?
+Keyman for iPhone and iPad lets you type in over 600 languages on Apple iPhones and iPads.
+
+[Click here](../start) to get started
diff --git a/ios/help/about/whatsnew.md b/ios/help/about/whatsnew.md
new file mode 100644
index 0000000000..05b0f72359
--- /dev/null
+++ b/ios/help/about/whatsnew.md
@@ -0,0 +1,13 @@
+---
+title: What's New
+---
+
+Here are some of the new features we have added to Keyman for iPhone and iPad 14.0:
+
+* Simpler and smoother keyboard search
+* Localizable UI through [translate.keyman.com](https://translate.keyman.com)
+* Consolidated crash reporting to [sentry.keyman.com](https://sentry.keyman.com)
+* Choose associated language(s) when keyboard is installed (#3437)
+* Improved batching of keyboard and dictionary downloads (#3458)
+* Improved corrections and predictions (#3555)
+* Match user input capital letters when offering suggestions (#3845)
diff --git a/ios/help/basic/index.md b/ios/help/basic/index.md
new file mode 100644
index 0000000000..0a5cbcc11d
--- /dev/null
+++ b/ios/help/basic/index.md
@@ -0,0 +1,12 @@
+---
+title: Basic Help
+---
+
+* [Switching Between Keyboards](switching-between-keyboards)
+
+* [Installing Custom Keyboards](installing-custom-keyboards)
+* [Sharing Keyboards](sharing-keyboards)
+
+* [Using the Keyman Browser](using-keyman-browser)
+
+* [Removing Keyboards](uninstalling-keyboards)
diff --git a/ios/help/basic/installing-custom-keyboards.md b/ios/help/basic/installing-custom-keyboards.md
new file mode 100644
index 0000000000..e56a240cb6
--- /dev/null
+++ b/ios/help/basic/installing-custom-keyboards.md
@@ -0,0 +1,55 @@
+---
+title: Installing Custom Keyboards - Keyman for iPhone and iPad Help
+---
+
+The following steps can also be used to install a dictionary package.
+
+###Download the File
+If downloading a custom keyboard from the internet, click the link to your custom keyboard package file.
+
+For this example, we'll install a custom keyboard from a link in Safari. Our example keyboard is for the GFF Amharic 7 keyboard.
+
+
+
+Safari will display an option to open the KMP file with Keyman.
+
+
+
+Click **Open in "Keyman"** to continue.
+
+### Finding the File (iOS 13+ only)
+Installation is also possible from email clients and other sources.
+Once you download the file and save it to your device, look for an
+**Open in "Keyman"** option or use the
+Install From File option in Keyman seen below.
+
+
+
+Once this option is selected, a file browser will appear. By default, it will show the most
+ recently downloaded files that can be installed.
+
+
+
+If you have difficulty finding the right file, consider using the **Browse**
+option at the bottom-right. Once you select it, you should then be greeted with the screen shown in
+the section below.
+
+### Installing the Package
+Either approach seen above will start the installation process. From there, Keyman
+for iPhone and iPad will parse the metadata in the package. Some packages include
+documentation that will be displayed at this time.
+
+
+
+Click the **"Install"** button at the top right.
+
+The keyboard from the keyboard package will then be successfully installed!
+
+
+
+All the keyboards in the package are installed as a group. In this example, the package only has the "GFF Amharic 7"
+keyboard, so it becomes the active keyboard.
+
+
+
+To learn how to create a custom installable keyboard, [click here](http://help.keyman.com/developer/current-version/guides/distribute/).
diff --git a/ios/help/basic/sharing-keyboards.md b/ios/help/basic/sharing-keyboards.md
new file mode 100644
index 0000000000..8cd217ab55
--- /dev/null
+++ b/ios/help/basic/sharing-keyboards.md
@@ -0,0 +1,48 @@
+---
+title: Sharing Keyboards - Keyman for iPhone and iPad Help
+---
+
+### Sharing the File
+If you have installed a custom keyboard or dictionary from a file, Keyman keeps a copy
+of that file on your device. You can find these copies in the iOS Files app.
+
+
+
+Simply select the "Keyman" folder to view these files.
+
+
+
+From here, longpress the file for the keyboard or dictionary you wish to share, then
+click **Share** to view sharing options.
+
+### Sharing via QR code
+For keyboards and dictionaries downloaded directly through the app,
+you can provide friends with a scannable QR code. First, find the resource
+through the Settings menu under Installed Languages.
+
+
+
+
+
+
+
+When you select the keyboard, a page like the following should appear:
+
+
+
+Note that QR codes are only provided for certain keyboards and dictionaries
+at this time.
+
+### Installing from QR code
+To install from QR code, simply launch your device's Camera app and point
+it at the code, as seen below.
+
+
+
+Selecting the notification seen at the top will lead you to the following page:
+
+
+
+Select the big **Install on iPhone** (or
+**Install on iPad**) option will then download
+the file for easy installation. (Refer to [Installing custom keyboards](installing-custom-keyboards) as necessary.)
diff --git a/ios/help/basic/switching-between-keyboards.md b/ios/help/basic/switching-between-keyboards.md
new file mode 100644
index 0000000000..5189121e7d
--- /dev/null
+++ b/ios/help/basic/switching-between-keyboards.md
@@ -0,0 +1,25 @@
+---
+title: Switching between keyboards - Keyman for iPhone and iPad Help
+---
+
+Keyboard switching is always activated by using the following key:
+
+
+
+ This will bring up a list of all currently installed languages (the default is English USA). If you have already downloaded additional languages, they will appear here. Simply select them and the keyboard will re-appear with the new language.
+
+### The In-App Menu
+
+
+Simply select any keyboard to activate it and return to the previous screen.
+
+### The System Keyboard Menu
+
+
+
+This menu only displays when the 'globe' key is touched and held.
+
+The "Close Keyman" option will activate the next available non-Keyman system keyboard.
+
+A quick tap on the "globe" key will instead transition to the next available installed keyboard
+without displaying the menu.
diff --git a/ios/help/basic/uninstalling-keyboards.md b/ios/help/basic/uninstalling-keyboards.md
new file mode 100644
index 0000000000..4f1af7ae24
--- /dev/null
+++ b/ios/help/basic/uninstalling-keyboards.md
@@ -0,0 +1,29 @@
+---
+title: Uninstalling Keyboards - Keyman for iPhone and iPad Help
+---
+
+To uninstall a keyboard, follow these steps.
+
+### Access "Installed Languages"
+First, open the "Settings" menu.
+
+
+
+The "Installed Languages" menu found here manages your installed keyboards and dictionaries.
+
+
+
+You should then see the following screen:
+
+
+
+### Removing the Keyboard
+Start by selecting the language for the keyboard you wish to uninstall.
+
+
+
+Swipe left on the keyboard you want to remove. You'll see a button to **Delete**.
+
+
+
+Click the **Delete** button to uninstall the keyboard.
diff --git a/ios/help/basic/using-keyman-browser.md b/ios/help/basic/using-keyman-browser.md
new file mode 100644
index 0000000000..9a587b8b33
--- /dev/null
+++ b/ios/help/basic/using-keyman-browser.md
@@ -0,0 +1,12 @@
+---
+title: Using the Keyman Browser - Keyman for iPhone and iPad Help
+---
+
+Step 1) Click the Keyman Browser button in the Keyman app
+
+Step 2) Enter the URL of a website to visit into the address bar, for example **google.com**. Keyman Browser will load
+the page and detect your language if it is present, and reformat it to show your language instead of square boxes.
+
+Step 3) Use the bookmark button to save the current page for browsing later.
+
+Step 4) Use the Globe icon to swap between languages.
diff --git a/ios/help/context/index.md b/ios/help/context/index.md
new file mode 100644
index 0000000000..99e41dd65c
--- /dev/null
+++ b/ios/help/context/index.md
@@ -0,0 +1,24 @@
+---
+title: Keyman for iPhone and iPad Help
+---
+
+| | Keyboard Keys (Keyboard Present) |
+|---|---|
+|  | Install or select another language/keyboard |
+|  | Hide the keyboard |
+|  | Backspace |
+|  | Return |
+|  | Shift key. Long press this key to access the CTRL, ALT and CTRLALT keys (which can access additional key layers) |
+|  | Keys with a small dot in the top right corner indicate a long press key. Access further functionality by long pressing the key |
+
+----
+
+| | Toolbar Icons
+|---|---|
+|  | Share your text via Mail, Text, Facebook or Twitter |
+|  | Open the Keyman Browser |
+|  | Open the menu for additional options |
+|  | Adjust the font size |
+|  | Delete all current text |
+|  | Open the initial setup screen |
+|  | Load the Keyman help page |
diff --git a/ios/help/index.md b/ios/help/index.md
new file mode 100644
index 0000000000..8602639a08
--- /dev/null
+++ b/ios/help/index.md
@@ -0,0 +1,35 @@
+---
+title: Keyman for iPhone and iPad 14.0 Help
+---
+
+## [About Keyman](about/)
+* [Welcome to Keyman](about/welcome)
+* [What's New](about/whatsnew)
+* [System Requirements](about/system-requirements)
+* [Version History](about/history)
+
+## [Getting Started](start/)
+* [How To - Adding a Keyboard](start/installing-keyboards)
+* [How To - Installing Keyman as a System Keyboard](start/installing-system-keyboard)
+
+## [Using the Menu](context/)
+
+## Ask for Help
+* [Ask other users in the SIL Keyman Community](https://community.software.sil.org/c/keyman)
+
+## Help Topics
+### [Troubleshooting](troubleshooting/)
+* [How To - Installing fonts](troubleshooting/installing-fonts)
+* [How To - Integrating Keyman for iPhone and iPad](troubleshooting/integrating)
+
+### [Using Keyman for iPhone and iPad](basic/)
+* [Switching Between Keyboards](basic/switching-between-keyboards)
+* [Installing Custom Keyboards](basic/installing-custom-keyboards)
+* [Sharing Keyboards](basic/sharing-keyboards)
+* [Using the Keyman Browser](basic/using-keyman-browser)
+* [Removing Keyboards](basic/uninstalling-keyboards)
+
+## Further Help
+For more information on Keyman, [keyman.com](https://keyman.com).
+
+For more information on Keyman for iPhone and iPad, visit [keyman.com/iphone-and-ipad](https://keyman.com/iphone-and-ipad/)
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-file-i.b0b4249fc27f737685a10fa6781db8b6.png b/ios/help/ios_images/add-keyboard-file-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-file-i.b0b4249fc27f737685a10fa6781db8b6.png
rename to ios/help/ios_images/add-keyboard-file-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i.47ed580b93a138e29e9c9ad70e00d25f.png b/ios/help/ios_images/add-keyboard-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i.47ed580b93a138e29e9c9ad70e00d25f.png
rename to ios/help/ios_images/add-keyboard-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i2.f815f73c0363f547b5c756ebcdb4a89a.png b/ios/help/ios_images/add-keyboard-i2.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i2.f815f73c0363f547b5c756ebcdb4a89a.png
rename to ios/help/ios_images/add-keyboard-i2.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i3.3509794b85cff04330f9f5449df2f874.png b/ios/help/ios_images/add-keyboard-i3.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i3.3509794b85cff04330f9f5449df2f874.png
rename to ios/help/ios_images/add-keyboard-i3.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i4.961fbda76f16aca5b91afd600f4f9df1.png b/ios/help/ios_images/add-keyboard-i4.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i4.961fbda76f16aca5b91afd600f4f9df1.png
rename to ios/help/ios_images/add-keyboard-i4.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i5.f41b6636a605786bafa435d2cf52267f.png b/ios/help/ios_images/add-keyboard-i5.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/add-keyboard-i5.f41b6636a605786bafa435d2cf52267f.png
rename to ios/help/ios_images/add-keyboard-i5.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/backspace.e7aa44e2e9f4ccd68dfffd7cdae23d1f.png b/ios/help/ios_images/backspace.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/backspace.e7aa44e2e9f4ccd68dfffd7cdae23d1f.png
rename to ios/help/ios_images/backspace.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/browser-icon.af5dfe566575261f1ea8164481323cb4.png b/ios/help/ios_images/browser-icon.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/browser-icon.af5dfe566575261f1ea8164481323cb4.png
rename to ios/help/ios_images/browser-icon.png
diff --git a/ios/help/ios_images/confirm-dl.png b/ios/help/ios_images/confirm-dl.png
new file mode 100644
index 0000000000..b2f42cba7d
Binary files /dev/null and b/ios/help/ios_images/confirm-dl.png differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete-keyboard-i.e69d65b22ce139e0ba20a1ba705a28cd.png b/ios/help/ios_images/delete-keyboard-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete-keyboard-i.e69d65b22ce139e0ba20a1ba705a28cd.png
rename to ios/help/ios_images/delete-keyboard-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete-keyboard-i2.ec40fd5e372cbac2dcb4266fb7ed79f7.png b/ios/help/ios_images/delete-keyboard-i2.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete-keyboard-i2.ec40fd5e372cbac2dcb4266fb7ed79f7.png
rename to ios/help/ios_images/delete-keyboard-i2.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete.3a5deb2cca38d2fceafdab4ecc07dd5d.png b/ios/help/ios_images/delete.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/delete.3a5deb2cca38d2fceafdab4ecc07dd5d.png
rename to ios/help/ios_images/delete.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-install1-i.9f5bb46e89bbdcf2bbe406da41ce6771.png b/ios/help/ios_images/dist-install1-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-install1-i.9f5bb46e89bbdcf2bbe406da41ce6771.png
rename to ios/help/ios_images/dist-install1-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-kmp-open-i.6a948c2a5b45cf7ad8d430cfd4c275af.png b/ios/help/ios_images/dist-kmp-open-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-kmp-open-i.6a948c2a5b45cf7ad8d430cfd4c275af.png
rename to ios/help/ios_images/dist-kmp-open-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-kmp-success-i.ebdf47a9e455838a09060ad92abcbf4e.png b/ios/help/ios_images/dist-kmp-success-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-kmp-success-i.ebdf47a9e455838a09060ad92abcbf4e.png
rename to ios/help/ios_images/dist-kmp-success-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-url-screen-i.58b4bbebb629e6152eb43ece3451fb3c.png b/ios/help/ios_images/dist-url-screen-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-url-screen-i.58b4bbebb629e6152eb43ece3451fb3c.png
rename to ios/help/ios_images/dist-url-screen-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-welcome-i.e4fac681e32f983734f73b37f3b445da.png b/ios/help/ios_images/dist-welcome-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/dist-welcome-i.e4fac681e32f983734f73b37f3b445da.png
rename to ios/help/ios_images/dist-welcome-i.png
diff --git a/ios/help/ios_images/dl-success.png b/ios/help/ios_images/dl-success.png
new file mode 100644
index 0000000000..e61f1eded2
Binary files /dev/null and b/ios/help/ios_images/dl-success.png differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/file-share-1i.6b5cb90a3fe79c777ae3e71db9d389c4.png b/ios/help/ios_images/file-share-1i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/file-share-1i.6b5cb90a3fe79c777ae3e71db9d389c4.png
rename to ios/help/ios_images/file-share-1i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/file-share-2i.b5ac36c325ecebb21ae10a44ee80a7e2.png b/ios/help/ios_images/file-share-2i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/file-share-2i.b5ac36c325ecebb21ae10a44ee80a7e2.png
rename to ios/help/ios_images/file-share-2i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl1.b8983c24d229e8bfaef5757e8cf61579.png b/ios/help/ios_images/font-dl1.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl1.b8983c24d229e8bfaef5757e8cf61579.png
rename to ios/help/ios_images/font-dl1.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl2.e89447124a646205302905cf75903b84.png b/ios/help/ios_images/font-dl2.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl2.e89447124a646205302905cf75903b84.png
rename to ios/help/ios_images/font-dl2.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl3.8ed35f744cca7be7ef8c0930744b713a.png b/ios/help/ios_images/font-dl3.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl3.8ed35f744cca7be7ef8c0930744b713a.png
rename to ios/help/ios_images/font-dl3.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl4.713ea3fe6632dc78a7d943305efca977.png b/ios/help/ios_images/font-dl4.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl4.713ea3fe6632dc78a7d943305efca977.png
rename to ios/help/ios_images/font-dl4.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl5.89bddef8908a51a5f56890f0ad93c673.png b/ios/help/ios_images/font-dl5.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-dl5.89bddef8908a51a5f56890f0ad93c673.png
rename to ios/help/ios_images/font-dl5.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-size.ad6bf9de6369ea97531dfc845b92547a.png b/ios/help/ios_images/font-size.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/font-size.ad6bf9de6369ea97531dfc845b92547a.png
rename to ios/help/ios_images/font-size.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/get-started.148a309221b6ae085ccbc3892614c3b3.png b/ios/help/ios_images/get-started.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/get-started.148a309221b6ae085ccbc3892614c3b3.png
rename to ios/help/ios_images/get-started.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/globe.b98948bb94a60ffb1822a9f8c6b355e2.png b/ios/help/ios_images/globe.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/globe.b98948bb94a60ffb1822a9f8c6b355e2.png
rename to ios/help/ios_images/globe.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/hide-keyboard.010579769b43952703da6147f8225501.png b/ios/help/ios_images/hide-keyboard.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/hide-keyboard.010579769b43952703da6147f8225501.png
rename to ios/help/ios_images/hide-keyboard.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/in-app-picker-i.0a1e8e542953df06cc90590f16d6e52f.png b/ios/help/ios_images/in-app-picker-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/in-app-picker-i.0a1e8e542953df06cc90590f16d6e52f.png
rename to ios/help/ios_images/in-app-picker-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/info.ac50440ebab389e55bad424d2aef4f3d.png b/ios/help/ios_images/info.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/info.ac50440ebab389e55bad424d2aef4f3d.png
rename to ios/help/ios_images/info.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings.fa7bb95bf3f13c7777484dcdaab9dd0a.png b/ios/help/ios_images/keyman-settings.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings.fa7bb95bf3f13c7777484dcdaab9dd0a.png
rename to ios/help/ios_images/keyman-settings.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings2.01cbeb0ac2121190250eadcdb38e9c27.png b/ios/help/ios_images/keyman-settings2.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings2.01cbeb0ac2121190250eadcdb38e9c27.png
rename to ios/help/ios_images/keyman-settings2.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings3.228f5978261f580be7b6ac285b59c995.png b/ios/help/ios_images/keyman-settings3.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings3.228f5978261f580be7b6ac285b59c995.png
rename to ios/help/ios_images/keyman-settings3.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings4.d6965eba9a73ea210512c32c69ec6981.png b/ios/help/ios_images/keyman-settings4.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings4.d6965eba9a73ea210512c32c69ec6981.png
rename to ios/help/ios_images/keyman-settings4.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings5.eb3048ad1e8bb9e24016134d6f1a9956.png b/ios/help/ios_images/keyman-settings5.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings5.eb3048ad1e8bb9e24016134d6f1a9956.png
rename to ios/help/ios_images/keyman-settings5.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings6.72000b5e1174fb6898febb017a63eb6d.png b/ios/help/ios_images/keyman-settings6.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/keyman-settings6.72000b5e1174fb6898febb017a63eb6d.png
rename to ios/help/ios_images/keyman-settings6.png
diff --git a/ios/help/ios_images/lang-list.png b/ios/help/ios_images/lang-list.png
new file mode 100644
index 0000000000..a4f966467e
Binary files /dev/null and b/ios/help/ios_images/lang-list.png differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/menu-icon.3ba89748b61f4ad9d363b9d0000c21cd.png b/ios/help/ios_images/menu-icon.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/menu-icon.3ba89748b61f4ad9d363b9d0000c21cd.png
rename to ios/help/ios_images/menu-icon.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-1i.712a0fe2abd4897b44a7b16ada1eaeda.png b/ios/help/ios_images/qr-code-share-1i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-1i.712a0fe2abd4897b44a7b16ada1eaeda.png
rename to ios/help/ios_images/qr-code-share-1i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-2i.fdd13bba60d1e46353290256e00f663a.png b/ios/help/ios_images/qr-code-share-2i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-2i.fdd13bba60d1e46353290256e00f663a.png
rename to ios/help/ios_images/qr-code-share-2i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-3i.7391cc9a2f049740cb6512d1e74273ff.png b/ios/help/ios_images/qr-code-share-3i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-3i.7391cc9a2f049740cb6512d1e74273ff.png
rename to ios/help/ios_images/qr-code-share-3i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-4i.b7bd5f4cea227ffa9e72bfb3554f2fb0.png b/ios/help/ios_images/qr-code-share-4i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/qr-code-share-4i.b7bd5f4cea227ffa9e72bfb3554f2fb0.png
rename to ios/help/ios_images/qr-code-share-4i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/return.bdf81704b5532f32581ad2b7533a46a9.png b/ios/help/ios_images/return.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/return.bdf81704b5532f32581ad2b7533a46a9.png
rename to ios/help/ios_images/return.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/share.a6c8dd88ab8dbb2614442fcce23f4f27.png b/ios/help/ios_images/share.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/share.a6c8dd88ab8dbb2614442fcce23f4f27.png
rename to ios/help/ios_images/share.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/shift.2cab323b121fe156b13ad0d6262f7852.png b/ios/help/ios_images/shift.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/shift.2cab323b121fe156b13ad0d6262f7852.png
rename to ios/help/ios_images/shift.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/system-picker-i.7d584a3ef7e6ff7826353b2e112af3ae.png b/ios/help/ios_images/system-picker-i.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/system-picker-i.7d584a3ef7e6ff7826353b2e112af3ae.png
rename to ios/help/ios_images/system-picker-i.png
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/touch-hold.42dd80d1666945835f79a9c3f5d05d55.png b/ios/help/ios_images/touch-hold.png
similarity index 100%
rename from ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/touch-hold.42dd80d1666945835f79a9c3f5d05d55.png
rename to ios/help/ios_images/touch-hold.png
diff --git a/ios/help/ios_images/uninstall-delete-i.png b/ios/help/ios_images/uninstall-delete-i.png
new file mode 100644
index 0000000000..eb66a11b5b
Binary files /dev/null and b/ios/help/ios_images/uninstall-delete-i.png differ
diff --git a/ios/help/ios_images/uninstall-list-i.png b/ios/help/ios_images/uninstall-list-i.png
new file mode 100644
index 0000000000..110a63a96c
Binary files /dev/null and b/ios/help/ios_images/uninstall-list-i.png differ
diff --git a/ios/help/start/index.md b/ios/help/start/index.md
new file mode 100644
index 0000000000..55d9e1f64a
--- /dev/null
+++ b/ios/help/start/index.md
@@ -0,0 +1,6 @@
+---
+title: Getting Started
+---
+
+* [How To - Adding a Keyboard](installing-keyboards)
+* [How To - Installing Keyman as a System Keyboard](installing-system-keyboard)
diff --git a/ios/help/start/installing-keyboards.md b/ios/help/start/installing-keyboards.md
new file mode 100644
index 0000000000..2d01475a66
--- /dev/null
+++ b/ios/help/start/installing-keyboards.md
@@ -0,0 +1,35 @@
+---
+title: Adding keyboards - Keyman for iPhone and iPad Help
+---
+
+To install resources for use with a new language, follow these steps.
+
+### Access "Installed Languages"
+First, open the "Settings" menu.
+
+
+
+The "Installed Languages" menu found here manages your installed keyboards and dictionaries.
+
+
+
+You should then see the following screen:
+
+
+
+
+### Finding Your Keyboard
+Click the **+** at the top-right to open the keyboard catalog.
+
+
+
+From there, select the language and keyboard you want to install.
+
+A list of all available languages will appear. Scroll through this list until you find the language you want to install.
+Some languages may have multiple keyboards - for example we have 10 different Tamil keyboards.
+
+A popup will then ask for confirmation. Hit the **Download** button.
+
+
+
+The new keyboard will then be installed and available for use.
diff --git a/ios/help/start/installing-system-keyboard.md b/ios/help/start/installing-system-keyboard.md
new file mode 100644
index 0000000000..d4cf98d6e8
--- /dev/null
+++ b/ios/help/start/installing-system-keyboard.md
@@ -0,0 +1,41 @@
+---
+title: Installing the Keyman System Keyboard - Keyman for iPhone and iPad Help
+---
+
+Open the 'Settings' App and go to 'General' > 'Keyboard'.
+
+
+
+Touch 'Keyboards'.
+
+
+
+### Enabling Keyman
+To activate Keyman as a system keyboard, touch 'Add New Keyboard...'
+
+
+
+Touch 'Keyman' under THIRD-PARTY KEYBOARDS.
+
+
+
+Touch 'Keyman - Keyman'.
+
+
+
+Turn on the 'Allow Full Access' toggle and confirm.
+
+
+
+Your Keyman keyboards will now be available throughout your entire device. You can switch between Keyman keyboards and
+the default iOS keyboard layout by touching the globe key of the keyboard whenever you are typing.
+
+
+
+### On "Allow Full Access"
+After opening the Keyman system keyboard for the first time in an app, you can turn off the "Allow Full Access" option
+again.
+
+You may need to temporarily switch this on again in the future for app updates and for some changes to keyboard preferences.
+
+It may always be safely deactivated immediately after opening the system keyboard again in an app.
diff --git a/ios/help/troubleshooting/index.md b/ios/help/troubleshooting/index.md
new file mode 100644
index 0000000000..2f31716c95
--- /dev/null
+++ b/ios/help/troubleshooting/index.md
@@ -0,0 +1,7 @@
+---
+title: Troubleshooting
+---
+
+* [How To - Installing fonts](installing-fonts)
+
+* [How To - Integrating Keyman for iPhone and iPad](integrating)
diff --git a/ios/help/troubleshooting/installing-fonts.md b/ios/help/troubleshooting/installing-fonts.md
new file mode 100644
index 0000000000..183b722c82
--- /dev/null
+++ b/ios/help/troubleshooting/installing-fonts.md
@@ -0,0 +1,27 @@
+---
+title: Installing fonts - Keyman for iPhone and iPad Help
+---
+
+Some keyboards require special fonts that do not come standard with your iPhone or iPad.
+For keyboards that use these fonts, the Keyman app will provide a download of the font to install onto your device,
+meaning all apps will be able to correctly display the font. To install the font, touch **Install**.
+
+
+
+You will then be taken to your device settings, and asked to install a profile for the font. Touch **Install**.
+
+
+
+Then Install again in the Consent page.
+
+
+
+Once the profile is installed, touch Done.
+
+
+
+And then Touch now to return to Keyman.
+
+
+
+The font is now successfully installed, and will display correctly throughout your device!
diff --git a/ios/help/troubleshooting/integrating.md b/ios/help/troubleshooting/integrating.md
new file mode 100644
index 0000000000..516503d091
--- /dev/null
+++ b/ios/help/troubleshooting/integrating.md
@@ -0,0 +1,8 @@
+---
+title: How To - Integrating Keyman for iPhone and iPad
+---
+
+## Integrate Keyman with your App or Website
+If you are interested in learning how Keyman can be integrated into your own app or
+website, visit [keyman.com/engine](https://keyman.com/engine)
+
diff --git a/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift b/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift
index f0721834bc..31f63e104b 100644
--- a/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift
+++ b/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift
@@ -43,27 +43,29 @@ class InfoViewController: UIViewController, UIWebViewDelegate {
}
func reloadKeymanHelp() {
- let networkStatus = networkReachable?.connection
- switch networkStatus {
- case Reachability.Connection.none?:
+ if let networkStatus = networkReachable?.connection {
+ switch networkStatus {
+ case Reachability.Connection.none, Reachability.Connection.unavailable:
+ loadFromLocal()
+ default:
+ loadFromServer()
+ }
+ } else {
loadFromLocal()
- default:
- loadFromServer()
}
}
private func loadFromLocal() {
let offlineHelpBundle = Bundle(path: Bundle.main.path(forResource: "OfflineHelp", ofType: "bundle")!)!
- // Yes, .php.html. That's how `wget` is set to retrieve it, since Safari won't recognize the contents
- // without the .html ending, it seems.
- let filePath = offlineHelpBundle.path(forResource: "index.php", ofType: "html", inDirectory: nil)
+ // Safari won't recognize the contents without the .html ending.
+ let filePath = offlineHelpBundle.path(forResource: "index", ofType: "html", inDirectory: nil)
webView.loadRequest(URLRequest(url: URL.init(fileURLWithPath: filePath!)))
}
private func loadFromServer() {
let appVersion = Version.current.majorMinor
- let url = "https://help.keyman.com/products/iphone-and-ipad/\(appVersion.plainString)/?embed=ios"
+ let url = "\(KeymanHosts.HELP_KEYMAN_COM)/products/iphone-and-ipad/\(appVersion.plainString)/"
webView.loadRequest(URLRequest(url: URL(string: url)!))
log.debug("Info page URL: \(url)")
}
diff --git a/ios/keyman/Keyman/Keyman/MainViewController.swift b/ios/keyman/Keyman/Keyman/MainViewController.swift
index 323af5544e..b708befd8e 100644
--- a/ios/keyman/Keyman/Keyman/MainViewController.swift
+++ b/ios/keyman/Keyman/Keyman/MainViewController.swift
@@ -536,7 +536,10 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
let installedLanguagesVC = InstalledLanguagesViewController()
nc.pushViewController(installedLanguagesVC, animated: true)
- self.present(nc, animated: true)
+ self.present(nc, animated: true) {
+ // Requires a host NavigationViewController, hence calling it afterward.
+ installedLanguagesVC.launchKeyboardSearch()
+ }
}
@objc func actionButtonClick(_ sender: Any) {
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/NotoSans-Regular-Ascii.ttf b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/NotoSans-Regular-Ascii.ttf
deleted file mode 100644
index f221c4a87a..0000000000
Binary files a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/NotoSans-Regular-Ascii.ttf and /dev/null differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/app-info.8f6cb12701af2facf8c6dd7c729c65bc.css b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/app-info.8f6cb12701af2facf8c6dd7c729c65bc.css
deleted file mode 100644
index 3fbe3544d2..0000000000
--- a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/app-info.8f6cb12701af2facf8c6dd7c729c65bc.css
+++ /dev/null
@@ -1,59 +0,0 @@
-/***********************
- Wrapper CSS
-***********************/
-
-h2{
- font-size: 22pt;
- font-weight: 400;
- margin: 30px 0px 15px 0px;
- text-align: center;
- color: #BA2034;
-}
-
-
-p img{
- margin-top: 10px !important;
- display: block !important;
- margin-left: auto !important;
- margin-right: auto !important;
- margin-bottom: 10px !important;
-}
-
-table{
- width: 100% !important;
- margin-bottom: 50px !important;
-}
-
-
-td{
- text-align: left !important;
- vertical-align: middle !important;
- padding: 10px !important;
-}
-
-th{
- font-weight: bold !important;
- font-size: 14pt !important;
- padding: 15px 0px 5px 0px !important;
-}
-
-.command{
- font-weight: bold !important;
- color: #69B7D3 !important;
-}
-
-@media all and (min-width: 10px) and (max-width: 720px){
- #section2 img{
- min-width: 40px;
- }
-}
-
-/**
- Removes existing max-width property settings from images in tables.
- They overly shrink the images on the main iOS symbol glossary.
- */
-#section2 td img {
- max-width: unset;
-}
-
-
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/embed.5f7dc4fec739bda98e73bbe078e4f770.css b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/embed.5f7dc4fec739bda98e73bbe078e4f770.css
deleted file mode 100644
index 8a291613a8..0000000000
--- a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/embed.5f7dc4fec739bda98e73bbe078e4f770.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.embed-on .content-online {
- display: none;
-}
-
-.embed-off .content-in-app {
- display: none;
-}
\ No newline at end of file
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/favicon.56e7a2d76793fb59cca3133b8bb1dd3d.ico b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/favicon.56e7a2d76793fb59cca3133b8bb1dd3d.ico
deleted file mode 100644
index 671c7c9156..0000000000
Binary files a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/favicon.56e7a2d76793fb59cca3133b8bb1dd3d.ico and /dev/null differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/fonts.css b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/fonts.css
deleted file mode 100644
index c72972eed5..0000000000
--- a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/fonts.css
+++ /dev/null
@@ -1,139 +0,0 @@
-@font-face {
- font-family:GeezWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/wookianos.ttf') format('truetype');
-}
-@font-face {
- font-family:MyanmarWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/Padauk.ttf') format('truetype');
-}
-/*@font-face {
- font-family:LatinWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/DejaVuSans.ttf') format('truetype');
-}*/
-@font-face {
- font-family:OriyaWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/utkalm.ttf') format('truetype');
-}
-@font-face {
- font-family:SinhalaWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/kaputaunicode.ttf') format('truetype');
-}
-@font-face {
- font-family:TamilWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/aava1.ttf') format('truetype');
-}
-@font-face {
- font-family:CherokeeWeb;
- font-style:normal;
- font-weight:normal;
- src:url('https://s.keyman.com/font/deploy/digohweli_1_7.ttf') format('truetype');
-}
-@font-face {
- font-family: SindhiWeb;
- font-style: normal;
- font-weight: normal;
- src: url('https://s.keyman.com/font/deploy/MBKhursheed10.6.ttf') format("truetype");
-}
-@font-face {
- font-family: TibetanWeb;
- font-style: normal;
- font-weight: normal;
- src: url('https://s.keyman.com/font/deploy/CTRC-Uchen.ttf') format("truetype");
-}
-@font-face {
- font-family: LaoWeb;
- font-style: normal;
- font-weight: normal;
- src: url('https://s.keyman.com/font/deploy/SAYSETT0.eot');
- src: url('https://s.keyman.com/font/deploy/SAYSETT0.eot?#iefix') format('embedded-opentype'),
- url('https://s.keyman.com/font/deploy/saysettha_web.woff') format('woff'),
- url('https://s.keyman.com/font/deploy/saysettha_OT.ttf') format('truetype');
-}
-@font-face {
- font-family: PashtoWeb;
- font-style: normal;
- font-weight: normal;
- src: url('https://s.keyman.com/font/deploy/LateefRegOT.ttf') format("truetype");
-}
-
-@font-face {
- font-family: "Noto Nastaliq Urdu Draft";
- src: url('https://s.keyman.com/font/deploy/NotoNastaliqUrduDraft.ttf') format("truetype");
-}
-
-/* Amharic */
-:lang(amh).lang-example {
- font-family: GeezWeb;
-}
-/* Burmese */
-:lang(mya).lang-example {
- font-family: MyanmarWeb;
-}
-/* Cherokee */
-:lang(chr).lang-example {
- font-family: CherokeeWeb;
-}
-/* Lao */
-:lang(lao).lang-example {
- font-family: LaoWeb;
-}
-/* Malayalam
-:lang(mal).lang-example {
- font-family: GeezWeb;
-} */
-
-/* Marathi
-:lang(mar).lang-example {
- font-family: GeezWeb;
-} */
-/* Oriya */
-:lang(ori).lang-example {
- font-family: OriyaWeb;
-}
-/* Sindhi */
-:lang(snd).lang-example {
- font-family: SindhiWeb;
-}
-/* Sinhala */
-:lang(sin).lang-example {
- font-family: SinhalaWeb;
-}
-
-/* Tamil */
-:lang(tam).lang-example {
- font-family: TamilWeb;
-}
-/* Tibetan */
-:lang(bod).lang-example {
- font-family: TibetanWeb;
-}
-/* Tigrigna */
-:lang(tir).lang-example {
- font-family: GeezWeb;
-}
-
-:lang(egy).language, .hiero{
- font-family:EgyptianWeb !important;
-}
-
-.lang2:lang(urd) {
- font-family: "Noto Nastaliq Urdu Draft";
- font-weight: normal;
-}
-
-#hiero{
- position: relative;
- top: 2px;
-}
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/headerbar.5b66d10475396d1a17cb0d687f794262.png b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/headerbar.5b66d10475396d1a17cb0d687f794262.png
deleted file mode 100644
index f61db79b21..0000000000
Binary files a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/headerbar.5b66d10475396d1a17cb0d687f794262.png and /dev/null differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/helpIcon.e6531e8bf34d0f667dac699db8f7438f.png b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/helpIcon.e6531e8bf34d0f667dac699db8f7438f.png
deleted file mode 100644
index 8178e4ff76..0000000000
Binary files a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/helpIcon.e6531e8bf34d0f667dac699db8f7438f.png and /dev/null differ
diff --git a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/index.php.html b/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/index.php.html
deleted file mode 100644
index ff5e90e9bf..0000000000
--- a/ios/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources/index.php.html
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
- Keyman for iPhone and iPad Help
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Keyman for iPhone and iPad: Installing Custom Keyboards
-
-
Download the File
-
- If downloading a custom keyboard from the internet, click the link to your custom keyboard package file.
-
-
- For this example, we'll install a custom keyboard from a link in Safari. Our example keyboard is for the GFF Amharic 7 keyboard.
-
-
-
-
-
- Safari will display an option to open the KMP file with Keyman.
-
-
-
-
-
- Click Open in "Keyman" to continue.
-
-
Finding the File (iOS 11+ only)
-
- Installation is also possible from email clients and other sources.
- Once you download the file and save it to your device, look for an
- Open in "Keyman" option or use the
- Install From File option in Keyman seen below.
-
-
-
-
-
- Once this option is selected, a file browser will appear. By default, it will show the most
- recently downloaded files that can be installed.
-
-
-
-
-
- If you have difficulty finding the right file, consider using the Browse
- option at the bottom-right. Once you select it, you should then be greeted with the screen shown in
- the section below.
-
-
-
Installing the Package
-
- Either approach seen above will start the installation process. From there, Keyman
- for iPhone and iPad will parse the metadata in the package. Some packages include
- documentation that will be displayed at this time.
-
-
-
-
-
- Click the "Install" button at the top right.
-
-
-The keyboard from the keyboard package will then be successfully installed!
-
-
-
-
-
- All the keyboards in the package are installed as a group. In this example, the package only has the "GFF Amharic 7"
- keyboard, so it becomes the active keyboard.
-
-
-
-
-
-
- To learn how to create a custom installable keyboard, click here.
-
- Some keyboards require special fonts that do not come standard with your iPhone or iPad. For keyboards that use these fonts, the Keyman app will provide a download of the font to install onto your device, meaning all apps will be able to correctly display the font. To install the font, touch Install.
-
-
-
- You will then be taken to your device settings, and asked to install a profile for the font. Touch Install.
-
-
-
- Then Install again in the Consent page.
-
-
-
- Once the profile is installed, touch Done.
-
-
-
- And then Touch now to return to Keyman.
-
-
-
- The font is now successfully installed, and will display correctly throughout your device!
-
- To install resources for use with a new language, follow these steps.
-
-
Access "Installed Languages"
-
First, open the "Settings" menu.
-
-
-
-
- The "Installed Languages" menu found here manages your installed keyboards and dictionaries.
-
-
-
-
-
You should then see the following screen:
-
-
-
-
-
Finding Your Keyboard
-
Click the + at the top-right to open the keyboard catalog.
-
-
-
-
From there, select the language and keyboard you want to install.
-
A list of all available languages will appear. Scroll through this list until you find the language you want to install. Some languages may have multiple keyboards - for example we have 10 different Tamil keyboards.
-
A popup will then ask for confirmation. Hit the Download button.
-
-
-
-
The new keyboard will then be installed and available for use.
Keyman for iPhone and iPad: Installing the Keyman System Keyboard
-
-
- Open the 'Settings' App and go to 'General' > 'Keyboard'.
-
-
-
-
-
- Touch 'Keyboards'.
-
-
-
-
-
Enabling Keyman
-
- To activate Keyman as a system keyboard, touch 'Add New Keyboard...'
-
-
-
-
-
- Touch 'Keyman' under THIRD-PARTY KEYBOARDS.
-
-
-
-
-
- Touch 'Keyman - Keyman'.
-
-
-
-
-
- Turn on the 'Allow Full Access' toggle and confirm.
-
-
-
-
-
- Your Keyman keyboards will now be available throughout your entire device. You can switch between Keyman keyboards and the default iOS keyboard layout by touching the globe key of the keyboard whenever you are typing.
-
-
-
-
-
On "Allow Full Access"
-
After opening the Keyman system keyboard for the first time in an app, you can turn off the "Allow Full Access" option
-again.
-
-
- You may need to temporarily switch this on again in the future for app updates and for some changes to keyboard preferences.
-
-
- It may always be safely deactivated immediately after opening the system keyboard again in an app.
-
- If you have installed a custom keyboard or dictionary from a file, Keyman keeps a copy
- of that file on your device. You can find these copies in the iOS Files app.
-
-
-
-
-
- Simply select the "Keyman" folder to view these files.
-
-
-
-
-
- From here, longpress the file for the keyboard or dictionary you wish to share, then
- click Share to view sharing options.
-
-
Sharing via QR code
-
- For keyboards and dictionaries downloaded directly through the app,
- you can provide friends with a scannable QR code. First, find the resource
- through the Settings menu under Installed Languages.
-
-
-
-
-
-
-
-
-
-
-
- When you select the keyboard, a page like the following should appear:
-
-
-
-
-
- Note that QR codes are only provided for certain keyboards and dictionaries
- at this time.
-
-
Installing from QR code
-
- To install from QR code, simply launch your device's Camera app and point
- it at the code, as seen below.
-
-
-
-
-
- Selecting the notification seen at the top will lead you to the following page:
-
-
-
-
-
- Select the big Install on iPhone (or
- Install on iPad) option will then download
- the file for easy installation. (Refer to
- Installing custom keyboards as necessary.)
-
Keyman for iPhone and iPad: Switching between Keyboards
-
-
- Keyboard switching is always activated by using the following key:
-
-
-
-
-
- This will bring up a list of all currently installed languages (the default is English USA). If you have already downloaded additional languages, they will appear here. Simply select them and the keyboard will re-appear with the new language.
-
-
The In-App Menu
-
-
-
-
Simply select any keyboard to activate it and return to the previous screen.
-
The System Keyboard Menu
-
-
-
-
This menu only displays when the 'globe' key is touched and held.
-
The "Close Keyman" option will activate the next available non-Keyman system keyboard.
-
A quick tap on the "globe" key will instead transition to the next available installed keyboard
- without displaying the menu.
Keyman for iPhone and iPad: Using the Keyman Browser
-
-
- Step 1) Click the Keyman Browser button in the Keyman app
-
- Step 2) Enter the URL of a website to visit into the address bar, for example google.com Keyman Browser will load
- the page and detect your language if it is present, and reformat it to show your language instead of square boxes.
-
- Step 3) Use the bookmark button to save the current page for browsing later.
-
- Step 4) Use the Globe icon to swap between languages.
-
-
-
-
\ No newline at end of file
diff --git a/ios/kmbuild.sh b/ios/kmbuild.sh
index b25f0b8cdb..05faaa46c3 100755
--- a/ios/kmbuild.sh
+++ b/ios/kmbuild.sh
@@ -204,45 +204,52 @@ assertDirExists "$FRAMEWORK_PATH_UNIVERSAL"
echo "KMEI build complete."
if [ $DO_KEYMANAPP = true ]; then
- # Provides a needed link for codesigning for our CI.
- if ! [ -z "${DEVELOPMENT_TEAM}" ]; then
- DEV_TEAM="DEVELOPMENT_TEAM=${DEVELOPMENT_TEAM}"
- fi
-
- if [ $DO_ARCHIVE = false ]; then
- xcodebuild $XCODEFLAGS_EXT $CODE_SIGN -scheme Keyman \
- VERSION=$VERSION \
- VERSION_WITH_TAG=$VERSION_WITH_TAG \
- VERSION_ENVIRONMENT=$VERSION_ENVIRONMENT \
- UPLOAD_SENTRY=$UPLOAD_SENTRY
-
- if [ $? -ne 0 ]; then
- fail "Keyman app build failed."
- fi
-
- else
- # Time to prepare the deployment archive data.
- echo ""
- echo "Preparing .ipa file for deployment."
- xcodebuild $XCODEFLAGS_EXT -scheme Keyman \
- -archivePath $ARCHIVE_PATH \
- archive -allowProvisioningUpdates \
- VERSION=$VERSION \
- VERSION_WITH_TAG=$VERSION_WITH_TAG \
- VERSION_ENVIRONMENT=$VERSION_ENVIRONMENT \
- UPLOAD_SENTRY=$UPLOAD_SENTRY
-
- assertDirExists "$ARCHIVE_PATH"
-
- xcodebuild $XCODEFLAGS -exportArchive -archivePath $ARCHIVE_PATH \
- -exportOptionsPlist exportAppStore.plist \
- -exportPath $BUILD_PATH/${CONFIG}-iphoneos -allowProvisioningUpdates
+ echo ""
+ echo "Building offline help."
+ ./build-help.sh html
+
+ echo ""
+ echo "Building Keyman app."
+
+ # Provides a needed link for codesigning for our CI.
+ if ! [ -z "${DEVELOPMENT_TEAM}" ]; then
+ DEV_TEAM="DEVELOPMENT_TEAM=${DEVELOPMENT_TEAM}"
+ fi
+
+ if [ $DO_ARCHIVE = false ]; then
+ xcodebuild $XCODEFLAGS_EXT $CODE_SIGN -scheme Keyman \
+ VERSION=$VERSION \
+ VERSION_WITH_TAG=$VERSION_WITH_TAG \
+ VERSION_ENVIRONMENT=$VERSION_ENVIRONMENT \
+ UPLOAD_SENTRY=$UPLOAD_SENTRY
+
+ if [ $? -ne 0 ]; then
+ fail "Keyman app build failed."
fi
+ else
+ # Time to prepare the deployment archive data.
echo ""
- if [ $? = 0 ]; then
- echo "Build succeeded."
- else
- fail "Build failed - please see the log above for details."
- fi
+ echo "Preparing .ipa file for deployment."
+ xcodebuild $XCODEFLAGS_EXT -scheme Keyman \
+ -archivePath $ARCHIVE_PATH \
+ archive -allowProvisioningUpdates \
+ VERSION=$VERSION \
+ VERSION_WITH_TAG=$VERSION_WITH_TAG \
+ VERSION_ENVIRONMENT=$VERSION_ENVIRONMENT \
+ UPLOAD_SENTRY=$UPLOAD_SENTRY
+
+ assertDirExists "$ARCHIVE_PATH"
+
+ xcodebuild $XCODEFLAGS -exportArchive -archivePath $ARCHIVE_PATH \
+ -exportOptionsPlist exportAppStore.plist \
+ -exportPath $BUILD_PATH/${CONFIG}-iphoneos -allowProvisioningUpdates
+ fi
+
+ echo ""
+ if [ $? = 0 ]; then
+ echo "Build succeeded."
+ else
+ fail "Build failed - please see the log above for details."
+ fi
fi
diff --git a/linux/keyman-config/debian/control b/linux/keyman-config/debian/control
index c985a593c6..2795069759 100644
--- a/linux/keyman-config/debian/control
+++ b/linux/keyman-config/debian/control
@@ -19,10 +19,9 @@ Build-Depends:
python3-pil,
python3-pip,
python3-qrcode,
- python3-raven ,
+ python3-raven | python3-sentry-sdk,
python3-requests,
python3-requests-cache,
- python3-sentry-sdk ,
python3-setuptools,
Standards-Version: 4.5.0
Vcs-Git: https://github.com/keymanapp/keyman.git
@@ -71,8 +70,7 @@ Depends:
kmflcomp (>=10.99.33),
python3-bs4,
python3-gi,
- python3-raven ,
- python3-sentry-sdk ,
+ python3-raven | python3-sentry-sdk,
${misc:Depends},
${python3:Depends},
Description: Keyman for Linux configuration
diff --git a/linux/keyman-config/km-package-list-installed b/linux/keyman-config/km-package-list-installed
index 42ca05e645..fd7baa5e32 100755
--- a/linux/keyman-config/km-package-list-installed
+++ b/linux/keyman-config/km-package-list-installed
@@ -7,11 +7,11 @@ from keyman_config import __version__
def main():
- parser = argparse.ArgumentParser(description='Show installed Keyman keyboards with name, version, id.')
+ parser = argparse.ArgumentParser(description='Show installed Keyman keyboard packages with name, version, id.')
parser.add_argument('-l', "--long", help='long format also shows description', action="store_true")
- parser.add_argument('-s', "--shared", help='show those installed in shared areas', action="store_true")
+ parser.add_argument('-s', "--shared", help='show those installed in shared area', action="store_true")
parser.add_argument('-o', "--os", help='show those installed by the OS', action="store_true")
- parser.add_argument('-u', "--user", help='show those installed in user areas', action="store_true")
+ parser.add_argument('-u', "--user", help='show those installed in user area', action="store_true")
parser.add_argument('--version', action='version', version='%(prog)s version ' + __version__)
parser.add_argument('-v', '--verbose', action='store_true', help='verbose logging')
parser.add_argument('-vv', '--veryverbose', action='store_true', help='very verbose logging')
@@ -25,18 +25,28 @@ def main():
logging.basicConfig(format='%(levelname)s:%(message)s')
all = not args.user and not args.shared and not args.os
- from keyman_config.list_installed_kmp import get_installed_kmp, InstallArea
+ from keyman_config.list_installed_kmp import get_installed_kmp, get_install_area_path, InstallArea
if args.user or all:
installed_kmp = get_installed_kmp(InstallArea.IA_USER)
- print("--- Installed user keyboards ---")
+ if args.verbose or args.veryverbose:
+ print("--- Installed user Keyman keyboard packages (%s) ---" % (get_install_area_path(InstallArea.IA_USER)))
+ else:
+ print("--- Installed user Keyman keyboard packages ---")
print_keyboards(installed_kmp, args.long)
if args.shared or all:
installed_kmp = get_installed_kmp(InstallArea.IA_SHARED)
- print("--- Installed shared keyboards ---")
+ if args.verbose or args.veryverbose:
+ print("--- Installed shared Keyman keyboard packages (%s) ---" %
+ (get_install_area_path(InstallArea.IA_SHARED)))
+ else:
+ print("--- Installed shared Keyman keyboard packages ---")
print_keyboards(installed_kmp, args.long)
if args.os or all:
installed_kmp = get_installed_kmp(InstallArea.IA_OS)
- print("--- Installed OS keyboards ---")
+ if args.verbose or args.veryverbose:
+ print("--- Installed OS Keyman keyboard packages (%s) ---" % (get_install_area_path(InstallArea.IA_OS)))
+ else:
+ print("--- Installed OS Keyman keyboard packages ---")
print_keyboards(installed_kmp, args.long)
@@ -45,10 +55,10 @@ def print_keyboards(installed_kmp, verbose):
print(installed_kmp[packageID]['name'] + ", version:", installed_kmp[packageID]['version'] + ", id:", packageID)
if verbose:
if installed_kmp[packageID]['version'] != installed_kmp[packageID]['kmpversion']:
- print("Version mismatch. Installed keyboard is %s. Website says it is %s."
+ print("Version mismatch. Installed keyboard package is %s. Website says it is %s."
% (installed_kmp[packageID]['kmpversion'], installed_kmp[packageID]['version']))
if installed_kmp[packageID]['name'] != installed_kmp[packageID]['kmpname']:
- print("Name mismatch. Installed keyboard is %s. Website says it is %s."
+ print("Name mismatch. Installed keyboard package is %s. Website says it is %s."
% (installed_kmp[packageID]['name'], installed_kmp[packageID]['kmpname']))
if installed_kmp[packageID]['description']:
diff --git a/mac/help/about/history.md b/mac/help/about/history.md
new file mode 100644
index 0000000000..3a0b9af3a6
--- /dev/null
+++ b/mac/help/about/history.md
@@ -0,0 +1,8 @@
+---
+title: Version History
+---
+
+A frequent updated changelog for Keyman is kept at [help.keyman.com/version-history](https://help.keyman.com/version-history/) on the Keyman Help website.
+
+## Related Topics
+* [What's New](whatsnew)
diff --git a/mac/help/about/index.md b/mac/help/about/index.md
new file mode 100644
index 0000000000..12e0a682cc
--- /dev/null
+++ b/mac/help/about/index.md
@@ -0,0 +1,8 @@
+---
+title: About Keyman for macOS
+---
+
+* [Welcome to Keyman](welcome)
+* [What's New](whatsnew)
+* [System Requirements](requirements)
+* [Version History](history)
diff --git a/mac/help/about/requirements.md b/mac/help/about/requirements.md
new file mode 100644
index 0000000000..b1c3123be7
--- /dev/null
+++ b/mac/help/about/requirements.md
@@ -0,0 +1,19 @@
+---
+title: System Requirements
+---
+
+## Supported Mac Operating Systems
+
+Keyman 14.0 supports the following Mac operating systems:
+
+* Mac OS X Yosemite (10.10)
+* Mac OS X El Capitan (10.11)
+* macOS Sierra (10.12)
+* macOS High Sierra (10.13)
+* macOS Mojave (10.14)
+* macOS Catalina (10.15)
+
+## Resource Requirements
+
+Keyman for macOS has minimal resource requirements. Any computer running
+Mac OS X 10.10 or later should be able to run Keyman for macOS without trouble.
diff --git a/mac/help/about/welcome.md b/mac/help/about/welcome.md
new file mode 100644
index 0000000000..5bd92f2fd8
--- /dev/null
+++ b/mac/help/about/welcome.md
@@ -0,0 +1,26 @@
+---
+title: Welcome to Keyman
+---
+
+Thank you for installing Keyman for macOS. Whether you're a new or returning user,
+we believe you will appreciate the significant enhancements in this latest
+version of Keyman for macOS.
+
+## What is Keyman for for macOS?
+
+Keyman for macOS brings an extensive library of keyboards for over 1,000
+languages to macOS. You can even create your own custom keyboards with
+[Keyman Developer](https://keyman.com/developer) (a Windows product).
+
+Our unique virtual keyboard technology makes it easy to type in all your programs,
+including Microsoft Office, Adobe Creative Suite, internet browsers and more, as well as
+supporting the latest version of macOS.
+
+A list of new features in Keyman is available [here](whatsnew).
+
+
+
+## Related Topics
+
+- [What's New](whatsnew)
+- [System Requirements](requirements)
diff --git a/mac/help/about/whatsnew.md b/mac/help/about/whatsnew.md
new file mode 100644
index 0000000000..8b3ad4c333
--- /dev/null
+++ b/mac/help/about/whatsnew.md
@@ -0,0 +1,11 @@
+---
+title: What's New
+---
+
+Here are some of the new features we have added to Keyman 14.0 for macOS:
+
+* Added icon for Keyman app (#3892)
+* Improved compatibility with Java apps (#3944)
+* Added support for European layouts in On Screen Keyboard (#3924)
+* Made it possible to specify app compatibility modes as a user default (#3949)
+* Improved input reliability with modifier keys and cursor keys (#2588, #3946)
diff --git a/mac/help/basic/config/index.md b/mac/help/basic/config/index.md
new file mode 100644
index 0000000000..a288a787b0
--- /dev/null
+++ b/mac/help/basic/config/index.md
@@ -0,0 +1,31 @@
+---
+title: Keyman Configuration
+---
+
+The Configuration window allows you to change several things about the way
+Keyman works, as well as access information about installed keyboards.
+
+## Opening Keyman Configuration
+To open Keyman Configuration:
+
+1. 
+
+ Make sure that Keyman for macOS is the active input source (as shown above).
+ For more information, see [Getting Started with Keyman for macOS](../../start/tutorial).
+2. Click the Keyman icon to display the Input menu.
+3. On the Input menu, in the section for Keyman, click **Configuration**. Note: If you just
+ installed Keyman and the Configuration menu is not available, please restart the computer.
+
+ 
+
+4. The Keyman Configuration window appears:
+ 
+
+## Using Keyman Configuration
+
+Following are instructions for performing various tasks in the Configuration window:
+
+- [Keyman Configuration - Keyboard Layouts Tab](keyboards)
+- [Keyman Configuration - Options Tab](options)
+- [Keyman Configuration - Support Tab](support)
+
diff --git a/mac/help/basic/config/keyboards.md b/mac/help/basic/config/keyboards.md
new file mode 100644
index 0000000000..7305053714
--- /dev/null
+++ b/mac/help/basic/config/keyboards.md
@@ -0,0 +1,54 @@
+---
+title: Keyman Configuration - Keyboard Layouts Tab
+---
+
+## Enable and Disable a Keyboard
+
+Keyman keyboards can be enabled and disabled. Disabling a Keyman keyboard removes
+it from the Keyman menu and Keyman Toolbox but does not uninstall the keyboard.
+This is useful if:
+
+* You are using a single keyboard layout from a package with multiple
+ keyboards and you want to remove the extra keyboards from the Keyman
+ Toolbox and menu.
+
+* You have a keyboard layout installed which you aren't currently using but don't
+ want to uninstall.
+
+To disable a Keyman keyboard, untick the corresponding checkbox. To enable a
+disabled keyboard, tick the checkbox.
+
+## Remove Keyboards
+
+Removing a Keyman keyboard package uninstalls and deletes the entire
+package. Although you can disable individual keyboards (as described above),
+if an installed package contains more than one keyboard, you cannot remove
+them individually.
+
+To remove a keyboard package, click the delete button
+ in the far right of the row with the
+package name.
+
+## Display Keyboard Information
+
+All Keyman keyboard packages contain some basic metadata information,
+such as the name and version, included fonts, author, and copyright. To
+display this information, click the information button
+ to the right of the package name.
+
+## Display Keyboard Help
+
+Many Keyman keyboard packages contain help files, with instructions for
+learning to use the keyboard(s) to type special characters. This is
+especially helpful for keyboards that use multiple key sequences to
+generate characters, since it is not usually possible to convey this
+information via an on-screen keyboard showing the individual characters
+associated with the keys on the physical keyboard. To open a window that
+will allow you to view the keyboard help, click the help button
+ to the right of the package name. (If
+this button is disabled, it means that no help files were included in the
+package.)
+
+## Related Topics
+
+- [Keyman Configuration](../config/)
diff --git a/mac/help/basic/config/options.md b/mac/help/basic/config/options.md
new file mode 100644
index 0000000000..f863536354
--- /dev/null
+++ b/mac/help/basic/config/options.md
@@ -0,0 +1,28 @@
+---
+title: Keyman Configuration - Options Tab
+---
+
+## Keyman Configuration Options
+
+If you select the **Options** tab on the Keyman Configuration window, you
+will see that there are two configuration options that affect the general
+behavior of Keyman, regardless of which keyboard is active:
+
+* **Always show on-screen keyboard**: If this option is ticked, the
+ on-screen keyboard will be displayed automatically whenever Keyman
+ becomes the active input source.
+
+* **Use verbose Console logging**: If this option is ticked, advanced
+ troubleshooting information will be sent to the system log. If the
+ Keyman development team is assisting you to resolve a problem, they
+ might instruct you to enable this option so you can supply them with a
+ log of important debugging messages from Keyman. You can view this log
+ information yourself using the Console utility, by filtering to show
+ only messages from the Keyman process (although it probably won't be
+ very meaningful to you unless you are a computer programmer and you are
+ looking at the Keyman for macOS source code). Console is a log viewer
+ developed by Apple Inc. and included with macOS.
+
+## Related Topics
+
+- [Keyman Configuration](../config/)
diff --git a/mac/help/basic/config/support.md b/mac/help/basic/config/support.md
new file mode 100644
index 0000000000..17cdab9974
--- /dev/null
+++ b/mac/help/basic/config/support.md
@@ -0,0 +1,12 @@
+---
+title: Keyman Configuration - Support Tab
+---
+
+
+The **Support** tab on the Keyman Configuration window displays the same
+program help information available on-line at
+[help.keyman.com/products/mac](https://help.keyman.com/products/mac/)
+
+## Related Topics
+
+- [Keyman Configuration](../config/)
diff --git a/mac/help/basic/index.md b/mac/help/basic/index.md
new file mode 100644
index 0000000000..8b3d0df07a
--- /dev/null
+++ b/mac/help/basic/index.md
@@ -0,0 +1,5 @@
+---
+title: Basic Help
+---
+
+* [Keyman Configuration](config/)
diff --git a/mac/help/common/adware.md b/mac/help/common/adware.md
new file mode 100644
index 0000000000..a29e146ca6
--- /dev/null
+++ b/mac/help/common/adware.md
@@ -0,0 +1,14 @@
+---
+title: Does Keyman for macOS include adware or spyware?
+---
+
+Simple answer: No!
+
+We never have and never will include adware or spyware components.
+
+We take your privacy seriously. Keyman does include an error reporting
+component, so if you find Keyman crashing, it will report the error to
+our server. The error report will contain details about your system
+configuration, such as operating system version and free disk space,
+but contains no personal data. This information helps us to address
+the problem.
diff --git a/mac/help/common/bug.md b/mac/help/common/bug.md
new file mode 100644
index 0000000000..8c67a85936
--- /dev/null
+++ b/mac/help/common/bug.md
@@ -0,0 +1,7 @@
+---
+title: I think I found a bug! How can I tell you about it?
+---
+
+We want to hear about problems you experience: if we don't
+hear about the problem, we can't fix it! So please do send bug reports
+through to the [SIL Keyman Community](https://community.software.sil.org/c/keyman)
diff --git a/mac/help/common/free.md b/mac/help/common/free.md
new file mode 100644
index 0000000000..a5e908b5f9
--- /dev/null
+++ b/mac/help/common/free.md
@@ -0,0 +1,10 @@
+---
+title: Is Keyman for macOS really free?
+---
+
+Yes! As with all Keyman products, Keyman for macOS is completely free.
+
+The source code for Keyman is freely available as well: you can download
+the code, change it, distribute your own version of Keyman, or contribute
+your improvments back to the Keyman project so we can all benefit.
+[Learn more](https://keyman.com/about/get-involved)
diff --git a/mac/help/common/index.md b/mac/help/common/index.md
new file mode 100644
index 0000000000..8fe9d2274c
--- /dev/null
+++ b/mac/help/common/index.md
@@ -0,0 +1,12 @@
+---
+title: Common Questions about Keyman for macOS
+---
+
+* [Which versions does Keyman for macOS work with?](os)
+* [What are Keyman's hardware requirements?](requirements)
+* [Which keyboards work on Mac?](keyboards)
+* [Does Keyman for macOS include adware or spyware?](adware)
+* [Does Keyman for macOS include a virtual on-screen keyboard?](osk)
+* [Is Keyman for macOS really free?](free)
+* [Will you help me install Keyman?](support)
+* [I think I found a bug! How can I tell you about it?](bug)
diff --git a/mac/help/common/keyboards.md b/mac/help/common/keyboards.md
new file mode 100644
index 0000000000..2b43713113
--- /dev/null
+++ b/mac/help/common/keyboards.md
@@ -0,0 +1,11 @@
+---
+title: Which keyboards work on Mac?
+---
+
+Most Keyman keyboards work on Mac. A small subset of keyboards require features which
+are not yet available in version 14.0. These features will be progressively implemented.
+Keyman for macOS will inform you when you attempt to install a keyboard if it is using
+a currently unsupported feature.
+
+The [Keyman keyboard catalogue](https://keyman.com/keyboards) also includes information
+about macOS compatibility for each keyboard.
diff --git a/mac/help/common/os.md b/mac/help/common/os.md
new file mode 100644
index 0000000000..79b2b5e4fb
--- /dev/null
+++ b/mac/help/common/os.md
@@ -0,0 +1,14 @@
+---
+title: Which versions does Keyman for macOS work with?
+---
+
+## Supported Mac Operating Systems
+
+Keyman 14.0 supports the following Mac operating systems:
+
+* Mac OS X Yosemite (10.10)
+* Mac OS X El Capitan (10.11)
+* macOS Sierra (10.12)
+* macOS High Sierra (10.13)
+* macOS Mojave (10.14)
+* macOS Catalina (10.15)
diff --git a/mac/help/common/osk.md b/mac/help/common/osk.md
new file mode 100644
index 0000000000..3589eeb464
--- /dev/null
+++ b/mac/help/common/osk.md
@@ -0,0 +1,9 @@
+---
+title: Does Keyman for macOS include a virtual on-screen keyboard?
+---
+
+Yes, Keyman includes an on-screen keyboard. Most Keyman keyboards include
+the information needed to display the on screen keyboard.
+
+To display the on-screen keyboard for the currently selected Keyman keyboard,
+in the Input menu, point to Keyman, and then click On-Screen Keyboard.
diff --git a/mac/help/common/requirements.md b/mac/help/common/requirements.md
new file mode 100644
index 0000000000..b54aa64bfd
--- /dev/null
+++ b/mac/help/common/requirements.md
@@ -0,0 +1,6 @@
+---
+title: What are Keyman's hardware requirements?
+---
+
+Keyman for macOS has minimal resource requirements. Any computer running
+Mac OS X 10.10 or later should be able to run Keyman for macOS without trouble.
diff --git a/mac/help/common/support.md b/mac/help/common/support.md
new file mode 100644
index 0000000000..3c4b9f8f35
--- /dev/null
+++ b/mac/help/common/support.md
@@ -0,0 +1,8 @@
+---
+title: Will you help me install Keyman?
+---
+
+SIL is pleased to provide Keyman software for free. However, we do not have the resources to
+provide free technical support. We do our best to monitor the
+[Keyman community forum](https://community.software.sil.org/c/keyman) for technical issues that
+warrant support, so if you post a question there, someone may be able to assist you.
\ No newline at end of file
diff --git a/mac/help/index.md b/mac/help/index.md
new file mode 100644
index 0000000000..d564804a90
--- /dev/null
+++ b/mac/help/index.md
@@ -0,0 +1,49 @@
+---
+title: Keyman 14.0 for macOS Help
+---
+
+Need help using Keyman 14.0 for macOS? You'll find everything you need here, including product documentation,
+frequently asked questions, tutorials and videos.
+
+## [About Keyman](about/)
+* [Welcome to Keyman](about/welcome)
+* [What's New](about/whatsnew)
+* [System Requirements](about/requirements)
+* [Version History](about/history)
+
+## [Getting Started](start/tutorial)
+* [Step-by-step Guide](start/tutorial)
+* [Tutorial: Installing Keyman](start/install-keyman)
+* [Tutorial: Installing a keyboard](start/install-keyboard)
+
+## [Common Questions](common/)
+* [Which versions does Keyman for macOS work with?](common/os)
+* [What are Keyman's hardware requirements?](common/requirements)
+* [Which keyboards work on Mac?](common/keyboards)
+* [Does Keyman for macOS include adware or spyware?](common/adware)
+* [Does Keyman for macOS include a virtual on-screen keyboard?](common/osk)
+* [Is Keyman for macOS really free?](common/free)
+* [Will you help me install Keyman?](common/support)
+* [I think I found a bug! How can I tell you about it?](common/bug)
+
+## Ask for Help
+[Ask other users in the SIL Keyman Community](https://community.software.sil.org/c/keyman)
+
+## Help Topics
+
+### [Troubleshooting](troubleshooting/)
+* [Configure macOS security for Keyman](troubleshooting/configure-security)
+* [Uninstalling Keyman](troubleshooting/uninstall-keyman)
+
+### Using Keyman for macOS
+* [Configuration Tasks](basic/config/)
+
+### Advanced Topics
+* [Keyman for macOS version history](https://help.keyman.com/products/mac/version-history)
+
+## Other Resources
+* [Knowledge Base](https://help.keyman.com/kb)
+* [Keyman Developer Help](https://help.keyman.com/developer)
+* [KeymanWeb Help](https://help.keyman.com/products/web)
+* [Keyman for Windows Help](https://help.keyman.com/products/windows)
+* [Keyman for Linux Help](https://help.keyman.com/products/linux)
diff --git a/mac/help/mac_images/add.png b/mac/help/mac_images/add.png
new file mode 100644
index 0000000000..bbcf7454dc
Binary files /dev/null and b/mac/help/mac_images/add.png differ
diff --git a/mac/help/mac_images/add_keyman.png b/mac/help/mac_images/add_keyman.png
new file mode 100644
index 0000000000..c34d8ebfb6
Binary files /dev/null and b/mac/help/mac_images/add_keyman.png differ
diff --git a/mac/help/mac_images/apple_menu.png b/mac/help/mac_images/apple_menu.png
new file mode 100644
index 0000000000..fb4dd0a60f
Binary files /dev/null and b/mac/help/mac_images/apple_menu.png differ
diff --git a/mac/help/mac_images/go_to_folder.png b/mac/help/mac_images/go_to_folder.png
new file mode 100644
index 0000000000..b72aa42559
Binary files /dev/null and b/mac/help/mac_images/go_to_folder.png differ
diff --git a/mac/help/mac_images/help_button.png b/mac/help/mac_images/help_button.png
new file mode 100644
index 0000000000..e9cba61c2e
Binary files /dev/null and b/mac/help/mac_images/help_button.png differ
diff --git a/mac/help/mac_images/icon-fonts.png b/mac/help/mac_images/icon-fonts.png
new file mode 100644
index 0000000000..cd235433c4
Binary files /dev/null and b/mac/help/mac_images/icon-fonts.png differ
diff --git a/mac/help/mac_images/icon-help.png b/mac/help/mac_images/icon-help.png
new file mode 100644
index 0000000000..2e8c2f40ba
Binary files /dev/null and b/mac/help/mac_images/icon-help.png differ
diff --git a/mac/help/mac_images/icon-intro.png b/mac/help/mac_images/icon-intro.png
new file mode 100644
index 0000000000..cfd2310e0a
Binary files /dev/null and b/mac/help/mac_images/icon-intro.png differ
diff --git a/mac/help/mac_images/icon-keyman.png b/mac/help/mac_images/icon-keyman.png
new file mode 100644
index 0000000000..de36600859
Binary files /dev/null and b/mac/help/mac_images/icon-keyman.png differ
diff --git a/mac/help/mac_images/icon-osk.png b/mac/help/mac_images/icon-osk.png
new file mode 100644
index 0000000000..a1cbdc416a
Binary files /dev/null and b/mac/help/mac_images/icon-osk.png differ
diff --git a/mac/help/mac_images/icon-unicode.png b/mac/help/mac_images/icon-unicode.png
new file mode 100644
index 0000000000..edeb18f039
Binary files /dev/null and b/mac/help/mac_images/icon-unicode.png differ
diff --git a/mac/help/mac_images/information_button.png b/mac/help/mac_images/information_button.png
new file mode 100644
index 0000000000..8a8b5dbd76
Binary files /dev/null and b/mac/help/mac_images/information_button.png differ
diff --git a/mac/help/mac_images/input_menu.png b/mac/help/mac_images/input_menu.png
new file mode 100644
index 0000000000..fd0a0b0840
Binary files /dev/null and b/mac/help/mac_images/input_menu.png differ
diff --git a/mac/help/mac_images/keyboards_menu.png b/mac/help/mac_images/keyboards_menu.png
new file mode 100644
index 0000000000..fcf7966dda
Binary files /dev/null and b/mac/help/mac_images/keyboards_menu.png differ
diff --git a/mac/help/mac_images/keyman_config.png b/mac/help/mac_images/keyman_config.png
new file mode 100644
index 0000000000..cb58a6b6fc
Binary files /dev/null and b/mac/help/mac_images/keyman_config.png differ
diff --git a/mac/help/mac_images/keyman_install.png b/mac/help/mac_images/keyman_install.png
new file mode 100644
index 0000000000..95ade979fd
Binary files /dev/null and b/mac/help/mac_images/keyman_install.png differ
diff --git a/mac/help/mac_images/keyman_menu_config.png b/mac/help/mac_images/keyman_menu_config.png
new file mode 100644
index 0000000000..07cc664c36
Binary files /dev/null and b/mac/help/mac_images/keyman_menu_config.png differ
diff --git a/mac/help/mac_images/menu_bar.png b/mac/help/mac_images/menu_bar.png
new file mode 100644
index 0000000000..0d74ebf79d
Binary files /dev/null and b/mac/help/mac_images/menu_bar.png differ
diff --git a/mac/help/mac_images/menu_bar_keyman.png b/mac/help/mac_images/menu_bar_keyman.png
new file mode 100644
index 0000000000..6a68897cdc
Binary files /dev/null and b/mac/help/mac_images/menu_bar_keyman.png differ
diff --git a/mac/help/mac_images/osk_amharic.png b/mac/help/mac_images/osk_amharic.png
new file mode 100644
index 0000000000..d636ae0404
Binary files /dev/null and b/mac/help/mac_images/osk_amharic.png differ
diff --git a/mac/help/mac_images/privacy_accessibility.png b/mac/help/mac_images/privacy_accessibility.png
new file mode 100644
index 0000000000..9af915507d
Binary files /dev/null and b/mac/help/mac_images/privacy_accessibility.png differ
diff --git a/mac/help/mac_images/privacy_files_and_folders.png b/mac/help/mac_images/privacy_files_and_folders.png
new file mode 100644
index 0000000000..7ffddb7f73
Binary files /dev/null and b/mac/help/mac_images/privacy_files_and_folders.png differ
diff --git a/mac/help/mac_images/privacy_input_monitoring.png b/mac/help/mac_images/privacy_input_monitoring.png
new file mode 100644
index 0000000000..3b4310262b
Binary files /dev/null and b/mac/help/mac_images/privacy_input_monitoring.png differ
diff --git a/mac/help/mac_images/privacy_input_monitoring_locked.png b/mac/help/mac_images/privacy_input_monitoring_locked.png
new file mode 100644
index 0000000000..e5652b06d7
Binary files /dev/null and b/mac/help/mac_images/privacy_input_monitoring_locked.png differ
diff --git a/mac/help/mac_images/remove.png b/mac/help/mac_images/remove.png
new file mode 100644
index 0000000000..bbb4cee892
Binary files /dev/null and b/mac/help/mac_images/remove.png differ
diff --git a/mac/help/mac_images/remove_button.png b/mac/help/mac_images/remove_button.png
new file mode 100644
index 0000000000..a01314556e
Binary files /dev/null and b/mac/help/mac_images/remove_button.png differ
diff --git a/mac/help/mac_images/remove_keyman.png b/mac/help/mac_images/remove_keyman.png
new file mode 100644
index 0000000000..846c88437e
Binary files /dev/null and b/mac/help/mac_images/remove_keyman.png differ
diff --git a/mac/help/mac_images/system_preferences.png b/mac/help/mac_images/system_preferences.png
new file mode 100644
index 0000000000..d6e66dcc77
Binary files /dev/null and b/mac/help/mac_images/system_preferences.png differ
diff --git a/mac/help/start/index.md b/mac/help/start/index.md
new file mode 100644
index 0000000000..7818eee925
--- /dev/null
+++ b/mac/help/start/index.md
@@ -0,0 +1,6 @@
+---
+title: Getting started
+---
+* [Getting started with Keyman for macOS](tutorial)
+* [Install Keyman for macOS](install-keyman)
+* [Install a Keyman Keyboard](install-keyboard)
diff --git a/mac/help/start/install-keyboard.md b/mac/help/start/install-keyboard.md
new file mode 100644
index 0000000000..6d22793586
--- /dev/null
+++ b/mac/help/start/install-keyboard.md
@@ -0,0 +1,72 @@
+---
+title: Install a Keyman Keyboard
+---
+
+You must have a Keyman keyboard installed to type with Keyman for macOS in your language.
+
+## Downloading and Installing a Keyman Keyboard within Keyman for macOS
+
+Here's how to download and install a Keyman keyboard within Keyman for macOS:
+
+1. Choose Keyman from the Input menu in the menu bar.
+2. Open Keyman Configuration, from the Configuration link under Keyman in the Input menu.
+ Note: If you just installed Keyman and the Configuration menu is not available, please
+ restart the computer.
+
+ 
+
+3. Select the Keyboard Layouts tab.
+4. Click **Download keyboard…**.
+5. From the dropdown boxes, find a language associated with your keyboard and click **Search**.
+6. Click **Install Keyboard** for the keyboard you want to install.
+7. Click **Done**. The keyboard will be installed automatically and
+ you will see a Keyboard/Package Info window.
+
+## Installing a Keyman Keyboard from a Folder on Your Computer
+
+There are two ways to install a keyboard from your computer. The easiest way is simply
+to find the keyboard package (.KMP file) on your computer using Finder and double-click.
+When prompted whether or not to install the package, click Yes. (If you don't see the
+dialog box, it might be hiding behind your Finder window.)
+
+The other way is to drag and drop a keyboard package file onto the Keyman Configuration
+window. Here's how:
+
+1. Choose Keyman from the Input menu in the menu bar.
+2. Open Keyman Configuration, from the Configuration link under Keyman in the Input menu.
+
+ 
+
+3. Select the Keyboard Layouts tab.
+4. Back in Finder, find the keyboard package on your computer. Keyman keyboard packages
+ have a file name that ends with .kmp.
+5. Drag and drop the keyboard package file in the installed keyboards list in Keyman
+ Configuration window.
+
+ **Note:** You can drag and drop multiple keyboard packages at once.
+
+
+## After installation
+
+**Tip:** The Keyboard/Package Info window includes some helpful information about
+the keyboard you have installed. In addition to the name and version of the keyboard,
+the dialog may also show:
+* Fonts installed with the keyboard.
+* Author name and contact information.
+* Specific help and readme information (under the readme tab).
+
+**Note:** Keyman keyboards are installed for the current user only. You can find
+the installed keyboards in 'Documents/Keyman-Keyboards' folder; however, you should
+not delete or modify this folder or its contents.
+
+1. To enable/disable a keyboard; click on the check box next to the keyboard.
+2. You can now select a Keyman keyboard from the Keyboards menu under Keyman in the
+ Input menu.
+
+**Note:** Only enabled keyboards will be displayed in the Keyboards menu under Keyman
+in the Input menu.
+
+## Related topics
+
+* [Install Keyman](install-keyman)
+* [Keyman Configuration](../basic/config/)
diff --git a/mac/help/start/install-keyman.md b/mac/help/start/install-keyman.md
new file mode 100644
index 0000000000..315d9f81ed
--- /dev/null
+++ b/mac/help/start/install-keyman.md
@@ -0,0 +1,38 @@
+---
+title: Install Keyman for macOS
+---
+
+*Keyman for macOS* is available for [download](https://keyman.com/mac/download) as a standard
+Apple Disk Image (.dmg) file. It should be installed according to the following instructions.
+
+1. Double click the DMG file to open it in Finder.
+2. Double click the **Install Keyman** icon to open the Keyman installer.
+3. You will be prompted to install Keyman. Follow the prompts to complete installation.
+
+4. Keyman should now be an option in the Input Sources menu towards the right hand
+ side of the menu bar.
+
+ 
+
+ **Note**: On recent versions of macOS, the first time you enable Keyman by selecting Keyman
+ from the menu, you will be prompted to give certain permissions to Keyman. It is
+ important that you allow Keyman these permissions, otherwise it will not be able
+ to remap the keyboard. [More information on permissions](../troubleshooting/configure-security)
+
+4. Click the input menu and switch to Keyman. Click the input menu again to see the
+ installed keyboards in Keyman:Keyboards menu.
+
+ This will show "(None)" at first. You may switch to another keyboard from this menu,
+ once they are installed.
+
+ See [Install a Keyman Keyboard](install-keyboard) to learn how to install keyboards.
+
+5. Now you can start typing with the selected keyboard in any text editor or
+ application that uses standard macOS input methods.
+
+## How To - Updating Keyman for macOS
+
+When a new version of Keyman is released, you can update by following the instructions
+above.
+
+**Note**: To uninstall Keyman for macOS, follow the steps in [Uninstall Keyman](../troubleshooting/uninstall-keyman).
diff --git a/mac/help/start/tutorial.md b/mac/help/start/tutorial.md
new file mode 100644
index 0000000000..2ad6a0842a
--- /dev/null
+++ b/mac/help/start/tutorial.md
@@ -0,0 +1,81 @@
+---
+title: Getting started with Keyman for macOS
+---
+
+Follow these steps for a basic introduction to Keyman for macOS:
+
+**Note:** *Keyman for macOS* must be installed first. For help on
+installing *Keyman for macOS*, please see: [Install Keyman for macOS](install-keyman).
+
+## Step 1: Is Keyman active?
+
+
+
+Check the menu bar near the date and time to see if Keyman for macOS is
+active. If it is active you will see the Keyman icon: 
+
+* If the Keyman icon is in the menu bar near the date/time, continue on to **Step 4**.
+
+## Step 2: Choose Keyman from Input Menu
+
+If the Keyman icon is not in the menu bar, choose **Keyman** from the Input menu in the
+menu bar and continue on to **Step 4**.
+
+
+
+The Input menu appears in the menu bar only if you enable at least two input
+sources in Keyboard preferences. The Input menu is identified by a flag or character
+that represents the input source currently in use.
+
+If Keyman is not in the Input menu, Keyman for macOS is not added as an input source.
+Follow **Step 3** to add Keyman for macOS as an input source.
+
+## Step 3: Add Keyman for macOS
+
+To add Keyman for macOS as an input source:
+
+1. On the Apple menu, click System Preferences.
+
+ 
+
+2. Click Keyboard, select the **Input Sources** tab, and then click .
+
+3. In the left-hand pane, select **Multiple Languages**, and then select **Keyman** in the
+ right-hand pane.
+
+ 
+
+4. Click Add.
+
+Now, return to **Step 2**.
+
+## Step 4: Select a Keyman keyboard
+
+On the Input menu, point to Keyboards, and then select a Keyman keyboard. Note: If
+the Keyman menu items are not available, please restart the computer.
+
+**Tip:**: If there are no Keyman keyboards in the Keyboards menu, you can learn
+how to install one here: [Install a keyboard](../start/install-keyboard).
+
+## Step 5: Enable the On-Screen Keyboard
+
+
+
+To become familiar with the layout of a Keyman keyboard, use the
+On-Screen Keyboard tool: On the Input menu, point to Keyman, and then click
+On-Screen Keyboard.
+
+**Tip:**: You do not need to use the On-Screen Keyboard in order to type. You can turn it
+off at any time.
+
+**Tip:**: Some Keyman keyboards do not include an On-Screen Keyboard. You will see
+a standard US keyboard layout if the selected keyboard does not include an
+On-Screen Keyboard.
+
+## Step 6: Start typing!
+
+You can now start typing in your language in almost any application. Use your
+hardware keyboard or click the keys in the On-Screen Keyboard to type.
+
+**Note:** To return to using your normal keyboard, choose your default keyboard
+from the Input menu in the menu bar.
diff --git a/mac/help/troubleshooting/configure-security.md b/mac/help/troubleshooting/configure-security.md
new file mode 100644
index 0000000000..0365b9962c
--- /dev/null
+++ b/mac/help/troubleshooting/configure-security.md
@@ -0,0 +1,61 @@
+---
+title: How to configure macOS security options for Keyman
+---
+
+Keyman requires access to your keyboard in order to translate input. In macOS Catalina, there
+are three different Privacy settings you will need to configure in order for Keyman to work
+correctly:
+
+* **Privacy** / **Input Monitoring**
+* **Privacy** / **Accessibility**
+* **Privacy** / **Files and Folders**
+
+The Keyman installer will configure these privacy settings for you, and prompt you to allow access for Keyman. If you do not allow access at that time, you will need to follow the steps here in order to use Keyman.
+
+Symptoms that you may experience if Security & Privacy is not configured correctly include:
+
+* Some key combinations may not work
+* You may find that some letters are duplicated or not deleted as you expect
+
+**Note:** Keyman may not appear under these settings until it has been run at least one
+time. If Keyman does not appear in the relevant panes in System Preferences, select Keyman
+from the Input Sources menu and try typing in an app.
+
+In some situations, even then, Keyman won't appear in the Accessibility setting. In this case,
+macOS should prompt you the first time that Keyman needs access to Accessibility.
+
+## Enabling Keyman in macOS Privacy System Preferences
+
+1. Open **System Preferences**:
+
+ 
+
+2. Select **Security & Privacy**, and choose the **Privacy** tab:
+
+ 
+
+3. Select **Input Monitoring** and unlock the settings with the lock icon,
+
+ 
+
+4. Keyman should appear in the list. Tick the Keyman item:
+
+ 
+
+5. Select **Accessibility**, and ensure that Keyman is ticked there as well:
+
+ 
+
+6. Select **Files and Folders**, and ensure that Keyman has access to the **Documents** folder there:
+
+ 
+
+**Note:** You may be prompted to shut down Keyman in order for the changes to take
+effect. If so, follow the prompts to allow the system to close Keyman. You'll need
+to select an alternate input source from the Input Sources, and then switch back to
+Keyman, to start using Keyman again.
+
+## Upgrading macOS
+
+You should only have to undertake this procedure once. However, if you upgrade your
+version of macOS, and Keyman stops working, follow these steps to re-enable Keyman.
diff --git a/mac/help/troubleshooting/index.md b/mac/help/troubleshooting/index.md
new file mode 100644
index 0000000000..2190a7c3cb
--- /dev/null
+++ b/mac/help/troubleshooting/index.md
@@ -0,0 +1,6 @@
+---
+title: Troubleshooting
+---
+
+* [Configure macOS security for Keyman](configure-security)
+* [Uninstall Keyman for macOS](uninstall-keyman)
diff --git a/mac/help/troubleshooting/uninstall-keyman.md b/mac/help/troubleshooting/uninstall-keyman.md
new file mode 100644
index 0000000000..64ba2648e0
--- /dev/null
+++ b/mac/help/troubleshooting/uninstall-keyman.md
@@ -0,0 +1,25 @@
+---
+title: Uninstalling Keyman
+---
+
+To uninstall Keyman for macOS:
+
+1. Choose Apple menu > System Preferences.
+
+ 
+
+2. Click Keyboard, then click Input Sources.
+
+3. Select Keyman, then click :
+ 
+
+4. In Finder, on the **Go** menu, click **Go to Folder...**
+
+5. Type `~/Library/Input Methods`, then click **Go**
+ 
+
+6. Right-click Keyman.app and choose **Move to Trash**
+
+**Note:** If you get the error 'The item "Keyman.app" can't be
+moved to the Trash because it's open', log out and log back in
+or restart your Mac and repeat the last step.
diff --git a/oem/firstvoices/common/build_keyboards.sh b/oem/firstvoices/common/build_keyboards.sh
index 7ead3ceb73..569a6e003d 100755
--- a/oem/firstvoices/common/build_keyboards.sh
+++ b/oem/firstvoices/common/build_keyboards.sh
@@ -35,11 +35,10 @@ function die {
}
function display_usage {
- echo "Usage: build_keyboards.sh [-download-keyboards] [-download-js-keyboards] [-copy-keyboards] [-clean-keyboards] [-debug] [-h|-?]"
+ echo "Usage: build_keyboards.sh [-download-keyboards] [-copy-keyboards] [-clean-keyboards] [-debug] [-h|-?]"
echo "Builds all keyboards used by the app and copies them into the"
echo "target path."
echo " -download-keyboards: Download fv_all.kmp from downloads.keyman.com"
- echo " -download-js-keyboards: Download js keyboards from downloads.keyman.com"
echo " -copy-keyboards: Only copy the keyboards; don't rebuild them"
echo " -clean-keyboards: Clean the keyboards from this repo"
echo " -debug: Build debug versions of the keyboards"
@@ -50,7 +49,6 @@ DO_CLEAN=true
DO_COPY=true
DO_BUILD=true
DO_DOWNLOAD=false
-DO_JS_DOWNLOAD=false # Remove when iOS handles fv-all.kmp
while [[ $# -gt 0 ]] ; do
key="$1"
@@ -60,12 +58,6 @@ while [[ $# -gt 0 ]] ; do
DO_COPY=false
DO_BUILD=false
;;
- -download-js-keyboards)
- DO_DOWNLOAD=true
- DO_JS_DOWNLOAD=true
- DO_COPY=false
- DO_BUILD=false
- ;;
-copy-keyboards)
DO_BUILD=false
;;
@@ -145,28 +137,10 @@ if [ $DO_DOWNLOAD = true ]; then
URL_DOWNLOAD=https://downloads.keyman.com
URL_API_VERSION=${URL_DOWNLOAD}/api/keyboard/
- if [ $DO_JS_DOWNLOAD = true ]; then
- # iOS still copies individual JS keyboard files
- {
- # Skip header line
- read
-
- # Read CSV and build each referenced keyboard
- while IFS=, read -r shortname id name region old_keyboard; do
- echo "Downloading $id ($name)"
- # Get latest version
- URL_DOWNLOAD_FILE=`curl -s "$URL_API_VERSION/$id" | "$JQ" -r .js`
- curl -s "$URL_DOWNLOAD_FILE" > "$SCRIPT_ROOT/$KEYBOARDS_TARGET/$id.js"
- curl -s "${URL_DOWNLOAD_FILE%.*}.keyboard_info" > "$SCRIPT_ROOT/$KEYBOARDS_TARGET/$id.keyboard_info"
- done
- } < "$SCRIPT_ROOT/../keyboards.csv"
- else
- # Desktop and Android use fv_all.kmp
- id="fv_all"
- echo "Downloading $id"
- URL_DOWNLOAD_FILE=`curl -s "$URL_API_VERSION/$id" | "$JQ" -r .kmp`
- curl -s "$URL_DOWNLOAD_FILE" > "$SCRIPT_ROOT/$KEYBOARDS_TARGET/$id.kmp"
- fi
+ id="fv_all"
+ echo "Downloading $id"
+ URL_DOWNLOAD_FILE=`curl -s "$URL_API_VERSION/$id" | "$JQ" -r .kmp`
+ curl -s "$URL_DOWNLOAD_FILE" > "$SCRIPT_ROOT/$KEYBOARDS_TARGET/$id.kmp"
fi
echo "Keyboards built successfully."
diff --git a/oem/firstvoices/ios/FVShared/FVShared.swift b/oem/firstvoices/ios/FVShared/FVShared.swift
index 84d8ee8614..c5148d119c 100644
--- a/oem/firstvoices/ios/FVShared/FVShared.swift
+++ b/oem/firstvoices/ios/FVShared/FVShared.swift
@@ -24,12 +24,13 @@ struct FVConstants {
static let legacy_kFVKeyboardFilenameKey = "FVKeyboardFilename"
// Keyboard files and paths
- static let keyboardsPath = "Keyboards/files"
+ static let keyboardsPath = "Keyboards"
+ static let keyboardsPackage = "fv_all"
+ static let keyboardsPackageExt = "kmp"
static let keyboardsCSVPath = "Keyboards"
static let keyboardsCSVName = "keyboards"
static let keyboardsCSVType = "csv"
static let keyboardInfoType = "keyboard_info"
- static let keyboardType = "js"
// Instructions web page
static let instructionsName = "setup"
diff --git a/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift b/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift
index 39dbe4a0ea..75ee364b47 100644
--- a/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift
+++ b/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift
@@ -194,49 +194,48 @@ class FVRegionStorage {
while Manager.shared.removeKeyboard(at: 0) {
}
- // Iterate through the available keyboards
+ // Load the primary keyboards package so that we can install keyboards from it.
+ let keyboardPackagePath: String = Bundle.main.path(forResource: FVConstants.keyboardsPackage,
+ ofType: FVConstants.keyboardsPackageExt,
+ inDirectory: FVConstants.keyboardsPath)!
+ let pathUrl = URL(fileURLWithPath: keyboardPackagePath)
+ let keyboardsPackage: KeyboardKeymanPackage
+ do {
+ let package = try ResourceFileManager.shared.prepareKMPInstall(from: pathUrl)
+ guard package as? KeyboardKeymanPackage != nil else {
+ print("Failed to load \(FVConstants.keyboardsPackage).\(FVConstants.keyboardsPackageExt)")
+ return
+ }
+ keyboardsPackage = (package as? KeyboardKeymanPackage)!
+ } catch {
+ print("Failed to load \(FVConstants.keyboardsPackage).\(FVConstants.keyboardsPackageExt)")
+ return
+ }
+
+ // Iterate through the available keyboards
for region in keyboardList {
let keyboards = region.keyboards
for kb in keyboards {
if loadedKeyboards.contains(kb.id) {
-
- // Load the .keyboard_info file and find its first language code
-
- var keyboardInfo: KeyboardInfo
+ // Install the keyboard from its package.
do {
- let kbinfoFilename: String = Bundle.main.path(forResource: kb.id, ofType: FVConstants.keyboardInfoType, inDirectory: FVConstants.keyboardsPath)!
- keyboardInfo = try KeyboardInfoParser.decode(file: kbinfoFilename)
- } catch {
- print("Failed to load keyboard info for " + kb.id+": " + error.localizedDescription)
+ // Find the matching keyboard entry from the package.
+ // We currently rely on the package to track each keyboard's available language tags.
+ if let packageKbId = keyboardsPackage.installables.first(where: { entry in
+ // Each entry in the returned array corresponds to one supported language for the keyboard.
+ entry.contains { $0.id == kb.id }
+ // We only install the first available language. Easy to change, though.
+ }).map({ $0[0] })?.fullID { // then
+ try ResourceFileManager.shared.install(resourceWithID: packageKbId, from: keyboardsPackage)
+ } else {
+ print("Keyboard "+kb.id+" not found in primary keyboards package")
continue
- }
-
- // Preload the keyboard
-
- do {
- let kbPath: String = Bundle.main.path(forResource: kb.id,
- ofType: FVConstants.keyboardType,
- inDirectory: FVConstants.keyboardsPath)!
- let pathUrl = URL(fileURLWithPath: kbPath)
- try Manager.shared.preloadFiles(forKeyboardID: kb.id, at: [pathUrl], shouldOverwrite: true)
+ }
} catch {
print("Failed to load preload "+kb.id+": " + error.localizedDescription)
continue
}
-
- // Install the keyboard into Keyman Engine
-
- let keyboard: InstallableKeyboard = InstallableKeyboard.init(id: kb.id,
- name: kb.name,
- languageID: keyboardInfo.languages.keys[keyboardInfo.languages.startIndex],
- languageName: kb.name,
- version: keyboardInfo.version,
- isRTL: false,
- font: nil,
- oskFont: nil,
- isCustom: true)
- Manager.shared.addKeyboard(keyboard)
}
}
}
diff --git a/oem/firstvoices/ios/FirstVoices/ViewController.swift b/oem/firstvoices/ios/FirstVoices/ViewController.swift
index 1d67e4d5ce..1081c390d1 100644
--- a/oem/firstvoices/ios/FirstVoices/ViewController.swift
+++ b/oem/firstvoices/ios/FirstVoices/ViewController.swift
@@ -21,22 +21,6 @@ class ViewController: UIViewController, UIWebViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
- //
- // Install all the .js files into Keyman Engine (doesn't show them in the keyboard list)
- //
-
- let kbPaths: [String] = Bundle.main.paths(forResourcesOfType: FVConstants.keyboardType,
- inDirectory: FVConstants.keyboardsPath)
- for kbPath in kbPaths {
- let pathUrl = URL(fileURLWithPath: kbPath)
- let id = pathUrl.deletingPathExtension().lastPathComponent
- do {
- try Manager.shared.preloadFiles(forKeyboardID: id, at: [pathUrl], shouldOverwrite: true)
- } catch {
- print("Failed to preload "+id+": "+error.localizedDescription)
- }
- }
-
//
// Show Instructions page
//
diff --git a/oem/firstvoices/ios/build.sh b/oem/firstvoices/ios/build.sh
index 4b56f116f6..3f83c56d70 100755
--- a/oem/firstvoices/ios/build.sh
+++ b/oem/firstvoices/ios/build.sh
@@ -3,11 +3,11 @@
set -e
export TARGET=FirstVoices
-export KEYBOARDS_TARGET="$TARGET/Keyboards/files"
+export KEYBOARDS_TARGET="$TARGET/Keyboards"
export KEYBOARDS_CSV_TARGET="$TARGET/Keyboards/keyboards.csv"
# TODO: support passing -copy-keyboards, -debug, -clean etc in to build_keyboards
-../common/build_keyboards.sh -download-js-keyboards
+../common/build_keyboards.sh -download-keyboards
TARGET=FirstVoices
# TODO: in the future build_common.sh should probably be shared with all oem products?
diff --git a/oem/firstvoices/windows/.gitignore b/oem/firstvoices/windows/.gitignore
index ad51cca561..58e1ecbc7a 100644
--- a/oem/firstvoices/windows/.gitignore
+++ b/oem/firstvoices/windows/.gitignore
@@ -6,6 +6,7 @@ src/inst/*.exe
src/inst/download.mak
src/inst/fv_all.kmp
src/xml/localedef.dtd
+src/xml/sentry.init.js
**/Thumbs.db
# Temporary ignores
diff --git a/oem/firstvoices/windows/src/branding/menutitle.png b/oem/firstvoices/windows/src/branding/menutitle.png
index 3cbd973be4..70d7fa600f 100644
Binary files a/oem/firstvoices/windows/src/branding/menutitle.png and b/oem/firstvoices/windows/src/branding/menutitle.png differ
diff --git a/oem/firstvoices/windows/src/inst/Makefile b/oem/firstvoices/windows/src/inst/Makefile
index a0e2ec268a..be9f4ad9f6 100644
--- a/oem/firstvoices/windows/src/inst/Makefile
+++ b/oem/firstvoices/windows/src/inst/Makefile
@@ -11,7 +11,7 @@ MSI=firstvoices.msi
EXE=firstvoices.exe
KMP=fv_all.kmp
INTEXE=firstvoices-fv_all.exe
-APPTITLE="FirstVoices Keyboards"
+APPTITLE="Keyman for FirstVoices"
TITLEIMAGE=setuptitle.png
# If doing manual build of the project, manual-setup is the default target
@@ -28,6 +28,9 @@ prereq:
cd $(FVROOT)\src\inst
$(MKVER_U) download.in download.mak
+ cd $(FVROOT)\src\xml
+ $(MKVER_U) sentry.init.js.in sentry.init.js
+
#
# Build FirstVoices keyboards fv_all.kmp
#
diff --git a/oem/firstvoices/windows/src/inst/license.html b/oem/firstvoices/windows/src/inst/license.html
index f8734937cf..9c601dc5c7 100644
--- a/oem/firstvoices/windows/src/inst/license.html
+++ b/oem/firstvoices/windows/src/inst/license.html
@@ -9,7 +9,7 @@
-
-
-
\ No newline at end of file
+
diff --git a/oem/firstvoices/windows/src/xml/keyman_footer.xsl b/oem/firstvoices/windows/src/xml/keyman_footer.xsl
index 9a5ed6d721..7e940e764b 100644
--- a/oem/firstvoices/windows/src/xml/keyman_footer.xsl
+++ b/oem/firstvoices/windows/src/xml/keyman_footer.xsl
@@ -9,28 +9,18 @@