diff --git a/HISTORY.md b/HISTORY.md index 71c17c7b6f..ce88c9fcdf 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,41 @@ # Keyman Version History +## 17.0.42 alpha 2023-02-03 + +* chore(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 (#8144) +* feat(developer): check for duplicated language codes in package editor and compiler (#8151) +* chore: Fail TC build if triggering Jenkins build fails (#8152) +* chore(linux): Fix lintian warnings (#8154) +* chore(core): Update meson version (#7882) +* refactor(android/engine): Consolidate Keyboard picker intent (#8163) + +## 17.0.41 alpha 2023-02-02 + +* chore(web): main web build & test script rework to our common script format + nomenclature (#7474) +* change(web): conversion to standard filesystem layout: source -> src, intermediate + release -> build (#7513) +* change(web): conversion to standard filesystem layout: testing -> src/test/manual, unit_tests -> src/test/auto (#7515) +* change(web): conversion to standard filesystem layout: tools -> src/tools (#7556) +* chore(web): updates build product references, extracts CI test-build scripts (#7831) +* feat(common): TS-based sourcemap remapping tool (#7894) +* feat(web): implements shell scripting for CI release-build configurations (#8001) + +## 17.0.40 alpha 2023-02-01 + +* chore(developer): kmcmpdll debug src path (#8127) +* chore(common): Merge end of beta from Sprint A17S5 (#8135) +* refactor(android): Change com.tavultesoft.kmea package to com.keyman.engine (#7981) +* refactor(android/engine): Split KMInAppKeyboardWebViewClient to new class (#7983) +* refactor(android/engine): Refactor KMSystemKeyboardWebViewClient (#7993) + +## 17.0.39 alpha 2023-01-31 + +* feat(windows): add additional registry keys to report (#8126) + +## 17.0.38 alpha 2023-01-30 + +* chore(deps): bump ua-parser-js from 0.7.31 to 0.7.33 (#8109) +* fix(linux): Fix CI build (#8121) + ## 17.0.37 alpha 2023-01-27 * chore(linux): Fix warnings (#8103) @@ -121,7 +157,7 @@ ## 17.0.13 alpha 2022-11-29 * fix(windows): lower case filenames for projects (#7837) -* refactor(linux): Refactor setting keyboard options ️ (#7804) +* refactor(linux): Refactor setting keyboard options (#7804) ## 17.0.12 alpha 2022-11-25 @@ -129,7 +165,7 @@ ## 17.0.11 alpha 2022-11-24 -* refactor(linux): Use consts instead of strings ️ (#7803) +* refactor(linux): Use consts instead of strings (#7803) ## 17.0.10 alpha 2022-11-21 @@ -150,14 +186,14 @@ * chore: fix TIER.md for master (#7704) -## 17.0.6 beta 2022-11-12 +## 17.0.6 alpha 2022-11-12 * chore: merge beta to master B16S1 (#7693) * chore(deps): bump minimatch from 3.0.4 to 3.1.2 (#7675) ## 17.0.5 alpha 2022-11-11 -* chore(linux): Update debian changelog :cherries: (#7681) +* chore(linux): Update debian changelog (#7681) ## 17.0.4 alpha 2022-11-10 @@ -178,6 +214,22 @@ * chore: move to 17.0-alpha (#7577) * chore: Move to 17.0 alpha +## 16.0.136 beta 2023-01-31 + +* chore(common): Update crowdin strings for Shuwa (Latin) (#8097) +* chore(common): Check in crowdin for Russian (#8072) +* chore(common): Check in crowdin for Ukrainian (#8073) +* chore(common): Add crowdin for Swedish (#8071) +* chore(common): Add crowdin strings for Czech (#8095) + +## 16.0.135 beta 2023-01-30 + +* chore(linux): Include packaging path in Vcs-Git header (#8110) + +## 16.0.134 beta 2023-01-25 + +* chore(common): Add crowdin strings for Kannada (#7970) + ## 16.0.133 beta 2023-01-19 * fix(linux): Properly set context after changing IP (#8025) diff --git a/VERSION.md b/VERSION.md index f486dd0d9a..8a45cf78ed 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -17.0.38 \ No newline at end of file +17.0.43 \ No newline at end of file diff --git a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java index afd0c5e574..62ec9813c3 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java +++ b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java @@ -32,10 +32,10 @@ import com.android.installreferrer.api.InstallReferrerStateListener; import com.android.installreferrer.api.ReferrerDetails; import com.tavultesoft.kmapro.MainActivity; import com.tavultesoft.kmapro.R; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.VersionUtils; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.VersionUtils; public class CheckInstallReferrer { private static final String TAG = "CheckInstallReferrer"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/DownloadIntentService.java b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/DownloadIntentService.java index 7d7a801acf..d1f2eee7bb 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/DownloadIntentService.java +++ b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/DownloadIntentService.java @@ -5,9 +5,9 @@ import android.content.Intent; import android.os.Bundle; import android.os.ResultReceiver; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; public class DownloadIntentService extends IntentService { private static final String TAG = "DownloadIntentSvc"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/SystemKeyboard.java b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/SystemKeyboard.java index 2d07b6fbf8..697825094b 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/SystemKeyboard.java +++ b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/SystemKeyboard.java @@ -6,14 +6,14 @@ package com.keyman.android; import com.tavultesoft.kmapro.BuildConfig; import com.tavultesoft.kmapro.KeymanSettingsActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMManager.KeyboardType; -import com.tavultesoft.kmea.KMHardwareKeyboardInterpreter; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.KMHardwareKeyboardInterpreter; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.R; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; import android.content.Context; import android.content.SharedPreferences; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustKeyboardHeightActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustKeyboardHeightActivity.java index 24527abbce..bc3e7929cd 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustKeyboardHeightActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustKeyboardHeightActivity.java @@ -19,8 +19,8 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMManager; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMManager; /** * Settings menu for adjusting the keyboard height. The value for the current device orientation diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java index 6cf3f468b4..6c1e2eb90d 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java @@ -37,8 +37,8 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.util.KMLog; public class BookmarksActivity extends BaseActivity { private static final String TAG = "BookmarksActivity"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DownloadResultReceiver.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DownloadResultReceiver.java index 64f5eaa911..14297aa87e 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DownloadResultReceiver.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DownloadResultReceiver.java @@ -10,9 +10,9 @@ import android.os.Handler; import android.os.ResultReceiver; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.util.FileUtils; import java.io.File; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java index c10acadbfd..59558fdb1f 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java @@ -8,9 +8,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Keyboard; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Keyboard; import android.os.Bundle; import android.provider.Settings; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java index 25af3f9f77..250e18ac9c 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java @@ -4,7 +4,7 @@ package com.tavultesoft.kmapro; -import com.tavultesoft.kmea.BaseActivity; +import com.keyman.engine.BaseActivity; import android.content.Context; import android.graphics.Bitmap; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java index fe217c57e4..bb770ef5b2 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java @@ -21,11 +21,11 @@ import android.webkit.WebViewClient; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.KMPLink; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.WebViewUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.KMPLink; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.WebViewUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; 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 9b3b68f0f9..0989bf0d08 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 @@ -28,21 +28,21 @@ 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.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.FileProviderUtils; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.MapCompat; -import com.tavultesoft.kmea.util.QRCodeUtil; +import com.keyman.engine.ConfirmDialogFragment; +import com.keyman.engine.KMHelpFileActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.FileProviderUtils; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.MapCompat; +import com.keyman.engine.util.QRCodeUtil; -import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_KEYBOARD; +import static com.keyman.engine.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_KEYBOARD; // Public access is necessary to avoid IllegalAccessException public final class KeyboardSettingsActivity extends AppCompatActivity { diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java index 7eb7919bec..86494e929b 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java @@ -2,7 +2,7 @@ package com.tavultesoft.kmapro; import android.os.Bundle; -import com.tavultesoft.kmea.BaseActivity; +import com.keyman.engine.BaseActivity; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java index de33bfd9ae..72c54aa0d0 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java @@ -17,9 +17,9 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; -import com.tavultesoft.kmea.DisplayLanguages; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Dataset; +import com.keyman.engine.DisplayLanguages; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Dataset; import java.util.HashMap; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsInstallActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsInstallActivity.java index b933f7306c..71a8f7c355 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsInstallActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsInstallActivity.java @@ -24,9 +24,9 @@ import android.os.Bundle; import android.widget.SimpleAdapter; import android.widget.TextView; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.util.MapCompat; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.util.MapCompat; public class KeymanSettingsInstallActivity extends AppCompatActivity { private static final String TAG = "SettingsInstallActivity"; @@ -51,7 +51,7 @@ public class KeymanSettingsInstallActivity extends AppCompatActivity { getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); - final ListView listView = findViewById(com.tavultesoft.kmea.R.id.listView); + final ListView listView = findViewById(com.keyman.engine.R.id.listView); Bundle bundle = getIntent().getExtras(); @@ -96,9 +96,9 @@ public class KeymanSettingsInstallActivity extends AppCompatActivity { installOptionList.add(hashMap); String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{com.keyman.engine.R.id.text1, com.keyman.engine.R.id.text2, com.keyman.engine.R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, installOptionList, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + ListAdapter adapter = new SimpleAdapter(context, installOptionList, com.keyman.engine.R.layout.list_row_layout2, from, to) { @Override public boolean isEnabled(int position) { HashMap hashMap = installOptionList.get(position); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java index 0c6ea5b1ef..2402d7b109 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -21,7 +21,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.preference.PreferenceManager; -import com.tavultesoft.kmea.DisplayLanguages; +import com.keyman.engine.DisplayLanguages; import java.util.ArrayList; import java.util.HashMap; @@ -48,7 +48,7 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); - final ListView listView = findViewById(com.tavultesoft.kmea.R.id.listView); + final ListView listView = findViewById(com.keyman.engine.R.id.listView); Bundle bundle = getIntent().getExtras(); @@ -69,9 +69,9 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { } String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{com.keyman.engine.R.id.text1, com.keyman.engine.R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.tavultesoft.kmea.R.layout.list_row_layout1, from, to) { + ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.keyman.engine.R.layout.list_row_layout1, from, to) { }; listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java index 335de4da3e..004d096bac 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java @@ -25,13 +25,13 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.ModelPickerActivity; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.adapters.NestedAdapter; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.ModelPickerActivity; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.adapters.NestedAdapter; +import com.keyman.engine.util.KMLog; import java.util.HashMap; @@ -315,7 +315,7 @@ public final class LanguageSettingsActivity extends AppCompatActivity { } // Fully details the building of this Activity's list view items. - static private class FilteredKeyboardsAdapter extends NestedAdapter { + static private class FilteredKeyboardsAdapter extends NestedAdapter { static final int RESOURCE = R.layout.list_row_layout1; private static class ViewHolder { diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguagesSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguagesSettingsActivity.java index 0cf396f635..8cc4ae8070 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguagesSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguagesSettingsActivity.java @@ -22,11 +22,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.adapters.AdapterFilter; -import com.tavultesoft.kmea.data.adapters.NestedAdapter; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.KMManager; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.adapters.AdapterFilter; +import com.keyman.engine.data.adapters.NestedAdapter; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.KMManager; import java.util.ArrayList; import java.util.HashMap; 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 789844db53..96c0d3edfe 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,29 +18,29 @@ import java.util.List; import java.util.Map; import com.keyman.android.CheckInstallReferrer; -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; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.KMTextView; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.DownloadFileUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMHelpFileActivity; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.KMTextView; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardDownloadEventListener; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.DownloadFileUtils; import com.keyman.android.DownloadIntentService; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMPLink; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.WebViewUtils.EngineWebViewVersionStatus; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMPLink; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.WebViewUtils.EngineWebViewVersionStatus; import android.Manifest; import android.app.ProgressDialog; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java index 86e1008e54..a99019fe2e 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java @@ -18,14 +18,14 @@ import android.widget.Toast; import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardEventHandler; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardEventHandler; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.packages.LexicalModelPackageProcessor; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; import org.json.JSONObject; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index ab8776bc64..892ac820cf 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -13,10 +13,10 @@ import androidx.fragment.app.Fragment; import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.KMLog; import org.json.JSONObject; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java index da53c2000f..03d053e469 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java @@ -23,11 +23,11 @@ import androidx.fragment.app.Fragment; import com.stepstone.stepper.BlockingStep; import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.KMLog; import org.json.JSONObject; @@ -179,7 +179,7 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt } String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{R.id.text1, R.id.text2, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{R.id.text1, R.id.text2, com.keyman.engine.R.id.image1}; adapter = new KMListAdapter(context, list, R.layout.list_row_layout2, from, to); listView.setAdapter(adapter); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java index bd298a42ad..46bc68ca1a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java @@ -19,10 +19,10 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.util.KMLog; import java.io.File; import java.util.ArrayList; @@ -87,9 +87,9 @@ public final class SelectPackageActivity extends AppCompatActivity { } String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{com.keyman.engine.R.id.text1, com.keyman.engine.R.id.text2, com.keyman.engine.R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, list, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + ListAdapter adapter = new SimpleAdapter(context, list, com.keyman.engine.R.layout.list_row_layout2, from, to) { }; listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java index 7dda328be9..60d26d7508 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SplashScreenActivity.java @@ -8,7 +8,7 @@ import android.app.Activity; import android.content.Intent; import android.widget.TextView; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.util.KMLog; import java.util.Calendar; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java index 26fdbca2a6..86b3d366d4 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java @@ -13,9 +13,9 @@ import androidx.fragment.app.FragmentManager; import com.stepstone.stepper.Step; import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter; import com.stepstone.stepper.viewmodel.StepViewModel; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.FileUtils; import java.io.File; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java index eeff8d75bb..3308caff9a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java @@ -10,9 +10,9 @@ import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.KMPLink; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.KMPLink; import android.annotation.SuppressLint; import android.content.Context; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebViewFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebViewFragment.java index d844a06996..5e7aed9dd2 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebViewFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebViewFragment.java @@ -12,9 +12,9 @@ import androidx.fragment.app.Fragment; import com.stepstone.stepper.BlockingStep; import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.WebViewUtils; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.WebViewUtils; import android.graphics.Bitmap; import android.os.Bundle; diff --git a/android/KMAPro/kMAPro/src/main/res/layout/activity_main.xml b/android/KMAPro/kMAPro/src/main/res/layout/activity_main.xml index fb960c8473..87c7fe16f9 100644 --- a/android/KMAPro/kMAPro/src/main/res/layout/activity_main.xml +++ b/android/KMAPro/kMAPro/src/main/res/layout/activity_main.xml @@ -17,7 +17,7 @@ android:layout_height="wrap_content" android:layout_below="@id/titlebar"/> - - + diff --git a/android/KMAPro/kMAPro/src/main/res/values-b+shu+latn/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-b+shu+latn/strings.xml index 0ae4064ffd..bfd4f8b6d5 100644 --- a/android/KMAPro/kMAPro/src/main/res/values-b+shu+latn/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values-b+shu+latn/strings.xml @@ -1,5 +1,6 @@ + Gassuma diff --git a/android/KMAPro/kMAPro/src/main/res/values-ru-rRU/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-ru-rRU/strings.xml new file mode 100644 index 0000000000..a42578425d --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/res/values-ru-rRU/strings.xml @@ -0,0 +1,163 @@ + + + + + Поделиться + + Веб-браузер + + Размер текста + + Больше + + Очистить текст + + Инф. + + Настройки + + Установить обновления + + Версия: %1$s + + Keyman требует Chrome версии 57 или новее. + + Обновить Chrome + + Начните вводить здесь… + + + + Размер текста: %1$d + + Размер текста вверх + + Размер текста вниз + + \nВесь текст будет очищен\n + + Начать работу + + Добавить клавиатуру для вашего языка + + Включить клавиатуру как системную клавиатуру + + Установить клавиатуру по умолчанию + + Подробнее + + Показать \"%1$s\" при запуске + + Для установки пакетов клавиатуры разрешите разрешение на чтение внешнего накопителя. + + Запрос на доступ к хранилищу отклонен. Может не установить пакет клавиатуры + + Настройки + + + Установленные языки (%1$d) + Установленные языки (%1$d) + Установленные языки (%1$d) + Установленные языки (%1$d) + + + Установить клавиатуру или словарь + + Показать язык + + Настройка высоты клавиатуры + + Заголовок пробела + + Клавиатура + + Язык + + Язык + клавиатура + + Пустой + + Показывать имя клавиатуры на пробеле + + Показывать название языка в пробеле + + Язык и клавиатура на пробеле + + Не показывать заголовок в пробеле + + Vibrate when typing + + Всегда показывать баннер + + Будет реализовано + + Если выключен, отображается только при включенном предиктивном тексте + + Разрешить отправку отчетов об ошибках по сети + + Когда включено, отчеты о сбоях будут отправлены + + Отчеты о сбое не будут отправлены + + Установить с keyman.com + + Установить из локального файла + + Установить с другого устройства + + Добавить языки на установленную клавиатуру + + (из пакета клавиатуры) + + Выберите набор клавиатуры + + Выберите языки для %1$s + + Язык %1$s добавлен в %2$s + + Все языки уже установлены + + Перетащите клавиатуру для изменения высоты + + Повернуть устройство для настройки портрета и ландшафта + + Сброс по умолчанию + + Поиск или введите URL + + Закладки + + Нет закладок + + Добавить закладку + + Заглавие + + Url + + Не удалось установить пакет %1$s + + Загрузка пакета клавиатуры\n%1$s… + + Не удалось извлечь + + Установить клавиатуру + + Установить словарь + + %1$s не является допустимым файлом пакета Keyman.\n%2$s\" + + В пакете клавиатуры нет сенсорных клавиатур для установки + + Нет нового предиктивного текста для установки + + Нет клавиатуры или предиктивного текста для установки + + Пакет клавиатуры не имеет связанных языков для установки + + Невалидные/отсутствующие метаданные в пакете + + Keyboard requires a newer version of Keyman + + Unable to launch web browser + diff --git a/android/KMAPro/kMAPro/src/main/res/values-sv-rSE/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-sv-rSE/strings.xml new file mode 100644 index 0000000000..1ad77c2919 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/res/values-sv-rSE/strings.xml @@ -0,0 +1,161 @@ + + + + + Dela + + Webbläsare + + Textstorlek + + Mer + + Rensa text + + Information + + Inställningar + + Installera uppdateringar + + Version: %1$s + + Keyman kräver Chrome version 57 eller senare. + + Uppdatera Chrome + + Börja skriva här… + + + + Textstorlek: %1$d + + Textstorlek upp + + Textstorlek ner + + \nAll text kommer att rensas\n + + Kom igång + + Lägg till ett tangentbord för ditt språk + + Aktivera Keyman som tangentbord i hela systemet + + Sätt Keyman som standardtangentbord + + Mer information + + Visa \"%1$s\" vid uppstart + + För att installera tangentbordspaket, tillåt Keyman tillåtelse att läsa extern lagring. + + Begäran om lagringsbehörighet nekades. Kan misslyckas med att installera tangentbordspaket + + Inställningar + + + Installerade språk (%1$d) + Installerade språk (%1$d) + + + Installera tangentbord eller ordbok + + Visa språk + + Justera tangentbordshöjd + + Mellanslag bildtext + + Keyboard + + Språk + + Språk + Tangentbord + + Tom + + Visa tangentbordsnamn på mellanslag + + Visa språknamn på mellanslag + + Språk och tangentbord på mellanslagstangenten + + Visa inte bildtext på mellanslagstangenten + + Vibrate when typing + + Visa alltid banner + + Att implementeras + + När du är avstängd, visas endast när prediktiv text är aktiverad + + Tillåt skicka kraschrapporter över nätverk + + När den är aktiverad kommer kraschrapporter att skickas + + När du är avstängd skickas inte kraschrapporter + + Installera från keyman.com + + Installera från lokal fil + + Installera från annan enhet + + Lägg till språk till installerat tangentbord + + (från tangentbordspaket) + + Välj tangentbordspaket + + Välj språk för %1$s + + Lade till språk %1$s till %2$s + + Alla språk är redan installerade + + Dra tangentbordet för att ändra storlek på höjden + + Rotera enheten för att justera stående och liggande + + Återställ till standard + + Sök eller skriv URL + + Bokmärken + + Inga bokmärken + + Lägg till bokmärke + + Titel + + URL + + Paketet %1$s kunde inte installeras + + Laddar ner tangentbordspaket\n%1$s… + + Det gick inte att extrahera + + Installera tangentbord + + Installera ordbok + + %1$s är inte en giltig Keyman-fil.\n%2$s\" + + Tangentbordspaketet har inga touch-optimerade tangentbord att installera + + Ingen ny prediktiv text att installera + + Inga tangentbord eller prediktiv text att installera + + Tangentbordspaket har inga associerade språk att installera + + Ogiltiga/saknade metadata i paketet + + Keyboard requires a newer version of Keyman + + Unable to launch web browser + diff --git a/android/KMAPro/kMAPro/src/main/res/values-uk-rUA/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-uk-rUA/strings.xml new file mode 100644 index 0000000000..0b9abbf394 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/res/values-uk-rUA/strings.xml @@ -0,0 +1,163 @@ + + + + + Поділитись + + Веб-переглядач + + Розмір тексту + + Більше + + Очистити текст + + Інформація + + Налаштування + + Встановити оновлення + + Версія: %1$s + + Keyman вимагає Chrome версії 57 або новіше. + + Оновлення Chrome + + Почніть вводити тут… + + + + Розмір тексту: %1$d + + Розмір тексту вгору + + Розмір тексту вниз + + \nВесь текст буде очищено\n + + Початок роботи + + Додайте клавіатуру для вашої мови + + Увімкнути Keyman як системну клавіатуру + + Встановити Keyman як типова клавіатура + + Детальніше + + Показувати \"%1$s\" під час запуску + + Щоб встановити пакунки клавіатури, дозвольте Keyman читати зовнішнє сховище. + + Запит на дозвіл на зберігання даних було відхилено. Може не вдалося встановити пакет клавіатури + + Налаштування + + + Встановлені мови (%1$d) + Встановлені мови (%1$d) + Встановлені мови (%1$d) + Встановлені мови (%1$d) + + + Встановлення клавіатури або словника + + Мова інтерфейсу + + Відрегулюйте висоту клавіатури + + Заголовок до панелі + + Keyboard + + Мова: + + Мова + Клавіатура + + Пустий + + Показувати назву клавіатури на пробілі + + Показувати назву мови на пробілі + + Мова і клавіатура на пробілі + + Не показувати підпис на пробілі + + Vibrate when typing + + Завжди показувати банер + + Для реалізування + + Коли вимкнено, відображається лише коли включений прогнозований текст + + Дозволити надсилання звітів про аварії через мережу + + Коли увімкнено, звіти про збої будуть надіслані + + Коли вимкнено, звіти про помилки не надсилатимуться + + Встановити з keyman.com + + Встановити з локального файлу + + Встановити з іншого пристрою + + Додати мови до встановленої клавіатури + + (із пакета клавіатури) + + Виберіть пакунок клавіатури + + Вибрати мову для %1$s + + Додано мову %1$s до %2$s + + Всі мови вже встановлені + + Перетягніть клавіатуру, щоб змінити розмір висоти + + Поверніть пристрій, щоб змінити портретну та альбомну орієнтацію + + Відновити параметри за замовчуванням + + Пошук або введення URL + + Закладки + + Немає закладок + + Додати закладку + + Найменування + + URL-адреса + + Не вдалося встановити пакунок %1$s + + Завантаження пакета клавіатури\n%1$s… + + Не вдалося витягти + + Встановлення клавіатури + + Установіть словник + + %1$s не є коректним файлом пакету Keyman.\n%2$s\" + + Пакет клавіатури не має сенсорних клавіатур для встановлення + + Немає нового предикатного тексту для встановлення + + Немає клавіатур чи прогнозованого тексту для встановлення + + У пакунку клавіатури немає пов\'язаних мов для встановлення + + Невірні/відсутні метадані в пакеті + + Keyboard requires a newer version of Keyman + + Unable to launch web browser + diff --git a/android/KMEA/app/src/main/AndroidManifest.xml b/android/KMEA/app/src/main/AndroidManifest.xml index 3ba6d1a835..b880992618 100644 --- a/android/KMEA/app/src/main/AndroidManifest.xml +++ b/android/KMEA/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.keyman.engine" > @@ -22,7 +22,7 @@ implements OnClickListener { private final static int KEYBOARD_LAYOUT_RESOURCE = R.layout.list_row_layout3; diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardWebViewClient.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardWebViewClient.java new file mode 100644 index 0000000000..6b6503828d --- /dev/null +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardWebViewClient.java @@ -0,0 +1,280 @@ +/** + * Copyright (C) 2023 SIL International. All rights reserved. + */ +package com.keyman.engine; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.RectF; +import android.net.Uri; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.RelativeLayout; + +import com.keyman.engine.KeyboardEventHandler.EventType; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.data.Keyboard; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; + +public final class KMKeyboardWebViewClient extends WebViewClient { + public static final String TAG = "KMKeyboardWebViewClient"; + + public static Context context; + private static KeyboardType keyboardType; + private static boolean keyboardLoaded; + + KMKeyboardWebViewClient(Context context, KeyboardType keyboardType) { + KMKeyboardWebViewClient.context = context; + KMKeyboardWebViewClient.keyboardType = keyboardType; + KMKeyboardWebViewClient.keyboardLoaded = false; + + if (keyboardType != KeyboardType.KEYBOARD_TYPE_INAPP && keyboardType != KeyboardType.KEYBOARD_TYPE_SYSTEM) { + KMLog.LogError(TAG, String.format("Cannot initialize: Invalid keyboard type: %s", keyboardType.toString())); + } + } + + public void setContext(Context context) { + KMKeyboardWebViewClient.context = context; + } + + public boolean getKeyboardLoaded() { + return keyboardLoaded; + } + + public void setKeyboardLoaded(boolean keyboardLoaded) { + KMKeyboardWebViewClient.keyboardLoaded = keyboardLoaded; + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + } + + @Override + public void onPageFinished(WebView view, String url) { + Log.d("KMEA", String.format("onPageFinished: [%s] %s", keyboardType.toString(), url)); + shouldOverrideUrlLoading(view, url); + } + + private void pageLoaded(WebView view, String url) { + Log.d("KMEA", String.format("pageLoaded: [%s] %s", keyboardType.toString(), url)); + KMKeyboard kmKeyboard = KMManager.getKMKeyboard(keyboardType); + if (kmKeyboard == null) { + KMLog.LogError(TAG, String.format("pageLoaded and %s keyboard null", keyboardType.toString())); + return; + } + kmKeyboard.keyboardSet = false; + KMManager.currentLexicalModel = null; + + if (url.startsWith("file")) { // TODO: is this test necessary? + KMKeyboardWebViewClient.keyboardLoaded = true; + + SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); + int index = prefs.getInt(KMManager.KMKey_UserKeyboardIndex, 0); + if (index < 0) { + index = 0; + } + Keyboard keyboardInfo = KMManager.getKeyboardInfo(context, index); + String langId = null; + if (keyboardInfo != null) { + langId = keyboardInfo.getLanguageID(); + kmKeyboard.setKeyboard(keyboardInfo); + } else { + // Revert to default (index 0) or fallback keyboard + keyboardInfo = KMManager.getKeyboardInfo(context, 0); + if (keyboardInfo == null) { + // Only log SystemKeyboard to Sentry because some keyboard apps like FV don't install keyboards until the user chooses + if (keyboardType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { + KMLog.LogError(TAG, "No keyboards installed. Reverting to fallback"); + } + keyboardInfo = KMManager.getDefaultKeyboard(context); + } + if (keyboardInfo != null) { + langId = keyboardInfo.getLanguageID(); + kmKeyboard.setKeyboard(keyboardInfo); + } + } + + KMManager.registerAssociatedLexicalModel(langId); + + kmKeyboard.showHelpBubbleAfterDelay(2000, true); // check if it should be shown at that time! + + kmKeyboard.callJavascriptAfterLoad(); + kmKeyboard.setSpacebarText(KMManager.getSpacebarText()); + + KeyboardEventHandler.notifyListeners(KMTextView.kbEventListeners, keyboardType, EventType.KEYBOARD_LOADED, null); + + // Special handling for in-app TextView context keymanapp/keyman#3809 + if (keyboardType == KeyboardType.KEYBOARD_TYPE_INAPP && + KMTextView.activeView != null && KMTextView.activeView.getClass() == KMTextView.class) { + KMTextView.updateTextContext(); + } + } + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.d("KMEA", String.format("shouldOverrideUrlLoading [%s]: %s", keyboardType.toString(), url)); + KMKeyboard kmKeyboard = KMManager.getKMKeyboard(keyboardType); + if (kmKeyboard == null) { + KMLog.LogError(TAG, String.format("shouldOverrideUrlLoading and %s null", keyboardType.toString())); + return false; + } + + // URL has actual path to the keyboard.html file as a prefix! We need to replace + // just the first intended '#' to get URI-based query param processing. + + // At some point, other parts of the function should be redone to allow use of ? instead + // of # in our WebView command "queries" entirely. + String cmd = url.replace("keyboard.html#", "keyboard.html?"); + Uri urlCommand = Uri.parse(cmd); + if (url.indexOf("pageLoaded") >= 0) { + pageLoaded(view, url); + } else if (url.indexOf("hideKeyboard") >= 0) { + // Dismiss help bubble - though it should only ever display with KEYBOARD_TYPE_INAPP + kmKeyboard.dismissHelpBubble(); + if (keyboardType == KeyboardType.KEYBOARD_TYPE_INAPP) { + if (KMTextView.activeView != null && KMTextView.activeView.getClass() == KMTextView.class) { + KMTextView textView = (KMTextView) KMTextView.activeView; + textView.dismissKeyboard(); + } + } else if (keyboardType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { + if (KMManager.IMService != null) { + KMManager.IMService.requestHideSelf(0); + } + } + } else if (urlCommand.getQueryParameter("globeKeyAction") != null) { + kmKeyboard.dismissHelpBubble(); + kmKeyboard.setShouldShowHelpBubble(false); + + // Globe key has been used; disable the internal preference setting. + KMManager.setPersistentShouldShowHelpBubble(false); + + KMManager.handleGlobeKeyAction(context, urlCommand.getBooleanQueryParameter("keydown", false), + keyboardType); + } else if (urlCommand.getQueryParameter("helpBubbleDismissed") != null) { + // The user has begun interacting with the keyboard; we'll disable the help bubble + // for the rest of the lifetime of this keyboard instance. + kmKeyboard.setShouldShowHelpBubble(false); + } else if (url.indexOf("showKeyPreview") >= 0) { + String deviceType = context.getResources().getString(R.string.device_type); + if (deviceType.equals("AndroidTablet")) { + return false; + } + + if (kmKeyboard.subKeysWindow != null) { + return false; + } + + int start = url.indexOf("x=") + 2; + int end = url.indexOf("+y="); + float x = Float.valueOf(url.substring(start, end)); + + start = url.indexOf("y=") + 2; + end = url.indexOf("+w="); + float y = Float.valueOf(url.substring(start, end)); + + start = url.indexOf("w=") + 2; + end = url.indexOf("+h="); + float w = Float.valueOf(url.substring(start, end)); + + start = url.indexOf("h=") + 2; + end = url.indexOf("+t="); + float h = Float.valueOf(url.substring(start, end)); + + start = url.indexOf("t=") + 2; + String t = url.substring(start); + String text = kmKeyboard.convertKeyText(t); + + float left = x - w / 2.0f; + float right = left + w; + float top = y - 1; + float bottom = top + h; + + RectF keyFrame = new RectF(left, top, right, bottom); + kmKeyboard.showKeyPreview(context, (int) x, (int) y, keyFrame, text); + } else if (url.indexOf("dismissKeyPreview") >= 0) { + kmKeyboard.dismissKeyPreview(100); + } else if (url.indexOf("showMore") >= 0) { + if (kmKeyboard.subKeysWindow != null && kmKeyboard.subKeysWindow.isShowing()) { + return false; + } + + int start = url.indexOf("keyPos=") + 7; + int end = url.indexOf("+keys="); + kmKeyboard.subKeysWindowPos = url.substring(start, end).split("\\,"); + + start = end + 6; + end = url.indexOf("+font="); + if (end < 0) { + end = url.length(); + kmKeyboard.specialOskFont = ""; + } else { + kmKeyboard.specialOskFont = KMManager.KMFilename_Osk_Ttf_Font; + } + + String keys = url.substring(start, end); + + String[] keyList = keys.split("\\;"); + int klCount = keyList.length; + kmKeyboard.subKeysList = new ArrayList>(); + for (int i = 0; i < klCount; i++) { + String[] values = keyList[i].split("\\:"); + String keyId = (values.length > 0) ? values[0] : ""; + String keyText = (values.length > 1) ? values[1] : ""; + + HashMap hashMap = new HashMap(); + hashMap.put("keyId", keyId); + hashMap.put("keyText", keyText); + kmKeyboard.subKeysList.add(hashMap); + } + } else if (url.indexOf("refreshBannerHeight") >= 0) { + int start = url.indexOf("change=") + 7; + String change = url.substring(start); + boolean isModelActive = change.equals("active"); + // appContext instead of context? + SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); + boolean modelPredictionPref = false; + if (KMManager.currentLexicalModel != null) { + modelPredictionPref = prefs.getBoolean(KMManager.getLanguagePredictionPreferenceKey(KMManager.currentLexicalModel.get(KMManager.KMKey_LanguageID)), true); + } + KMManager.currentBanner = (isModelActive && modelPredictionPref) ? + KMManager.KM_BANNER_STATE_SUGGESTION : KMManager.KM_BANNER_STATE_BLANK; + RelativeLayout.LayoutParams params = KMManager.getKeyboardLayoutParams(); + kmKeyboard.setLayoutParams(params); + } else if (url.indexOf("suggestPopup") >= 0) { + double x = Float.parseFloat(urlCommand.getQueryParameter("x")); + double y = Float.parseFloat(urlCommand.getQueryParameter("y")); + double width = Float.parseFloat(urlCommand.getQueryParameter("w")); + double height = Float.parseFloat(urlCommand.getQueryParameter("h")); + String suggestionJSON = urlCommand.getQueryParameter("suggestion"); + + JSONParser parser = new JSONParser(); + JSONObject obj = parser.getJSONObjectFromURIString(suggestionJSON); + + /* // For future implementation + InAppKeyboard.suggestionWindowPos = new double[]{x, y}; + InAppKeyboard.suggestionJSON = suggestionJSON; + + try { + Log.v("KMEA", "Suggestion display: " + obj.getString("displayAs")); + Log.v("KMEA", "Suggestion's banner coords: " + x + ", " + y + ", " + width + ", " + height); + Log.v("KMEA", "Is a suggestion: "); // likely outdated now that tags exist. + } catch (JSONException e) { + //e.printStackTrace(); + Log.v("KMEA", "JSON parsing error: " + e.getMessage()); + } + */ + } else if (url.indexOf("reloadAfterError") >= 0) { + kmKeyboard.reloadAfterError(); + } + return false; + } +} diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java similarity index 80% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java index e7bab6f722..b8e115f3e8 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java @@ -2,7 +2,7 @@ * Copyright (C) 2017 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.io.File; import java.io.FileFilter; @@ -12,7 +12,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,7 +33,6 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -62,27 +60,25 @@ import io.sentry.Breadcrumb; import io.sentry.Sentry; import io.sentry.SentryLevel; -import com.tavultesoft.kmea.KeyboardEventHandler.EventType; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.cloud.CloudDataJsonUtil; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.logic.ResourcesUpdateTool; -import com.tavultesoft.kmea.packages.JSONUtils; -import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.CharSequenceUtil; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.MapCompat; -import com.tavultesoft.kmea.util.WebViewUtils; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardDownloadEventListener; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.logic.ResourcesUpdateTool; +import com.keyman.engine.packages.JSONUtils; +import com.keyman.engine.packages.LexicalModelPackageProcessor; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.CharSequenceUtil; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.MapCompat; +import com.keyman.engine.util.WebViewUtils; import org.json.JSONArray; import org.json.JSONException; @@ -161,7 +157,7 @@ public final class KMManager { } }; - private static InputMethodService IMService; + protected static InputMethodService IMService; private static boolean debugMode = false; private static boolean shouldAllowSetKeyboard = true; private static boolean didCopyAssets = false; @@ -178,14 +174,14 @@ public final class KMManager { private static KMManager.SpacebarText spacebarText = KMManager.SpacebarText.LANGUAGE_KEYBOARD; // must match default given in kmwbase.ts - protected static boolean InAppKeyboardLoaded = false; - protected static boolean SystemKeyboardLoaded = false; protected static boolean InAppKeyboardShouldIgnoreTextChange = false; protected static boolean InAppKeyboardShouldIgnoreSelectionChange = false; protected static boolean SystemKeyboardShouldIgnoreTextChange = false; protected static boolean SystemKeyboardShouldIgnoreSelectionChange = false; protected static KMKeyboard InAppKeyboard = null; protected static KMKeyboard SystemKeyboard = null; + protected static KMKeyboardWebViewClient InAppKeyboardWebViewClient = null; + protected static KMKeyboardWebViewClient SystemKeyboardWebViewClient = null; protected static HashMap currentLexicalModel = null; protected static WebViewUtils.EngineWebViewVersionStatus engineWebViewVersionStatus = WebViewUtils.EngineWebViewVersionStatus.UNDETERMINED; @@ -336,12 +332,12 @@ public final class KMManager { /** * Extract KMEA tier from versionName. Uses parameter so we can unit test. * @param versionName String - If not provided, determine tier from - * com.tavultesoft.kmea.BuildConfig.KEYMAN_ENGINE_VERSION_NAME + * com.keyman.engine.BuildConfig.KEYMAN_ENGINE_VERSION_NAME * @return Tier (ALPHA, BETA, STABLE) */ public static Tier getTier(String versionName) { if (versionName == null || versionName.isEmpty()) { - versionName = com.tavultesoft.kmea.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; + versionName = com.keyman.engine.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; } Pattern pattern = Pattern.compile("^(\\d+\\.\\d+\\.\\d+)-(alpha|beta|stable).*"); Matcher matcher = pattern.matcher(versionName); @@ -362,7 +358,7 @@ public final class KMManager { */ public static String getMajorVersion() { // Regex needs to match the entire string - String appVersion = com.tavultesoft.kmea.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; + String appVersion = com.keyman.engine.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; Pattern pattern = Pattern.compile("^(\\d+\\.\\d+)\\.\\d+.*"); Matcher matcher = pattern.matcher(appVersion); if (matcher.matches() && matcher.groupCount() >= 1) { @@ -378,7 +374,7 @@ public final class KMManager { */ public static String getVersion() { // Regex needs to match the entire string - String appVersion = com.tavultesoft.kmea.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; + String appVersion = com.keyman.engine.BuildConfig.KEYMAN_ENGINE_VERSION_NAME; Pattern pattern = Pattern.compile("^(\\d+\\.\\d+\\.\\d+).*"); Matcher matcher = pattern.matcher(appVersion); if (matcher.matches() && matcher.groupCount() >= 1) { @@ -620,7 +616,8 @@ public final class KMManager { InAppKeyboard.setLayoutParams(params); InAppKeyboard.setVerticalScrollBarEnabled(false); InAppKeyboard.setHorizontalScrollBarEnabled(false); - InAppKeyboard.setWebViewClient(new KMInAppKeyboardWebViewClient(appContext)); + InAppKeyboardWebViewClient = new KMKeyboardWebViewClient(appContext, KeyboardType.KEYBOARD_TYPE_INAPP); + InAppKeyboard.setWebViewClient(InAppKeyboardWebViewClient); InAppKeyboard.addJavascriptInterface(new KMInAppKeyboardJSHandler(appContext, InAppKeyboard), "jsInterface"); InAppKeyboard.loadKeyboard(); @@ -635,7 +632,8 @@ public final class KMManager { SystemKeyboard.setLayoutParams(params); SystemKeyboard.setVerticalScrollBarEnabled(false); SystemKeyboard.setHorizontalScrollBarEnabled(false); - SystemKeyboard.setWebViewClient(new KMSystemKeyboardWebViewClient(appContext)); + SystemKeyboardWebViewClient = new KMKeyboardWebViewClient(appContext, KeyboardType.KEYBOARD_TYPE_SYSTEM); + SystemKeyboard.setWebViewClient(SystemKeyboardWebViewClient); SystemKeyboard.addJavascriptInterface(new KMSystemKeyboardJSHandler(appContext, SystemKeyboard), "jsInterface"); SystemKeyboard.loadKeyboard(); @@ -665,9 +663,15 @@ public final class KMManager { public static boolean isKeyboardLoaded(KeyboardType type) { if (type == KeyboardType.KEYBOARD_TYPE_INAPP) { - return InAppKeyboardLoaded; + if (InAppKeyboardWebViewClient != null) { + return InAppKeyboardWebViewClient.getKeyboardLoaded(); + } + return false; } else if (type == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - return SystemKeyboardLoaded; + if (SystemKeyboardWebViewClient != null) { + return SystemKeyboardWebViewClient.getKeyboardLoaded(); + } + return false; } else { String msg = "Keyboard type undefined"; KMLog.LogError(TAG, msg); @@ -1327,12 +1331,12 @@ public final class KMManager { boolean mayCorrect = prefs.getBoolean(getLanguageCorrectionPreferenceKey(languageID), true); RelativeLayout.LayoutParams params; - if (InAppKeyboard != null && InAppKeyboardLoaded && !InAppKeyboardShouldIgnoreTextChange && modelFileExists) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded() && !InAppKeyboardShouldIgnoreTextChange && modelFileExists) { params = getKeyboardLayoutParams(); InAppKeyboard.setLayoutParams(params); InAppKeyboard.loadJavascript(KMString.format("enableSuggestions(%s, %s, %s)", model, mayPredict, mayCorrect)); } - if (SystemKeyboard != null && SystemKeyboardLoaded && !SystemKeyboardShouldIgnoreTextChange && modelFileExists) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded() && !SystemKeyboardShouldIgnoreTextChange && modelFileExists) { params = getKeyboardLayoutParams(); SystemKeyboard.setLayoutParams(params); SystemKeyboard.loadJavascript(KMString.format("enableSuggestions(%s, %s, %s)", model, mayPredict, mayCorrect)); @@ -1347,11 +1351,11 @@ public final class KMManager { } String url = KMString.format("deregisterModel('%s')", modelID); - if (InAppKeyboard != null) { // && InAppKeyboardLoaded) { + if (InAppKeyboard != null) { InAppKeyboard.loadJavascript(url); } - if (SystemKeyboard != null) { // && SystemKeyboardLoaded) { + if (SystemKeyboard != null) { SystemKeyboard.loadJavascript(url); } return true; @@ -1497,10 +1501,10 @@ public final class KMManager { boolean result1 = false; boolean result2 = false; - if (InAppKeyboard != null && InAppKeyboardLoaded) + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded()) result1 = InAppKeyboard.setKeyboard(packageID, keyboardID, languageID); - if (SystemKeyboard != null && SystemKeyboardLoaded) + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) result2 = SystemKeyboard.setKeyboard(packageID, keyboardID, languageID); return (result1 || result2); @@ -1510,11 +1514,11 @@ public final class KMManager { boolean result1 = false; boolean result2 = false; - if (InAppKeyboard != null && InAppKeyboardLoaded && keyboardInfo != null) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded() && keyboardInfo != null) { result1 = InAppKeyboard.setKeyboard(keyboardInfo); } - if (SystemKeyboard != null && SystemKeyboardLoaded && keyboardInfo != null) + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded() && keyboardInfo != null) result2 = SystemKeyboard.setKeyboard(keyboardInfo); if (keyboardInfo != null) { @@ -1540,11 +1544,11 @@ public final class KMManager { boolean result1 = false; boolean result2 = false; - if (InAppKeyboard != null && InAppKeyboardLoaded) + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded()) { result1 = InAppKeyboard.prepareKeyboardSwitch(packageID, keyboardID, languageID,keyboardName); } - if (SystemKeyboard != null && SystemKeyboardLoaded) + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) { result2 = SystemKeyboard.prepareKeyboardSwitch(packageID, keyboardID, languageID,keyboardName); } @@ -1559,10 +1563,10 @@ public final class KMManager { boolean result1 = false; boolean result2 = false; - if (InAppKeyboard != null && (InAppKeyboardLoaded || isTestMode())) + if (InAppKeyboard != null && (InAppKeyboardWebViewClient.getKeyboardLoaded() || isTestMode())) result1 = InAppKeyboard.setKeyboard(packageID, keyboardID, languageID, keyboardName, languageName, kFont, kOskFont); - if (SystemKeyboard != null && SystemKeyboardLoaded) + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) result2 = SystemKeyboard.setKeyboard(packageID, keyboardID, languageID, keyboardName, languageName, kFont, kOskFont); registerAssociatedLexicalModel(languageID); @@ -1602,11 +1606,11 @@ public final class KMManager { } public static void clearKeyboardCache() { - if (InAppKeyboard != null && InAppKeyboardLoaded) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded()) { InAppKeyboard.clearCache(true); InAppKeyboard.loadKeyboard(); } - if (SystemKeyboard != null && SystemKeyboardLoaded) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) { SystemKeyboard.clearCache(true); SystemKeyboard.loadKeyboard(); } @@ -1854,19 +1858,19 @@ public final class KMManager { } public static void applyKeyboardHeight(Context context, int height) { - if (InAppKeyboard != null && InAppKeyboardLoaded) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded()) { InAppKeyboard.loadJavascript(KMString.format("setOskHeight('%s')", height)); RelativeLayout.LayoutParams params = getKeyboardLayoutParams(); InAppKeyboard.setLayoutParams(params); } - if (SystemKeyboard != null && SystemKeyboardLoaded) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) { SystemKeyboard.loadJavascript(KMString.format("setOskHeight('%s')", height)); RelativeLayout.LayoutParams params = getKeyboardLayoutParams(); SystemKeyboard.setLayoutParams(params); } } - private static void setPersistentShouldShowHelpBubble(boolean flag) { + protected static void setPersistentShouldShowHelpBubble(boolean flag) { SharedPreferences prefs = appContext.getSharedPreferences(appContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(KMManager.KMKey_ShouldShowHelpBubble, flag); @@ -1901,21 +1905,22 @@ public final class KMManager { } public static void showKeyboardPicker(Context context, KeyboardType kbType) { - if (kbType == KeyboardType.KEYBOARD_TYPE_INAPP) { - Intent i = new Intent(context, KeyboardPickerActivity.class); - i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - i.putExtra(KMKey_DisplayKeyboardSwitcher, false); - context.startActivity(i); - } else if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - Intent i = new Intent(context, KeyboardPickerActivity.class); - i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + if (kbType == KeyboardType.KEYBOARD_TYPE_UNDEFINED) { + KMLog.LogError(TAG, String.format("showKeyboardPicker with invalid %s", kbType.toString())); + return; + } + + Intent i = new Intent(context, KeyboardPickerActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); // Replaces FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Required to call startActivity() from outside of an Activity context + + if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - i.putExtra(KMKey_DisplayKeyboardSwitcher, true); - context.startActivity(i); } + + i.putExtra(KMKey_DisplayKeyboardSwitcher, kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM); + context.startActivity(i); } public static void setKeyboardPickerFont(Typeface typeface) { @@ -1929,11 +1934,11 @@ public final class KMManager { public static void setNumericLayer(KeyboardType kbType) { if (kbType == KeyboardType.KEYBOARD_TYPE_INAPP) { - if (InAppKeyboard != null && InAppKeyboardLoaded && !InAppKeyboardShouldIgnoreTextChange) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded() && !InAppKeyboardShouldIgnoreTextChange) { InAppKeyboard.loadJavascript("setNumericLayer()"); } } else if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - if (SystemKeyboard != null && SystemKeyboardLoaded && !SystemKeyboardShouldIgnoreTextChange) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded() && !SystemKeyboardShouldIgnoreTextChange) { SystemKeyboard.loadJavascript("setNumericLayer()"); } } @@ -1947,14 +1952,14 @@ public final class KMManager { } if (kbType == KeyboardType.KEYBOARD_TYPE_INAPP) { - if (InAppKeyboard != null && InAppKeyboardLoaded && !InAppKeyboardShouldIgnoreTextChange) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded() && !InAppKeyboardShouldIgnoreTextChange) { InAppKeyboard.loadJavascript(KMString.format("updateKMText('%s')", kmText)); result = true; } InAppKeyboardShouldIgnoreTextChange = false; } else if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - if (SystemKeyboard != null && SystemKeyboardLoaded && !SystemKeyboardShouldIgnoreTextChange) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded() && !SystemKeyboardShouldIgnoreTextChange) { SystemKeyboard.loadJavascript(KMString.format("updateKMText('%s')", kmText)); result = true; } @@ -1968,14 +1973,14 @@ public final class KMManager { public static boolean updateSelectionRange(KeyboardType kbType, int selStart, int selEnd) { boolean result = false; if (kbType == KeyboardType.KEYBOARD_TYPE_INAPP) { - if (InAppKeyboard != null && InAppKeyboardLoaded && !InAppKeyboardShouldIgnoreSelectionChange) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded() && !InAppKeyboardShouldIgnoreSelectionChange) { InAppKeyboard.loadJavascript(KMString.format("updateKMSelectionRange(%d,%d)", selStart, selEnd)); result = true; } InAppKeyboardShouldIgnoreSelectionChange = false; } else if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - if (SystemKeyboard != null && SystemKeyboardLoaded && !SystemKeyboardShouldIgnoreSelectionChange) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded() && !SystemKeyboardShouldIgnoreSelectionChange) { InputConnection ic = (IMService != null ? IMService.getCurrentInputConnection() : null); if (ic != null) { ExtractedText icText = ic.getExtractedText(new ExtractedTextRequest(), 0); @@ -1996,11 +2001,11 @@ public final class KMManager { public static void resetContext(KeyboardType kbType) { if (kbType == KeyboardType.KEYBOARD_TYPE_INAPP) { - if (InAppKeyboard != null && InAppKeyboardLoaded) { + if (InAppKeyboard != null && InAppKeyboardWebViewClient.getKeyboardLoaded()) { InAppKeyboard.loadJavascript("resetContext()"); } } else if (kbType == KeyboardType.KEYBOARD_TYPE_SYSTEM) { - if (SystemKeyboard != null && SystemKeyboardLoaded) { + if (SystemKeyboard != null && SystemKeyboardWebViewClient.getKeyboardLoaded()) { SystemKeyboard.loadJavascript("resetContext()"); } } @@ -2222,435 +2227,6 @@ public final class KMManager { } } - protected static final class KMInAppKeyboardWebViewClient extends WebViewClient { - public static Context context; - - KMInAppKeyboardWebViewClient(Context context) { - KMInAppKeyboardWebViewClient.context = context; - } - - @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - } - - @Override - public void onPageFinished(WebView view, String url) { - Log.d("KMEA", "onPageFinished: [inapp] " + url); - shouldOverrideUrlLoading(view, url); - } - - private void pageLoaded(WebView view, String url) { - Log.d("KMEA", "pageLoaded: [inapp] " + url); - if (InAppKeyboard == null) { - KMLog.LogError(TAG, "pageLoaded and InAppKeyboard null"); - return; - } - InAppKeyboard.keyboardSet = false; - currentLexicalModel = null; - - if (url.startsWith("file")) { // TODO: is this test necessary? - InAppKeyboardLoaded = true; - - SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); - int index = prefs.getInt(KMManager.KMKey_UserKeyboardIndex, 0); - if (index < 0) { - index = 0; - } - Keyboard keyboardInfo = KMManager.getKeyboardInfo(context, index); - String langId = null; - if (keyboardInfo != null) { - langId = keyboardInfo.getLanguageID(); - InAppKeyboard.setKeyboard(keyboardInfo); - } else { - // Revert to default (index 0) or fallback keyboard - keyboardInfo = KMManager.getKeyboardInfo(context, 0); - if (keyboardInfo == null) { - // Not logging to Sentry because some keyboard apps like FV don't install keyboards until the user chooses - keyboardInfo = KMManager.getDefaultKeyboard(context); - } - if (keyboardInfo != null) { - langId = keyboardInfo.getLanguageID(); - InAppKeyboard.setKeyboard(keyboardInfo); - } - } - - registerAssociatedLexicalModel(langId); - - InAppKeyboard.showHelpBubbleAfterDelay(2000, true); // check if it should be shown at that time! - - InAppKeyboard.callJavascriptAfterLoad(); - InAppKeyboard.setSpacebarText(spacebarText); - - KeyboardEventHandler.notifyListeners(KMTextView.kbEventListeners, KeyboardType.KEYBOARD_TYPE_INAPP, EventType.KEYBOARD_LOADED, null); - - // Special handling for in-app TextView context keymanapp/keyman#3809 - if (KMTextView.activeView != null && KMTextView.activeView.getClass() == KMTextView.class) { - KMTextView.updateTextContext(); - } - } - } - - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - Log.d("KMEA", "shouldOverrideUrlLoading [inapp]: " + url); - if (InAppKeyboard == null) { - KMLog.LogError(TAG, "shouldOverrideUrlLoading and InAppKeyboard null"); - return false; - } - - // URL has actual path to the keyboard.html file as a prefix! We need to replace - // just the first intended '#' to get URI-based query param processing. - // At some point, other parts of the function should be redone to allow use of ? instead - // of # in our WebView command "queries" entirely. - String cmd = url.replace("keyboard.html#", "keyboard.html?"); - Uri urlCommand = Uri.parse(cmd); - if (url.indexOf("pageLoaded") >= 0) { - pageLoaded(view, url); - } else if (url.indexOf("hideKeyboard") >= 0) { - if (KMTextView.activeView != null && KMTextView.activeView.getClass() == KMTextView.class) { - InAppKeyboard.dismissHelpBubble(); - KMTextView textView = (KMTextView) KMTextView.activeView; - textView.dismissKeyboard(); - } - } else if (urlCommand.getQueryParameter("globeKeyAction") != null) { - InAppKeyboard.dismissHelpBubble(); - InAppKeyboard.setShouldShowHelpBubble(false); - - // Globe key has been used; disable the internal preference setting. - KMManager.setPersistentShouldShowHelpBubble(false); - - handleGlobeKeyAction(context, urlCommand.getBooleanQueryParameter("keydown", false), - KeyboardType.KEYBOARD_TYPE_INAPP); - } else if (url.indexOf("helpBubbleDismissed") >= 0) { - // The user has begun interacting with the keyboard; we'll disable the help bubble - // for the rest of the lifetime of this keyboard instance. - InAppKeyboard.setShouldShowHelpBubble(false); - } else if (url.indexOf("showKeyPreview") >= 0) { - String deviceType = context.getResources().getString(R.string.device_type); - if (deviceType.equals("AndroidTablet")) { - return false; - } - - if (InAppKeyboard.subKeysWindow != null) { - return false; - } - - int start = url.indexOf("x=") + 2; - int end = url.indexOf("+y="); - float x = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("y=") + 2; - end = url.indexOf("+w="); - float y = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("w=") + 2; - end = url.indexOf("+h="); - float w = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("h=") + 2; - end = url.indexOf("+t="); - float h = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("t=") + 2; - String t = url.substring(start); - String text = InAppKeyboard.convertKeyText(t); - - float left = x - w / 2.0f; - float right = left + w; - float top = y - 1; - float bottom = top + h; - - RectF keyFrame = new RectF(left, top, right, bottom); - InAppKeyboard.showKeyPreview(context, (int) x, (int) y, keyFrame, text); - } else if (url.indexOf("dismissKeyPreview") >= 0) { - InAppKeyboard.dismissKeyPreview(100); - } else if (url.indexOf("showMore") >= 0) { - if (InAppKeyboard.subKeysWindow != null && InAppKeyboard.subKeysWindow.isShowing()) { - return false; - } - - int start = url.indexOf("keyPos=") + 7; - int end = url.indexOf("+keys="); - InAppKeyboard.subKeysWindowPos = url.substring(start, end).split("\\,"); - - start = end + 6; - end = url.indexOf("+font="); - if (end < 0) { - end = url.length(); - InAppKeyboard.specialOskFont = ""; - } else { - InAppKeyboard.specialOskFont = KMFilename_Osk_Ttf_Font; - } - - String keys = url.substring(start, end); - - String[] keyList = keys.split("\\;"); - int klCount = keyList.length; - InAppKeyboard.subKeysList = new ArrayList>(); - for (int i = 0; i < klCount; i++) { - String[] values = keyList[i].split("\\:"); - String keyId = (values.length > 0) ? values[0] : ""; - String keyText = (values.length > 1) ? values[1] : ""; - - HashMap hashMap = new HashMap(); - hashMap.put("keyId", keyId); - hashMap.put("keyText", keyText); - InAppKeyboard.subKeysList.add(hashMap); - } - } else if (url.indexOf("refreshBannerHeight") >= 0) { - int start = url.indexOf("change=") + 7; - String change = url.substring(start); - boolean isModelActive = change.equals("active"); - SharedPreferences prefs = appContext.getSharedPreferences(appContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); - boolean modelPredictionPref = false; - if (currentLexicalModel != null) { - modelPredictionPref = prefs.getBoolean(getLanguagePredictionPreferenceKey(currentLexicalModel.get(KMManager.KMKey_LanguageID)), true); - } - currentBanner = (isModelActive && modelPredictionPref) ? - KM_BANNER_STATE_SUGGESTION : KM_BANNER_STATE_BLANK; - RelativeLayout.LayoutParams params = getKeyboardLayoutParams(); - InAppKeyboard.setLayoutParams(params); - } else if (url.indexOf("suggestPopup") >= 0) { - double x = Float.parseFloat(urlCommand.getQueryParameter("x")); - double y = Float.parseFloat(urlCommand.getQueryParameter("y")); - double width = Float.parseFloat(urlCommand.getQueryParameter("w")); - double height = Float.parseFloat(urlCommand.getQueryParameter("h")); - String suggestionJSON = urlCommand.getQueryParameter("suggestion"); - - JSONParser parser = new JSONParser(); - JSONObject obj = parser.getJSONObjectFromURIString(suggestionJSON); - - /* // For future implementation - InAppKeyboard.suggestionWindowPos = new double[]{x, y}; - InAppKeyboard.suggestionJSON = suggestionJSON; - - try { - Log.v("KMEA", "Suggestion display: " + obj.getString("displayAs")); - Log.v("KMEA", "Suggestion's banner coords: " + x + ", " + y + ", " + width + ", " + height); - Log.v("KMEA", "Is a suggestion: "); // likely outdated now that tags exist. - } catch (JSONException e) { - //e.printStackTrace(); - Log.v("KMEA", "JSON parsing error: " + e.getMessage()); - } - */ - } else if (url.indexOf("reloadAfterError") >= 0) { - InAppKeyboard.reloadAfterError(); - } - return false; - } - } - - protected static final class KMSystemKeyboardWebViewClient extends WebViewClient { - public static Context context; - - KMSystemKeyboardWebViewClient(Context context) { - KMSystemKeyboardWebViewClient.context = context; - } - - @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - } - - @Override - public void onPageFinished(WebView view, String url) { - Log.d("KMEA", "onPageFinished: [system] " + url); - shouldOverrideUrlLoading(view, url); - } - - private void pageLoaded(WebView view, String url) { - Log.d("KMEA", "pageLoaded: [system] " + url); - if (SystemKeyboard == null) { - KMLog.LogError(TAG, "pageLoaded and SystemKeyboard null"); - return; - } - - SystemKeyboard.keyboardSet = false; - currentLexicalModel = null; - - if (url.startsWith("file:")) { // TODO: is this test necessary? - SystemKeyboardLoaded = true; - - SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); - int index = prefs.getInt(KMManager.KMKey_UserKeyboardIndex, 0); - if (index < 0) { - index = 0; - } - Keyboard keyboardInfo = KMManager.getKeyboardInfo(context, index); - String langId = null; - if (keyboardInfo != null) { - langId = keyboardInfo.getLanguageID(); - SystemKeyboard.setKeyboard(keyboardInfo); - } else { - // Revert to default (index 0) or fallback keyboard - keyboardInfo = KMManager.getKeyboardInfo(context, 0); - if (keyboardInfo == null) { - KMLog.LogError(TAG, "No keyboards installed. Reverting to fallback"); - keyboardInfo = KMManager.getDefaultKeyboard(context); - } - if (keyboardInfo != null) { - langId = keyboardInfo.getLanguageID(); - SystemKeyboard.setKeyboard(keyboardInfo); - } - } - - registerAssociatedLexicalModel(langId); - - SystemKeyboard.showHelpBubbleAfterDelay(2000, true); // check if it should be shown at that time! - - KeyboardEventHandler.notifyListeners(KMTextView.kbEventListeners, KeyboardType.KEYBOARD_TYPE_SYSTEM, EventType.KEYBOARD_LOADED, null); - - SystemKeyboard.callJavascriptAfterLoad(); - SystemKeyboard.setSpacebarText(spacebarText); - } - } - - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - if (SystemKeyboard == null) { - KMLog.LogError(TAG, "shouldOverrideUrlLoading and SystemKeyboard null"); - return false; - } - - // URL has actual path to the keyboard.html file as a prefix! We need to replace - // just the first intended '#' to get URI-based query param processing. - - // At some point, other parts of the function should be redone to allow use of ? instead - // of # in our WebView command "queries" entirely. - String cmd = url.replace("keyboard.html#", "keyboard.html?"); - Uri urlCommand = Uri.parse(cmd); - if(url.indexOf("pageLoaded") >= 0) { - pageLoaded(view, url); - } else if (url.indexOf("hideKeyboard") >= 0) { - SystemKeyboard.dismissHelpBubble(); - IMService.requestHideSelf(0); - } else if (urlCommand.getQueryParameter("globeKeyAction") != null) { - SystemKeyboard.dismissHelpBubble(); - SystemKeyboard.setShouldShowHelpBubble(false); - - // Globe key has been used; disable the internal preference setting. - KMManager.setPersistentShouldShowHelpBubble(false); - - handleGlobeKeyAction(context, urlCommand.getBooleanQueryParameter("keydown", false), - KeyboardType.KEYBOARD_TYPE_SYSTEM); - } else if (urlCommand.getQueryParameter("helpBubbleDismissed") != null) { - // The user has begun interacting with the keyboard; we'll disable the help bubble - // for the rest of the lifetime of this keyboard instance. - SystemKeyboard.setShouldShowHelpBubble(false); - } else if (url.indexOf("showKeyPreview") >= 0) { - String deviceType = context.getString(R.string.device_type); - if (deviceType.equals("AndroidTablet")) { - return false; - } - - if (SystemKeyboard.subKeysWindow != null) { - return false; - } - - int start = url.indexOf("x=") + 2; - int end = url.indexOf("+y="); - float x = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("y=") + 2; - end = url.indexOf("+w="); - float y = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("w=") + 2; - end = url.indexOf("+h="); - float w = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("h=") + 2; - end = url.indexOf("+t="); - float h = Float.valueOf(url.substring(start, end)); - - start = url.indexOf("t=") + 2; - String t = url.substring(start); - String text = SystemKeyboard.convertKeyText(t); - - float left = x - w / 2.0f; - float right = left + w; - float top = y - 1; - float bottom = top + h; - - RectF keyFrame = new RectF(left, top, right, bottom); - SystemKeyboard.showKeyPreview(context, (int) x, (int) y, keyFrame, text); - } else if (url.indexOf("dismissKeyPreview") >= 0) { - SystemKeyboard.dismissKeyPreview(100); - } else if (url.indexOf("showMore") >= 0) { - if (SystemKeyboard.subKeysWindow != null && SystemKeyboard.subKeysWindow.isShowing()) { - return false; - } - - int start = url.indexOf("keyPos=") + 7; - int end = url.indexOf("+keys="); - SystemKeyboard.subKeysWindowPos = url.substring(start, end).split("\\,"); - - start = end + 6; - end = url.indexOf("+font="); - if (end < 0) { - end = url.length(); - SystemKeyboard.specialOskFont = ""; - } else { - SystemKeyboard.specialOskFont = KMFilename_Osk_Ttf_Font; - } - - String keys = url.substring(start, end); - - String[] keyList = keys.split("\\;"); - int klCount = keyList.length; - SystemKeyboard.subKeysList = new ArrayList>(); - for (int i = 0; i < klCount; i++) { - String[] values = keyList[i].split("\\:"); - String keyId = (values.length > 0) ? values[0] : ""; - String keyText = (values.length > 1) ? values[1] : ""; - - HashMap hashMap = new HashMap(); - hashMap.put("keyId", keyId); - hashMap.put("keyText", keyText); - SystemKeyboard.subKeysList.add(hashMap); - } - } else if (url.indexOf("refreshBannerHeight") >= 0) { - int start = url.indexOf("change=") + 7; - String change = url.substring(start); - boolean isModelActive = change.equals("active"); - SharedPreferences prefs = appContext.getSharedPreferences(appContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); - boolean modelPredictionPref = false; - if(currentLexicalModel != null) { - modelPredictionPref = prefs.getBoolean(getLanguagePredictionPreferenceKey(currentLexicalModel.get(KMManager.KMKey_LanguageID)), true); - } - currentBanner = (isModelActive && modelPredictionPref) ? - KM_BANNER_STATE_SUGGESTION : KM_BANNER_STATE_BLANK; - RelativeLayout.LayoutParams params = getKeyboardLayoutParams(); - SystemKeyboard.setLayoutParams(params); - } else if (url.indexOf("suggestPopup") >= 0) { - double x = Float.parseFloat(urlCommand.getQueryParameter("x")); - double y = Float.parseFloat(urlCommand.getQueryParameter("y")); - double width = Float.parseFloat(urlCommand.getQueryParameter("w")); - double height = Float.parseFloat(urlCommand.getQueryParameter("h")); - String suggestionJSON = urlCommand.getQueryParameter("suggestion"); - - JSONParser parser = new JSONParser(); - JSONObject obj = parser.getJSONObjectFromURIString(suggestionJSON); - - /* // For future implementation - SystemKeyboard.suggestionWindowPos = new double[]{x, y}; - SystemKeyboard.suggestionJSON = suggestionJSON; - - try { - Log.v("KMEA", "Suggestion display: " + obj.getString("displayAs")); - Log.v("KMEA", "Suggestion's banner coords: " + x + ", " + y + ", " + width + ", " + height); - Log.v("KMEA", "Is a suggestion: "); // likely outdated now that tags exist. - } catch (JSONException e) { - //e.printStackTrace(); - Log.v("KMEA", "JSON parsing error: " + e.getMessage()); - } - */ - } else if (url.indexOf("reloadAfterError") >= 0) { - SystemKeyboard.reloadAfterError(); - } - return false; - } - } - private static final class KMInAppKeyboardJSHandler extends KMKeyboardJSHandler { KMInAppKeyboardJSHandler(Context context, KMKeyboard k) { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMModifierCodes.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMModifierCodes.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMModifierCodes.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KMModifierCodes.java index e7f823c070..85a174d04d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMModifierCodes.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMModifierCodes.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.util.HashMap; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMPopoverView.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMPopoverView.java similarity index 99% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMPopoverView.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KMPopoverView.java index bfbc87a0d8..498739c334 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMPopoverView.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMPopoverView.java @@ -2,7 +2,7 @@ * Copyright (C) 2017 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import android.content.Context; import android.graphics.Canvas; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMScanCodeMap.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMScanCodeMap.java similarity index 99% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMScanCodeMap.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KMScanCodeMap.java index 3ad32fee47..ca103816cd 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMScanCodeMap.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMScanCodeMap.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea; +package com.keyman.engine; public final class KMScanCodeMap { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMTextView.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMTextView.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMTextView.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KMTextView.java index c637cdb76d..70774a4e2c 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMTextView.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMTextView.java @@ -2,14 +2,15 @@ * Copyright (C) 2017 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.util.ArrayList; -import com.tavultesoft.kmea.KMManager.KeyboardType; -import com.tavultesoft.kmea.KeyboardEventHandler.EventType; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMKeyboardWebViewClient; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.KeyboardEventHandler.EventType; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.util.KMLog; import android.view.ContextThemeWrapper; import androidx.appcompat.app.AppCompatActivity; @@ -120,7 +121,7 @@ public final class KMTextView extends AppCompatEditText { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { activeView = v; - if (KMManager.InAppKeyboardLoaded) { + if (KMManager.InAppKeyboardWebViewClient.getKeyboardLoaded()) { updateTextContext(); } showKeyboard(); @@ -178,7 +179,7 @@ public final class KMTextView extends AppCompatEditText { Window mainWindow = activity.getWindow(); if (hasWindowFocus) { - KMManager.KMInAppKeyboardWebViewClient.context = context; + KMManager.InAppKeyboardWebViewClient.setContext(context); activeView = mainWindow.getCurrentFocus(); Typeface font = KMManager.getFontTypeface(context, KMKeyboard.textFontFilename()); @@ -189,7 +190,7 @@ public final class KMTextView extends AppCompatEditText { } if (activeView != null && activeView.equals(this)) { - if (KMManager.InAppKeyboardLoaded) { + if (KMManager.InAppKeyboardWebViewClient.getKeyboardLoaded()) { updateTextContext(); } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardEventHandler.java b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardEventHandler.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardEventHandler.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KeyboardEventHandler.java index a92e4d6c1c..e992ba3e74 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardEventHandler.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardEventHandler.java @@ -2,14 +2,14 @@ * Copyright (C) 2017 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.tavultesoft.kmea.KMManager.KeyboardType; +import com.keyman.engine.KMManager.KeyboardType; public final class KeyboardEventHandler { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardInfoActivity.java similarity index 93% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KeyboardInfoActivity.java index 1176182762..c2daaea303 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardInfoActivity.java @@ -2,7 +2,7 @@ * Copyright (C) 2017-2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.util.ArrayList; import java.util.HashMap; @@ -28,15 +28,15 @@ import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; -import com.tavultesoft.kmea.util.FileProviderUtils; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.MapCompat; -import com.tavultesoft.kmea.util.QRCodeUtil; -import com.tavultesoft.kmea.KMHelpFileActivity; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; +import com.keyman.engine.util.FileProviderUtils; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.MapCompat; +import com.keyman.engine.util.QRCodeUtil; +import com.keyman.engine.KMHelpFileActivity; // Public access is necessary to avoid IllegalAccessException public final class KeyboardInfoActivity extends BaseActivity { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardPickerActivity.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KeyboardPickerActivity.java index 19f34d5f19..fff24c3b56 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KeyboardPickerActivity.java @@ -2,7 +2,7 @@ * Copyright (C) 2017 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.io.File; import java.io.FileInputStream; @@ -13,15 +13,15 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.MapCompat; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.MapCompat; import android.content.ComponentName; import android.content.Context; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KmpInstallMode.java b/android/KMEA/app/src/main/java/com/keyman/engine/KmpInstallMode.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/KmpInstallMode.java rename to android/KMEA/app/src/main/java/com/keyman/engine/KmpInstallMode.java index 63f7c7be40..2452dcaefa 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KmpInstallMode.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KmpInstallMode.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea; +package com.keyman.engine; public enum KmpInstallMode { Silent, // Show no UI while installing a package. Errors may be shown as toasts diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java b/android/KMEA/app/src/main/java/com/keyman/engine/ModelInfoActivity.java similarity index 94% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java rename to android/KMEA/app/src/main/java/com/keyman/engine/ModelInfoActivity.java index 8fc641deb7..ef1b180c52 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/ModelInfoActivity.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2017-2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea; +package com.keyman.engine; import java.util.ArrayList; import java.util.HashMap; @@ -19,13 +19,13 @@ import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.FileProviderUtils; -import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.MapCompat; -import com.tavultesoft.kmea.KMHelpFileActivity; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.FileProviderUtils; +import com.keyman.engine.util.KMString; +import com.keyman.engine.util.MapCompat; +import com.keyman.engine.KMHelpFileActivity; -import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_MODEL; +import static com.keyman.engine.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_MODEL; // Public access is necessary to avoid IllegalAccessException public final class ModelInfoActivity extends BaseActivity { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java b/android/KMEA/app/src/main/java/com/keyman/engine/ModelPickerActivity.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java rename to android/KMEA/app/src/main/java/com/keyman/engine/ModelPickerActivity.java index 2ce2ca80e2..8207c6e6d5 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/ModelPickerActivity.java @@ -1,5 +1,5 @@ -package com.tavultesoft.kmea; +package com.keyman.engine; import android.content.Context; import android.content.Intent; @@ -20,15 +20,15 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.data.adapters.NestedAdapter; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.MapCompat; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.data.adapters.NestedAdapter; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.MapCompat; import java.io.File; import java.util.ArrayList; @@ -209,7 +209,7 @@ public final class ModelPickerActivity extends BaseActivity { if(immediateRegister) { // Register associated lexical model if it matches the active keyboard's language code; // it's safe since we're on the same thread. Needs to be called AFTER deinstalling the old one. - com.tavultesoft.kmea.data.Keyboard kbInfo = KMManager.getCurrentKeyboardInfo(context); + com.keyman.engine.data.Keyboard kbInfo = KMManager.getCurrentKeyboardInfo(context); if(kbInfo != null) { String kbdLgCode = kbInfo.getLanguageID(); if(BCP47.languageEquals(kbdLgCode, languageID)) { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudApiTypes.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudApiTypes.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudApiTypes.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudApiTypes.java index b6dc0e6f54..805f682367 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudApiTypes.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudApiTypes.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.cloud; +package com.keyman.engine.cloud; import android.app.DownloadManager; import android.content.Context; @@ -7,9 +7,9 @@ import android.widget.Toast; import androidx.annotation.NonNull; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.util.DownloadFileUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.R; +import com.keyman.engine.util.DownloadFileUtils; import org.json.JSONArray; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDataJsonUtil.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDataJsonUtil.java index c93e3b6635..46eb51f558 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDataJsonUtil.java @@ -1,22 +1,22 @@ -package com.tavultesoft.kmea.cloud; +package com.keyman.engine.cloud; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import com.tavultesoft.kmea.JSONParser; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.MapCompat; +import com.keyman.engine.JSONParser; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.MapCompat; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDownloadMgr.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDownloadMgr.java similarity index 99% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDownloadMgr.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDownloadMgr.java index 99c86d6c2c..87e96353df 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDownloadMgr.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/CloudDownloadMgr.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.cloud; +package com.keyman.engine.cloud; import android.app.DownloadManager; import android.content.BroadcastReceiver; @@ -8,7 +8,7 @@ import android.content.IntentFilter; import android.net.Uri; import android.util.Log; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.util.KMLog; import java.io.File; import java.util.HashMap; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/ICloudDownloadCallback.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/ICloudDownloadCallback.java similarity index 87% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/ICloudDownloadCallback.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/ICloudDownloadCallback.java index c49cff8754..537653a3f7 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/ICloudDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/ICloudDownloadCallback.java @@ -1,9 +1,9 @@ -package com.tavultesoft.kmea.cloud; +package com.keyman.engine.cloud; import android.content.Context; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDownloadMgr; /** * Interface for {@link CloudDownloadMgr} as callback to do use case specific task. diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadCallback.java similarity index 89% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadCallback.java index ca99c2f0c6..21769f76dd 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadCallback.java @@ -1,24 +1,24 @@ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDataJsonUtil; -import com.tavultesoft.kmea.cloud.ICloudDownloadCallback; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.data.LanguageResource; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.VersionUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDataJsonUtil; +import com.keyman.engine.cloud.ICloudDownloadCallback; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.data.LanguageResource; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.VersionUtils; import org.json.JSONArray; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadReturns.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadReturns.java similarity index 92% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadReturns.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadReturns.java index 3febc1c486..80e5445be6 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadReturns.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudCatalogDownloadReturns.java @@ -1,6 +1,6 @@ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; -import com.tavultesoft.kmea.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudApiTypes; import org.json.JSONArray; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardDownloadReturns.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardDownloadReturns.java similarity index 92% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardDownloadReturns.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardDownloadReturns.java index 97caad0854..668bb5f49b 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardDownloadReturns.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardDownloadReturns.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; import java.util.List; import java.util.Map; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardPackageDownloadCallback.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardPackageDownloadCallback.java similarity index 87% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardPackageDownloadCallback.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardPackageDownloadCallback.java index e9b5c6e5c3..67c8efae71 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudKeyboardPackageDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudKeyboardPackageDownloadCallback.java @@ -1,21 +1,21 @@ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; import android.content.Context; import android.net.Uri; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardEventHandler; -import com.tavultesoft.kmea.KmpInstallMode; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.ICloudDownloadCallback; -import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardEventHandler; +import com.keyman.engine.KmpInstallMode; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.ICloudDownloadCallback; +import com.keyman.engine.packages.LexicalModelPackageProcessor; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java similarity index 94% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java index 95b2af0461..c3315c2d67 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalModelMetaDataDownloadCallback.java @@ -1,19 +1,19 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; import android.content.Context; import android.os.Bundle; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDataJsonUtil; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.cloud.ICloudDownloadCallback; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDataJsonUtil; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.cloud.ICloudDownloadCallback; +import com.keyman.engine.util.KMLog; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalPackageDownloadCallback.java b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalPackageDownloadCallback.java similarity index 87% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalPackageDownloadCallback.java rename to android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalPackageDownloadCallback.java index 093d99161f..dac380b8cb 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudLexicalPackageDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/cloud/impl/CloudLexicalPackageDownloadCallback.java @@ -1,19 +1,19 @@ -package com.tavultesoft.kmea.cloud.impl; +package com.keyman.engine.cloud.impl; import android.content.Context; import android.net.Uri; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KeyboardEventHandler; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.ICloudDownloadCallback; -import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KeyboardEventHandler; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.ICloudDownloadCallback; +import com.keyman.engine.packages.LexicalModelPackageProcessor; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/CloudRepository.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/CloudRepository.java index b992e86e4b..4aad0a4e9f 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/CloudRepository.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.content.Context; import android.os.Bundle; @@ -6,21 +6,21 @@ import android.widget.Toast; import androidx.annotation.NonNull; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.BuildConfig; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.impl.CloudCatalogDownloadCallback; -import com.tavultesoft.kmea.cloud.impl.CloudCatalogDownloadReturns; -import com.tavultesoft.kmea.cloud.CloudDataJsonUtil; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.packages.JSONUtils; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.VersionUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.BuildConfig; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.R; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.impl.CloudCatalogDownloadCallback; +import com.keyman.engine.cloud.impl.CloudCatalogDownloadReturns; +import com.keyman.engine.cloud.CloudDataJsonUtil; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.packages.JSONUtils; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.VersionUtils; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Dataset.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/Dataset.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Dataset.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/Dataset.java index 45e87a7c00..0baff02cf8 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Dataset.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/Dataset.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.content.Context; import android.widget.ArrayAdapter; @@ -6,8 +6,8 @@ import android.widget.ArrayAdapter; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.tavultesoft.kmea.data.adapters.AdapterFilter; -import com.tavultesoft.kmea.data.adapters.ListBacked; +import com.keyman.engine.data.adapters.AdapterFilter; +import com.keyman.engine.data.adapters.ListBacked; import java.util.ArrayList; import java.util.Arrays; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Keyboard.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/Keyboard.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Keyboard.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/Keyboard.java index ffebdc49ae..984284fe09 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/Keyboard.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/Keyboard.java @@ -1,20 +1,20 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.content.Context; import android.os.Bundle; import androidx.annotation.NonNull; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; import org.json.JSONException; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/KeyboardController.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/KeyboardController.java index 0676306c87..0eb56eb042 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/KeyboardController.java @@ -2,19 +2,19 @@ * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.content.Context; import android.util.Log; -import com.tavultesoft.kmea.JSONParser; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.MapCompat; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.JSONParser; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.MapCompat; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.KMLog; import org.json.JSONArray; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LanguageResource.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/LanguageResource.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LanguageResource.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/LanguageResource.java index 36c9f8bdfe..90e633ae99 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LanguageResource.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/LanguageResource.java @@ -1,15 +1,15 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.net.Uri; import android.os.Bundle; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; import org.json.JSONException; import org.json.JSONObject; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/LexicalModel.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/LexicalModel.java index f636fa9c76..cb7b889bd4 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/LexicalModel.java @@ -1,18 +1,18 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.data; +package com.keyman.engine.data; import android.content.Context; import android.net.Uri; import android.os.Bundle; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.KMString; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/AdapterFilter.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/AdapterFilter.java similarity index 93% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/AdapterFilter.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/AdapterFilter.java index 3cba3874e7..a673ff278d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/AdapterFilter.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/AdapterFilter.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.data.adapters; +package com.keyman.engine.data.adapters; import android.widget.ArrayAdapter; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/ListBacked.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/ListBacked.java similarity index 64% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/ListBacked.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/ListBacked.java index e928ef6745..b6f1df8c66 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/ListBacked.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/ListBacked.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.data.adapters; +package com.keyman.engine.data.adapters; import java.util.List; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/NestedAdapter.java b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/NestedAdapter.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/NestedAdapter.java rename to android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/NestedAdapter.java index 679b9f381d..67118f3689 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/adapters/NestedAdapter.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/data/adapters/NestedAdapter.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.data.adapters; +package com.keyman.engine.data.adapters; import android.content.Context; import android.database.DataSetObserver; @@ -7,7 +7,7 @@ import android.widget.ArrayAdapter; import androidx.annotation.NonNull; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.util.KMLog; import java.lang.ref.WeakReference; import java.util.ArrayList; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java b/android/KMEA/app/src/main/java/com/keyman/engine/logic/ResourcesUpdateTool.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java rename to android/KMEA/app/src/main/java/com/keyman/engine/logic/ResourcesUpdateTool.java index 6f72741819..0e1db6847f 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/logic/ResourcesUpdateTool.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.logic; +package com.keyman.engine.logic; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -20,15 +20,15 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat.Builder; import androidx.core.app.NotificationManagerCompat; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardEventHandler; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.VersionUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardEventHandler; +import com.keyman.engine.R; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.VersionUtils; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/JSONUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/packages/JSONUtils.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/JSONUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/packages/JSONUtils.java index 1d36e9c580..d764505217 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/JSONUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/packages/JSONUtils.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; import android.util.Log; @@ -7,10 +7,10 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Map; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.JSONParser; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.JSONParser; +import com.keyman.engine.util.KMLog; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java b/android/KMEA/app/src/main/java/com/keyman/engine/packages/LexicalModelPackageProcessor.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java rename to android/KMEA/app/src/main/java/com/keyman/engine/packages/LexicalModelPackageProcessor.java index 77373e3485..1cdf356b37 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/packages/LexicalModelPackageProcessor.java @@ -1,7 +1,7 @@ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.FileUtils; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java b/android/KMEA/app/src/main/java/com/keyman/engine/packages/PackageProcessor.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java rename to android/KMEA/app/src/main/java/com/keyman/engine/packages/PackageProcessor.java index 599ea5dc79..1e3bff4a76 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/packages/PackageProcessor.java @@ -1,19 +1,19 @@ /** * Copyright (C) 2017-2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; import android.widget.Toast; import androidx.annotation.NonNull; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.JSONParser; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.ZipUtils; +import com.keyman.engine.KMManager; +import com.keyman.engine.JSONParser; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.ZipUtils; import java.io.File; import java.io.FileFilter; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/BCP47.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/BCP47.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/BCP47.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/BCP47.java index 81542ca86d..bf3b38a993 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/BCP47.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/BCP47.java @@ -2,7 +2,7 @@ * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import java.util.ArrayList; import java.security.InvalidParameterException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/CharSequenceUtil.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/CharSequenceUtil.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java index a356656f54..45199fe684 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/CharSequenceUtil.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import java.lang.CharSequence; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/Connection.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/Connection.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/Connection.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/Connection.java index 2fcc449df0..1a02ccf66f 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/Connection.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/Connection.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import java.io.InputStream; import java.io.IOException; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/ContextUtils.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/ContextUtils.java index efae405166..ab41731cc4 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/ContextUtils.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; import android.content.ContextWrapper; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DependencyUtil.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/DependencyUtil.java similarity index 97% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DependencyUtil.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/DependencyUtil.java index 82d03cf934..4d414184a5 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DependencyUtil.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/DependencyUtil.java @@ -2,7 +2,7 @@ * Copyright (C) 2022 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; public final class DependencyUtil { private static final String TAG = "DependencyUtil"; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DownloadFileUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/DownloadFileUtils.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DownloadFileUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/DownloadFileUtils.java index a59bbee0b9..c16d3d381d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/DownloadFileUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/DownloadFileUtils.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; import android.database.Cursor; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileProviderUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/FileProviderUtils.java similarity index 93% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileProviderUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/FileProviderUtils.java index a4a9918ac8..825ebb8b7d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileProviderUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/FileProviderUtils.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; import android.content.ContentProviderClient; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/FileUtils.java similarity index 99% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/FileUtils.java index 9da485f780..d5610dedec 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/FileUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/FileUtils.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/HelpFile.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/HelpFile.java similarity index 88% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/HelpFile.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/HelpFile.java index a2a3024d2d..c2da3aa05a 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/HelpFile.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/HelpFile.java @@ -2,7 +2,7 @@ * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.ClipData; import android.content.ClipDescription; @@ -13,11 +13,11 @@ import android.widget.Toast; import androidx.core.content.FileProvider; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.util.FileProviderUtils; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.R; +import com.keyman.engine.util.FileProviderUtils; +import com.keyman.engine.util.FileUtils; import java.io.File; import java.io.FileFilter; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMLog.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMLog.java similarity index 91% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMLog.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/KMLog.java index 1a8610cf26..3eeabdcbdf 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMLog.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMLog.java @@ -2,16 +2,16 @@ * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.util.Log; import android.widget.Toast; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.BuildConfig; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.BuildConfig; +import com.keyman.engine.KMManager; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; import io.sentry.Sentry; import io.sentry.SentryLevel; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMPLink.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMPLink.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMPLink.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/KMPLink.java index 19ad4aaa72..c26b64776d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMPLink.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMPLink.java @@ -1,16 +1,16 @@ /** * Copyright (C) 2020 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.net.Uri; import android.os.Build; -import com.tavultesoft.kmea.BuildConfig; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMManager.Tier; -import com.tavultesoft.kmea.util.KMString; +import com.keyman.engine.BuildConfig; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.Tier; +import com.keyman.engine.util.KMString; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMString.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMString.java similarity index 92% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMString.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/KMString.java index 361632ee02..18b3dd0288 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/KMString.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/KMString.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import java.util.Locale; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/MapCompat.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/MapCompat.java similarity index 96% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/MapCompat.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/MapCompat.java index 7db5128356..badf6798d0 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/MapCompat.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/MapCompat.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.os.Build; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/QRCodeUtil.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/QRCodeUtil.java similarity index 95% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/QRCodeUtil.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/QRCodeUtil.java index 04dec4c4c1..f01d443ae8 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/QRCodeUtil.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/QRCodeUtil.java @@ -2,7 +2,7 @@ * Copyright (C) 2022 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.graphics.Bitmap; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/VersionUtils.java similarity index 89% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/VersionUtils.java index 311cc4c642..58e80399f5 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/VersionUtils.java @@ -1,9 +1,9 @@ /** * Copyright (C) 2022 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; -import com.tavultesoft.kmea.BuildConfig; +import com.keyman.engine.BuildConfig; /** * Utilities to determine if a build is local or a test (PR) build. diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/WebViewUtils.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/WebViewUtils.java index e31b8860a1..1c60193dc7 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/WebViewUtils.java @@ -1,12 +1,12 @@ /** * Keyman is copyright (C) SIL International. MIT License. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; import android.view.ViewGroup; import android.webkit.WebView; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.util.KMLog; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ZipUtils.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/ZipUtils.java similarity index 98% rename from android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ZipUtils.java rename to android/KMEA/app/src/main/java/com/keyman/engine/util/ZipUtils.java index 3344534956..e707ba64b2 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ZipUtils.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/ZipUtils.java @@ -2,7 +2,7 @@ * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import java.io.BufferedInputStream; import java.io.File; diff --git a/android/KMEA/app/src/main/res/layout/help_bubble_layout.xml b/android/KMEA/app/src/main/res/layout/help_bubble_layout.xml index ef36e81bc8..953c74e692 100644 --- a/android/KMEA/app/src/main/res/layout/help_bubble_layout.xml +++ b/android/KMEA/app/src/main/res/layout/help_bubble_layout.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - diff --git a/android/KMEA/app/src/main/res/layout/key_preview_layout.xml b/android/KMEA/app/src/main/res/layout/key_preview_layout.xml index 0fc2a96701..bb03d58347 100644 --- a/android/KMEA/app/src/main/res/layout/key_preview_layout.xml +++ b/android/KMEA/app/src/main/res/layout/key_preview_layout.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - diff --git a/android/KMEA/app/src/main/res/layout/subkeys_popup_layout.xml b/android/KMEA/app/src/main/res/layout/subkeys_popup_layout.xml index 8979ad9218..4cdd7356fd 100644 --- a/android/KMEA/app/src/main/res/layout/subkeys_popup_layout.xml +++ b/android/KMEA/app/src/main/res/layout/subkeys_popup_layout.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - diff --git a/android/KMEA/app/src/main/res/values-b+shu+latn/strings.xml b/android/KMEA/app/src/main/res/values-b+shu+latn/strings.xml index f726144cf2..58be85253b 100644 --- a/android/KMEA/app/src/main/res/values-b+shu+latn/strings.xml +++ b/android/KMEA/app/src/main/res/values-b+shu+latn/strings.xml @@ -11,10 +11,10 @@ - Other Input Method - Other Input Methods - Other Input Methods - Other Input Methods + Darb gadey hana dassasan + Durub gadey hana dassasan + Durub gadey hana dassasan + Durub gadey hana dassasan Zyd Keyboard jadid diff --git a/android/KMEA/app/src/main/res/values-ru-rRU/strings.xml b/android/KMEA/app/src/main/res/values-ru-rRU/strings.xml new file mode 100644 index 0000000000..678a22dc1b --- /dev/null +++ b/android/KMEA/app/src/main/res/values-ru-rRU/strings.xml @@ -0,0 +1,180 @@ + + + + + + + Клавиатура + Клавиатуры + Клавиатуры + Клавиатуры + + + + Другой метод ввода + Другие методы ввода + Другие методы ввода + Другие методы ввода + + + Добавить новую клавиатуру + + Установленные языки + + Настройки %1$s + + Добавить + + Назад + + Отменить + + Закрыть + + Закрыть Клавиатуру + + Вперед + + Метод следующего ввода + + Скачать + + Установить + + Позже + + Следующий + + ОК + + Обновить + + No internet connection + + Не удается подключиться к серверу Keyman! + + Вы хотите удалить эту клавиатуру? + + Хотите загрузить последнюю версию этой клавиатуры? + + Вы хотите обновить клавиатуры и словари сейчас? + + Обновления ресурсов + + Доступно обновление ресурсов + + %1$s (Доступно обновление) + + Доступны обновления для клавиатуры %1$s: %2$s + + Доступные обновления для словаря %1$s: %2$s + + Версия клавиатуры + + Справка + + Удалить клавиатуру + + [new] %1$s + + Отсканируйте этот код, чтобы загрузить эту клавиатуру\nна другом устройстве + + Добро пожаловать в %1$s + + Библиотека файлового провайдера необходима для просмотра файла справки: %1$s + + Неустранимая ошибка клавиатуры %1$s:%2$s для %3$s языка. Загрузка по умолчанию клавиатуры. + + Ошибка в клавиатуре %1$s:%2$s для языка %3$s. + + Проверка соответствующего словаря для загрузки + Cannot connect to Keyman server to check for associated dictionary to download + + Загрузить последнюю версию этого словаря? + + Нет словаря для загрузки + + Каталог ресурсов недоступен + + Обновление каталога запущено в фоновом режиме + + Каталог все еще загружается; Пожалуйста, повторите попытку через некоторое время! + + Проверка ресурса + + Загрузка клавиатуры началась в фоновом режиме + + Выбранная клавиатура уже загружается; Пожалуйста, попробуйте еще раз через некоторое время! + + Загрузка клавиатуры завершена! + + Загрузка словаря началась в фоновом режиме + + Выбранный словарь уже загружается; Пожалуйста, попробуйте еще раз через некоторое время! + + Загрузка словаря завершена. + + Ошибка загрузки + + Не удалось получить скачанный файл + + Не удалось получить доступ к серверу! + + "Все ресурсы актуальны!" + + Не удалось обновить один или несколько ресурсов! + + Ресурсы успешно обновлены! + + Версия словаря + + Удалить словарь + + Вы хотите удалить этот словарь? + + Dictionary deleted + + Установлена клавиатура %1$s + + Keyboard deleted + + Включить исправления + + Включить прогнозы + + Словарь + + Dictionary + Dictionaries + Dictionaries + Dictionaries + + + Проверить доступный словарь + Check for dictionaries online + + Словарь: %1$s + + словари %1$s + + + Словарь установлен + + + (%1$d клавиатура) + (%1$d клавиатура) + (%1$d клавиатура) + (%1$d клавиатура) + + + Язык по умолчанию + + + + Удалить + + + Нажмите здесь, чтобы изменить клавиатуру + + Unable to launch web browser + diff --git a/android/KMEA/app/src/main/res/values-sv-rSE/strings.xml b/android/KMEA/app/src/main/res/values-sv-rSE/strings.xml new file mode 100644 index 0000000000..ca9e0ba02a --- /dev/null +++ b/android/KMEA/app/src/main/res/values-sv-rSE/strings.xml @@ -0,0 +1,172 @@ + + + + + + + Keyboard + Tangentbord + + + + Annan inmatningsmetod + Andra inmatningsmetoder + + + Lägg till nytt tangentbord + + Installerade språk + + %1$s Inställningar + + Lägg till + + Tillbaka + + Avbryt + + Stäng + + Stäng Keyman + + Framåt + + Nästa inmatningsmetod + + Hämta + + Installera + + Senare + + Nästa + + Ok + + Uppdatera + + No internet connection + + Kan inte ansluta till Keyman-servern! + + Vill du ta bort det här tangentbordet? + + Vill du ladda ner den senaste versionen av detta tangentbord? + + Vill du uppdatera tangentbord och ordböcker nu? + + Uppdateringar av resurs + + Uppdateringar av resurs tillgängliga + + %1$s (Uppdatering tillgänglig) + + Uppdateringar tillgängliga för tangentbord %1$s: %2$s + + Uppdateringar tillgängliga för ordbok %1$s: %2$s + + Tangentbord version + + Hjälp länk + + Avinstallera tangentbordet + + [new] %1$s + + Skanna koden för att ladda detta\ntangentbord på en annan enhet + + Välkommen till %1$s + + Filleverantörsbibliotek behövs för att visa hjälpfilen: %1$s + + Kritiskt tangentbordsfel med %1$s:%2$s för %3$s språk. Laddar standardtangentbordet. + + Fel i tangentbordet %1$s:%2$s för %3$s språk. + + Söker efter tillhörande ordbok att ladda ner + Cannot connect to Keyman server to check for associated dictionary to download + + Vill du ladda ner den senaste versionen av denna ordbok? + + Ingen ordbok att ladda ner + + Resurskatalogen är inte tillgänglig + + Kataloguppdatering startad i bakgrunden + + Katalogen laddas fortfarande ner; försök igen om ett ögonblick! + + Söker efter resurs + + Nedladdning av tangentbord startat i bakgrunden + + Det valda tangentbordet laddas redan ner; försök igen om ett ögonblick! + + Tangentbords nedladdning är klar! + + Nedladdning av ordbok startad i bakgrunden + + Den valda ordboken laddas redan ner; försök igen om en stund! + + Nedladdning av ordbok är klar. + + Nedladdning misslyckades + + Det gick inte att hämta den hämtade filen + + Det gick inte att komma åt servern! + + "Alla resurser är uppdaterade!" + + En eller flera resurser kunde inte uppdateras! + + Resurser har uppdaterats! + + Ordbok version + + Avinstallera ordbok + + Vill du ta bort denna ordbok? + + Dictionary deleted + + %1$s tangentbord installerat + + Keyboard deleted + + Aktivera korrigeringar + + Aktivera förutsägelser + + Ordbok + + Dictionary + Dictionaries + + + Sök efter tillgänglig ordbok + Check for dictionaries online + + Ordbok: %1$s + + %1$s ordböcker + + + Ordbok installerad + + + (%1$d tangentbord) + (%1$d tangentbord) + + + Standard språk + + + + Radera + + + Tryck här för att ändra tangentbordet + + Unable to launch web browser + diff --git a/android/KMEA/app/src/main/res/values-uk-rUA/strings.xml b/android/KMEA/app/src/main/res/values-uk-rUA/strings.xml new file mode 100644 index 0000000000..bc53218a87 --- /dev/null +++ b/android/KMEA/app/src/main/res/values-uk-rUA/strings.xml @@ -0,0 +1,180 @@ + + + + + + + Keyboard + Клавіатури + Клавіатури + Клавіатури + + + + Інший метод введення + Інші Методи вводу + Інші Методи вводу + Інші Методи вводу + + + Додати нову клавіатуру + + Встановлені мови + + %1$s Налаштування + + Додати + + Відмінити + + Скасувати + + Закрити + + Закрити Keyman + + Переслати + + Спосіб наступного введення + + Звантажити + + Інсталювати + + Пізніше + + Уперед + + Гаразд + + Оновити + + No internet connection + + Не вдається підключитися до сервера Keyman! + + Ви хотіли б видалити цю клавіатуру? + + Завантажити останню версію цієї клавіатури? + + Оновити клавіатури та словники? + + Оновлення ресурсів + + Доступні оновлення для ресурсів + + %1$s (Оновити доступне) + + Доступні оновлення для клавіатури %1$s: %2$s + + Доступні оновлення для словника %1$s: %2$s + + Версія клавіатури + + Посилання допомоги + + Видалити клавіатуру + + [new] %1$s + + Відскануйте цей код, щоб завантажити цю\nклавіатуру на іншому пристрої + + Ласкаво просимо до %1$s + + Бібліотека FileProvider необхідна для перегляду файлу довідки: %1$s + + Критична помилка в клавіатурі з %1$s:%2$s для мови %3$s . Завантаження клавіатури за замовчуванням. + + Помилка в клавіатурі %1$s:%2$s для мови %3$s. + + Перевірка пов\'язаного словника для завантаження + Cannot connect to Keyman server to check for associated dictionary to download + + Бажаєте завантажити останню версію цього словника? + + Немає словника для завантаження + + Каталог ресурсів недоступний + + Оновлення каталогу розпочате у фоновому режимі + + Каталог ще завантажується; будь ласка, спробуйте ще раз! + + Перевірка ресурсу + + Завантаження клавіатури почнеться у фоновому режимі + + Обрана клавіатура вже завантажується; будь ласка, спробуйте ще раз за хвилину! + + Завантаження клавіатури завершено! + + Завантаження словника розпочато в фоновому режимі + + Обраний словник вже завантажується; будь ласка, спробуйте ще раз! + + Словник завантаження завершено. + + Не вдалося завантажити + + Не вдалося отримати завантажений файл + + Не вдалося отримати доступ до сервера! + + "Усі ресурси найновіші!" + + Один або кілька ресурсів не вдалося оновити! + + Ресурси успішно оновлено! + + Версія словника + + Видалити словник + + Видалити цей словник? + + Dictionary deleted + + %1$s встановлено клавіатуру + + Keyboard deleted + + Увімкнути виправлення + + Увімкнути передбачення + + Словник + + Dictionary + Dictionaries + Dictionaries + Dictionaries + + + Перевірка доступного словника + Check for dictionaries online + + Словник: %1$s + + %1$s словників + + + Словник встановлено + + + (%1$d клавіатура) + (%1$d клавіатури) + (%1$d клавіатури) + (%1$d клавіатури) + + + Мова за замовчуванням + + + + Видалити + + + Натисніть тут для зміни клавіатури + + Unable to launch web browser + diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/KMManagerTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/KMManagerTest.java similarity index 98% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/KMManagerTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/KMManagerTest.java index 418d446c9f..97515b7190 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/KMManagerTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/KMManagerTest.java @@ -1,9 +1,9 @@ -package com.tavultesoft.kmea; +package com.keyman.engine; import android.util.Log; import androidx.test.core.app.ApplicationProvider; -import com.tavultesoft.kmea.data.Keyboard; +import com.keyman.engine.data.Keyboard; import org.junit.Assert; import org.junit.Before; @@ -97,7 +97,7 @@ public class KMManagerTest { tier = KMManager.getTier(versionName); Assert.assertEquals(KMManager.Tier.STABLE, tier); - // If versionName is null or blank, tier based on com.tavultesoft.kmea.BuildConfig.KEYMAN_ENGINE_VERSION_NAME + // If versionName is null or blank, tier based on com.keyman.engine.BuildConfig.KEYMAN_ENGINE_VERSION_NAME // But we can't test for it. // If regex fails, tier is stable diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtilTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/cloud/CloudDataJsonUtilTest.java similarity index 94% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtilTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/cloud/CloudDataJsonUtilTest.java index d80c6516c3..b2c45ebbb6 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtilTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/cloud/CloudDataJsonUtilTest.java @@ -1,9 +1,9 @@ -package com.tavultesoft.kmea.cloud; +package com.keyman.engine.cloud; -import com.tavultesoft.kmea.JSONParser; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.packages.JSONUtils; +import com.keyman.engine.JSONParser; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.packages.JSONUtils; import org.json.JSONArray; import org.junit.Assert; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/logic/ResourcesUpdateToolTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/logic/ResourcesUpdateToolTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/logic/ResourcesUpdateToolTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/logic/ResourcesUpdateToolTest.java index 8a96b3d6df..ecda7ba17a 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/logic/ResourcesUpdateToolTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/logic/ResourcesUpdateToolTest.java @@ -1,11 +1,11 @@ -package com.tavultesoft.kmea.logic; +package com.keyman.engine.logic; import android.content.Context; import android.content.SharedPreferences; import androidx.test.core.app.ApplicationProvider; -import com.tavultesoft.kmea.R; +import com.keyman.engine.R; import org.junit.Assert; import org.junit.Assume; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/JSONUtilsTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/packages/JSONUtilsTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/JSONUtilsTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/packages/JSONUtilsTest.java index 4a425d9ba1..cf8ddadfbe 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/JSONUtilsTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/packages/JSONUtilsTest.java @@ -1,8 +1,8 @@ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; import android.util.Log; -import com.tavultesoft.kmea.JSONParser; +import com.keyman.engine.JSONParser; import org.json.JSONArray; import org.json.JSONException; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/packages/LexicalModelPackageProcessorTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/packages/LexicalModelPackageProcessorTest.java index 543b6d1cb8..c28c68374b 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/packages/LexicalModelPackageProcessorTest.java @@ -1,6 +1,6 @@ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; -import com.tavultesoft.kmea.KMManager; +import com.keyman.engine.KMManager; import org.apache.commons.io.FileUtils; import org.json.JSONObject; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/PackageProcessorTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/packages/PackageProcessorTest.java similarity index 99% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/PackageProcessorTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/packages/PackageProcessorTest.java index 3969b6f5e7..f43f9de175 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/PackageProcessorTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/packages/PackageProcessorTest.java @@ -1,6 +1,6 @@ -package com.tavultesoft.kmea.packages; +package com.keyman.engine.packages; -import com.tavultesoft.kmea.KMManager; +import com.keyman.engine.KMManager; import org.apache.commons.io.FileUtils; import org.json.JSONObject; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/BCP47Test.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/BCP47Test.java similarity index 92% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/BCP47Test.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/BCP47Test.java index b5d68f2250..4dc7b09c5e 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/BCP47Test.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/BCP47Test.java @@ -1,11 +1,11 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import com.tavultesoft.kmea.util.BCP47; +import com.keyman.engine.util.BCP47; @RunWith(RobolectricTestRunner.class) public class BCP47Test { diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/CharSequenceUtilTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java similarity index 98% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/CharSequenceUtilTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java index 4e70517838..6feb49feb1 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/CharSequenceUtilTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java @@ -1,11 +1,11 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import com.tavultesoft.kmea.util.CharSequenceUtil; +import com.keyman.engine.util.CharSequenceUtil; @RunWith(RobolectricTestRunner.class) public class CharSequenceUtilTest { diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/FileUtilsTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/FileUtilsTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/FileUtilsTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/FileUtilsTest.java index 64df232d02..5118159c9b 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/FileUtilsTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/FileUtilsTest.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import androidx.test.core.app.ApplicationProvider; @@ -23,13 +23,13 @@ public class FileUtilsTest { List logs = ShadowLog.getLogs(); // The logs contain type 4, but we only care about type 6 for connection messages - Assert.assertEquals(3, logs.size()); + Assert.assertEquals(2, logs.size()); - Assert.assertEquals("Connection", logs.get(1).tag); - Assert.assertEquals("Initialization failed:\njava.net.MalformedURLException: no protocol: invalidURL", logs.get(1).msg); + Assert.assertEquals("Connection", logs.get(0).tag); + Assert.assertEquals("Initialization failed:\njava.net.MalformedURLException: no protocol: invalidURL", logs.get(0).msg); - Assert.assertEquals("FileUtils", logs.get(2).tag); - Assert.assertEquals("Could not download filename ", logs.get(2).msg); + Assert.assertEquals("FileUtils", logs.get(1).tag); + Assert.assertEquals("Could not download filename ", logs.get(1).msg); } @Test diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/KMPLinkTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/KMPLinkTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/KMPLinkTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/KMPLinkTest.java index 56743502ed..81e8ccf30a 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/KMPLinkTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/KMPLinkTest.java @@ -1,9 +1,9 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import org.junit.Assert; import org.junit.Test; -import com.tavultesoft.kmea.util.KMPLink; +import com.keyman.engine.util.KMPLink; import org.junit.Assert; import org.junit.Test; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/MapCompatTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/MapCompatTest.java similarity index 97% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/MapCompatTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/MapCompatTest.java index 3ef80d7daf..58ac484b73 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/MapCompatTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/MapCompatTest.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import org.junit.Assert; import org.junit.Before; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/WebViewUtilsTest.java similarity index 95% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/WebViewUtilsTest.java index ec70707392..344b01879a 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/WebViewUtilsTest.java @@ -1,7 +1,7 @@ /** * Keyman is copyright (C) SIL International. MIT License. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; import android.content.Context; @@ -12,7 +12,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import com.tavultesoft.kmea.util.WebViewUtils; +import com.keyman.engine.util.WebViewUtils; @RunWith(RobolectricTestRunner.class) public class WebViewUtilsTest { diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/ZipUtilsTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/ZipUtilsTest.java similarity index 93% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/ZipUtilsTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/util/ZipUtilsTest.java index 41c0f36818..47ff5dc4e6 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/ZipUtilsTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/ZipUtilsTest.java @@ -2,9 +2,9 @@ * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmea.util; +package com.keyman.engine.util; -import com.tavultesoft.kmea.util.ZipUtils; +import com.keyman.engine.util.ZipUtils; import org.junit.Assert; import org.junit.Assume; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/FunctionalTestHelper.java b/android/KMEA/app/src/test/java/com/keyman/engine/view/FunctionalTestHelper.java similarity index 89% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/FunctionalTestHelper.java rename to android/KMEA/app/src/test/java/com/keyman/engine/view/FunctionalTestHelper.java index 412b0eaa2d..b56a4063eb 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/FunctionalTestHelper.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/view/FunctionalTestHelper.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.view; +package com.keyman.engine.view; import android.Manifest; import android.app.Application; @@ -8,10 +8,10 @@ import android.util.Log; import androidx.test.core.app.ApplicationProvider; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.FileUtils; import org.json.JSONException; import org.junit.Assert; diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/view/KeyboardPickerTest.java similarity index 94% rename from android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java rename to android/KMEA/app/src/test/java/com/keyman/engine/view/KeyboardPickerTest.java index f6ce2366ad..8162e8afc9 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/view/KeyboardPickerTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/view/KeyboardPickerTest.java @@ -1,4 +1,4 @@ -package com.tavultesoft.kmea.view; +package com.keyman.engine.view; import android.content.Intent; import android.util.Log; @@ -7,11 +7,11 @@ import android.widget.ListView; import androidx.test.core.app.ApplicationProvider; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardInfoActivity; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.data.Keyboard; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardInfoActivity; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.R; +import com.keyman.engine.data.Keyboard; import org.json.JSONException; import org.junit.After; @@ -184,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("com.tavultesoft.kmea.KMHelpFileActivity", actual2.getComponent().getClassName()); + Assert.assertEquals("com.keyman.engine.KMHelpFileActivity", actual2.getComponent().getClassName()); } finally { if(_controller2!=null) diff --git a/android/KMEA/build.sh b/android/KMEA/build.sh index 4004f88482..5cd3205922 100755 --- a/android/KMEA/build.sh +++ b/android/KMEA/build.sh @@ -45,7 +45,6 @@ SHLVL=0 KMA_ROOT="$KEYMAN_ROOT/android" KMW_ROOT="$KEYMAN_ROOT/web" -KMW_SOURCE="$KMW_ROOT/source" KMEA_ASSETS="$KMA_ROOT/KMEA/app/src/main/assets" warn ( ) { @@ -65,8 +64,8 @@ DO_COPY=true DO_TEST=true NO_DAEMON=false DEBUG_BUILD=false -KMWFLAGS=-embed -KMW_PATH= +KMWFLAGS="build:embed" +KMW_CONFIG=release # Parse args while [[ $# -gt 0 ]] ; do @@ -89,8 +88,8 @@ while [[ $# -gt 0 ]] ; do ;; -debug) DEBUG_BUILD=true - KMWFLAGS=-debug_embedded - KMW_PATH=unminified + KMWFLAGS="$KMWFLAGS --debug" + KMW_CONFIG=debug ;; -h|-\?) display_usage @@ -106,6 +105,7 @@ done # by developer. As it's not CI, the Web artifacts won't exist otherwise... # unless the developer manually runs the correct build configuration accordingly. if [[ $VERSION_ENVIRONMENT == "local" ]] && [[ $UPLOAD_SENTRY == true ]]; then + # TODO: handle the -upload-sentry in its eventual new form KMWFLAGS="$KMWFLAGS -upload-sentry" fi @@ -116,7 +116,7 @@ echo "DO_TEST: $DO_TEST" echo "NO_DAEMON: $NO_DAEMON" echo "DEBUG_BUILD: $DEBUG_BUILD" echo "KMWFLAGS: $KMWFLAGS" -echo "KMW_PATH: $KMW_PATH" +echo "KMW_CONFIG: $KMW_CONFIG" echo if [ "$NO_DAEMON" = true ]; then @@ -131,9 +131,8 @@ PLATFORM=`uname -s` if [ "$DO_BUILD" = true ]; then echo "Building keyman web engine" - cd $KMW_SOURCE - ./build.sh $KMWFLAGS + "$KMW_ROOT/build.sh" $KMWFLAGS if [ $? -ne 0 ]; then die "ERROR: keymanweb build failed. Exiting" @@ -141,12 +140,12 @@ if [ "$DO_BUILD" = true ]; then fi if [ "$DO_COPY" = true ]; then echo "Copying KMW artifacts" - cp $KMW_ROOT/release/$KMW_PATH/embedded/resources/osk/ajax-loader.gif $KMEA_ASSETS/ajax-loader.gif - cp $KMW_ROOT/release/$KMW_PATH/embedded/keyman.js $KMEA_ASSETS/keymanandroid.js - cp $KMW_ROOT/release/$KMW_PATH/embedded/keyman.js.map $KMEA_ASSETS/keyman.js.map - cp $KMW_ROOT/release/$KMW_PATH/embedded/resources/osk/kmwosk.css $KMEA_ASSETS/kmwosk.css - cp $KMW_ROOT/release/$KMW_PATH/embedded/resources/osk/globe-hint.css $KMEA_ASSETS/globe-hint.css - cp $KMW_ROOT/release/$KMW_PATH/embedded/resources/osk/keymanweb-osk.ttf $KMEA_ASSETS/keymanweb-osk.ttf + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/osk/ajax-loader.gif $KMEA_ASSETS/ajax-loader.gif + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/keyman.js $KMEA_ASSETS/keymanandroid.js + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/keyman.js.map $KMEA_ASSETS/keyman.js.map + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/osk/kmwosk.css $KMEA_ASSETS/kmwosk.css + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/osk/globe-hint.css $KMEA_ASSETS/globe-hint.css + cp $KMW_ROOT/build/app/embed/$KMW_CONFIG/osk/keymanweb-osk.ttf $KMEA_ASSETS/keymanweb-osk.ttf cp $KEYMAN_ROOT/common/web/sentry-manager/build/index.js $KMEA_ASSETS/keyman-sentry.js diff --git a/android/README.md b/android/README.md index 07aa1e37af..067f3667be 100644 --- a/android/README.md +++ b/android/README.md @@ -150,4 +150,4 @@ dependencies { } ```` -5. include `import com.tavultesoft.kmea.*;` to use Keyman Engine in a class. +5. include `import com.keyman.engine.*;` to use Keyman Engine in a class. diff --git a/android/Samples/KMSample1/app/src/main/java/com/keyman/kmsample1/MainActivity.java b/android/Samples/KMSample1/app/src/main/java/com/keyman/kmsample1/MainActivity.java index 4134348d9c..f56064b459 100644 --- a/android/Samples/KMSample1/app/src/main/java/com/keyman/kmsample1/MainActivity.java +++ b/android/Samples/KMSample1/app/src/main/java/com/keyman/kmsample1/MainActivity.java @@ -8,13 +8,13 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMTextView; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener; -import com.tavultesoft.kmea.KMManager.KeyboardType; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMTextView; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardDownloadEventListener; +import com.keyman.engine.KMManager.KeyboardType; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/android/Samples/KMSample1/app/src/main/res/layout/activity_main.xml b/android/Samples/KMSample1/app/src/main/res/layout/activity_main.xml index 37613d7e25..06de0d7f24 100644 --- a/android/Samples/KMSample1/app/src/main/res/layout/activity_main.xml +++ b/android/Samples/KMSample1/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - - + diff --git a/android/Samples/KMSample2/app/src/main/java/com/keyman/kmsample2/SystemKeyboard.java b/android/Samples/KMSample2/app/src/main/java/com/keyman/kmsample2/SystemKeyboard.java index 6f9a1e23a0..e4ab04e50f 100644 --- a/android/Samples/KMSample2/app/src/main/java/com/keyman/kmsample2/SystemKeyboard.java +++ b/android/Samples/KMSample2/app/src/main/java/com/keyman/kmsample2/SystemKeyboard.java @@ -1,10 +1,10 @@ package com.keyman.kmsample2; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMManager.KeyboardType; -import com.tavultesoft.kmea.KMHardwareKeyboardInterpreter; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.KMHardwareKeyboardInterpreter; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; import android.content.Context; import android.content.res.Configuration; diff --git a/android/Tests/KeyboardHarness/app/src/main/java/com/keyman/android/tests/keyboardHarness/MainActivity.java b/android/Tests/KeyboardHarness/app/src/main/java/com/keyman/android/tests/keyboardHarness/MainActivity.java index c09a70c0fe..bea32f2198 100644 --- a/android/Tests/KeyboardHarness/app/src/main/java/com/keyman/android/tests/keyboardHarness/MainActivity.java +++ b/android/Tests/KeyboardHarness/app/src/main/java/com/keyman/android/tests/keyboardHarness/MainActivity.java @@ -6,13 +6,13 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMTextView; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener; -import com.tavultesoft.kmea.KMManager.KeyboardType; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMTextView; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardDownloadEventListener; +import com.keyman.engine.KMManager.KeyboardType; import java.util.HashMap; import java.util.List; diff --git a/android/Tests/KeyboardHarness/app/src/main/res/layout/activity_main.xml b/android/Tests/KeyboardHarness/app/src/main/res/layout/activity_main.xml index 317c86c320..70cea91bfb 100644 --- a/android/Tests/KeyboardHarness/app/src/main/res/layout/activity_main.xml +++ b/android/Tests/KeyboardHarness/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - - + diff --git a/common/predictive-text/build.sh b/common/predictive-text/build.sh index 7d1f3ff92b..1462586954 100755 --- a/common/predictive-text/build.sh +++ b/common/predictive-text/build.sh @@ -41,6 +41,7 @@ builder_describe "Builds the lm-layer module" \ "--ci Sets ${BUILDER_TERM_START}test${BUILDER_TERM_END} action to use CI-based test configurations & reporting" builder_describe_outputs \ + configure /node_modules \ configure:headless /node_modules \ configure:browser /node_modules \ build:headless build/headless.js \ diff --git a/web/source/build_kill_browserstack.sh b/common/test/resources/test_kill_browserstack.sh similarity index 87% rename from web/source/build_kill_browserstack.sh rename to common/test/resources/test_kill_browserstack.sh index 1e15ade0c4..59a75be627 100755 --- a/web/source/build_kill_browserstack.sh +++ b/common/test/resources/test_kill_browserstack.sh @@ -1,5 +1,5 @@ #! /usr/bin/env bash -# +# # CI script to kill BrowserStack testing tunnel (Windows only) # @@ -8,7 +8,7 @@ set -eu ## 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" +. "$(dirname "$THIS_SCRIPT")/../../../resources/build/build-utils.sh" . "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" ## END STANDARD BUILD SCRIPT INCLUDE diff --git a/common/tools/sourcemap-path-remapper/.gitignore b/common/tools/sourcemap-path-remapper/.gitignore new file mode 100644 index 0000000000..07ed7069a2 --- /dev/null +++ b/common/tools/sourcemap-path-remapper/.gitignore @@ -0,0 +1 @@ +build/* \ No newline at end of file diff --git a/common/tools/sourcemap-path-remapper/build.sh b/common/tools/sourcemap-path-remapper/build.sh new file mode 100755 index 0000000000..1550cdd872 --- /dev/null +++ b/common/tools/sourcemap-path-remapper/build.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# +# Compile our sourcemap-path remapping module for use by Web builds, releases, etc. +# +set -eu + +## 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 + +. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" + +# This script runs from its own folder +cd "$THIS_SCRIPT_PATH" + +################################ Main script ################################ + +# TODO: for predictive-text, we only need :headless, perhaps we should be splitting modules? +# TODO: remove :tools once kmlmc is a dependency for test:module + +builder_describe "Builds a sourcemap manipulation ES module for use in Web-related builds" \ + "clean" \ + "configure" \ + "build" + +builder_describe_outputs \ + configure /node_modules \ + build build/index.js + +builder_parse "$@" + +### CONFIGURE ACTIONS + +if builder_start_action configure; then + verify_npm_setup + builder_finish_action success configure +fi + +### CLEAN ACTIONS + +if builder_start_action clean; then + rm -rf build/ + builder_finish_action success clean +fi + +### BUILD ACTIONS + +if builder_start_action build; then + npm run tsc + + builder_finish_action success build +fi \ No newline at end of file diff --git a/common/tools/sourcemap-path-remapper/package.json b/common/tools/sourcemap-path-remapper/package.json new file mode 100644 index 0000000000..87697810a7 --- /dev/null +++ b/common/tools/sourcemap-path-remapper/package.json @@ -0,0 +1,32 @@ +{ + "name": "@keymanapp/sourcemap-path-remapper", + "description": "Sourcemap-path remapper utility", + "main": "build/index.js", + "type": "module", + "scripts": { + "tsc": "tsc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/keymanapp/keyman.git" + }, + "author": "Joshua A. Horton ", + "license": "MIT", + "bugs": { + "url": "https://github.com/keymanapp/keyman/issues" + }, + "homepage": "https://github.com/keymanapp/keyman#readme", + "devDependencies": { + "@keymanapp/resources-gosh": "*", + "@types/node": "^10.17.21", + "chai": "^4.3.4", + "mocha": "^10.0.0", + "mocha-teamcity-reporter": "^4.0.0", + "sinon": "^7.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.5.4" + }, + "dependencies": { + "convert-source-map": "^2.0.0" + } +} diff --git a/common/tools/sourcemap-path-remapper/src/index.ts b/common/tools/sourcemap-path-remapper/src/index.ts new file mode 100644 index 0000000000..de54a3499b --- /dev/null +++ b/common/tools/sourcemap-path-remapper/src/index.ts @@ -0,0 +1,137 @@ +import * as fs from 'fs'; +import convertSourcemap from 'convert-source-map'; // Transforms sourcemaps among various common formats. + // Base64, stringified-JSON, end-of-file comment... + +// Because we're compiling the main project based on its TS build outputs, and our cross-module references +// also link to build outputs, we need to clean up the sourcemap-paths. Also, the individual module sourcemaps. + +export interface Mapping { + readonly from: RegExp | string; + readonly to: string; +} + +/** + * An intermediate state for sourcemap source path remapping operations + functions to + * mutate it. + */ +class RemappingState { + constructor(srcmap: Object) { + this.sourcemap = srcmap; + this.resetChangedSourcepathTracking(); + } + + public readonly sourcemap: any; + private _unchangedSourcepaths: string[] = []; + + public get unchangedSourcepaths() { + return this._unchangedSourcepaths; + } + + public resetChangedSourcepathTracking() { + this._unchangedSourcepaths = [...this.sourcemap.sources]; + } + + /** + * The sourcemap's `sourceRoot` property. + */ + public get sourceRoot() { + return this.sourcemap.sourceRoot; + } + + /** + * The sourcemap's `sourceRoot` property. + */ + public set sourceRoot(path: string) { + this.sourcemap.sourceRoot = path; + } + + /** + * Searches for source-file paths that match specified path-remapping rules and remaps them + * accordingly. + * @param transforms Path-remapping rules to apply. For each remappable path, only the first + * matching rule in the specified set will be applied. + * @returns `this` - the original instance - in order to facilitate function-call chaining. + */ + remapPaths(transforms: Mapping | Mapping[], logger?: (from: string, to: string) => void) { + if(!(transforms instanceof Array)) { + transforms = [transforms]; + } + + const unusedTransforms = [...transforms]; + + const sourcePaths = this.sourcemap.sources; + for(let i = 0; i < sourcePaths.length; i++) { + for(const transform of transforms) { + if(sourcePaths[i].match(transform.from)) { + // Note that this source path has been remapped (if it wasn't previously) + if(this.unchangedSourcepaths.includes(sourcePaths[i])) { + this.unchangedSourcepaths.splice(this.unchangedSourcepaths.indexOf(sourcePaths[i]), 1); + } + + // Note that this transform has been used. + if(unusedTransforms.includes(transform)) { + unusedTransforms.splice(unusedTransforms.indexOf(transform), 1); + } + + let startPath = sourcePaths[i]; + sourcePaths[i] = sourcePaths[i].replace(transform.from, transform.to); + if(logger) { + logger(startPath, sourcePaths[i]); + } + break; + } + } + } + + if(unusedTransforms.length > 0) { + console.warn(); + console.warn("Unused sourcemath mappings:"); + for(const transform of unusedTransforms) { + let isRegex = transform.from instanceof RegExp; + let delim = isRegex ? '' : '"'; + console.warn(`* ${delim}${transform.from.toString()}${delim} => "${transform.to}"`); + } + } + + return this; + } + + /** + * Writes the current state of the remapped sourcemap out to the specified file. + * @param file + */ + public toFile(file: fs.PathLike) { + fs.writeFileSync(file, convertSourcemap.fromObject(this.sourcemap).toJSON()); + } +} + +export default class SourcemapRemapper { + private constructor() {} + + /** + * Starts sourcemap source path remapping from a pre-loaded JSON sourcemap instance. + * @param obj + * @returns + */ + public static fromObject(obj: Object) { + return new RemappingState(obj); + } + + /** + * Starts sourcemap source path remapping from the specified .js.map file. + * @param file + * @returns + */ + public static fromFile(file: fs.PathLike) { + return this.fromBuffer(fs.readFileSync(file)); + } + + /** + * Starts sourcemap source path remapping from a loaded but unparsed file. + * @param buffer + * @returns + */ + public static fromBuffer(buffer: Buffer) { + return this.fromObject(convertSourcemap.fromJSON(buffer).toObject()); + } +} \ No newline at end of file diff --git a/common/tools/sourcemap-path-remapper/tsconfig.json b/common/tools/sourcemap-path-remapper/tsconfig.json new file mode 100644 index 0000000000..f9b531b311 --- /dev/null +++ b/common/tools/sourcemap-path-remapper/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../tsconfig-base.json", + + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "declaration": true, + "module": "es6", + "moduleResolution": "node", + "inlineSourceMap": true, + "inlineSources": true, + "sourceRoot": "/common/tools/sourcemap-path-remapper/src", + "lib": ["dom", "es6"], + "target": "es5", + "types": ["node"], + "downlevelIteration": true, + "baseUrl": "./", + "outDir": "build/", + "tsBuildInfoFile": "build/tsconfig.tsbuildinfo", + "rootDir": "./src/" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/common/web/input-processor/build.sh b/common/web/input-processor/build.sh index 70e0cc7398..70dcc1575c 100755 --- a/common/web/input-processor/build.sh +++ b/common/web/input-processor/build.sh @@ -34,6 +34,7 @@ builder_describe "Builds the standalone, headless form of Keyman Engine for Web' "--ci Sets ${BUILDER_TERM_START}test${BUILDER_TERM_END} action to use CI-based test configurations & reporting" builder_describe_outputs \ + configure /node_modules \ configure:module /node_modules \ configure:tools /node_modules \ build:module build/index.js \ diff --git a/common/web/recorder/build.sh b/common/web/recorder/build.sh index 969453f37c..fb566a18c8 100755 --- a/common/web/recorder/build.sh +++ b/common/web/recorder/build.sh @@ -27,6 +27,7 @@ builder_describe \ ":proctor Builds headless-testing, node-oriented 'proctor' component" builder_describe_outputs \ + configure "/node_modules" \ configure:module "/node_modules" \ configure:proctor "/node_modules" \ build:module "build/index.js" \ diff --git a/common/windows/delphi/packages/PackageInfo.pas b/common/windows/delphi/packages/PackageInfo.pas index 81e633fe53..dd4dbcd110 100644 --- a/common/windows/delphi/packages/PackageInfo.pas +++ b/common/windows/delphi/packages/PackageInfo.pas @@ -337,6 +337,8 @@ type procedure SaveJSON(ARoot: TJSONObject); virtual; procedure LoadXML(ARoot: IXMLNode); virtual; procedure SaveXML(ARoot: IXMLNode); virtual; + function ContainsID(const id: string): Boolean; + function IndexOfID(const id: string): Integer; end; TPackageLexicalModel = class(TPackageBaseObject) @@ -2262,6 +2264,21 @@ end; { TPackageKeyboardLanguageList } +function TPackageKeyboardLanguageList.ContainsID(const id: string): Boolean; +begin + Result := IndexOfID(id) >= 0; +end; + +function TPackageKeyboardLanguageList.IndexOfID(const id: string): Integer; +var + i: Integer; +begin + for i := 0 to Count - 1 do + if SameText(Items[i].ID, id) then + Exit(i); + Result := -1; +end; + procedure TPackageKeyboardLanguageList.LoadJSON(ARoot: TJSONObject); var j: Integer; diff --git a/core/meson.build b/core/meson.build index cad35decec..5f530aae3d 100644 --- a/core/meson.build +++ b/core/meson.build @@ -12,19 +12,14 @@ project('keyboardprocessor', 'cpp', 'c', 'cpp_std=c++14', 'b_vscrt=static_from_buildtype', 'warning_level=2'], - meson_version: '>=0.45.0') + meson_version: '>=0.53.0') compiler = meson.get_compiler('cpp') lib_version = '0.0.0' -if meson.version().version_compare('>=0.46') - py = import('python') - python = py.find_installation() -else - py = import('python3') - python = py.find_python() -endif +py = import('python') +python = py.find_installation() # Once we can assume meson 0.60 we can delete this # (https://mesonbuild.com/Release-notes-for-0-60-0.html#msvc-compiler-now-assumes-utf8-source-code-by-default) diff --git a/developer/src/common/delphi/compiler/CompilePackage.pas b/developer/src/common/delphi/compiler/CompilePackage.pas index 1e711169dd..c7c5e07123 100644 --- a/developer/src/common/delphi/compiler/CompilePackage.pas +++ b/developer/src/common/delphi/compiler/CompilePackage.pas @@ -27,7 +27,9 @@ unit CompilePackage; interface uses - kpsfile, kmpinffile, PackageInfo, + kpsfile, + kmpinffile, + PackageInfo, Keyman.Developer.System.Project.ProjectLog; function DoCompilePackage(pack: TKPSFile; AMessageEvent: TCompilePackageMessageEvent; ASilent, ACheckFilenameConventions: Boolean; const AOutputFileName: string): Boolean; // I4688 @@ -37,6 +39,7 @@ implementation uses Winapi.Windows, System.Classes, + System.Generics.Collections, System.SysUtils, System.IniFiles, System.Zip, @@ -85,6 +88,7 @@ type procedure CheckKeyboardLanguages; procedure CheckFilenameConventions; function CheckLexicalModels: Boolean; + procedure CheckForDuplicatedLanguages(const resourceType, id: string; languages: TPackageKeyboardLanguageList); end; function DoCompilePackage(pack: TKPSFile; AMessageEvent: TCompilePackageMessageEvent; ASilent, ACheckFilenameConventions: Boolean; const AOutputFileName: string): Boolean; // I4688 @@ -141,6 +145,8 @@ begin end; function TCompilePackage.CheckLexicalModels: Boolean; +var + model: TPackageLexicalModel; begin if pack.LexicalModels.Count > 0 then begin @@ -151,6 +157,12 @@ begin end; end; + for model in pack.LexicalModels do + begin + CheckForDuplicatedLanguages('model', model.id, model.Languages); + end; + + Exit(True); end; @@ -487,6 +499,7 @@ end; const SKKeyboardPackageLanguageNonCanonical = 'The keyboard %0:s has a non-canonical language tag "%1:s" (%2:s), should be "%3:s".'; SKKeyboardShouldHaveAtLeastOneLanguage = 'The keyboard %0:s has no language tags. It should have at least one language tag.'; + SKPackageShouldNotRepeatLanguages = 'The %0:s %1:s has a repeated language "%2:s".'; procedure TCompilePackage.CheckKeyboardLanguages; var @@ -496,6 +509,30 @@ begin begin if k.Languages.Count = 0 then WriteMessage(plsWarning, Format(SKKeyboardShouldHaveAtLeastOneLanguage, [k.ID])); + CheckForDuplicatedLanguages('keyboard', k.ID, k.Languages); + end; +end; + +procedure TCompilePackage.CheckForDuplicatedLanguages(const resourceType, id: string; languages: TPackageKeyboardLanguageList); +var + tags: TDictionary; + lang: TPackageKeyboardLanguage; +begin + tags := TDictionary.Create; + try + for lang in languages do + begin + if tags.ContainsKey(lang.ID.ToLower) then + begin + WriteMessage(plsWarning, Format(SKPackageShouldNotRepeatLanguages, [resourceType, id, lang.ID])); + end + else + begin + tags.Add(lang.ID.ToLower, 0); + end; + end; + finally + tags.Free; end; end; diff --git a/developer/src/server/build.sh b/developer/src/server/build.sh index ab31b34e1f..f250684582 100755 --- a/developer/src/server/build.sh +++ b/developer/src/server/build.sh @@ -123,21 +123,23 @@ fi # ---------------------------------------- if (( build_keymanweb )); then - pushd "$KEYMAN_ROOT/web/source" - ./build.sh -no_minify + pushd "$KEYMAN_ROOT/web/" + ./build.sh --no-minify popd fi if (( copy_keymanweb )); then - SRC="$KEYMAN_ROOT/web/release/unminified" + WEB_SRC="$KEYMAN_ROOT/web/build/app/web/debug" + UI_SRC="$KEYMAN_ROOT/web/build/app/ui/debug" DST="$(dirname "$THIS_SCRIPT")/src/site/resource" rm -rf "$DST" mkdir -p "$DST/osk" mkdir -p "$DST/ui" - cp "$SRC/web/"*.js "$SRC/web/"*.js.map "$DST/" - cp -R "$SRC/web/osk/"* "$DST/osk/" - cp -R "$SRC/web/ui/"* "$DST/ui/" + cp "$WEB_SRC/"*.js "$WEB_SRC/"*.js.map "$DST/" + cp "$UI_SRC/"*.js "$UI_SRC/"*.js.map "$DST/" + cp -R "$WEB_SRC/osk/"* "$DST/osk/" + cp -R "$WEB_SRC/ui/"* "$DST/ui/" cp "$KEYMAN_ROOT/web/LICENSE" "$DST/" cp "$KEYMAN_ROOT/web/README.md" "$DST/" fi diff --git a/developer/src/tike/child/UfrmPackageEditor.pas b/developer/src/tike/child/UfrmPackageEditor.pas index 22b94a4835..4b36d67170 100644 --- a/developer/src/tike/child/UfrmPackageEditor.pas +++ b/developer/src/tike/child/UfrmPackageEditor.pas @@ -314,8 +314,7 @@ type procedure EnableLexicalModelTabControls; procedure ShowEditLanguageForm(grid: TStringGrid; langs: TPackageKeyboardLanguageList; lang: TPackageKeyboardLanguage); - function ShowAddLanguageForm(grid: TStringGrid; - langs: TPackageKeyboardLanguageList): Boolean; + procedure ShowAddLanguageForm(grid: TStringGrid; langs: TPackageKeyboardLanguageList); procedure RefreshLexicalModelList; procedure UpdateQRCode; @@ -1624,6 +1623,8 @@ procedure TfrmPackageEditor.EnableControls; begin EnableStartMenuControls; EnableDetailsTabControls; + EnableKeyboardTabControls; + EnableLexicalModelTabControls; EnableCompileTabControls; end; @@ -1686,35 +1687,16 @@ end; procedure TfrmPackageEditor.cmdKeyboardAddLanguageClick(Sender: TObject); var k: TPackageKeyboard; - lang: TPackageKeyboardLanguage; - frm: TfrmSelectBCP47Language; begin k := SelectedKeyboard; Assert(Assigned(k)); - - frm := TfrmSelectBCP47Language.Create(Application.MainForm); - try - if frm.ShowModal = mrOk then - begin - lang := TPackageKeyboardLanguage.Create(pack); - lang.ID := frm.LanguageID; - lang.Name := frm.LanguageName; - k.Languages.Add(lang); - RefreshKeyboardLanguageList(k); - gridKeyboardLanguages.Row := gridKeyboardLanguages.RowCount - 1; - gridKeyboardLanguagesClick(gridKeyboardLanguages); - Modified := True; - end; - finally - frm.Free; - end; + ShowAddLanguageForm(gridKeyboardLanguages, k.Languages); end; procedure TfrmPackageEditor.cmdKeyboardEditLanguageClick(Sender: TObject); var k: TPackageKeyboard; lang: TPackageKeyboardLanguage; - frm: TfrmSelectBCP47Language; begin k := SelectedKeyboard; Assert(Assigned(k)); @@ -1722,20 +1704,7 @@ begin lang := SelectedKeyboardLanguage; Assert(Assigned(lang)); - frm := TfrmSelectBCP47Language.Create(Application.MainForm); - try - frm.LanguageID := lang.ID; - frm.LanguageName := lang.Name; - if frm.ShowModal = mrOk then - begin - lang.ID := frm.LanguageID; - lang.Name := frm.LanguageName; - RefreshKeyboardLanguageList(k); - Modified := True; - end; - finally - frm.Free; - end; + ShowEditLanguageForm(gridKeyboardLanguages, k.Languages, lang); end; procedure TfrmPackageEditor.cmdKeyboardRemoveLanguageClick(Sender: TObject); @@ -1819,16 +1788,25 @@ begin end; end; -function TfrmPackageEditor.ShowAddLanguageForm(grid: TStringGrid; langs: TPackageKeyboardLanguageList): Boolean; +procedure TfrmPackageEditor.ShowAddLanguageForm(grid: TStringGrid; langs: TPackageKeyboardLanguageList); var lang: TPackageKeyboardLanguage; frm: TfrmSelectBCP47Language; + n: Integer; begin - Result := False; frm := TfrmSelectBCP47Language.Create(Application.MainForm); try if frm.ShowModal = mrOk then begin + n := langs.IndexOfID(frm.LanguageID); + if n >= 0 then + begin + // Duplicate - we won't re-add the item, just select the existing item + grid.Row := n + 1; + EnableControls; + Exit; + end; + lang := TPackageKeyboardLanguage.Create(pack); lang.ID := frm.LanguageID; lang.Name := frm.LanguageName; @@ -1836,7 +1814,7 @@ begin RefreshLanguageList(grid, langs); grid.Row := grid.RowCount - 1; Modified := True; - Result := True; + EnableControls; end; finally frm.Free; @@ -1846,6 +1824,7 @@ end; procedure TfrmPackageEditor.ShowEditLanguageForm(grid: TStringGrid; langs: TPackageKeyboardLanguageList; lang: TPackageKeyboardLanguage); var frm: TfrmSelectBCP47Language; + n: Integer; begin frm := TfrmSelectBCP47Language.Create(Application.MainForm); try @@ -1853,9 +1832,30 @@ begin frm.LanguageName := lang.Name; if frm.ShowModal = mrOk then begin + if not SameText(frm.LanguageID, lang.ID) then + begin + // If the id has changed, check for duplicates + n := langs.IndexOfID(frm.LanguageID); + if n >= 0 then + begin + // Duplicate - we will delete the edited one and select the existing + // one + langs.Remove(lang); + RefreshLanguageList(grid, langs); + + // The index may have changed, search again + n := langs.IndexOfID(frm.LanguageID); + grid.Row := n + 1; + EnableControls; + Modified := True; + Exit; + end; + end; + lang.ID := frm.LanguageID; lang.Name := frm.LanguageName; RefreshLanguageList(grid, langs); + EnableControls; Modified := True; end; finally @@ -2005,10 +2005,7 @@ var begin lm := SelectedLexicalModel; Assert(Assigned(lm)); - - if ShowAddLanguageForm(gridLexicalModelLanguages, lm.Languages) then - gridLexicalModelLanguagesClick(gridLexicalModelLanguages); - EnableLexicalModelTabControls; + ShowAddLanguageForm(gridLexicalModelLanguages, lm.Languages); end; procedure TfrmPackageEditor.cmdLexicalModelLanguageEditClick(Sender: TObject); diff --git a/developer/src/tike/main/RedistFiles.pas b/developer/src/tike/main/RedistFiles.pas index 998878e962..b02c956679 100644 --- a/developer/src/tike/main/RedistFiles.pas +++ b/developer/src/tike/main/RedistFiles.pas @@ -139,12 +139,17 @@ function GetDebugKMCmpDllPath: string; var root: string; const + DevPlatform={$IFDEF WIN64}'x64'{$ELSE}'Win32'{$ENDIF}; + DevConfig={$IFDEF DEBUG}'Debug'{$ELSE}'Release'{$ENDIF}; + DevSrcCompilerPath = 'developer\src\kmcmpdll\bin\'+DevPlatform+'\'+DevConfig; DevCompilerPath = 'developer\bin'; begin - if TKeymanPaths.RunningFromSource(root) and - FileExists(root + DevCompilerPath + '\kmcmpdll.dll') - then Result := root + DevCompilerPath - else Result := ExtractFilePath(ParamStr(0)); + if TKeymanPaths.RunningFromSource(root) and FileExists(root + DevSrcCompilerPath + '\kmcmpdll.dll') then + Result := root + DevSrcCompilerPath + else if TKeymanPaths.RunningFromSource(root) and FileExists(root + DevCompilerPath + '\kmcmpdll.dll') then + Result := root + DevCompilerPath + else + Result := ExtractFilePath(ParamStr(0)); Result := GetDebugPath('Debug_KMCMPDLLPath', Result); end; diff --git a/docs/settings/linux/extensions.json b/docs/settings/linux/extensions.json index 55b5ccd393..bd790bd97e 100644 --- a/docs/settings/linux/extensions.json +++ b/docs/settings/linux/extensions.json @@ -9,5 +9,6 @@ "timonwong.shellcheck", "maelvalais.autoconf", "webfreak.debug", + "dawidd6.debian-vscode", ] } diff --git a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj index 375720e0fb..4f21ff9830 100644 --- a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj +++ b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj @@ -308,12 +308,21 @@ 2949146F2738DA6700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/ResourceInfoView.strings"; sourceTree = ""; }; 294914702738DD7400400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/Localizable.strings"; sourceTree = ""; }; 294914712738DD9700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "ff-NG"; path = "ff-NG.lproj/Localizable.stringsdict"; sourceTree = ""; }; - 297810FE297FAEDF007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/ResourceInfoView.strings; sourceTree = ""; }; - 297810FF297FAEF8007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = ""; }; - 29781100297FAF06007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = kn; path = kn.lproj/Localizable.stringsdict; sourceTree = ""; }; 298566B929802892004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/ResourceInfoView.strings; sourceTree = ""; }; 298566BA298028A8004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; 298566BB298028AC004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = cs; path = cs.lproj/Localizable.stringsdict; sourceTree = ""; }; + 297810FE297FAEDF007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/ResourceInfoView.strings; sourceTree = ""; }; + 297810FF297FAEF8007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = ""; }; + 29781100297FAF06007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = kn; path = kn.lproj/Localizable.stringsdict; sourceTree = ""; }; + 298566C52980C5BB004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/ResourceInfoView.strings; sourceTree = ""; }; + 298566C62980C5C7004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 298566C72980C5CC004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv; path = sv.lproj/Localizable.stringsdict; sourceTree = ""; }; + 298566D12980D390004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/ResourceInfoView.strings; sourceTree = ""; }; + 298566D22980D39A004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 298566D32980D39F004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = uk; path = uk.lproj/Localizable.stringsdict; sourceTree = ""; }; + 298566DD2980E477004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ResourceInfoView.strings; sourceTree = ""; }; + 298566DE2980E486004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 298566DF2980E48C004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = ""; }; 29B27FEF29062CF50036917E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/ResourceInfoView.strings; sourceTree = ""; }; 29B27FF029062D100036917E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; 29B27FF129062D190036917E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = nl; path = nl.lproj/Localizable.stringsdict; sourceTree = ""; }; @@ -1201,8 +1210,11 @@ it, pl, nl, - kn, cs, + kn, + sv, + uk, + ru, ); mainGroup = F243887314BBD43000A3E055; productRefGroup = F243887F14BBD43000A3E055 /* Products */; @@ -1596,8 +1608,11 @@ 29BFA760282934BB009FCCC3 /* it */, 29BFA76C28294833009FCCC3 /* pl */, 29B27FF129062D190036917E /* nl */, - 29781100297FAF06007C886D /* kn */, 298566BB298028AC004ACA95 /* cs */, + 29781100297FAF06007C886D /* kn */, + 298566C72980C5CC004ACA95 /* sv */, + 298566D32980D39F004ACA95 /* uk */, + 298566DF2980E48C004ACA95 /* ru */, ); name = Localizable.stringsdict; sourceTree = ""; @@ -1620,8 +1635,11 @@ 29BFA75F282934B4009FCCC3 /* it */, 29BFA76B28294813009FCCC3 /* pl */, 29B27FF029062D100036917E /* nl */, - 297810FF297FAEF8007C886D /* kn */, 298566BA298028A8004ACA95 /* cs */, + 297810FF297FAEF8007C886D /* kn */, + 298566C62980C5C7004ACA95 /* sv */, + 298566D22980D39A004ACA95 /* uk */, + 298566DE2980E486004ACA95 /* ru */, ); name = Localizable.strings; sourceTree = ""; @@ -1645,8 +1663,11 @@ 29BFA75E28293287009FCCC3 /* it */, 29BFA76A28294746009FCCC3 /* pl */, 29B27FEF29062CF50036917E /* nl */, - 297810FE297FAEDF007C886D /* kn */, 298566B929802892004ACA95 /* cs */, + 297810FE297FAEDF007C886D /* kn */, + 298566C52980C5BB004ACA95 /* sv */, + 298566D12980D390004ACA95 /* uk */, + 298566DD2980E477004ACA95 /* ru */, ); name = ResourceInfoView.xib; sourceTree = ""; diff --git a/ios/engine/KMEI/KeymanEngine/Classes/ru.lproj/ResourceInfoView.strings b/ios/engine/KMEI/KeymanEngine/Classes/ru.lproj/ResourceInfoView.strings new file mode 100644 index 0000000000..3622f14d7c --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/Classes/ru.lproj/ResourceInfoView.strings @@ -0,0 +1,2 @@ +/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */ +"z2O-MT-IoV.text" = "Сканируйте этот код для загрузки этой клавиатуры на другом устройстве"; diff --git a/ios/engine/KMEI/KeymanEngine/Classes/sv.lproj/ResourceInfoView.strings b/ios/engine/KMEI/KeymanEngine/Classes/sv.lproj/ResourceInfoView.strings new file mode 100644 index 0000000000..4ad462fd6f --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/Classes/sv.lproj/ResourceInfoView.strings @@ -0,0 +1,2 @@ +/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */ +"z2O-MT-IoV.text" = "Skanna den här koden för att ladda tangentbordet på en annan enhet"; diff --git a/ios/engine/KMEI/KeymanEngine/Classes/uk.lproj/ResourceInfoView.strings b/ios/engine/KMEI/KeymanEngine/Classes/uk.lproj/ResourceInfoView.strings new file mode 100644 index 0000000000..1d9dfc9b81 --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/Classes/uk.lproj/ResourceInfoView.strings @@ -0,0 +1,2 @@ +/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */ +"z2O-MT-IoV.text" = "Проскануйте цей код, щоб завантажити цю клавіатуру на іншому пристрої"; diff --git a/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.strings b/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..c71eb67ea7 --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.strings @@ -0,0 +1,257 @@ +/* A descriptive message used for errors when the app is already busy downloading */ +"alert-download-error-busy" = "Загрузка уже занята."; + +/* A descriptive message used when a download fails */ +"alert-download-error-detail" = "Произошла ошибка во время загрузки или установки."; + +/* Title for a "download failed" alert */ +"alert-download-error-title" = "Ошибка загрузки"; + +/* Title for a general alert about errors */ +"alert-error-title" = "Ошибка"; + +/* A descriptive message used when no internet connection is detected */ +"alert-no-connection-detail" = "Не удалось подключиться к серверу Keyman. Пожалуйста, повторите попытку позже."; + +/* Title for a "no connection" alert */ +"alert-no-connection-title" = "Ошибка соединения"; + +/* Short text for a 'back' navigational command. Used to return to the previous screen */ +"command-back" = "Назад"; + +/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */ +"command-cancel" = "Отменить"; + +/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */ +"command-done" = "Готово"; + +/* Short text for an 'install' command. Used to confirm installation of a package. */ +"command-install" = "Установить"; + +/* Short text for a 'next' navigational command. Used to advance to the next screen */ +"command-next" = "Следующий"; + +/* Short text for an 'OK' command. Used for some error alerts */ +"command-ok" = "ОК"; + +/* Short text for confirmining 'uninstall' commands. */ +"command-uninstall" = "Удалить"; + +/* Text for the command to uninstall a keyboard */ +"command-uninstall-keyboard" = "Удалить клавиатуру"; + +/* Confirmation text to display before uninstalling a keyboard */ +"command-uninstall-keyboard-confirm" = "Вы хотите удалить эту клавиатуру?"; + +/* Text for the command to uninstall a lexical model */ +"command-uninstall-lexical-model" = "Удалить словарь"; + +/* Confirmation text to display before uninstalling a lexical model */ +"command-uninstall-lexical-model-confirm" = "Вы хотите удалить этот словарь?"; + +/* Text for error when a keyboard cannot load properly */ +"error-loading-keyboard" = "Не удается загрузить запрошенную клавиатуру"; + +/* Text for error when a lexical model cannot load properly */ +"error-loading-lexical-model" = "Не удается загрузить запрошенный словарь"; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file" = "Не удалось найти требуемый файл."; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file-critical" = "Файл с критическим значением не найден. Пожалуйста, попробуйте переустановить приложение."; + +/* Text for errors in data received from search queries */ +"error-query-decoding" = "Сервер в настоящее время испытывает технические трудности"; + +/* A descriptive message used when a download fails */ +"error-query-general" = "Ошибка соединения с сервером"; + +/* Text for error when a search query is unexpectedly empty */ +"error-query-no-data" = "Сервер не ответил"; + +/* Text for general errors where not much information is known */ +"error-unknown" = "Произошла непредвиденная ошибка"; + +/* Text for error when updating a resource: cannot download because no source is available */ +"error-update-no-link" = "Источник обновлений для этого пакета не доступен"; + +/* Text for error when updating a resource: Keyman does not know how to update the resource */ +"error-update-not-managed" = "Невозможно обновить ресурс, не управляемый движком Keyman"; + +/* Text for the command to open the help page of a keyboard, as shown on resource information views */ +"info-command-help-keyboard" = "Справка по клавиатуре"; + +/* Text for the command to open the help page of a lexical model, as shown on resource information views */ +"info-command-help-lexical-model" = "Справка по словарям"; + +/* Text label for displaying a keyboard's version, as shown on resource information views */ +"info-label-version-keyboard" = "Версия клавиатуры"; + +/* Text label for displaying a lexical model's version, as shown on resource information views */ +"info-label-version-lexical-model" = "Версия словаря"; + +/* Label used for the "package info" / readme tab with the package installation prompt on phones. */ +"installer-label-package-info" = "Информация о пакете"; + +/* Label used for the language-selection tab with the package installation prompt on phones. */ +"installer-label-select-languages" = "Выберите язык(и)"; + +/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */ +"installer-label-version" = "Версия: %@"; + +/* Section header for languages supported by a package, as seen within the package installation prompt */ +"installer-section-available-languages" = "Доступные языки"; + +/* Text for the help popup for changing keyboards with the globe key */ +"keyboard-help-change" = "Нажмите здесь, чтобы изменить клавиатуру"; + +/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */ +"keyboard-menu-exit" = "Закрыть %@"; + +/* Error installing a Keyman package - could not allocate a location to install it */ +"kmp-error-file-system" = "Ошибка установки пакета - ошибка файловой системы"; + +/* Error installing a Keyman package - could not copy package files */ +"kmp-error-file-copying" = "Ошибка установки пакета - невозможно скопировать необходимые файлы"; + +/* Error opening a Keyman package - package is not valid */ +"kmp-error-invalid" = "Файл пакета повреждён."; + +/* Error opening a Keyman package - it does not exist / the specified location is wrong */ +"kmp-error-missing" = "Указанный пакет не существует."; + +/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */ +"kmp-error-missing-resource" = "Этот пакет не содержит запрошенной клавиатуры или словаря."; + +/* Error installing a Keyman package with a version of Keyman that does not support it */ +"kmp-error-unsupported-keyman-version" = "This package requires a newer version of Keyman."; + +/* Error opening a Keyman package - cannot parse contents */ +"kmp-error-no-metadata" = "Этот пакет не был правильно собран - содержимое неизвестно."; + +/* Error opening a Keyman package - package's contents are for desktop platforms only */ +"kmp-error-unsupported" = "Этот пакет не включает поддержку вашего устройства."; + +/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */ +"kmp-error-wrong-type" = "Этот пакет не содержит ожидаемый тип ресурса."; + +/* Title for the Installed Languages menu */ +"menu-installed-languages-title" = "Установленные языки"; + +/* Section header for lexical models within a language-specific settings menu */ +"menu-langsettings-label-lexical-models" = "Словари"; + +/* Section header for keyboards within a language-specific settings menu */ +"menu-langsettings-section-keyboards" = "Клавиатуры"; + +/* Section header for the settings toggles within a language-specific settings menu */ +"menu-langsettings-section-settings" = "Настройки языка"; + +/* Title for the language-specific settings menus */ +"menu-langsettings-title" = "Настройки %@"; + +/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-correct" = "Включить исправления"; + +/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-predict" = "Включить прогнозы"; + +/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-message" = "Вы хотите установить этот словарь?"; + +/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-title" = "%1$@: %2$@"; + +/* Text for an info alert indicating that no lexical models are available */ +"menu-lexical-model-none-message" = "Нет доступных словарей"; + +/* Title for the lexical model menu, a submenu of the language-specific settings menus */ +"menu-lexical-model-title" = "%@ словаря"; + +/* Title for the keyboard picker */ +"menu-picker-title" = "Клавиатуры"; + +/* Primary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report" = "Разрешить сообщение об ошибках"; + +/* Secondary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report-description" = "Может потребоваться \"полный доступ\""; + +/* Primary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file" = "Установить из файла"; + +/* Secondary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file-description" = "Поиск файлов .kmp"; + +/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */ +"menu-settings-system-keyboard-menu" = "Системные настройки клавиатуры"; + +/* Label for the "Show Banner" toggle on the main settings screen */ +"menu-settings-show-banner" = "Показать баннер"; + +/* Label for the "Get Started" automatic display toggle seen in the Settings menu */ +"menu-settings-startup-get-started" = "Показывать 'Начало работы' при запуске"; + +/* Title for the main Settings menu */ +"menu-settings-title" = "Настройки Keyman"; + +/* Secondary text showing current setting for spacebar caption - blank */ +"menu-settings-spacebar-hint-blank" = "Не показывать заголовок в пробеле"; + +/* Secondary text showing current setting for spacebar caption - keyboard */ +"menu-settings-spacebar-hint-keyboard" = "Показывать имя клавиатуры на пробеле"; + +/* Secondary text showing current setting for spacebar caption - language */ +"menu-settings-spacebar-hint-language" = "Показывать название языка в пробеле"; + +/* Secondary text showing current setting for spacebar caption - language + keyboard */ +"menu-settings-spacebar-hint-languageKeyboard" = "Показывать язык и название клавиатуры на пробеле"; + +/* Label for the "Spacebar Caption" item on the main settings screen */ +"menu-settings-spacebar-text" = "Заголовок пробела"; + +/* Title for the "Spacebar Caption" settings screen */ +"menu-settings-spacebar-title" = "Заголовок пробела"; + +/* Text showing name of spacebar caption - blank */ +"menu-settings-spacebar-item-blank" = "Пустой"; + +/* Text showing name of spacebar caption - keyboard */ +"menu-settings-spacebar-item-keyboard" = "Клавиатура"; + +/* Text showing name of spacebar caption - language */ +"menu-settings-spacebar-item-language" = "Язык"; + +/* Text showing name of spacebar caption - language + keyboard */ +"menu-settings-spacebar-item-languageKeyboard" = "Язык и клавиатура"; + +/* Short text for notification: download failure for keyboard */ +"notification-download-failure-keyboard" = "Ошибка загрузки клавиатуры"; + +/* Short text for notification: download failure for lexical model */ +"notification-download-failure-lexical-model" = "Ошибка загрузки словаря"; + +/* Short text for notification: download success for keyboard */ +"notification-download-success-keyboard" = "Клавиатура успешно загружена"; + +/* Short text for notification: download success for lexical model */ +"notification-download-success-lexical-model" = "Лексическая модель успешно загружена"; + +/* Short text for notification: downloading a keyboard */ +"notification-downloading-keyboard" = "Загрузка клавиатуры\U2026"; + +/* Short text for notification: downloading a lexical model */ +"notification-downloading-lexical-model" = "Загрузка словаря\U2026"; + +/* Short text for notification: an update is available */ +"notification-update-available" = "Доступно обновление"; + +/* Short text for notification: currently updating */ +"notification-update-processing" = "Обновление\U2026"; + +/* Text indicating success at installing new keyboards or dictionaries */ +"success-install" = "Успешно установлено."; + +/* A title to use in alerts indicating 'success' at whatever task the user requested */ +"success-title" = "Успешно"; diff --git a/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.stringsdict b/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.stringsdict new file mode 100644 index 0000000000..49d78157bb --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/ru.lproj/Localizable.stringsdict @@ -0,0 +1,146 @@ + + + + + menu-langsettings-lexical-model-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u словарь установлен + few + Установлено %u словарей + many + Установлено %u словарей + other + Установлено %u словарей + + + notification-update-failed + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Сбой обновления %u + few + %u обновлений не удалось + many + %u обновлений не удалось + other + %u обновлений не удалось + + + notification-update-success + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u успешно обновлено + few + %u обновлений успешно + many + %u обновлений успешно + other + %u обновлений успешно + + + settings-keyboards-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Установлена %u клавиатура + few + %u клавиатуры установлены + many + %u клавиатуры установлены + other + %u клавиатуры установлены + + + settings-languages-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Установлен %u язык + few + Установлено %u языков + many + Установлено %u языков + other + Установлено %u языков + + + package-default-found-keyboards + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u клавиатура найдена: + few + Найдено %u клавиатур в пакете: + many + Найдено %u клавиатур в пакете: + other + Найдено %u клавиатур в пакете: + + + package-default-found-lexical-models + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Найден %u словарь в пакете: + few + Найдено %u словарей в пакете: + many + Найдено %u словарей в пакете: + other + Найдено %u словарей в пакете: + + + + diff --git a/ios/engine/KMEI/KeymanEngine/shu-latn-n.lproj/Localizable.strings b/ios/engine/KMEI/KeymanEngine/shu-latn-n.lproj/Localizable.strings index f9a094c3c5..f5a97d6119 100644 --- a/ios/engine/KMEI/KeymanEngine/shu-latn-n.lproj/Localizable.strings +++ b/ios/engine/KMEI/KeymanEngine/shu-latn-n.lproj/Localizable.strings @@ -119,7 +119,7 @@ "kmp-error-invalid" = "Alshu'ul maknus."; /* Error opening a Keyman package - it does not exist / the specified location is wrong */ -"kmp-error-missing" = "The specified package does not exist."; +"kmp-error-missing" = "Al package alkhassa da mafi."; /* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */ "kmp-error-missing-resource" = "Alshu'ul da ma leya gudura layl keyboard walla kakkad hanal kalimat da."; @@ -131,7 +131,7 @@ "kmp-error-no-metadata" = "Ma sawwol shu'ul da zayn - shu'ul alfiya ma mil'araf."; /* Error opening a Keyman package - package's contents are for desktop platforms only */ -"kmp-error-unsupported" = "This package does not include support for your device."; +"kmp-error-unsupported" = "Al package da ma bikun bidukhul ley shu'ulak."; /* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */ "kmp-error-wrong-type" = "Alshu'ul da ma leya shu'ul albinadawar minna."; diff --git a/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.strings b/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.strings new file mode 100644 index 0000000000..e8ceafa04d --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.strings @@ -0,0 +1,257 @@ +/* A descriptive message used for errors when the app is already busy downloading */ +"alert-download-error-busy" = "Redan upptagen med nedladdning."; + +/* A descriptive message used when a download fails */ +"alert-download-error-detail" = "Fel uppstod under nedladdning eller installation."; + +/* Title for a "download failed" alert */ +"alert-download-error-title" = "Fel vid hämtning"; + +/* Title for a general alert about errors */ +"alert-error-title" = "Fel"; + +/* A descriptive message used when no internet connection is detected */ +"alert-no-connection-detail" = "Kunde inte nå Keyman-servern. Försök igen senare."; + +/* Title for a "no connection" alert */ +"alert-no-connection-title" = "Anslutningsfel"; + +/* Short text for a 'back' navigational command. Used to return to the previous screen */ +"command-back" = "Tillbaka"; + +/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */ +"command-cancel" = "Avbryt"; + +/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */ +"command-done" = "Klar"; + +/* Short text for an 'install' command. Used to confirm installation of a package. */ +"command-install" = "Installera"; + +/* Short text for a 'next' navigational command. Used to advance to the next screen */ +"command-next" = "Nästa"; + +/* Short text for an 'OK' command. Used for some error alerts */ +"command-ok" = "Ok"; + +/* Short text for confirmining 'uninstall' commands. */ +"command-uninstall" = "Avinstallera"; + +/* Text for the command to uninstall a keyboard */ +"command-uninstall-keyboard" = "Avinstallera tangentbordet"; + +/* Confirmation text to display before uninstalling a keyboard */ +"command-uninstall-keyboard-confirm" = "Vill du avinstallera det här tangentbordet?"; + +/* Text for the command to uninstall a lexical model */ +"command-uninstall-lexical-model" = "Avinstallera ordbok"; + +/* Confirmation text to display before uninstalling a lexical model */ +"command-uninstall-lexical-model-confirm" = "Vill du avinstallera det här lexikonet?"; + +/* Text for error when a keyboard cannot load properly */ +"error-loading-keyboard" = "Det gick inte att ladda det begärda tangentbordet"; + +/* Text for error when a lexical model cannot load properly */ +"error-loading-lexical-model" = "Det går inte att ladda den begärda ordboken"; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file" = "Det gick inte att hitta en obligatorisk fil."; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file-critical" = "Det gick inte att hitta en kritisk fil. Försök att installera om appen."; + +/* Text for errors in data received from search queries */ +"error-query-decoding" = "Servern upplever för närvarande tekniska svårigheter"; + +/* A descriptive message used when a download fails */ +"error-query-general" = "Fel vid kommunikation med servern"; + +/* Text for error when a search query is unexpectedly empty */ +"error-query-no-data" = "Servern kunde inte svara"; + +/* Text for general errors where not much information is known */ +"error-unknown" = "Ett oväntat fel har inträffat"; + +/* Text for error when updating a resource: cannot download because no source is available */ +"error-update-no-link" = "Ingen källa för uppdateringar är tillgänglig för detta paket"; + +/* Text for error when updating a resource: Keyman does not know how to update the resource */ +"error-update-not-managed" = "Kan inte uppdatera resursen som inte hanteras av Keyman-motorn"; + +/* Text for the command to open the help page of a keyboard, as shown on resource information views */ +"info-command-help-keyboard" = "Tangentbord hjälp"; + +/* Text for the command to open the help page of a lexical model, as shown on resource information views */ +"info-command-help-lexical-model" = "Hjälp med ordbok"; + +/* Text label for displaying a keyboard's version, as shown on resource information views */ +"info-label-version-keyboard" = "Tangentbord version"; + +/* Text label for displaying a lexical model's version, as shown on resource information views */ +"info-label-version-lexical-model" = "Ordbok version"; + +/* Label used for the "package info" / readme tab with the package installation prompt on phones. */ +"installer-label-package-info" = "Paketinformation"; + +/* Label used for the language-selection tab with the package installation prompt on phones. */ +"installer-label-select-languages" = "Välj språk"; + +/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */ +"installer-label-version" = "Version: %@"; + +/* Section header for languages supported by a package, as seen within the package installation prompt */ +"installer-section-available-languages" = "Tillgängliga språk"; + +/* Text for the help popup for changing keyboards with the globe key */ +"keyboard-help-change" = "Tryck här för att ändra tangentbordet"; + +/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */ +"keyboard-menu-exit" = "Stäng %@"; + +/* Error installing a Keyman package - could not allocate a location to install it */ +"kmp-error-file-system" = "Fel vid installation av paket - fel i filsystemet"; + +/* Error installing a Keyman package - could not copy package files */ +"kmp-error-file-copying" = "Fel vid installation av paket - kunde inte kopiera obligatoriska filer"; + +/* Error opening a Keyman package - package is not valid */ +"kmp-error-invalid" = "Paketets fil är skadad."; + +/* Error opening a Keyman package - it does not exist / the specified location is wrong */ +"kmp-error-missing" = "Det angivna paketet finns inte."; + +/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */ +"kmp-error-missing-resource" = "Detta paket innehåller inte det begärda tangentbordet eller ordboken."; + +/* Error installing a Keyman package with a version of Keyman that does not support it */ +"kmp-error-unsupported-keyman-version" = "This package requires a newer version of Keyman."; + +/* Error opening a Keyman package - cannot parse contents */ +"kmp-error-no-metadata" = "Paketet byggdes inte ordentligt - innehållet är okänt."; + +/* Error opening a Keyman package - package's contents are for desktop platforms only */ +"kmp-error-unsupported" = "Det här paketet innehåller inte stöd för din enhet."; + +/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */ +"kmp-error-wrong-type" = "Detta paket innehåller inte den förväntade resurstypen."; + +/* Title for the Installed Languages menu */ +"menu-installed-languages-title" = "Installerade språk"; + +/* Section header for lexical models within a language-specific settings menu */ +"menu-langsettings-label-lexical-models" = "Ordböcker"; + +/* Section header for keyboards within a language-specific settings menu */ +"menu-langsettings-section-keyboards" = "Tangentbord"; + +/* Section header for the settings toggles within a language-specific settings menu */ +"menu-langsettings-section-settings" = "Inställningar för språk"; + +/* Title for the language-specific settings menus */ +"menu-langsettings-title" = "%@ Inställningar"; + +/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-correct" = "Aktivera korrigeringar"; + +/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-predict" = "Aktivera förutsägelser"; + +/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-message" = "Vill du installera denna ordbok?"; + +/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-title" = "%1$@: %2$@"; + +/* Text for an info alert indicating that no lexical models are available */ +"menu-lexical-model-none-message" = "Inga ordböcker tillgängliga"; + +/* Title for the lexical model menu, a submenu of the language-specific settings menus */ +"menu-lexical-model-title" = "%@ ordböcker"; + +/* Title for the keyboard picker */ +"menu-picker-title" = "Tangentbord"; + +/* Primary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report" = "Tillåt felrapportering"; + +/* Secondary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report-description" = "Kan kräva \"full åtkomst\""; + +/* Primary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file" = "Installera från fil"; + +/* Secondary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file-description" = "Bläddra efter .kmp-filer"; + +/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */ +"menu-settings-system-keyboard-menu" = "Systeminställningar för tangentbord"; + +/* Label for the "Show Banner" toggle on the main settings screen */ +"menu-settings-show-banner" = "Visa banner"; + +/* Label for the "Get Started" automatic display toggle seen in the Settings menu */ +"menu-settings-startup-get-started" = "Visa 'Kom igång' vid start"; + +/* Title for the main Settings menu */ +"menu-settings-title" = "Keyman inställningar"; + +/* Secondary text showing current setting for spacebar caption - blank */ +"menu-settings-spacebar-hint-blank" = "Visa inte bildtext på mellanslagstangenten"; + +/* Secondary text showing current setting for spacebar caption - keyboard */ +"menu-settings-spacebar-hint-keyboard" = "Visa tangentbordsnamn på mellanslag"; + +/* Secondary text showing current setting for spacebar caption - language */ +"menu-settings-spacebar-hint-language" = "Visa språknamn på mellanslag"; + +/* Secondary text showing current setting for spacebar caption - language + keyboard */ +"menu-settings-spacebar-hint-languageKeyboard" = "Visa språk och tangentbordsnamn på mellanslag"; + +/* Label for the "Spacebar Caption" item on the main settings screen */ +"menu-settings-spacebar-text" = "Bildtext för mellanslag"; + +/* Title for the "Spacebar Caption" settings screen */ +"menu-settings-spacebar-title" = "Bildtext för mellanslag"; + +/* Text showing name of spacebar caption - blank */ +"menu-settings-spacebar-item-blank" = "Tom"; + +/* Text showing name of spacebar caption - keyboard */ +"menu-settings-spacebar-item-keyboard" = "Keyboard"; + +/* Text showing name of spacebar caption - language */ +"menu-settings-spacebar-item-language" = "Språk"; + +/* Text showing name of spacebar caption - language + keyboard */ +"menu-settings-spacebar-item-languageKeyboard" = "Språk och tangentbord"; + +/* Short text for notification: download failure for keyboard */ +"notification-download-failure-keyboard" = "Tangentbords nedladdning misslyckades"; + +/* Short text for notification: download failure for lexical model */ +"notification-download-failure-lexical-model" = "Nedladdning av ordbok misslyckades"; + +/* Short text for notification: download success for keyboard */ +"notification-download-success-keyboard" = "Tangentbordet har laddats ner"; + +/* Short text for notification: download success for lexical model */ +"notification-download-success-lexical-model" = "Lexikal modell har laddats ner"; + +/* Short text for notification: downloading a keyboard */ +"notification-downloading-keyboard" = "Laddar ner tangentbord\U2026"; + +/* Short text for notification: downloading a lexical model */ +"notification-downloading-lexical-model" = "Laddar ner ordbok\U2026"; + +/* Short text for notification: an update is available */ +"notification-update-available" = "Uppdatering tillgänglig"; + +/* Short text for notification: currently updating */ +"notification-update-processing" = "Uppdaterar\U2026"; + +/* Text indicating success at installing new keyboards or dictionaries */ +"success-install" = "Installationen lyckades."; + +/* A title to use in alerts indicating 'success' at whatever task the user requested */ +"success-title" = "Klart"; diff --git a/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.stringsdict b/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.stringsdict new file mode 100644 index 0000000000..1e7a6785f2 --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/sv.lproj/Localizable.stringsdict @@ -0,0 +1,118 @@ + + + + + menu-langsettings-lexical-model-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u ordbok installerad + other + %u ordböcker installerade + + + notification-update-failed + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u uppdatering misslyckades + other + %u uppdateringar misslyckades + + + notification-update-success + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u uppdatering slutförd + other + %u uppdateringar lyckade + + + settings-keyboards-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u tangentbord installerat + other + %u tangentbord installerade + + + settings-languages-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u språk installerat + other + %u språk installerade + + + package-default-found-keyboards + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Hittade %u tangentbord i paketet: + other + Hittade %u tangentbord i paketet: + + + package-default-found-lexical-models + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Hittade %u ordbok i paketet: + other + Hittade %u ordböcker i paketet: + + + + diff --git a/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.strings b/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..4d9ff33cb5 --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.strings @@ -0,0 +1,257 @@ +/* A descriptive message used for errors when the app is already busy downloading */ +"alert-download-error-busy" = "Вже зайнято завантаженням."; + +/* A descriptive message used when a download fails */ +"alert-download-error-detail" = "Сталася помилка під час завантаження або інсталяції."; + +/* Title for a "download failed" alert */ +"alert-download-error-title" = "Помилка завантаження"; + +/* Title for a general alert about errors */ +"alert-error-title" = "Помилка"; + +/* A descriptive message used when no internet connection is detected */ +"alert-no-connection-detail" = "Не вдалося зв’язатися з сервером Keyman. Будь ласка, спробуйте ще раз пізніше."; + +/* Title for a "no connection" alert */ +"alert-no-connection-title" = "Помилка підключення"; + +/* Short text for a 'back' navigational command. Used to return to the previous screen */ +"command-back" = "Відмінити"; + +/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */ +"command-cancel" = "Скасувати"; + +/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */ +"command-done" = "Виконано"; + +/* Short text for an 'install' command. Used to confirm installation of a package. */ +"command-install" = "Інсталювати"; + +/* Short text for a 'next' navigational command. Used to advance to the next screen */ +"command-next" = "Уперед"; + +/* Short text for an 'OK' command. Used for some error alerts */ +"command-ok" = "Гаразд"; + +/* Short text for confirmining 'uninstall' commands. */ +"command-uninstall" = "Видалити"; + +/* Text for the command to uninstall a keyboard */ +"command-uninstall-keyboard" = "Видалити клавіатуру"; + +/* Confirmation text to display before uninstalling a keyboard */ +"command-uninstall-keyboard-confirm" = "Видалити цю клавіатуру?"; + +/* Text for the command to uninstall a lexical model */ +"command-uninstall-lexical-model" = "Видалити словник"; + +/* Confirmation text to display before uninstalling a lexical model */ +"command-uninstall-lexical-model-confirm" = "Ви хотіли б видалити цей словник?"; + +/* Text for error when a keyboard cannot load properly */ +"error-loading-keyboard" = "Не вдається завантажити запитану клавіатуру"; + +/* Text for error when a lexical model cannot load properly */ +"error-loading-lexical-model" = "Не вдалося завантажити запитаний словник"; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file" = "Необхідний файл не знайдено."; + +/* Text for error when an installed file is unexpectedly missing */ +"error-missing-file-critical" = "Критичний файл не знайдено. Будь ласка, спробуйте перевстановити додаток."; + +/* Text for errors in data received from search queries */ +"error-query-decoding" = "В даний час сервер має технічні труднощі"; + +/* A descriptive message used when a download fails */ +"error-query-general" = "Помилка зв'язку з сервером"; + +/* Text for error when a search query is unexpectedly empty */ +"error-query-no-data" = "Сервер не зміг відповісти"; + +/* Text for general errors where not much information is known */ +"error-unknown" = "Сталась непередбачена помилка"; + +/* Text for error when updating a resource: cannot download because no source is available */ +"error-update-no-link" = "Джерело оновлень для цього пакету не доступне"; + +/* Text for error when updating a resource: Keyman does not know how to update the resource */ +"error-update-not-managed" = "Неможливо оновити ресурс яким керує рушій Keyman"; + +/* Text for the command to open the help page of a keyboard, as shown on resource information views */ +"info-command-help-keyboard" = "Допомога з клавіатурою"; + +/* Text for the command to open the help page of a lexical model, as shown on resource information views */ +"info-command-help-lexical-model" = "Допомога по словнику"; + +/* Text label for displaying a keyboard's version, as shown on resource information views */ +"info-label-version-keyboard" = "Версія клавіатури"; + +/* Text label for displaying a lexical model's version, as shown on resource information views */ +"info-label-version-lexical-model" = "Версія словника"; + +/* Label used for the "package info" / readme tab with the package installation prompt on phones. */ +"installer-label-package-info" = "Відомості про пакунок"; + +/* Label used for the language-selection tab with the package installation prompt on phones. */ +"installer-label-select-languages" = "Вибрати мову"; + +/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */ +"installer-label-version" = "Версія: %@"; + +/* Section header for languages supported by a package, as seen within the package installation prompt */ +"installer-section-available-languages" = "Доступні мови"; + +/* Text for the help popup for changing keyboards with the globe key */ +"keyboard-help-change" = "Натисніть тут для зміни клавіатури"; + +/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */ +"keyboard-menu-exit" = "Закрити %@"; + +/* Error installing a Keyman package - could not allocate a location to install it */ +"kmp-error-file-system" = "Помилка встановлення пакунку - помилка файлової системи"; + +/* Error installing a Keyman package - could not copy package files */ +"kmp-error-file-copying" = "Помилка встановлення пакунку - не вдалося скопіювати необхідні файли"; + +/* Error opening a Keyman package - package is not valid */ +"kmp-error-invalid" = "Файл пакунку пошкоджено."; + +/* Error opening a Keyman package - it does not exist / the specified location is wrong */ +"kmp-error-missing" = "Вказаний пакунок не існує."; + +/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */ +"kmp-error-missing-resource" = "Цей пакет не містить запитаної клавіатури чи словника."; + +/* Error installing a Keyman package with a version of Keyman that does not support it */ +"kmp-error-unsupported-keyman-version" = "This package requires a newer version of Keyman."; + +/* Error opening a Keyman package - cannot parse contents */ +"kmp-error-no-metadata" = "Цей пакет був не коректно побудований - вміст невідомо."; + +/* Error opening a Keyman package - package's contents are for desktop platforms only */ +"kmp-error-unsupported" = "Цей пакунок не має підтримки для вашого пристрою."; + +/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */ +"kmp-error-wrong-type" = "Цей пакунок не містить очікуваний тип ресурсів."; + +/* Title for the Installed Languages menu */ +"menu-installed-languages-title" = "Встановлені мови"; + +/* Section header for lexical models within a language-specific settings menu */ +"menu-langsettings-label-lexical-models" = "Словники"; + +/* Section header for keyboards within a language-specific settings menu */ +"menu-langsettings-section-keyboards" = "Клавіатури"; + +/* Section header for the settings toggles within a language-specific settings menu */ +"menu-langsettings-section-settings" = "Мовні параметри"; + +/* Title for the language-specific settings menus */ +"menu-langsettings-title" = "%@ Параметри"; + +/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-correct" = "Увімкнути виправлення"; + +/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */ +"menu-langsettings-toggle-predict" = "Увімкнути передбачення"; + +/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-message" = "Ви б хотіли встановити цей словник?"; + +/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */ +"menu-lexical-model-install-title" = "%1$@: %2$@"; + +/* Text for an info alert indicating that no lexical models are available */ +"menu-lexical-model-none-message" = "Немає словників"; + +/* Title for the lexical model menu, a submenu of the language-specific settings menus */ +"menu-lexical-model-title" = "%@ словники"; + +/* Title for the keyboard picker */ +"menu-picker-title" = "Клавіатури"; + +/* Primary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report" = "Дозволити звіт про помилки"; + +/* Secondary text for the Settings menu option to report keyboard crashes */ +"menu-settings-error-report-description" = "Може зажадати \"повний доступ\""; + +/* Primary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file" = "Встановити з файлу"; + +/* Secondary text for the Settings menu local-file package installation option */ +"menu-settings-install-from-file-description" = "Шукати файли .kmp"; + +/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */ +"menu-settings-system-keyboard-menu" = "Системні налаштування клавіатури"; + +/* Label for the "Show Banner" toggle on the main settings screen */ +"menu-settings-show-banner" = "Показувати банер"; + +/* Label for the "Get Started" automatic display toggle seen in the Settings menu */ +"menu-settings-startup-get-started" = "Показувати \"Розпочати\" під час запуску"; + +/* Title for the main Settings menu */ +"menu-settings-title" = "Налаштування Keyman"; + +/* Secondary text showing current setting for spacebar caption - blank */ +"menu-settings-spacebar-hint-blank" = "Не показувати підпис на пробілі"; + +/* Secondary text showing current setting for spacebar caption - keyboard */ +"menu-settings-spacebar-hint-keyboard" = "Показувати назву клавіатури на пробілі"; + +/* Secondary text showing current setting for spacebar caption - language */ +"menu-settings-spacebar-hint-language" = "Показувати назву мови на пробілі"; + +/* Secondary text showing current setting for spacebar caption - language + keyboard */ +"menu-settings-spacebar-hint-languageKeyboard" = "Показати мову і назву клавіатури на пробілі"; + +/* Label for the "Spacebar Caption" item on the main settings screen */ +"menu-settings-spacebar-text" = "Заголовок до пробілу"; + +/* Title for the "Spacebar Caption" settings screen */ +"menu-settings-spacebar-title" = "Заголовок до пробілу"; + +/* Text showing name of spacebar caption - blank */ +"menu-settings-spacebar-item-blank" = "Пустий"; + +/* Text showing name of spacebar caption - keyboard */ +"menu-settings-spacebar-item-keyboard" = "Keyboard"; + +/* Text showing name of spacebar caption - language */ +"menu-settings-spacebar-item-language" = "Мова:"; + +/* Text showing name of spacebar caption - language + keyboard */ +"menu-settings-spacebar-item-languageKeyboard" = "Мови та клавіатура"; + +/* Short text for notification: download failure for keyboard */ +"notification-download-failure-keyboard" = "Помилка завантаження клавіатури"; + +/* Short text for notification: download failure for lexical model */ +"notification-download-failure-lexical-model" = "Помилка завантаження словника"; + +/* Short text for notification: download success for keyboard */ +"notification-download-success-keyboard" = "Клавіатура успішно завантажена"; + +/* Short text for notification: download success for lexical model */ +"notification-download-success-lexical-model" = "Лексична модель успішно завантажена"; + +/* Short text for notification: downloading a keyboard */ +"notification-downloading-keyboard" = "Завантаження клавіатури\U2026"; + +/* Short text for notification: downloading a lexical model */ +"notification-downloading-lexical-model" = "Завантаження словника\U2026"; + +/* Short text for notification: an update is available */ +"notification-update-available" = "Доступне оновлення"; + +/* Short text for notification: currently updating */ +"notification-update-processing" = "Оновлення\U2026"; + +/* Text indicating success at installing new keyboards or dictionaries */ +"success-install" = "Успішно встановлено."; + +/* A title to use in alerts indicating 'success' at whatever task the user requested */ +"success-title" = "Успіх"; diff --git a/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.stringsdict b/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.stringsdict new file mode 100644 index 0000000000..27ce4f3c75 --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/uk.lproj/Localizable.stringsdict @@ -0,0 +1,146 @@ + + + + + menu-langsettings-lexical-model-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u словник встановлено + few + %u словників встановлено + many + %u словників встановлено + other + %u словників встановлено + + + notification-update-failed + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u оновлення не вдалося + few + %u оновлення не вдалося + many + %u оновлення не вдалося + other + %u оновлення не вдалося + + + notification-update-success + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u оновлено успішно + few + %u оновлення успішно + many + %u оновлення успішно + other + %u оновлення успішно + + + settings-keyboards-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u встановлено клавіатуру + few + %u установлено клавіатури + many + %u установлено клавіатури + other + %u установлено клавіатури + + + settings-languages-installed-count + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + %u мова встановлена + few + %u мов встановлено + many + %u мов встановлено + other + %u мов встановлено + + + package-default-found-keyboards + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Знайдено %u клавіатуру в пакеті: + few + Знайдено %u клавіатур у пакеті: + many + Знайдено %u клавіатур у пакеті: + other + Знайдено %u клавіатур у пакеті: + + + package-default-found-lexical-models + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + u + one + Знайдено %u словник в пакеті: + few + Знайдено %u словників у пакеті: + many + Знайдено %u словників у пакеті: + other + Знайдено %u словників у пакеті: + + + + diff --git a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj index 9895576b1b..012d3ba08f 100644 --- a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj +++ b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj @@ -205,8 +205,11 @@ 16A9229D20325253003CC98E /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Keyman/Info.plist; sourceTree = SOURCE_ROOT; }; 293EA3E027059C6900545EED /* ha */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ha; path = ha.lproj/Localizable.strings; sourceTree = ""; }; 294914742738DF7700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/Localizable.strings"; sourceTree = ""; }; - 297810FD297FA818007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = ""; }; 298566B829802828004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + 297810FD297FA818007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = ""; }; + 298566C42980C493004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 298566D02980D354004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 298566DC2980E416004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 29B27FEE29062BBC0036917E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; 29BFA75D282931F8009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; 29BFA769282946EC009FCCC3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; @@ -796,8 +799,11 @@ it, pl, nl, - kn, cs, + kn, + sv, + uk, + ru, ); mainGroup = 98ABADA7176935E400B62590; productRefGroup = 98ABADB1176935E400B62590 /* Products */; @@ -1105,8 +1111,11 @@ 29BFA75D282931F8009FCCC3 /* it */, 29BFA769282946EC009FCCC3 /* pl */, 29B27FEE29062BBC0036917E /* nl */, - 297810FD297FA818007C886D /* kn */, 298566B829802828004ACA95 /* cs */, + 297810FD297FA818007C886D /* kn */, + 298566C42980C493004ACA95 /* sv */, + 298566D02980D354004ACA95 /* uk */, + 298566DC2980E416004ACA95 /* ru */, ); name = Localizable.strings; sourceTree = ""; diff --git a/ios/keyman/Keyman/Keyman/ru.lproj/Localizable.strings b/ios/keyman/Keyman/Keyman/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..a95a279c20 --- /dev/null +++ b/ios/keyman/Keyman/Keyman/ru.lproj/Localizable.strings @@ -0,0 +1,81 @@ +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-add-title" = "Добавить закладку"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-none" = "Нет закладок"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-title" = "Закладки"; + +/* Used to confirm a user's desire to install a package */ +"confirm-install" = "Установить"; + +/* The label for the toggle to stop automatically showing the "Get Started" tutorial popup. */ +"disable-get-started" = "Больше не показывать"; + +/* Indicates an error opening a web page requested by a user */ +"error-opening-page" = "Невозможно открыть страницу"; + +/* Long-form used when installing a font in order to display a language properly. */ +"font-install-description" = "Нажмите «Установить», чтобы %@ отображался правильно во всех ваших приложениях"; + +/* The name of the iOS Settings menu option for keyboards */ +"ios-settings-keyboards" = "Клавиатуры"; + +/* The name of the iOS Settings menu option for giving the keyboard full access. (The menu entry +underneath the app's name within the app-specific keyboard menu.) */ +"ios-settings-allow-full-access" = "Разрешить полный доступ"; + +/* Short-form used when installing a font in order to display a language properly. */ +"language-for-font" = "%@ Font"; + +/* Used for 'add' options within menus */ +"menu-add" = "Добавить"; + +/* Used to indicate a sequence of menu options that a user needs to copy. May be chained. Example: "Keyboards (1) > Enable Keyman (2)" */ +"menu-breadcrumbing" = "%1$@ > %2$@"; + +/* Used to exit a menu without choosing an option */ +"menu-cancel" = "Отменить"; + +/* Menu option that erases all previously-typed text. */ +"menu-clear-text" = "Очистить текст"; + +/* Menu option that displays a list designed to help users start using the app */ +"menu-get-started" = "Начать работу"; + +/* Menu option that displays help for the app */ +"menu-help" = "Инф."; + +/* Menu option that displays the main screen's drop-down menu */ +"menu-more" = "Больше"; + +/* Menu option used to edit keyboard and dictionary settings */ +"menu-settings" = "Настройки"; + +/* Menu option that displays the iOS Share menu */ +"menu-share" = "Поделиться"; + +/* Menu option that displays an embedded web browser. */ +"menu-show-browser" = "Браузер"; + +/* Menu option used to control in-app font size. */ +"menu-text-size" = "Размер текста"; + +/* Used to describe the current font size */ +"text-size-label" = "Размер текста: %i"; + +/* Text to indicate that a user should set a toggle within iOS Settings to 'active'. */ +"toggle-to-enable" = "Включить %@"; + +/* First option on the Get Started tutorial - Add a keyboard for your language */ +"tutorial-add-keyboard" = "Добавить клавиатуру для вашего языка"; + +/* Third option on the Get Started tutorial - Displays app help. */ +"tutorial-show-help" = "Подробнее"; + +/* Second option on the Get Started tutorial - Set up Keyman as system-wide keyboard */ +"tutorial-system-keyboard" = "Настроить клавиатуру как системную клавиатуру"; + +/* Used to display app version (as in \"Version: 1.0.2\" */ +"version-label" = "Версия: %@"; diff --git a/ios/keyman/Keyman/Keyman/sv.lproj/Localizable.strings b/ios/keyman/Keyman/Keyman/sv.lproj/Localizable.strings new file mode 100644 index 0000000000..c2e7509aa6 --- /dev/null +++ b/ios/keyman/Keyman/Keyman/sv.lproj/Localizable.strings @@ -0,0 +1,81 @@ +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-add-title" = "Lägg till bokmärke"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-none" = "Inga bokmärken"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-title" = "Bokmärken"; + +/* Used to confirm a user's desire to install a package */ +"confirm-install" = "Installera"; + +/* The label for the toggle to stop automatically showing the "Get Started" tutorial popup. */ +"disable-get-started" = "Visa inte igen"; + +/* Indicates an error opening a web page requested by a user */ +"error-opening-page" = "Kan inte öppna sidan"; + +/* Long-form used when installing a font in order to display a language properly. */ +"font-install-description" = "Tryck på Installera för att få %@ att visas korrekt i alla appar"; + +/* The name of the iOS Settings menu option for keyboards */ +"ios-settings-keyboards" = "Tangentbord"; + +/* The name of the iOS Settings menu option for giving the keyboard full access. (The menu entry +underneath the app's name within the app-specific keyboard menu.) */ +"ios-settings-allow-full-access" = "Tillåt full åtkomst"; + +/* Short-form used when installing a font in order to display a language properly. */ +"language-for-font" = "%@ Font"; + +/* Used for 'add' options within menus */ +"menu-add" = "Lägg till"; + +/* Used to indicate a sequence of menu options that a user needs to copy. May be chained. Example: "Keyboards (1) > Enable Keyman (2)" */ +"menu-breadcrumbing" = "%1$@ > %2$@"; + +/* Used to exit a menu without choosing an option */ +"menu-cancel" = "Avbryt"; + +/* Menu option that erases all previously-typed text. */ +"menu-clear-text" = "Rensa text"; + +/* Menu option that displays a list designed to help users start using the app */ +"menu-get-started" = "Kom igång"; + +/* Menu option that displays help for the app */ +"menu-help" = "Information"; + +/* Menu option that displays the main screen's drop-down menu */ +"menu-more" = "Mer"; + +/* Menu option used to edit keyboard and dictionary settings */ +"menu-settings" = "Inställningar"; + +/* Menu option that displays the iOS Share menu */ +"menu-share" = "Dela"; + +/* Menu option that displays an embedded web browser. */ +"menu-show-browser" = "Webbläsare"; + +/* Menu option used to control in-app font size. */ +"menu-text-size" = "Textstorlek"; + +/* Used to describe the current font size */ +"text-size-label" = "Textstorlek: %i"; + +/* Text to indicate that a user should set a toggle within iOS Settings to 'active'. */ +"toggle-to-enable" = "Aktivera %@"; + +/* First option on the Get Started tutorial - Add a keyboard for your language */ +"tutorial-add-keyboard" = "Lägg till ett tangentbord för ditt språk"; + +/* Third option on the Get Started tutorial - Displays app help. */ +"tutorial-show-help" = "Mer information"; + +/* Second option on the Get Started tutorial - Set up Keyman as system-wide keyboard */ +"tutorial-system-keyboard" = "Ställ in Keyman som tangentbord i hela systemet"; + +/* Used to display app version (as in \"Version: 1.0.2\" */ +"version-label" = "Version: %@"; diff --git a/ios/keyman/Keyman/Keyman/uk.lproj/Localizable.strings b/ios/keyman/Keyman/Keyman/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..856fd1f08a --- /dev/null +++ b/ios/keyman/Keyman/Keyman/uk.lproj/Localizable.strings @@ -0,0 +1,81 @@ +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-add-title" = "Додати закладку"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-none" = "Немає закладок"; + +/* Title for the bookmarks menu within the embedded browser */ +"browser-bookmarks-title" = "Закладки"; + +/* Used to confirm a user's desire to install a package */ +"confirm-install" = "Інсталювати"; + +/* The label for the toggle to stop automatically showing the "Get Started" tutorial popup. */ +"disable-get-started" = "Не показувати знову"; + +/* Indicates an error opening a web page requested by a user */ +"error-opening-page" = "Не вдається відкрити сторінку"; + +/* Long-form used when installing a font in order to display a language properly. */ +"font-install-description" = "Додаток Встановити, щоб зробити %@ доступним у всіх ваших програмах"; + +/* The name of the iOS Settings menu option for keyboards */ +"ios-settings-keyboards" = "Клавіатури"; + +/* The name of the iOS Settings menu option for giving the keyboard full access. (The menu entry +underneath the app's name within the app-specific keyboard menu.) */ +"ios-settings-allow-full-access" = "Дозволити повний доступ"; + +/* Short-form used when installing a font in order to display a language properly. */ +"language-for-font" = "%@ Font"; + +/* Used for 'add' options within menus */ +"menu-add" = "Додати"; + +/* Used to indicate a sequence of menu options that a user needs to copy. May be chained. Example: "Keyboards (1) > Enable Keyman (2)" */ +"menu-breadcrumbing" = "%1$@ > %2$@"; + +/* Used to exit a menu without choosing an option */ +"menu-cancel" = "Скасувати"; + +/* Menu option that erases all previously-typed text. */ +"menu-clear-text" = "Очистити текст"; + +/* Menu option that displays a list designed to help users start using the app */ +"menu-get-started" = "Початок роботи"; + +/* Menu option that displays help for the app */ +"menu-help" = "Інформація"; + +/* Menu option that displays the main screen's drop-down menu */ +"menu-more" = "Більше"; + +/* Menu option used to edit keyboard and dictionary settings */ +"menu-settings" = "Налаштування"; + +/* Menu option that displays the iOS Share menu */ +"menu-share" = "Поділитись"; + +/* Menu option that displays an embedded web browser. */ +"menu-show-browser" = "Браузер"; + +/* Menu option used to control in-app font size. */ +"menu-text-size" = "Розмір тексту"; + +/* Used to describe the current font size */ +"text-size-label" = "Розмір тексту: %i"; + +/* Text to indicate that a user should set a toggle within iOS Settings to 'active'. */ +"toggle-to-enable" = "Увімкнути %@"; + +/* First option on the Get Started tutorial - Add a keyboard for your language */ +"tutorial-add-keyboard" = "Додайте клавіатуру для вашої мови"; + +/* Third option on the Get Started tutorial - Displays app help. */ +"tutorial-show-help" = "Детальніше"; + +/* Second option on the Get Started tutorial - Set up Keyman as system-wide keyboard */ +"tutorial-system-keyboard" = "Встановити Keyman як цілочисельна клавіатура"; + +/* Used to display app version (as in \"Version: 1.0.2\" */ +"version-label" = "Версія: %@"; diff --git a/ios/kmbuild.sh b/ios/kmbuild.sh index 75aff1e1ab..401e2c483e 100755 --- a/ios/kmbuild.sh +++ b/ios/kmbuild.sh @@ -116,7 +116,7 @@ done # Extended path definitions KMEI_RESOURCES=engine/KMEI/KeymanEngine/resources BUNDLE_PATH=$KMEI_RESOURCES/Keyman.bundle/contents/resources -KMW_SOURCE=../web/source +KMW_ROOT=../web DEFAULT_KBD_ID="sil_euro_latin" DEFAULT_LM_ID="nrc.en.mtnt" @@ -137,7 +137,7 @@ if [ $CLEAN_ONLY = true ]; then fi echo -echo "KMW_SOURCE: $KMW_SOURCE" +echo "KMW_ROOT: $KMW_ROOT" echo "DO_KMW_BUILD: $DO_KMW_BUILD" echo "DO_KMP_DOWNLOADS: $DO_KMP_DOWNLOADS" echo "CONFIGURATION: $CONFIG" @@ -148,48 +148,46 @@ update_bundle ( ) { mkdir -p "$BUNDLE_PATH" fi - base_dir="$(pwd)" + local base_dir="$(pwd)" if [ $DO_KMW_BUILD = true ]; then - echo Building KeymanWeb from $KMW_SOURCE - - cd $KMW_SOURCE + echo Building KeymanWeb from $KMW_ROOT + KMW_PRODUCT=web/build/app/embed/ if [ "$CONFIG" == "Debug" ]; then - KMWFLAGS="-debug_embedded" + KMWFLAGS="configure:embed build:embed --debug" + KMW_PRODUCT="$KMW_PRODUCT/debug" else - KMWFLAGS="-embed" + KMWFLAGS="configure:embed build:embed" + KMW_PRODUCT="$KMW_PRODUCT/release" fi # Local development optimization - cross-target Sentry uploading when requested # by developer. As it's not CI, the Web artifacts won't exist otherwise... # unless the developer manually runs the correct build configuration accordingly. if [[ $VERSION_ENVIRONMENT == "local" ]] && [[ $UPLOAD_SENTRY == true ]]; then + # TODO: handle the -upload-sentry in its eventual new form KMWFLAGS="$KMWFLAGS -upload-sentry" fi - ./build.sh $KMWFLAGS + "$KEYMAN_ROOT/web/build.sh" $KMWFLAGS if [ $? -ne 0 ]; then fail "ERROR: KeymanWeb's build.sh failed." fi #Copy over the relevant resources! It's easiest to do if we navigate to the resulting folder. - cd ../release/embedded - cp resources/osk/kmwosk.css "$base_dir/$BUNDLE_PATH/kmwosk.css" - cp resources/osk/keymanweb-osk.ttf "$base_dir/$BUNDLE_PATH/keymanweb-osk.ttf" - cp keyman.js "$base_dir/$BUNDLE_PATH/keymanios.js" + cp "$KEYMAN_ROOT/$KMW_PRODUCT/osk/kmwosk.css" "$base_dir/$BUNDLE_PATH/kmwosk.css" + cp "$KEYMAN_ROOT/$KMW_PRODUCT/osk/keymanweb-osk.ttf" "$base_dir/$BUNDLE_PATH/keymanweb-osk.ttf" + cp "$KEYMAN_ROOT/$KMW_PRODUCT/keyman.js" "$base_dir/$BUNDLE_PATH/keymanios.js" if [ "$CONFIG" == "Debug" ]; then - cp keyman.js.map "$base_dir/$BUNDLE_PATH/keyman.js.map" + cp "$KEYMAN_ROOT/$KMW_PRODUCT/keyman.js.map" "$base_dir/$BUNDLE_PATH/keyman.js.map" elif [ -f "$base_dir/$BUNDLE_PATH/keyman.js.map" ]; then rm "$base_dir/$BUNDLE_PATH/keyman.js.map" fi - cd "$KEYMAN_ROOT/common/web/sentry-manager/build" + cp "$KEYMAN_ROOT/common/web/sentry-manager/build/index.js" "$base_dir/$BUNDLE_PATH/keyman-sentry.js" - cp index.js "$base_dir/$BUNDLE_PATH/keyman-sentry.js" - - cd "$base_dir" fi # Our default resources are part of the bundle, so let's check on them. diff --git a/linux/debian/control b/linux/debian/control index cd14e2fc40..c00fe70307 100644 --- a/linux/debian/control +++ b/linux/debian/control @@ -26,7 +26,7 @@ Build-Depends: python3-requests, python3-requests-cache, python3-setuptools, - meson (>= 0.45), + meson (>= 0.53), ninja-build, libgtk-3-dev, libibus-1.0-dev (>= 1.2), diff --git a/linux/debian/copyright b/linux/debian/copyright index 5c7c5e9189..292f45bd75 100644 --- a/linux/debian/copyright +++ b/linux/debian/copyright @@ -4,24 +4,24 @@ Upstream-Contact: Keyman team Source: https://github.com/keymanapp/keyman Files: * -Copyright: 2018-2022 SIL International +Copyright: 2018-2023 SIL International License: MIT Files: linux/ibus-keyman/* -Copyright: 2004-2022 SIL International +Copyright: 2004-2023 SIL International License: GPL-2+ Files: linux/ibus-keyman/src/keymanutil.c linux/ibus-keyman/src/keymanutil.h linux/ibus-keyman/src/kmpdetails.c linux/ibus-keyman/src/kmpdetails.h -Copyright: 2009-2022 SIL International +Copyright: 2009-2023 SIL International License: GPL-2+ or MIT Files: linux/ibus-keyman/src/keyman-service.c linux/ibus-keyman/src/keyman-service.h linux/keyman-config/buildtools/help2md -Copyright: 2018-2022 SIL International +Copyright: 2018-2023 SIL International License: GPL-3+ Files: linux/ibus-keyman/config.rpath @@ -49,7 +49,7 @@ Files: linux/ibus-keyman/Makefile.am linux/ibus-keyman/tests/Makefile.am linux/ibus-keyman/tests/Makefile.in Copyright: 1994-2017, Free Software Foundation, Inc. - 2009-2022, SIL International + 2009-2023, SIL International License: GPL-2+ Files: linux/ibus-keyman/m4/gettext.m4 @@ -87,7 +87,7 @@ Copyright: 2008-2010, Peng Huang 2008-2013, Peng Huang 2008-2021, Red Hat, Inc. 2015-2021, Takao Fujiwara - 2021-2022, SIL International + 2021-2023, SIL International License: LGPL-2.1+ Files: linux/keyman-config/buildtools/help2man @@ -97,7 +97,7 @@ License: GPL-3+ Files: debian/com.keyman.config.appdata.xml debian/com.keyman.ibus_keyman.metainfo.xml Copyright: 2019 Daniel Glassey - 2022 SIL International + 2022-2023 SIL International License: MIT License: MIT diff --git a/linux/debian/source/lintian-overrides b/linux/debian/source/lintian-overrides deleted file mode 100644 index 18c8d38d04..0000000000 --- a/linux/debian/source/lintian-overrides +++ /dev/null @@ -1,10 +0,0 @@ -# Lintian overrides -keyman source: very-long-line-length-in-source-file CONTRIBUTING.md * -keyman source: very-long-line-length-in-source-file linux/ibus-keyman/configure * -keyman source: very-long-line-length-in-source-file linux/ibus-keyman/m4/* * -keyman source: very-long-line-length-in-source-file linux/ibus-keyman/tests/Makefile.in * -keyman source: very-long-line-length-in-source-file resources/standards-data/langtags/langtags.json * - -# Looks like /usr/libexec/ibus-engine-keyman is not recognized as binary for the man page, -# so ignore that rule -spare-manual-page diff --git a/linux/keyman-config/locale/ru_RU.po b/linux/keyman-config/locale/ru_RU.po new file mode 100644 index 0000000000..594889818b --- /dev/null +++ b/linux/keyman-config/locale/ru_RU.po @@ -0,0 +1,332 @@ +msgid "" +msgstr "" +"Project-Id-Version: keyman\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-19 19:17+0200\n" +"PO-Revision-Date: 2023-01-24 03:09\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: keyman\n" +"X-Crowdin-Project-ID: 386703\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /master/linux/keyman-config.pot\n" +"X-Crowdin-File-ID: 504\n" + +#: keyman_config/__init__.py:68 +msgid "Neither sentry-sdk nor raven is available. Not enabling Sentry error reporting." +msgstr "Ни sentry-sdk ни raven не доступны. Не включает отправку отчетов об ошибке." + +#: keyman_config/downloadkeyboard.py:23 +msgid "Download Keyman keyboards" +msgstr "Скачать клавиатуры клавиатуры" + +#: keyman_config/downloadkeyboard.py:37 keyman_config/keyboard_details.py:49 +#: keyman_config/keyboard_details.py:340 keyman_config/view_installed.py:205 +msgid "_Close" +msgstr "_Закрыть" + +#: keyman_config/install_kmp.py:99 +msgid "You do not have permissions to install the keyboard files to the shared area /usr/local/share/keyman" +msgstr "У вас нет прав на установку файлов клавиатуры в общую область /usr/local/share/keyman" + +#: keyman_config/install_kmp.py:103 +msgid "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman" +msgstr "У вас нет прав на установку документации в общую область документации /usr/local/share/doc/keyman" + +#: keyman_config/install_kmp.py:107 +msgid "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts" +msgstr "У вас нет прав на установку файлов шрифтов в область общего шрифта /usr/local/share/fonts" + +#: keyman_config/install_kmp.py:179 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {package}" +msgstr "install_kmp.py: ошибка: в {package} не найдено kmp.json или kmp.inf" + +#: keyman_config/install_kmp.py:246 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {packageFile}" +msgstr "install_kmp.py: ошибка: в {packageFile} не найдено kmp.json или kmp.inf" + +#: keyman_config/install_window.py:54 +#, python-brace-format +msgid "Installing keyboard/package {keyboardid}" +msgstr "Установка клавиатуры/пакета {keyboardid}" + +#: keyman_config/install_window.py:72 keyman_config/install_window.py:93 +msgid "Keyboard is installed already" +msgstr "Клавиатура уже установлена" + +#: keyman_config/install_window.py:74 +#, python-brace-format +msgid "The {name} keyboard is already installed at version {version}. Do you want to uninstall then reinstall it?" +msgstr "Клавиатура {name} уже установлена в версии {version}. Вы хотите удалить, а затем переустановить ее?" + +#: keyman_config/install_window.py:95 +#, python-brace-format +msgid "The {name} keyboard is already installed with a newer version {installedversion}. Do you want to uninstall it and install the older version {version}?" +msgstr "Клавиатура {name} уже установлена в более новой версии {installedversion}. Вы хотите удалить её и установить старую версию {version}?" + +#: keyman_config/install_window.py:128 +msgid "Keyboard layouts: " +msgstr "Раскладка клавиатуры: " + +#: keyman_config/install_window.py:147 +msgid "Fonts: " +msgstr "Шрифты: " + +#: keyman_config/install_window.py:167 keyman_config/keyboard_details.py:96 +msgid "Package version: " +msgstr "Версия пакета: " + +#: keyman_config/install_window.py:179 +msgid "Author: " +msgstr "Автор: " + +#: keyman_config/install_window.py:197 +msgid "Website: " +msgstr "Веб-сайт: " + +#: keyman_config/install_window.py:211 +msgid "Copyright: " +msgstr "Авторские права: " + +#: keyman_config/install_window.py:245 +msgid "Details" +msgstr "Подробности" + +#: keyman_config/install_window.py:248 +msgid "README" +msgstr "ПОЛУЧИТЬ" + +#: keyman_config/install_window.py:256 keyman_config/view_installed.py:200 +msgid "_Install" +msgstr "_Установить" + +#: keyman_config/install_window.py:260 +msgid "_Cancel" +msgstr "_Отмена" + +#: keyman_config/install_window.py:305 +#, python-brace-format +msgid "Keyboard {name} installed" +msgstr "Установлена клавиатура {name}" + +#: keyman_config/install_window.py:310 keyman_config/install_window.py:315 +#, python-brace-format +msgid "Keyboard {name} could not be installed." +msgstr "Клавиатура {name} не может быть установлена." + +#: keyman_config/install_window.py:311 +msgid "Error Message:" +msgstr "Сообщение об ошибке:" + +#: keyman_config/install_window.py:316 +msgid "Warning Message:" +msgstr "Предупреждение:" + +#: keyman_config/keyboard_details.py:37 +#, python-brace-format +msgid "{name} keyboard" +msgstr "{name} keyboard" + +#: keyman_config/keyboard_details.py:53 +msgid "ERROR: Keyboard metadata is damaged.\n" +"Please \"Uninstall\" and then \"Install\" the keyboard." +msgstr "ОШИБКА: метаданные клавиатуры повреждены.\n" +"Пожалуйста, \"Удалить\" и затем \"Установить\" клавиатуру." + +#: keyman_config/keyboard_details.py:74 +msgid "Package name: " +msgstr "Название пакета: " + +#: keyman_config/keyboard_details.py:85 +msgid "Package id: " +msgstr "ID пакета: " + +#: keyman_config/keyboard_details.py:108 +msgid "Package description: " +msgstr "Описание пакета: " + +#: keyman_config/keyboard_details.py:121 +msgid "Package author: " +msgstr "Автор пакета: " + +#: keyman_config/keyboard_details.py:133 +msgid "Package copyright: " +msgstr "Пакет авторских прав: " + +#: keyman_config/keyboard_details.py:174 +msgid "Keyboard filename: " +msgstr "Имя файла клавиатуры: " + +#: keyman_config/keyboard_details.py:187 +msgid "Keyboard name: " +msgstr "Название клавиатуры: " + +#: keyman_config/keyboard_details.py:198 +msgid "Keyboard id: " +msgstr "Keyboard id: " + +#: keyman_config/keyboard_details.py:209 +msgid "Keyboard version: " +msgstr "Версия клавиатуры: " + +#: keyman_config/keyboard_details.py:221 +msgid "Keyboard author: " +msgstr "Автор клавиатуры: " + +#: keyman_config/keyboard_details.py:232 +msgid "Keyboard license: " +msgstr "Лицензия на клавиатуру: " + +#: keyman_config/keyboard_details.py:243 +msgid "Keyboard description: " +msgstr "Описание клавиатуры: " + +#: keyman_config/keyboard_details.py:334 +#, python-brace-format +msgid "Scan this code to load this keyboard\n" +"on another device or share online" +msgstr "Сканируйте этот код, чтобы загрузить эту клавиатуру\n" +"на другом устройстве или поделиться онлайн" + +#: keyman_config/options.py:24 +#, python-brace-format +msgid "{packageId} Settings" +msgstr "Настройки {packageId}" + +#: keyman_config/view_installed.py:30 +msgid "Keyman Configuration" +msgstr "Настройки Keyman" + +#: keyman_config/view_installed.py:60 +msgid "Choose a kmp file..." +msgstr "Выберите kmp файл..." + +#. i18n: file type in file selection dialog +#: keyman_config/view_installed.py:65 +msgid "KMP files" +msgstr "KMP файлы" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:141 +msgid "Icon" +msgstr "Иконка" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:145 +msgid "Name" +msgstr "Имя" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:148 +msgid "Version" +msgstr "Версия" + +#: keyman_config/view_installed.py:161 +msgid "_Uninstall" +msgstr "_Удалить" + +#: keyman_config/view_installed.py:162 keyman_config/view_installed.py:304 +msgid "Uninstall keyboard" +msgstr "Удалить клавиатуру" + +#: keyman_config/view_installed.py:167 +msgid "_About" +msgstr "_О программе" + +#: keyman_config/view_installed.py:168 keyman_config/view_installed.py:306 +msgid "About keyboard" +msgstr "О клавиатуре" + +#: keyman_config/view_installed.py:173 +msgid "_Help" +msgstr "_Справка" + +#: keyman_config/view_installed.py:174 keyman_config/view_installed.py:305 +msgid "Help for keyboard" +msgstr "Помощь по клавиатуре" + +#: keyman_config/view_installed.py:179 +msgid "_Options" +msgstr "_Параметры" + +#: keyman_config/view_installed.py:180 keyman_config/view_installed.py:307 +msgid "Settings for keyboard" +msgstr "Настройки клавиатуры" + +#: keyman_config/view_installed.py:190 +msgid "_Refresh" +msgstr "_Обновить" + +#: keyman_config/view_installed.py:191 +msgid "Refresh keyboard list" +msgstr "Обновить список клавиатуры" + +#: keyman_config/view_installed.py:195 +msgid "_Download" +msgstr "_Скачать" + +#: keyman_config/view_installed.py:196 +msgid "Download and install a keyboard from the Keyman website" +msgstr "Скачать и установить клавиатуру с сайта Keyman" + +#: keyman_config/view_installed.py:201 +msgid "Install a keyboard from a file" +msgstr "Установить клавиатуру из файла" + +#: keyman_config/view_installed.py:206 +msgid "Close window" +msgstr "Закрыть окно" + +#: keyman_config/view_installed.py:278 +#, python-brace-format +msgid "Uninstall keyboard {package}" +msgstr "Удалить клавиатуру {package}" + +#: keyman_config/view_installed.py:280 +#, python-brace-format +msgid "Help for keyboard {package}" +msgstr "Справка по клавиатуре {package}" + +#: keyman_config/view_installed.py:282 +#, python-brace-format +msgid "About keyboard {package}" +msgstr "О клавиатуре {package}" + +#: keyman_config/view_installed.py:284 +#, python-brace-format +msgid "Settings for keyboard {package}" +msgstr "Настройки клавиатуры {package}" + +#: keyman_config/view_installed.py:349 +msgid "Uninstall keyboard package?" +msgstr "Удалить пакет клавиатуры?" + +#: keyman_config/view_installed.py:351 +#, python-brace-format +msgid "Are you sure that you want to uninstall the {keyboard} keyboard and its fonts?" +msgstr "Вы уверены, что хотите удалить {keyboard} клавиатуру и его шрифты?" + +#: keyman_config/welcome.py:22 +#, python-brace-format +msgid "{name} installed" +msgstr "{name} установлено" + +#: keyman_config/welcome.py:40 +msgid "Open in _Web browser" +msgstr "Открыть в _веб-браузере" + +#: keyman_config/welcome.py:42 +msgid "Open in the default web browser to do things like printing" +msgstr "Открыть в веб-браузере по умолчанию для печати" + +#: keyman_config/welcome.py:45 +msgid "_OK" +msgstr "_OK" + diff --git a/linux/keyman-config/locale/sv_SE.po b/linux/keyman-config/locale/sv_SE.po new file mode 100644 index 0000000000..f288b17d6e --- /dev/null +++ b/linux/keyman-config/locale/sv_SE.po @@ -0,0 +1,332 @@ +msgid "" +msgstr "" +"Project-Id-Version: keyman\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-19 19:17+0200\n" +"PO-Revision-Date: 2023-01-24 02:30\n" +"Last-Translator: \n" +"Language-Team: Swedish\n" +"Language: sv_SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: keyman\n" +"X-Crowdin-Project-ID: 386703\n" +"X-Crowdin-Language: sv-SE\n" +"X-Crowdin-File: /master/linux/keyman-config.pot\n" +"X-Crowdin-File-ID: 504\n" + +#: keyman_config/__init__.py:68 +msgid "Neither sentry-sdk nor raven is available. Not enabling Sentry error reporting." +msgstr "Varken sentry-sdk eller raven är tillgänglig. Aktiverar inte Sentry felrapportering." + +#: keyman_config/downloadkeyboard.py:23 +msgid "Download Keyman keyboards" +msgstr "Ladda ner Keyman-tangentbord" + +#: keyman_config/downloadkeyboard.py:37 keyman_config/keyboard_details.py:49 +#: keyman_config/keyboard_details.py:340 keyman_config/view_installed.py:205 +msgid "_Close" +msgstr "_Stäng" + +#: keyman_config/install_kmp.py:99 +msgid "You do not have permissions to install the keyboard files to the shared area /usr/local/share/keyman" +msgstr "Du har inte behörighet att installera tangentbordsfilerna till det delade området /usr/local/share/keyman" + +#: keyman_config/install_kmp.py:103 +msgid "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman" +msgstr "Du har inte behörighet att installera dokumentationen till det delade dokumentationsområdet /usr/local/share/doc/keyman" + +#: keyman_config/install_kmp.py:107 +msgid "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts" +msgstr "Du har inte behörighet att installera teckensnittsfilerna till det delade teckensnittsområdet /usr/local/share/fonts" + +#: keyman_config/install_kmp.py:179 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {package}" +msgstr "install_kmp.py: fel: Ingen kmp.json eller kmp.inf hittades i {package}" + +#: keyman_config/install_kmp.py:246 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {packageFile}" +msgstr "install_kmp.py: fel: Ingen kmp.json eller kmp.inf hittades i {packageFile}" + +#: keyman_config/install_window.py:54 +#, python-brace-format +msgid "Installing keyboard/package {keyboardid}" +msgstr "Installerar tangentbord/paket {keyboardid}" + +#: keyman_config/install_window.py:72 keyman_config/install_window.py:93 +msgid "Keyboard is installed already" +msgstr "Tangentbord är redan installerat" + +#: keyman_config/install_window.py:74 +#, python-brace-format +msgid "The {name} keyboard is already installed at version {version}. Do you want to uninstall then reinstall it?" +msgstr "{name} tangentbordet är redan installerat på version {version}. Vill du avinstallera sedan installera om det?" + +#: keyman_config/install_window.py:95 +#, python-brace-format +msgid "The {name} keyboard is already installed with a newer version {installedversion}. Do you want to uninstall it and install the older version {version}?" +msgstr "{name} tangentbordet är redan installerat med en nyare version {installedversion}. Vill du avinstallera det och installera den äldre versionen {version}?" + +#: keyman_config/install_window.py:128 +msgid "Keyboard layouts: " +msgstr "Tangentbordslayouter: " + +#: keyman_config/install_window.py:147 +msgid "Fonts: " +msgstr "Teckensnitt: " + +#: keyman_config/install_window.py:167 keyman_config/keyboard_details.py:96 +msgid "Package version: " +msgstr "Paketversion: " + +#: keyman_config/install_window.py:179 +msgid "Author: " +msgstr "Författare: " + +#: keyman_config/install_window.py:197 +msgid "Website: " +msgstr "Webbplats: " + +#: keyman_config/install_window.py:211 +msgid "Copyright: " +msgstr "Upphovsrätt: " + +#: keyman_config/install_window.py:245 +msgid "Details" +msgstr "Detaljer" + +#: keyman_config/install_window.py:248 +msgid "README" +msgstr "LÄS DIG" + +#: keyman_config/install_window.py:256 keyman_config/view_installed.py:200 +msgid "_Install" +msgstr "_Installera" + +#: keyman_config/install_window.py:260 +msgid "_Cancel" +msgstr "_Avbryt" + +#: keyman_config/install_window.py:305 +#, python-brace-format +msgid "Keyboard {name} installed" +msgstr "Tangentbord {name} installerat" + +#: keyman_config/install_window.py:310 keyman_config/install_window.py:315 +#, python-brace-format +msgid "Keyboard {name} could not be installed." +msgstr "Tangentbord {name} kunde inte installeras." + +#: keyman_config/install_window.py:311 +msgid "Error Message:" +msgstr "Felmeddelande:" + +#: keyman_config/install_window.py:316 +msgid "Warning Message:" +msgstr "Varningsmeddelande:" + +#: keyman_config/keyboard_details.py:37 +#, python-brace-format +msgid "{name} keyboard" +msgstr "{name} keyboard" + +#: keyman_config/keyboard_details.py:53 +msgid "ERROR: Keyboard metadata is damaged.\n" +"Please \"Uninstall\" and then \"Install\" the keyboard." +msgstr "FEL: Tangentbords metadata är skadad.\n" +"Vänligen \"Avinstallera\" och sedan \"Installera\" tangentbordet." + +#: keyman_config/keyboard_details.py:74 +msgid "Package name: " +msgstr "Paketets namn: " + +#: keyman_config/keyboard_details.py:85 +msgid "Package id: " +msgstr "Paket-id: " + +#: keyman_config/keyboard_details.py:108 +msgid "Package description: " +msgstr "Paketbeskrivning: " + +#: keyman_config/keyboard_details.py:121 +msgid "Package author: " +msgstr "Paketets författare: " + +#: keyman_config/keyboard_details.py:133 +msgid "Package copyright: " +msgstr "Paketets upphovsrätt: " + +#: keyman_config/keyboard_details.py:174 +msgid "Keyboard filename: " +msgstr "Tangentbords filnamn: " + +#: keyman_config/keyboard_details.py:187 +msgid "Keyboard name: " +msgstr "Tangentbords namn: " + +#: keyman_config/keyboard_details.py:198 +msgid "Keyboard id: " +msgstr "Keyboard id: " + +#: keyman_config/keyboard_details.py:209 +msgid "Keyboard version: " +msgstr "Tangentbordsversion: " + +#: keyman_config/keyboard_details.py:221 +msgid "Keyboard author: " +msgstr "Tangentbord författare: " + +#: keyman_config/keyboard_details.py:232 +msgid "Keyboard license: " +msgstr "Tangentbord licens: " + +#: keyman_config/keyboard_details.py:243 +msgid "Keyboard description: " +msgstr "Tangentbord beskrivning: " + +#: keyman_config/keyboard_details.py:334 +#, python-brace-format +msgid "Scan this code to load this keyboard\n" +"on another device or share online" +msgstr "Skanna koden för att ladda det här tangentbordet\n" +"på en annan enhet eller dela online" + +#: keyman_config/options.py:24 +#, python-brace-format +msgid "{packageId} Settings" +msgstr "{packageId} Inställningar" + +#: keyman_config/view_installed.py:30 +msgid "Keyman Configuration" +msgstr "Keyman konfiguration" + +#: keyman_config/view_installed.py:60 +msgid "Choose a kmp file..." +msgstr "Välj en TMP-fil..." + +#. i18n: file type in file selection dialog +#: keyman_config/view_installed.py:65 +msgid "KMP files" +msgstr "KMP filer" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:141 +msgid "Icon" +msgstr "Ikon" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:145 +msgid "Name" +msgstr "Namn" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:148 +msgid "Version" +msgstr "Version" + +#: keyman_config/view_installed.py:161 +msgid "_Uninstall" +msgstr "_Avinstallera" + +#: keyman_config/view_installed.py:162 keyman_config/view_installed.py:304 +msgid "Uninstall keyboard" +msgstr "Avinstallera tangentbordet" + +#: keyman_config/view_installed.py:167 +msgid "_About" +msgstr "_Om" + +#: keyman_config/view_installed.py:168 keyman_config/view_installed.py:306 +msgid "About keyboard" +msgstr "Om tangentbordet" + +#: keyman_config/view_installed.py:173 +msgid "_Help" +msgstr "_Hjälp" + +#: keyman_config/view_installed.py:174 keyman_config/view_installed.py:305 +msgid "Help for keyboard" +msgstr "Hjälp för tangentbordet" + +#: keyman_config/view_installed.py:179 +msgid "_Options" +msgstr "_Alternativ" + +#: keyman_config/view_installed.py:180 keyman_config/view_installed.py:307 +msgid "Settings for keyboard" +msgstr "Inställningar för tangentbord" + +#: keyman_config/view_installed.py:190 +msgid "_Refresh" +msgstr "_Uppdatera" + +#: keyman_config/view_installed.py:191 +msgid "Refresh keyboard list" +msgstr "Uppdatera tangentbordslista" + +#: keyman_config/view_installed.py:195 +msgid "_Download" +msgstr "_Ladda" + +#: keyman_config/view_installed.py:196 +msgid "Download and install a keyboard from the Keyman website" +msgstr "Ladda ner och installera ett tangentbord från Keymans webbplats" + +#: keyman_config/view_installed.py:201 +msgid "Install a keyboard from a file" +msgstr "Installera ett tangentbord från en fil" + +#: keyman_config/view_installed.py:206 +msgid "Close window" +msgstr "Stäng fönster" + +#: keyman_config/view_installed.py:278 +#, python-brace-format +msgid "Uninstall keyboard {package}" +msgstr "Avinstallera tangentbordet {package}" + +#: keyman_config/view_installed.py:280 +#, python-brace-format +msgid "Help for keyboard {package}" +msgstr "Hjälp för tangentbord {package}" + +#: keyman_config/view_installed.py:282 +#, python-brace-format +msgid "About keyboard {package}" +msgstr "Om tangentbordet {package}" + +#: keyman_config/view_installed.py:284 +#, python-brace-format +msgid "Settings for keyboard {package}" +msgstr "Inställningar för tangentbord {package}" + +#: keyman_config/view_installed.py:349 +msgid "Uninstall keyboard package?" +msgstr "Avinstallera tangentbordspaket?" + +#: keyman_config/view_installed.py:351 +#, python-brace-format +msgid "Are you sure that you want to uninstall the {keyboard} keyboard and its fonts?" +msgstr "Är du säker på att du vill avinstallera tangentbordet {keyboard} och dess teckensnitt?" + +#: keyman_config/welcome.py:22 +#, python-brace-format +msgid "{name} installed" +msgstr "{name} installerade" + +#: keyman_config/welcome.py:40 +msgid "Open in _Web browser" +msgstr "Öppna i _Webbläsare" + +#: keyman_config/welcome.py:42 +msgid "Open in the default web browser to do things like printing" +msgstr "Öppna i standardwebbläsaren för att göra saker som utskrift" + +#: keyman_config/welcome.py:45 +msgid "_OK" +msgstr "_OK" + diff --git a/linux/keyman-config/locale/uk_UA.po b/linux/keyman-config/locale/uk_UA.po new file mode 100644 index 0000000000..2d68b91513 --- /dev/null +++ b/linux/keyman-config/locale/uk_UA.po @@ -0,0 +1,332 @@ +msgid "" +msgstr "" +"Project-Id-Version: keyman\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-19 19:17+0200\n" +"PO-Revision-Date: 2023-01-24 03:25\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: keyman\n" +"X-Crowdin-Project-ID: 386703\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /master/linux/keyman-config.pot\n" +"X-Crowdin-File-ID: 504\n" + +#: keyman_config/__init__.py:68 +msgid "Neither sentry-sdk nor raven is available. Not enabling Sentry error reporting." +msgstr "Ні реал sdk ні крук не доступні. Не допускається надсилання повідомлень про помилки входу на екран." + +#: keyman_config/downloadkeyboard.py:23 +msgid "Download Keyman keyboards" +msgstr "Завантажити клавіатури Keyman" + +#: keyman_config/downloadkeyboard.py:37 keyman_config/keyboard_details.py:49 +#: keyman_config/keyboard_details.py:340 keyman_config/view_installed.py:205 +msgid "_Close" +msgstr "_Закрити" + +#: keyman_config/install_kmp.py:99 +msgid "You do not have permissions to install the keyboard files to the shared area /usr/local/share/keyman" +msgstr "У вас немає дозволу на встановлення файлів клавіатури у спільній області /usr/local/share/keyman" + +#: keyman_config/install_kmp.py:103 +msgid "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman" +msgstr "У вас немає прав на встановлення документації до спільної області документації /usr/local/share/doc/keyman" + +#: keyman_config/install_kmp.py:107 +msgid "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts" +msgstr "У вас немає прав на встановлення файлів шрифтів у спільну область шрифту /usr/local/share/fonts" + +#: keyman_config/install_kmp.py:179 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {package}" +msgstr "install_kmp.py: помилка: у {package} не знайдено kmp.json або kmp.inf" + +#: keyman_config/install_kmp.py:246 +#, python-brace-format +msgid "install_kmp.py: error: No kmp.json or kmp.inf found in {packageFile}" +msgstr "install_kmp.py: помилка: у {packageFile} не знайдено kmp.json або kmp.inf" + +#: keyman_config/install_window.py:54 +#, python-brace-format +msgid "Installing keyboard/package {keyboardid}" +msgstr "Встановлення клавіатури/пакету {keyboardid}" + +#: keyman_config/install_window.py:72 keyman_config/install_window.py:93 +msgid "Keyboard is installed already" +msgstr "Клавіатура вже встановлена" + +#: keyman_config/install_window.py:74 +#, python-brace-format +msgid "The {name} keyboard is already installed at version {version}. Do you want to uninstall then reinstall it?" +msgstr "Клавіатура {name} вже встановлена на версії {version}. Ви хочете видалити, а потім перевстановити його?" + +#: keyman_config/install_window.py:95 +#, python-brace-format +msgid "The {name} keyboard is already installed with a newer version {installedversion}. Do you want to uninstall it and install the older version {version}?" +msgstr "Клавіатура {name} вже встановлена з новішою версією {installedversion}. Ви хочете видалити її і встановити стару версію {version}?" + +#: keyman_config/install_window.py:128 +msgid "Keyboard layouts: " +msgstr "Розкладки клавіатури: " + +#: keyman_config/install_window.py:147 +msgid "Fonts: " +msgstr "Шрифт: " + +#: keyman_config/install_window.py:167 keyman_config/keyboard_details.py:96 +msgid "Package version: " +msgstr "Версія пакету: " + +#: keyman_config/install_window.py:179 +msgid "Author: " +msgstr "Автор: " + +#: keyman_config/install_window.py:197 +msgid "Website: " +msgstr "Веб-сайт: " + +#: keyman_config/install_window.py:211 +msgid "Copyright: " +msgstr "Авторські права: " + +#: keyman_config/install_window.py:245 +msgid "Details" +msgstr "Подробиці" + +#: keyman_config/install_window.py:248 +msgid "README" +msgstr "README" + +#: keyman_config/install_window.py:256 keyman_config/view_installed.py:200 +msgid "_Install" +msgstr "_Встановити" + +#: keyman_config/install_window.py:260 +msgid "_Cancel" +msgstr "_Скасувати" + +#: keyman_config/install_window.py:305 +#, python-brace-format +msgid "Keyboard {name} installed" +msgstr "Клавіатура {name} встановлена" + +#: keyman_config/install_window.py:310 keyman_config/install_window.py:315 +#, python-brace-format +msgid "Keyboard {name} could not be installed." +msgstr "Клавіатура {name} не може бути встановлена." + +#: keyman_config/install_window.py:311 +msgid "Error Message:" +msgstr "Повідомлення про помилку:" + +#: keyman_config/install_window.py:316 +msgid "Warning Message:" +msgstr "Попереджувальне повідомлення:" + +#: keyman_config/keyboard_details.py:37 +#, python-brace-format +msgid "{name} keyboard" +msgstr "{name} keyboard" + +#: keyman_config/keyboard_details.py:53 +msgid "ERROR: Keyboard metadata is damaged.\n" +"Please \"Uninstall\" and then \"Install\" the keyboard." +msgstr "Помилка: метадані клавіатури пошкоджено.\n" +"будь ласка, \"Видалити\" і потім \"Встановити\" клавіатуру." + +#: keyman_config/keyboard_details.py:74 +msgid "Package name: " +msgstr "Назва пакету: " + +#: keyman_config/keyboard_details.py:85 +msgid "Package id: " +msgstr "ID пакета: " + +#: keyman_config/keyboard_details.py:108 +msgid "Package description: " +msgstr "Опис пакету: " + +#: keyman_config/keyboard_details.py:121 +msgid "Package author: " +msgstr "Пакет автора: " + +#: keyman_config/keyboard_details.py:133 +msgid "Package copyright: " +msgstr "Тільки авторські права пакета: " + +#: keyman_config/keyboard_details.py:174 +msgid "Keyboard filename: " +msgstr "Ім'я файлу клавіатури: " + +#: keyman_config/keyboard_details.py:187 +msgid "Keyboard name: " +msgstr "Ім'я клавіатури: " + +#: keyman_config/keyboard_details.py:198 +msgid "Keyboard id: " +msgstr "Keyboard id: " + +#: keyman_config/keyboard_details.py:209 +msgid "Keyboard version: " +msgstr "Версія клавіатури: " + +#: keyman_config/keyboard_details.py:221 +msgid "Keyboard author: " +msgstr "Автор клавіатури: " + +#: keyman_config/keyboard_details.py:232 +msgid "Keyboard license: " +msgstr "Ліцензія клавіатури: " + +#: keyman_config/keyboard_details.py:243 +msgid "Keyboard description: " +msgstr "Опис клавіатури: " + +#: keyman_config/keyboard_details.py:334 +#, python-brace-format +msgid "Scan this code to load this keyboard\n" +"on another device or share online" +msgstr "Проскануйте цей код, щоб завантажити цю клавіатуру\n" +"на іншому пристрої або поділитися онлайн" + +#: keyman_config/options.py:24 +#, python-brace-format +msgid "{packageId} Settings" +msgstr "{packageId} Налаштування" + +#: keyman_config/view_installed.py:30 +msgid "Keyman Configuration" +msgstr "Налаштування Keyman" + +#: keyman_config/view_installed.py:60 +msgid "Choose a kmp file..." +msgstr "Виберіть файл kmp..." + +#. i18n: file type in file selection dialog +#: keyman_config/view_installed.py:65 +msgid "KMP files" +msgstr "KMP файли" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:141 +msgid "Icon" +msgstr "Іконка" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:145 +msgid "Name" +msgstr "Ім'я" + +#. i18n: column header in table displaying installed keyboards +#: keyman_config/view_installed.py:148 +msgid "Version" +msgstr "Версія" + +#: keyman_config/view_installed.py:161 +msgid "_Uninstall" +msgstr "_Видалити" + +#: keyman_config/view_installed.py:162 keyman_config/view_installed.py:304 +msgid "Uninstall keyboard" +msgstr "Видалити клавіатуру" + +#: keyman_config/view_installed.py:167 +msgid "_About" +msgstr "_Про" + +#: keyman_config/view_installed.py:168 keyman_config/view_installed.py:306 +msgid "About keyboard" +msgstr "Про клавіатуру" + +#: keyman_config/view_installed.py:173 +msgid "_Help" +msgstr "_Допомога" + +#: keyman_config/view_installed.py:174 keyman_config/view_installed.py:305 +msgid "Help for keyboard" +msgstr "Допомога для клавіатури" + +#: keyman_config/view_installed.py:179 +msgid "_Options" +msgstr "_Параметри" + +#: keyman_config/view_installed.py:180 keyman_config/view_installed.py:307 +msgid "Settings for keyboard" +msgstr "Налаштування клавіатури" + +#: keyman_config/view_installed.py:190 +msgid "_Refresh" +msgstr "_Оновити" + +#: keyman_config/view_installed.py:191 +msgid "Refresh keyboard list" +msgstr "Оновити список клавіатури" + +#: keyman_config/view_installed.py:195 +msgid "_Download" +msgstr "_Завантажити" + +#: keyman_config/view_installed.py:196 +msgid "Download and install a keyboard from the Keyman website" +msgstr "Завантажте та встановіть клавіатуру з веб-сайту Keyman" + +#: keyman_config/view_installed.py:201 +msgid "Install a keyboard from a file" +msgstr "Встановлення клавіатури з файлу" + +#: keyman_config/view_installed.py:206 +msgid "Close window" +msgstr "Закрити вікно" + +#: keyman_config/view_installed.py:278 +#, python-brace-format +msgid "Uninstall keyboard {package}" +msgstr "Видалити клавіатуру {package}" + +#: keyman_config/view_installed.py:280 +#, python-brace-format +msgid "Help for keyboard {package}" +msgstr "Довідка по клавіатурі {package}" + +#: keyman_config/view_installed.py:282 +#, python-brace-format +msgid "About keyboard {package}" +msgstr "Про клавіатуру {package}" + +#: keyman_config/view_installed.py:284 +#, python-brace-format +msgid "Settings for keyboard {package}" +msgstr "Налаштування клавіатури для {package}" + +#: keyman_config/view_installed.py:349 +msgid "Uninstall keyboard package?" +msgstr "Видалити пакунок з клавіатурою?" + +#: keyman_config/view_installed.py:351 +#, python-brace-format +msgid "Are you sure that you want to uninstall the {keyboard} keyboard and its fonts?" +msgstr "Ви впевнені, що хочете видалити клавіатуру {keyboard} і її шрифти?" + +#: keyman_config/welcome.py:22 +#, python-brace-format +msgid "{name} installed" +msgstr "{name} встановлено" + +#: keyman_config/welcome.py:40 +msgid "Open in _Web browser" +msgstr "Відкрити у браузері" + +#: keyman_config/welcome.py:42 +msgid "Open in the default web browser to do things like printing" +msgstr "Відкрити в веб-браузері за замовчуванням для друку" + +#: keyman_config/welcome.py:45 +msgid "_OK" +msgstr "_OK" + diff --git a/linux/scripts/jenkins.sh b/linux/scripts/jenkins.sh index 01d8d0f571..edac87d30f 100755 --- a/linux/scripts/jenkins.sh +++ b/linux/scripts/jenkins.sh @@ -65,8 +65,8 @@ checkAndInstallRequirements echo_heading "cleaning previous builds of $1" rm -rf builddebs -rm -rf "$sourcedir/${1}_*.{dsc,build,buildinfo,changes,tar.?z,log}" -rm -rf "$sourcedir/../${1}_*.{dsc,build,buildinfo,changes,tar.?z,log}" +rm -rf "$sourcedir/${1}"_*.{dsc,build,buildinfo,changes,tar.?z,log} +rm -rf "$sourcedir/../${1}"_*.{dsc,build,buildinfo,changes,tar.?z,log} echo_heading "Make source package for $fullsourcename" echo_heading "reconfigure" diff --git a/linux/scripts/package-build.inc.sh b/linux/scripts/package-build.inc.sh index 6041b69c93..ee85f29a22 100644 --- a/linux/scripts/package-build.inc.sh +++ b/linux/scripts/package-build.inc.sh @@ -48,8 +48,8 @@ function downloadSource() { mv "${proj}-${version}" "${BASEDIR}/${packageDir}" mv "${proj}_${version}.orig.tar.gz" "${BASEDIR}/${packageDir}" mv "${proj}-${version}.tar.gz" "${BASEDIR}/${packageDir}" - mv "${proj}*.asc" "${BASEDIR}/${packageDir}" - rm "${proj}*.debian.tar.xz" + mv "${proj}"*.asc "${BASEDIR}/${packageDir}" + rm "${proj}"*.debian.tar.xz cd "${BASEDIR}/${packageDir}" || exit wget -N https://downloads.keyman.com/linux/${TIER}/${dirversion}/SHA256SUMS sha256sum -c --ignore-missing SHA256SUMS |grep "${proj}" diff --git a/linux/scripts/upload-to-debian.sh b/linux/scripts/upload-to-debian.sh index 1474b281b4..23622f86a6 100755 --- a/linux/scripts/upload-to-debian.sh +++ b/linux/scripts/upload-to-debian.sh @@ -104,7 +104,7 @@ cp debianpackage/keyman-*/debian/changelog debian/ git add debian/changelog git commit -m "chore(linux): Update debian changelog" if [ -n "$PUSH" ]; then - $NOOP git push origin chore/linux/changelog + $NOOP git push --force-with-lease origin chore/linux/changelog fi if $ISBETA; then @@ -116,7 +116,7 @@ fi git checkout -B chore/linux/cherry-pick/changelog ${CLBRANCH} git cherry-pick -x chore/linux/changelog if [ -n "$PUSH" ]; then - $NOOP git push origin chore/linux/cherry-pick/changelog + $NOOP git push --force-with-lease origin chore/linux/cherry-pick/changelog fi echo_heading "Finishing" diff --git a/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj b/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj index f208b87d0f..a7ca883cf1 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj +++ b/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj @@ -166,6 +166,24 @@ 298566BF29802963004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/KMKeyboardHelpWindowController.strings; sourceTree = ""; }; 298566C029802963004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/MainMenu.strings; sourceTree = ""; }; 298566C129802970004ACA95 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + 298566C82980C9AD004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/KMAboutWindowController.strings; sourceTree = ""; }; + 298566C92980C9AD004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/preferences.strings; sourceTree = ""; }; + 298566CA2980C9AD004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/KMInfoWindowController.strings; sourceTree = ""; }; + 298566CB2980C9AE004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/KMKeyboardHelpWindowController.strings; sourceTree = ""; }; + 298566CC2980C9AE004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/MainMenu.strings; sourceTree = ""; }; + 298566CD2980C9B9004ACA95 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 298566D42980D47C004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/KMAboutWindowController.strings; sourceTree = ""; }; + 298566D52980D47D004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/preferences.strings; sourceTree = ""; }; + 298566D62980D47D004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/KMInfoWindowController.strings; sourceTree = ""; }; + 298566D72980D47D004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/KMKeyboardHelpWindowController.strings; sourceTree = ""; }; + 298566D82980D47E004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/MainMenu.strings; sourceTree = ""; }; + 298566D92980D489004ACA95 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 298566E02980E579004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/KMAboutWindowController.strings; sourceTree = ""; }; + 298566E12980E579004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/preferences.strings; sourceTree = ""; }; + 298566E22980E57A004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/KMInfoWindowController.strings; sourceTree = ""; }; + 298566E32980E57A004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/KMKeyboardHelpWindowController.strings; sourceTree = ""; }; + 298566E42980E57A004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainMenu.strings; sourceTree = ""; }; + 298566E52980E584004ACA95 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 299B5E1E29126CA20070841D /* keyman-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keyman-icon@2x.png"; sourceTree = ""; }; 299B5E1F29126CA20070841D /* keyman-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keyman-icon.png"; sourceTree = ""; }; 29A4730527E9D6D500DE07C7 /* ha */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ha; path = ha.lproj/KMAboutWindowController.strings; sourceTree = ""; }; @@ -760,8 +778,11 @@ nl, "zh-Hans", "ff-NG", - kn, cs, + kn, + sv, + uk, + ru, ); mainGroup = 989C9BFF1A7876DE00A20425; productRefGroup = 989C9C091A7876DE00A20425 /* Products */; @@ -1009,8 +1030,11 @@ 29B27FF229062FF50036917E /* nl */, 29B6BB5B292239B4008F04BD /* zh-Hans */, 2901BA8A292332B3009903EC /* ff-NG */, - 29781101297FB262007C886D /* kn */, 298566BC29802962004ACA95 /* cs */, + 29781101297FB262007C886D /* kn */, + 298566C82980C9AD004ACA95 /* sv */, + 298566D42980D47C004ACA95 /* uk */, + 298566E02980E579004ACA95 /* ru */, ); name = KMAboutWindowController.xib; sourceTree = ""; @@ -1031,8 +1055,11 @@ 29B27FF329062FF50036917E /* nl */, 29B6BB5C292239B4008F04BD /* zh-Hans */, 2901BA8B292332B3009903EC /* ff-NG */, - 29781102297FB262007C886D /* kn */, 298566BD29802963004ACA95 /* cs */, + 29781102297FB262007C886D /* kn */, + 298566C92980C9AD004ACA95 /* sv */, + 298566D52980D47D004ACA95 /* uk */, + 298566E12980E579004ACA95 /* ru */, ); name = preferences.xib; path = Keyman4MacIM/KMConfiguration; @@ -1053,8 +1080,11 @@ 29B27FF7290630170036917E /* nl */, 29B6BB60292239DC008F04BD /* zh-Hans */, 2901BA8F292332CF009903EC /* ff-NG */, - 29781106297FB27E007C886D /* kn */, 298566C129802970004ACA95 /* cs */, + 29781106297FB27E007C886D /* kn */, + 298566CD2980C9B9004ACA95 /* sv */, + 298566D92980D489004ACA95 /* uk */, + 298566E52980E584004ACA95 /* ru */, ); name = Localizable.strings; sourceTree = ""; @@ -1075,8 +1105,11 @@ 29B27FF429062FF50036917E /* nl */, 29B6BB5D292239B4008F04BD /* zh-Hans */, 2901BA8C292332B3009903EC /* ff-NG */, - 29781103297FB263007C886D /* kn */, 298566BE29802963004ACA95 /* cs */, + 29781103297FB263007C886D /* kn */, + 298566CA2980C9AD004ACA95 /* sv */, + 298566D62980D47D004ACA95 /* uk */, + 298566E22980E57A004ACA95 /* ru */, ); name = KMInfoWindowController.xib; path = Keyman4MacIM/KMInfoWindow; @@ -1098,8 +1131,11 @@ 29B27FF529062FF60036917E /* nl */, 29B6BB5E292239B4008F04BD /* zh-Hans */, 2901BA8D292332B3009903EC /* ff-NG */, - 29781104297FB263007C886D /* kn */, 298566BF29802963004ACA95 /* cs */, + 29781104297FB263007C886D /* kn */, + 298566CB2980C9AE004ACA95 /* sv */, + 298566D72980D47D004ACA95 /* uk */, + 298566E32980E57A004ACA95 /* ru */, ); name = KMKeyboardHelpWindowController.xib; path = Keyman4MacIM/KMKeyboardHelpWindow; @@ -1121,8 +1157,11 @@ 29B27FF629062FF60036917E /* nl */, 29B6BB5F292239B4008F04BD /* zh-Hans */, 2901BA8E292332B4009903EC /* ff-NG */, - 29781105297FB263007C886D /* kn */, 298566C029802963004ACA95 /* cs */, + 29781105297FB263007C886D /* kn */, + 298566CC2980C9AE004ACA95 /* sv */, + 298566D82980D47E004ACA95 /* uk */, + 298566E42980E57A004ACA95 /* ru */, ); name = MainMenu.xib; sourceTree = ""; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/ru.lproj/KMAboutWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/ru.lproj/KMAboutWindowController.strings new file mode 100644 index 0000000000..4f3099f1e1 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/ru.lproj/KMAboutWindowController.strings @@ -0,0 +1,8 @@ +/* button text to close the About window */ +"Kab-Up-fYH.title" = "Закрыть"; + +/* text of link to the license agreement */ +"hYC-Bx-aoP.title" = "Лицензионное соглашение"; + +/* button text to open Configuration window */ +"vkh-b5-vO7.title" = "Конфигурация ..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/shu-latn-n.lproj/KMAboutWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/shu-latn-n.lproj/KMAboutWindowController.strings new file mode 100644 index 0000000000..f98a1ec607 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/shu-latn-n.lproj/KMAboutWindowController.strings @@ -0,0 +1,8 @@ +/* button text to close the About window */ +"Kab-Up-fYH.title" = "Sidda"; + +/* text of link to the license agreement */ +"hYC-Bx-aoP.title" = "Muwafiqa hana izin"; + +/* button text to open Configuration window */ +"vkh-b5-vO7.title" = "Wasiyana..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/sv.lproj/KMAboutWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/sv.lproj/KMAboutWindowController.strings new file mode 100644 index 0000000000..a83caa4a49 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/sv.lproj/KMAboutWindowController.strings @@ -0,0 +1,8 @@ +/* button text to close the About window */ +"Kab-Up-fYH.title" = "Stäng"; + +/* text of link to the license agreement */ +"hYC-Bx-aoP.title" = "Licensavtal"; + +/* button text to open Configuration window */ +"vkh-b5-vO7.title" = "Konfiguration..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/uk.lproj/KMAboutWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/uk.lproj/KMAboutWindowController.strings new file mode 100644 index 0000000000..bc2095eafa --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/uk.lproj/KMAboutWindowController.strings @@ -0,0 +1,8 @@ +/* button text to close the About window */ +"Kab-Up-fYH.title" = "Закрити"; + +/* text of link to the license agreement */ +"hYC-Bx-aoP.title" = "Ліцензійна угода"; + +/* button text to open Configuration window */ +"vkh-b5-vO7.title" = "Налаштування..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/ru.lproj/preferences.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/ru.lproj/preferences.strings new file mode 100644 index 0000000000..24b4393b03 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/ru.lproj/preferences.strings @@ -0,0 +1,38 @@ +/* Checkbox text to always show on-screen keyboard */ +"4UX-80-0Vo.title" = "Всегда показывать экранную клавиатуру"; + +/* Checkbox text to enable verbose Console logging */ +"7J6-zy-R20.title" = "Использовать подробное ведение журнала Консоли"; + +/* Support button text */ +"93O-x6-RLF.label" = "Поддержка"; + +/* Download Keyboard button text */ +"CTw-kf-WNS.title" = "Скачать клавиатуру..."; + +/* Keyman Configuration window title */ +"F0z-JX-Cv5.title" = "Настройки Keyman"; + +/* button text to go back to previous page */ +"JOK-JV-n8w.title" = "Назад"; + +/* Keyboards button text */ +"MPN-9N-wWc.label" = "Keyboards"; + +/* text to explain verbose Console logging option */ +"MrI-GM-7d6.title" = "Когда включена опция ведения подробного журнала, Keyman будет записывать действия, которые могут помочь в диагностировании проблемы с помощью Keyman Support. Программа консоли может быть использована для просмотра журнала сообщений от Keyman. В консоли фильтровать для показа всех сообщений из процесса \"Keyman\". Этот журнал можно экспортировать и при необходимости отправлять в службу поддержки Keyman."; + +/* button text to move forward to the next page */ +"eXr-8V-h1g.title" = "Вперед"; + +/* button text to return to the home help page */ +"fXS-aC-CMH.title" = "Домашний"; + +/* Options button text */ +"frd-No-seV.label" = "Параметры"; + +/* Installed Keyboard column heading */ +"jex-Nd-Qzg.headerCell.title" = "Установленная клавиатура"; + +/* Verbose logging tooltip text */ +"uWx-3J-U0D.ibShadowedToolTip" = "Включите это, если у вас возникли проблемы с определенной клавиатурой или с Keyman в целом."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/shu-latn-n.lproj/preferences.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/shu-latn-n.lproj/preferences.strings new file mode 100644 index 0000000000..537a73e885 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/shu-latn-n.lproj/preferences.strings @@ -0,0 +1,38 @@ +/* Checkbox text to always show on-screen keyboard */ +"4UX-80-0Vo.title" = "Matakula war keyboard albinshaf"; + +/* Checkbox text to enable verbose Console logging */ +"7J6-zy-R20.title" = "Annaf bey verbose console logging"; + +/* Support button text */ +"93O-x6-RLF.label" = "Mi'awana"; + +/* Download Keyboard button text */ +"CTw-kf-WNS.title" = "Dyssal keyboard..."; + +/* Keyman Configuration window title */ +"F0z-JX-Cv5.title" = "Ta'adil hana Keyman"; + +/* button text to go back to previous page */ +"JOK-JV-n8w.title" = "Wara"; + +/* Keyboards button text */ +"MPN-9N-wWc.label" = "Keyboards"; + +/* text to explain verbose Console logging option */ +"MrI-GM-7d6.title" = "Kan verbose logging mafkuk da, alshu'ul bi'awwun Keyman ley eirfiyan shunu min mashakil kan gamma. Alshu'ul hanal console binnafu beya ley shafian risalat min Keyman. Fyl console da, dyssa ley eiwari risalat chatta min darb albisawwi hana \"Keyman\". Alshu'ul da bikun bisullu wa biluzzu ley Keyman kan murada gamma."; + +/* button text to move forward to the next page */ +"eXr-8V-h1g.title" = "Giddam"; + +/* button text to return to the home help page */ +"fXS-aC-CMH.title" = "Bidaya"; + +/* Options button text */ +"frd-No-seV.label" = "Durub"; + +/* Installed Keyboard column heading */ +"jex-Nd-Qzg.headerCell.title" = "Dyssal keyboard"; + +/* Verbose logging tooltip text */ +"uWx-3J-U0D.ibShadowedToolTip" = "Fukkal shu'ul da kan ligyt mashakil bey keyboard khassa walla bey Keyman zaata."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/sv.lproj/preferences.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/sv.lproj/preferences.strings new file mode 100644 index 0000000000..88d3107cba --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/sv.lproj/preferences.strings @@ -0,0 +1,38 @@ +/* Checkbox text to always show on-screen keyboard */ +"4UX-80-0Vo.title" = "Visa alltid skärmtangentbord"; + +/* Checkbox text to enable verbose Console logging */ +"7J6-zy-R20.title" = "Använd verbose Console-loggning"; + +/* Support button text */ +"93O-x6-RLF.label" = "Stöd"; + +/* Download Keyboard button text */ +"CTw-kf-WNS.title" = "Ladda ner tangentbord..."; + +/* Keyman Configuration window title */ +"F0z-JX-Cv5.title" = "Keyman konfiguration"; + +/* button text to go back to previous page */ +"JOK-JV-n8w.title" = "Tillbaka"; + +/* Keyboards button text */ +"MPN-9N-wWc.label" = "Keyboards"; + +/* text to explain verbose Console logging option */ +"MrI-GM-7d6.title" = "När verbose loggning alternativet är på, kommer Keyman logga åtgärder som kan hjälpa Keyman Support diagnostisera ett problem. Programmet Konsol kan användas för att se en logg av meddelanden från Keyman. I Console, filter för att visa alla meddelanden från \"Keyman\" processen. Denna logg kan exporteras och skickas till Keyman support om det behövs."; + +/* button text to move forward to the next page */ +"eXr-8V-h1g.title" = "Framåt"; + +/* button text to return to the home help page */ +"fXS-aC-CMH.title" = "Hem"; + +/* Options button text */ +"frd-No-seV.label" = "Alternativ"; + +/* Installed Keyboard column heading */ +"jex-Nd-Qzg.headerCell.title" = "Installerat tangentbord"; + +/* Verbose logging tooltip text */ +"uWx-3J-U0D.ibShadowedToolTip" = "Aktivera detta om du har problem med ett specifikt tangentbord eller med Keyman i allmänhet."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/uk.lproj/preferences.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/uk.lproj/preferences.strings new file mode 100644 index 0000000000..040cb82624 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/uk.lproj/preferences.strings @@ -0,0 +1,38 @@ +/* Checkbox text to always show on-screen keyboard */ +"4UX-80-0Vo.title" = "Завжди показувати на екранній клавіатурі"; + +/* Checkbox text to enable verbose Console logging */ +"7J6-zy-R20.title" = "Використати докладне ведення журналу"; + +/* Support button text */ +"93O-x6-RLF.label" = "Підтримка"; + +/* Download Keyboard button text */ +"CTw-kf-WNS.title" = "Завантажити клавіатуру..."; + +/* Keyman Configuration window title */ +"F0z-JX-Cv5.title" = "Налаштування Keyman"; + +/* button text to go back to previous page */ +"JOK-JV-n8w.title" = "Відмінити"; + +/* Keyboards button text */ +"MPN-9N-wWc.label" = "Keyboards"; + +/* text to explain verbose Console logging option */ +"MrI-GM-7d6.title" = "Коли відбувається докладне ведення журналу, Keyman буде журналювати, які можуть допомогти Keyman підтримувати проблему. Програма Консолі може бути використана щоб побачити журнал повідомлень з Keyman. У Console, фільтр для показу всіх повідомлень з процесу \"Keyman\". За необхідності, цей журнал можна експортувати та відправляти в підтримку Keyman."; + +/* button text to move forward to the next page */ +"eXr-8V-h1g.title" = "Переслати"; + +/* button text to return to the home help page */ +"fXS-aC-CMH.title" = "Домашній екран"; + +/* Options button text */ +"frd-No-seV.label" = "Опції"; + +/* Installed Keyboard column heading */ +"jex-Nd-Qzg.headerCell.title" = "Встановлена клавіатура"; + +/* Verbose logging tooltip text */ +"uWx-3J-U0D.ibShadowedToolTip" = "Увімкніть це, якщо у вас виникають проблеми з певною клавіатурою або з Keyman загалом."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/ru.lproj/KMInfoWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/ru.lproj/KMInfoWindowController.strings new file mode 100644 index 0000000000..d466f39f8d --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/ru.lproj/KMInfoWindowController.strings @@ -0,0 +1,8 @@ +/* Package Information window title */ +"F0z-JX-Cv5.title" = "Package Information"; + +/* button text to show Details */ +"Fvy-XJ-s38.label" = "Подробности"; + +/* button text to show Read Me */ +"waA-IW-Qyn.label" = "Читать меня"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/shu-latn-n.lproj/KMInfoWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/shu-latn-n.lproj/KMInfoWindowController.strings new file mode 100644 index 0000000000..f46b5aec51 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/shu-latn-n.lproj/KMInfoWindowController.strings @@ -0,0 +1,8 @@ +/* Package Information window title */ +"F0z-JX-Cv5.title" = "Package Information"; + +/* button text to show Details */ +"Fvy-XJ-s38.label" = "Shu'ul alfiya"; + +/* button text to show Read Me */ +"waA-IW-Qyn.label" = "Agurni"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/sv.lproj/KMInfoWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/sv.lproj/KMInfoWindowController.strings new file mode 100644 index 0000000000..296a10433a --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/sv.lproj/KMInfoWindowController.strings @@ -0,0 +1,8 @@ +/* Package Information window title */ +"F0z-JX-Cv5.title" = "Package Information"; + +/* button text to show Details */ +"Fvy-XJ-s38.label" = "Detaljer"; + +/* button text to show Read Me */ +"waA-IW-Qyn.label" = "Läs mig"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/uk.lproj/KMInfoWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/uk.lproj/KMInfoWindowController.strings new file mode 100644 index 0000000000..e887a8a345 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/uk.lproj/KMInfoWindowController.strings @@ -0,0 +1,8 @@ +/* Package Information window title */ +"F0z-JX-Cv5.title" = "Package Information"; + +/* button text to show Details */ +"Fvy-XJ-s38.label" = "Подробиці"; + +/* button text to show Read Me */ +"waA-IW-Qyn.label" = "Читати мене"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/ru.lproj/KMKeyboardHelpWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/ru.lproj/KMKeyboardHelpWindowController.strings new file mode 100644 index 0000000000..21ff5e91b8 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/ru.lproj/KMKeyboardHelpWindowController.strings @@ -0,0 +1,8 @@ +/* Keyboard Help window title */ +"F0z-JX-Cv5.title" = "Справка клавиатуры"; + +/* OK button text */ +"Zla-QF-m0K.title" = "ОК"; + +/* Print button text */ +"fYY-Uj-y4S.title" = "Print..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/shu-latn-n.lproj/KMKeyboardHelpWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/shu-latn-n.lproj/KMKeyboardHelpWindowController.strings new file mode 100644 index 0000000000..4467b08e38 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/shu-latn-n.lproj/KMKeyboardHelpWindowController.strings @@ -0,0 +1,8 @@ +/* Keyboard Help window title */ +"F0z-JX-Cv5.title" = "Mi'awana faougal Keyboard"; + +/* OK button text */ +"Zla-QF-m0K.title" = "Zayn"; + +/* Print button text */ +"fYY-Uj-y4S.title" = "Sulla..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/sv.lproj/KMKeyboardHelpWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/sv.lproj/KMKeyboardHelpWindowController.strings new file mode 100644 index 0000000000..ba364d59ba --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/sv.lproj/KMKeyboardHelpWindowController.strings @@ -0,0 +1,8 @@ +/* Keyboard Help window title */ +"F0z-JX-Cv5.title" = "Tangentbord Hjälp"; + +/* OK button text */ +"Zla-QF-m0K.title" = "Ok"; + +/* Print button text */ +"fYY-Uj-y4S.title" = "Print..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/uk.lproj/KMKeyboardHelpWindowController.strings b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/uk.lproj/KMKeyboardHelpWindowController.strings new file mode 100644 index 0000000000..deeeecc477 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/uk.lproj/KMKeyboardHelpWindowController.strings @@ -0,0 +1,8 @@ +/* Keyboard Help window title */ +"F0z-JX-Cv5.title" = "Допомога з клавіатурою"; + +/* OK button text */ +"Zla-QF-m0K.title" = "Гаразд"; + +/* Print button text */ +"fYY-Uj-y4S.title" = "Print..."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/Localizable.strings b/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..3403c18d14 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/Localizable.strings @@ -0,0 +1,71 @@ +/* Message displayed to confirm delete of the Keyman keyboard selected by the user from the keyboard list */ +"message-confirm-delete-keyboard" = "Вы уверены, что хотите удалить клавиатуру '%@'?"; + +/* Delete keyboard confirmation info indicating that the delete action cannot be undone */ +"info-cannot-undo-delete-keyboard" = "Это действие нельзя отменить."; + +/* Button text to cancel delete of the specified installed Keyman keyboard */ +"button-cancel-delete-keyboard" = "Отменить"; + +/* Button text to confirm delete of the specified installed Keyman keyboard */ +"button-delete-keyboard" = "Удалить"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"message-confirm-install-keyboard" = "Установить клавиатуру Keyman?"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"info-install-keyboard-filename" = "Вы хотите, чтобы Keyman установил клавиатуру из файла '%@'?"; + +/* Button text to cancel installation of the double-clicked Keyman file */ +"button-cancel-install-keyboard" = "Отменить"; + +/* Button text to confirm installation of the double-clicked Keyman file */ +"button-install-keyboard" = "Установить"; + +/* Message displayed to inform user that .kmp file could not be read/unzipped */ +"message-keyboard-file-unreadable" = "Не удалось прочитать файл Keyman '%@'."; + +/* Message displayed in Configuration window when keyboard cannot be loaded */ +"message-error-loading-keyboard" = "(error loading keyboard)"; + +/* Message displayed in Configuration window when keyboard metadata cannot be loaded */ +"message-error-unknown-metadata" = "unknown"; + +/* Button text to acknowledge that .kmp file could not be read */ +"button-keyboard-file-unreadable" = "ОК"; + +/* label text to identify Keyman version */ +"version-label-text" = "Версия %@"; + +/* Status text for keyboard downloading */ +"message-keyboard-downloading" = "Загрузка..."; + +/* Status text for keyboard download complete */ +"message-keyboard-download-complete" = "Загрузка завершена."; + +/* Button text to cancel downloading keyboard */ +"button-cancel-downloading" = "Отменить"; + +/* Button text keyboard download complete */ +"button-download-complete" = "Готово"; + +/* keyboards label in the Package Information window */ +"keyboards-label" = "Keyboards:"; + +/* fonts label in the Package Information window */ +"fonts-label" = "Fonts:"; + +/* package version label in the Package Information window */ +"package-version-label" = "Package Version:"; + +/* author label in the Package Information window */ +"author-label" = "Author:"; + +/* website label in the Package Information window */ +"website-label" = "Website:"; + +/* copyright label in the Package Information window */ +"copyright-label" = "Copyright:"; + +/* message displayed to alert user to need grant accessibility permission */ +"privacy-alert-text" = "To function properly, Keyman requires accessibility features:\n\nGrant access in System Preferences, Security & Privacy.\nRestart your system."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/MainMenu.strings b/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/MainMenu.strings new file mode 100644 index 0000000000..bf236a609a --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/ru.lproj/MainMenu.strings @@ -0,0 +1,14 @@ +/* Configuration window menu text */ +"P1b-lE-yFw.title" = "Конфигурация ..."; + +/* Keyboards menu text */ +"bQa-j9-nHe.title" = "Клавиатуры"; + +/* Keyboards menu text */ +"goP-aK-3WB.title" = "Клавиатуры"; + +/* About menu text */ +"kb2-ww-RS3.title" = "О"; + +/* On-Screen Keyboard menu text */ +"s96-JI-YDh.title" = "Клавиатура на экране"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/Localizable.strings b/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/Localizable.strings new file mode 100644 index 0000000000..578a15b5b1 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/Localizable.strings @@ -0,0 +1,71 @@ +/* Message displayed to confirm delete of the Keyman keyboard selected by the user from the keyboard list */ +"message-confirm-delete-keyboard" = "Tabbat tador tasulal keyboard wah '%@'?"; + +/* Delete keyboard confirmation info indicating that the delete action cannot be undone */ +"info-cannot-undo-delete-keyboard" = "Ma taddar tagulbal shu'ul da."; + +/* Button text to cancel delete of the specified installed Keyman keyboard */ +"button-cancel-delete-keyboard" = "Halla"; + +/* Button text to confirm delete of the specified installed Keyman keyboard */ +"button-delete-keyboard" = "Chinna"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"message-confirm-install-keyboard" = "Dys keyman keyboard?"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"info-install-keyboard-filename" = "Tador Keyman eidissal keyboard minal shu'ul wah '%@'?"; + +/* Button text to cancel installation of the double-clicked Keyman file */ +"button-cancel-install-keyboard" = "Halla"; + +/* Button text to confirm installation of the double-clicked Keyman file */ +"button-install-keyboard" = "Dyssa"; + +/* Message displayed to inform user that .kmp file could not be read/unzipped */ +"message-keyboard-file-unreadable" = "Ma gudur gara shu'ul alfyl Keyman '%@'."; + +/* Message displayed in Configuration window when keyboard cannot be loaded */ +"message-error-loading-keyboard" = "(error loading keyboard)"; + +/* Message displayed in Configuration window when keyboard metadata cannot be loaded */ +"message-error-unknown-metadata" = "unknown"; + +/* Button text to acknowledge that .kmp file could not be read */ +"button-keyboard-file-unreadable" = "Zayn"; + +/* label text to identify Keyman version */ +"version-label-text" = "Nafar: %@"; + +/* Status text for keyboard downloading */ +"message-keyboard-downloading" = "Dakhalan..."; + +/* Status text for keyboard download complete */ +"message-keyboard-download-complete" = "Tammam dakhalan."; + +/* Button text to cancel downloading keyboard */ +"button-cancel-downloading" = "Halla"; + +/* Button text keyboard download complete */ +"button-download-complete" = "Tamma"; + +/* keyboards label in the Package Information window */ +"keyboards-label" = "Keyboards:"; + +/* fonts label in the Package Information window */ +"fonts-label" = "Fonts:"; + +/* package version label in the Package Information window */ +"package-version-label" = "Package Version:"; + +/* author label in the Package Information window */ +"author-label" = "Author:"; + +/* website label in the Package Information window */ +"website-label" = "Website:"; + +/* copyright label in the Package Information window */ +"copyright-label" = "Copyright:"; + +/* message displayed to alert user to need grant accessibility permission */ +"privacy-alert-text" = "To function properly, Keyman requires accessibility features:\n\nGrant access in System Preferences, Security & Privacy.\nRestart your system."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/MainMenu.strings b/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/MainMenu.strings new file mode 100644 index 0000000000..cea35d0deb --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/shu-latn-n.lproj/MainMenu.strings @@ -0,0 +1,14 @@ +/* Configuration window menu text */ +"P1b-lE-yFw.title" = "Wasiyana..."; + +/* Keyboards menu text */ +"bQa-j9-nHe.title" = "Keyboards"; + +/* Keyboards menu text */ +"goP-aK-3WB.title" = "Keyboards"; + +/* About menu text */ +"kb2-ww-RS3.title" = "Faoug"; + +/* On-Screen Keyboard menu text */ +"s96-JI-YDh.title" = "Keyboard albinshaf"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/Localizable.strings b/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/Localizable.strings new file mode 100644 index 0000000000..bd5a351933 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/Localizable.strings @@ -0,0 +1,71 @@ +/* Message displayed to confirm delete of the Keyman keyboard selected by the user from the keyboard list */ +"message-confirm-delete-keyboard" = "Är du säker på att du vill ta bort tangentbordet%@'?"; + +/* Delete keyboard confirmation info indicating that the delete action cannot be undone */ +"info-cannot-undo-delete-keyboard" = "Du kan inte ångra denna åtgärd."; + +/* Button text to cancel delete of the specified installed Keyman keyboard */ +"button-cancel-delete-keyboard" = "Avbryt"; + +/* Button text to confirm delete of the specified installed Keyman keyboard */ +"button-delete-keyboard" = "Radera"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"message-confirm-install-keyboard" = "Installera Keyman-tangentbordet?"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"info-install-keyboard-filename" = "Vill du att Keyman ska installera tangentbordet från filen '%@'?"; + +/* Button text to cancel installation of the double-clicked Keyman file */ +"button-cancel-install-keyboard" = "Avbryt"; + +/* Button text to confirm installation of the double-clicked Keyman file */ +"button-install-keyboard" = "Installera"; + +/* Message displayed to inform user that .kmp file could not be read/unzipped */ +"message-keyboard-file-unreadable" = "Kunde inte läsa Nyckelmansfilen '%@'."; + +/* Message displayed in Configuration window when keyboard cannot be loaded */ +"message-error-loading-keyboard" = "(error loading keyboard)"; + +/* Message displayed in Configuration window when keyboard metadata cannot be loaded */ +"message-error-unknown-metadata" = "unknown"; + +/* Button text to acknowledge that .kmp file could not be read */ +"button-keyboard-file-unreadable" = "Ok"; + +/* label text to identify Keyman version */ +"version-label-text" = "Version %@"; + +/* Status text for keyboard downloading */ +"message-keyboard-downloading" = "Hämtar..."; + +/* Status text for keyboard download complete */ +"message-keyboard-download-complete" = "Nedladdning slutförd."; + +/* Button text to cancel downloading keyboard */ +"button-cancel-downloading" = "Avbryt"; + +/* Button text keyboard download complete */ +"button-download-complete" = "Klar"; + +/* keyboards label in the Package Information window */ +"keyboards-label" = "Keyboards:"; + +/* fonts label in the Package Information window */ +"fonts-label" = "Fonts:"; + +/* package version label in the Package Information window */ +"package-version-label" = "Package Version:"; + +/* author label in the Package Information window */ +"author-label" = "Author:"; + +/* website label in the Package Information window */ +"website-label" = "Website:"; + +/* copyright label in the Package Information window */ +"copyright-label" = "Copyright:"; + +/* message displayed to alert user to need grant accessibility permission */ +"privacy-alert-text" = "To function properly, Keyman requires accessibility features:\n\nGrant access in System Preferences, Security & Privacy.\nRestart your system."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/MainMenu.strings b/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/MainMenu.strings new file mode 100644 index 0000000000..d7d876bb0e --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/sv.lproj/MainMenu.strings @@ -0,0 +1,14 @@ +/* Configuration window menu text */ +"P1b-lE-yFw.title" = "Konfiguration..."; + +/* Keyboards menu text */ +"bQa-j9-nHe.title" = "Tangentbord"; + +/* Keyboards menu text */ +"goP-aK-3WB.title" = "Tangentbord"; + +/* About menu text */ +"kb2-ww-RS3.title" = "Om"; + +/* On-Screen Keyboard menu text */ +"s96-JI-YDh.title" = "Tangentbord på skärmen"; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/Localizable.strings b/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..e5a48d86b2 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/Localizable.strings @@ -0,0 +1,71 @@ +/* Message displayed to confirm delete of the Keyman keyboard selected by the user from the keyboard list */ +"message-confirm-delete-keyboard" = "Ви дійсно бажаєте видалити клавіатуру '%@'?"; + +/* Delete keyboard confirmation info indicating that the delete action cannot be undone */ +"info-cannot-undo-delete-keyboard" = "Цю дію не можна відмінити."; + +/* Button text to cancel delete of the specified installed Keyman keyboard */ +"button-cancel-delete-keyboard" = "Скасувати"; + +/* Button text to confirm delete of the specified installed Keyman keyboard */ +"button-delete-keyboard" = "Видалити"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"message-confirm-install-keyboard" = "Встановити клавіатуру Keyman?"; + +/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */ +"info-install-keyboard-filename" = "Бажаєте, щоб Keyman встановив клавіатуру з файлу '%@'?"; + +/* Button text to cancel installation of the double-clicked Keyman file */ +"button-cancel-install-keyboard" = "Скасувати"; + +/* Button text to confirm installation of the double-clicked Keyman file */ +"button-install-keyboard" = "Інсталювати"; + +/* Message displayed to inform user that .kmp file could not be read/unzipped */ +"message-keyboard-file-unreadable" = "Не вдалося прочитати файл Keyman '%@."; + +/* Message displayed in Configuration window when keyboard cannot be loaded */ +"message-error-loading-keyboard" = "(error loading keyboard)"; + +/* Message displayed in Configuration window when keyboard metadata cannot be loaded */ +"message-error-unknown-metadata" = "unknown"; + +/* Button text to acknowledge that .kmp file could not be read */ +"button-keyboard-file-unreadable" = "Гаразд"; + +/* label text to identify Keyman version */ +"version-label-text" = "Версія %@"; + +/* Status text for keyboard downloading */ +"message-keyboard-downloading" = "Завантаження..."; + +/* Status text for keyboard download complete */ +"message-keyboard-download-complete" = "Завантаження завершено."; + +/* Button text to cancel downloading keyboard */ +"button-cancel-downloading" = "Скасувати"; + +/* Button text keyboard download complete */ +"button-download-complete" = "Виконано"; + +/* keyboards label in the Package Information window */ +"keyboards-label" = "Keyboards:"; + +/* fonts label in the Package Information window */ +"fonts-label" = "Fonts:"; + +/* package version label in the Package Information window */ +"package-version-label" = "Package Version:"; + +/* author label in the Package Information window */ +"author-label" = "Author:"; + +/* website label in the Package Information window */ +"website-label" = "Website:"; + +/* copyright label in the Package Information window */ +"copyright-label" = "Copyright:"; + +/* message displayed to alert user to need grant accessibility permission */ +"privacy-alert-text" = "To function properly, Keyman requires accessibility features:\n\nGrant access in System Preferences, Security & Privacy.\nRestart your system."; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/MainMenu.strings b/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/MainMenu.strings new file mode 100644 index 0000000000..977e359d09 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/uk.lproj/MainMenu.strings @@ -0,0 +1,14 @@ +/* Configuration window menu text */ +"P1b-lE-yFw.title" = "Налаштування..."; + +/* Keyboards menu text */ +"bQa-j9-nHe.title" = "Клавіатури"; + +/* Keyboards menu text */ +"goP-aK-3WB.title" = "Клавіатури"; + +/* About menu text */ +"kb2-ww-RS3.title" = "Про програму"; + +/* On-Screen Keyboard menu text */ +"s96-JI-YDh.title" = "Екран клавіатура"; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVDownloadResultReceiver.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVDownloadResultReceiver.java index 5c0bcb5d1b..aad514b527 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVDownloadResultReceiver.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVDownloadResultReceiver.java @@ -8,8 +8,8 @@ import android.os.ResultReceiver; import android.widget.Toast; import com.firstvoices.android.FVKmpInstallMode; -import com.tavultesoft.kmea.BaseActivity; -import com.tavultesoft.kmea.util.FileUtils; +import com.keyman.engine.BaseActivity; +import com.keyman.engine.util.FileUtils; import java.io.File; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardListAdapter.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardListAdapter.java index 6deba05efd..460d878949 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardListAdapter.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardListAdapter.java @@ -16,8 +16,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.KeyboardController; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.KeyboardController; class FVKeyboardListAdapter extends ArrayAdapter { diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardSettingsActivity.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardSettingsActivity.java index 17b051258a..7309115326 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardSettingsActivity.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVKeyboardSettingsActivity.java @@ -21,22 +21,22 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardPickerActivity; -import com.tavultesoft.kmea.ModelInfoActivity; -import com.tavultesoft.kmea.ModelPickerActivity; -import com.tavultesoft.kmea.cloud.CloudApiTypes; -import com.tavultesoft.kmea.cloud.CloudDownloadMgr; -import com.tavultesoft.kmea.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.data.LexicalModel; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.MapCompat; +import com.keyman.engine.KMKeyboardDownloaderActivity; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardPickerActivity; +import com.keyman.engine.ModelInfoActivity; +import com.keyman.engine.ModelPickerActivity; +import com.keyman.engine.cloud.CloudApiTypes; +import com.keyman.engine.cloud.CloudDownloadMgr; +import com.keyman.engine.cloud.impl.CloudLexicalModelMetaDataDownloadCallback; +import com.keyman.engine.data.CloudRepository; +import com.keyman.engine.data.Dataset; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.data.KeyboardController; +import com.keyman.engine.data.LexicalModel; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.MapCompat; import java.io.File; import java.util.ArrayList; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVShared.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVShared.java index 3e5f052c1a..95158826ba 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVShared.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/FVShared.java @@ -7,10 +7,10 @@ import android.content.res.AssetManager; import android.net.Uri; import android.util.Log; import android.widget.Toast; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.util.KMLog; import java.io.BufferedReader; import java.io.File; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/MainActivity.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/MainActivity.java index 5e7550261b..305cf968b6 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/MainActivity.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/MainActivity.java @@ -17,11 +17,11 @@ import androidx.appcompat.app.AppCompatActivity; import io.sentry.android.core.SentryAndroid; -import com.tavultesoft.kmea.*; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.util.BCP47; -import com.tavultesoft.kmea.util.DownloadFileUtils; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener; +import com.keyman.engine.*; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.util.BCP47; +import com.keyman.engine.util.DownloadFileUtils; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardDownloadEventListener; import java.io.File; import java.util.HashMap; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/PackageActivity.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/PackageActivity.java index 95fd3edfa2..a34da65b41 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/PackageActivity.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/PackageActivity.java @@ -12,12 +12,12 @@ import android.os.Bundle; import android.widget.Toast; import com.firstvoices.android.FVKmpInstallMode; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KeyboardEventHandler; -import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor; -import com.tavultesoft.kmea.util.FileUtils; -import com.tavultesoft.kmea.util.KMLog; +import com.keyman.engine.KMManager; +import com.keyman.engine.KeyboardEventHandler; +import com.keyman.engine.packages.PackageProcessor; +import com.keyman.engine.packages.LexicalModelPackageProcessor; +import com.keyman.engine.util.FileUtils; +import com.keyman.engine.util.KMLog; import org.json.JSONObject; diff --git a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/SystemKeyboard.java b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/SystemKeyboard.java index b125c6e5f5..95d0c51b37 100644 --- a/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/SystemKeyboard.java +++ b/oem/firstvoices/android/app/src/main/java/com/firstvoices/keyboards/SystemKeyboard.java @@ -20,14 +20,14 @@ import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; import android.widget.FrameLayout; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMManager.KeyboardType; -import com.tavultesoft.kmea.KMHardwareKeyboardInterpreter; -import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener; -import com.tavultesoft.kmea.R; -import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.util.DependencyUtil; -import com.tavultesoft.kmea.util.DependencyUtil.LibraryType; +import com.keyman.engine.KMManager; +import com.keyman.engine.KMManager.KeyboardType; +import com.keyman.engine.KMHardwareKeyboardInterpreter; +import com.keyman.engine.KeyboardEventHandler.OnKeyboardEventListener; +import com.keyman.engine.R; +import com.keyman.engine.data.Keyboard; +import com.keyman.engine.util.DependencyUtil; +import com.keyman.engine.util.DependencyUtil.LibraryType; import io.sentry.android.core.SentryAndroid; import io.sentry.Sentry; diff --git a/package-lock.json b/package-lock.json index 53fcf8026f..21273416fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "developer/src/kmlmc", "developer/src/server", "common/models/*", + "common/tools/*", "common/web/*", "common/predictive-text", "web" @@ -197,6 +198,29 @@ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true }, + "common/tools/sourcemap-path-remapper": { + "name": "@keymanapp/sourcemap-path-remapper", + "license": "MIT", + "dependencies": { + "convert-source-map": "^2.0.0" + }, + "devDependencies": { + "@keymanapp/resources-gosh": "*", + "@types/node": "^10.17.21", + "chai": "^4.3.4", + "mocha": "^10.0.0", + "mocha-teamcity-reporter": "^4.0.0", + "sinon": "^7.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.5.4" + } + }, + "common/tools/sourcemap-path-remapper/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, "common/web/es6-shim": { "name": "@keymanapp/es6-shim", "extraneous": true, @@ -805,6 +829,10 @@ "resolved": "resources/gosh", "link": true }, + "node_modules/@keymanapp/sourcemap-path-remapper": { + "resolved": "common/tools/sourcemap-path-remapper", + "link": true + }, "node_modules/@keymanapp/web-sentry-manager": { "resolved": "common/web/sentry-manager", "link": true @@ -2288,6 +2316,11 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -3344,9 +3377,9 @@ "optional": true }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { "version": "1.8.1", @@ -7533,6 +7566,28 @@ "@keymanapp/resources-gosh": { "version": "file:resources/gosh" }, + "@keymanapp/sourcemap-path-remapper": { + "version": "file:common/tools/sourcemap-path-remapper", + "requires": { + "@keymanapp/resources-gosh": "*", + "@types/node": "^10.17.21", + "chai": "^4.3.4", + "convert-source-map": "^2.0.0", + "mocha": "^10.0.0", + "mocha-teamcity-reporter": "^4.0.0", + "sinon": "^7.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.5.4" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + } + } + }, "@keymanapp/web-sentry-manager": { "version": "file:common/web/sentry-manager", "requires": { @@ -8831,6 +8886,11 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -9648,9 +9708,9 @@ "optional": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-errors": { "version": "1.8.1", diff --git a/package.json b/package.json index df60de59f8..3740150c62 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "developer/src/kmlmc", "developer/src/server", "common/models/*", + "common/tools/*", "common/web/*", "common/predictive-text", "web" diff --git a/resources/build/trigger-builds.inc.sh b/resources/build/trigger-builds.inc.sh index 35234c43c0..9660bd4b74 100644 --- a/resources/build/trigger-builds.inc.sh +++ b/resources/build/trigger-builds.inc.sh @@ -96,6 +96,7 @@ function triggerJenkinsBuild() { if echo "$OUTPUT" | grep -q "\"triggered\":true"; then echo -n " job triggered: " else + echo "##teamcity[buildProblem description='Triggering Jenkins build failed']" echo -n " triggering failed: " fi diff --git a/resources/build/trigger-definitions.inc.sh b/resources/build/trigger-definitions.inc.sh index 83f687d46d..9224d407df 100644 --- a/resources/build/trigger-definitions.inc.sh +++ b/resources/build/trigger-definitions.inc.sh @@ -94,3 +94,15 @@ bc_stable_15_0_windows=(Keyman_Build) bc_stable_15_0_web=(Keymanweb_Build) vcs_stable_15_0=HttpsGithubComKeymanappKeyman + +# Stable 16.0 Build Configurations + +bc_stable_16_0_android=(KeymanAndroid_Build) +bc_stable_16_0_ios=(Keyman_iOS_Master) +bc_stable_16_0_linux=(KeymanLinux_Master pipeline-keyman-packaging_Jenkins) +bc_stable_16_0_mac=(KeymanMac_Master) +bc_stable_16_0_windows=(Keyman_Build) +bc_stable_16_0_web=(Keymanweb_Build) +bc_stable_16_0_developer=(Keyman_Developer_Release) + +vcs_stable_16_0=HttpsGithubComKeymanappKeyman diff --git a/web/.build-builder b/web/.build-builder new file mode 100644 index 0000000000..6e3cca9a02 --- /dev/null +++ b/web/.build-builder @@ -0,0 +1 @@ +The presence of this file tells CI to use the new builder_ style parameters for source/build.sh and unit_tests/test.sh. \ No newline at end of file diff --git a/web/.gitignore b/web/.gitignore index fe29333720..d7d1e04036 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -8,7 +8,6 @@ release/ # Other local files. node_modules/ -unit_tests/modernizr.js source/environment.inc.ts **/.idea/**/*.xml **/*.iml diff --git a/web/README.md b/web/README.md index 90884d5e69..4f49dbdf08 100644 --- a/web/README.md +++ b/web/README.md @@ -14,11 +14,10 @@ The following folders contain the distribution for Keyman Engine for Web: keymanweb-osk.ttf is maintained at https://github.com/silnrsi/font-keymanweb-osk unit_tests Automated testing resources - intermediate Intermediate compiled code; TypeScript source is compiled here before it is minified. - release/web Fully-compiled KeymanWeb modules for testing - release/embedded Fully-compiled KMEA/KMEI modules for inclusion in mobile app builds - release/unminified/web Fully-compiled but non-minified KeymanWeb modules - release/unminified/embedded Fully-compiled KMEA/KMEI modules for inclusion in mobile app builds + build/web/release Fully-compiled KeymanWeb modules for release + build/embed/release Fully-compiled KMEA/KMEI modules for inclusion in mobile app builds + build/web/debug Fully-compiled but non-minified KeymanWeb modules + build/embed/debug Fully-compiled but non-minified KMEA/KMEI modules samples Sample pages demonstrating ways to link with KeymanWeb testing Test-case web-pages for various aspects of KeymanWeb functionality @@ -35,29 +34,7 @@ Refer to the samples for usage details. To view pages using compiled Keyman Engine for Web, 1. cd to **keyman/web/source** 2. Run `./build.sh` - -### `build.sh` options: - -* `-ui` - - to compile desktop user interface modules to output folder -* `-test` - - to compile for testing without copying resources or updating the saved - version number. -* `-embed` - - to compile only the KMEA/KMEI embedded engine. -* `-web` - - to compile only the KeymanWeb engine. -* `-debug_embedded` - - to compile a readable version of the embedded KMEA/KMEI code -* `-no_minify` - - to disable the minified '/release/web' and '/release/embedded' build - sections. - - the '/release/unminified/web' and '/release/unminified/embedded' folders - will still be built. -* `-clean` - - to erase pre-existing build products before the build. - -If more than one target is specified, the last one will take precedence. + - Use `./build.sh --help` for the script's documentation. ### Unit Testing ### @@ -74,7 +51,7 @@ the former command executes. `describe.only`. 2. From this directory, run `./unit_tests/test.sh -debug`. Alternatively, from `web/` or any `web/` subdirectory, - + ``` npm run test -- -debug ``` diff --git a/web/build.sh b/web/build.sh new file mode 100755 index 0000000000..c67b2ae6d3 --- /dev/null +++ b/web/build.sh @@ -0,0 +1,585 @@ +#!/usr/bin/env bash +# +# Compiles the Keyman Engine for Web and its various end-products +# + +# set -x +set -eu + +## 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 + +. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" + +# This script runs from its own folder +cd "$THIS_SCRIPT_PATH" + +# ################################ Main script ################################ + +# Definition of global compile constants + +UI="app/ui" +WEB="app/web" +EMBEDDED="app/embed" + +BUILD_BASE="build" + +DEBUG="debug" +RELEASE="release" +INTERMEDIATE="obj" + +# Composites and outputs the output path corresponding to the build configuration +# specified by the parameters. +# +# ### Parameters +# +# * 1: - build product (app/embed, app/web, app/ui, engine) +# * 2: (optional) - build stage / config (obj, debug, release) +# +# ### Example +# +# ```bash +# cp index.js "$(output_path app/web debug)/index.js" +# ``` +# +# The block above would copy index.js into the build output folder for app/web's debug +# product. +# +# ``` bash +# rm -rf "$(output_path app/web)" +# ``` +# +# The block above is useful for deleting all app/web build products as part of a `clean` +# action. +# +# ### Other Notes +# +# In the future, we may opt to move $INTERMEDIATE stuff underneath both $DEBUG and $RELEASE, +# making it a third param. This is currently unclear, but if so, we'd do +# $DEBUG/$INTERMEDIATE and $RELEASE/$INTERMEDIATE via a third argument. +output_path ( ) { + if [ $# -lt 1 ]; then + builder_die "Insufficient argument count!" + elif [ $# -eq 1 ]; then + # Used by clean: actions + echo "$BUILD_BASE/$1" + else + echo "$BUILD_BASE/$1/$2" + fi +} + +SOURCE="src" + +SENTRY_RELEASE_VERSION="release@$VERSION_WITH_TAG" + +# Ensures that we rely first upon the local npm-based install of Typescript. +# (Facilitates automated setup for build agents.) +PATH="../node_modules/.bin:$PATH" + +compiler="npm run tsc --" +compilecmd="$compiler" + +PREDICTIVE_TEXT_SOURCE="../common/predictive-text/unit_tests/in_browser/resources/models/simple-trie.js" +PREDICTIVE_TEXT_OUTPUT="src/test/manual/web/prediction-ui/simple-en-trie.js" + +builder_check_color "$@" + +DOC_WEB_PRODUCT="${BUILDER_TERM_START}:web${BUILDER_TERM_END} build product" +DOC_TEST_WEB="${BUILDER_TERM_START}test:web${BUILDER_TERM_END}" +DOC_BUILD_EMBED_WEB="${BUILDER_TERM_START}build:embed${BUILDER_TERM_END} and ${BUILDER_TERM_START}build:web${BUILDER_TERM_END}" +DOC_TEST_SYMBOL="actions - ${BUILDER_TERM_START}test${BUILDER_TERM_END}" + +builder_describe "Builds Keyman Engine for Web (KMW)." \ + "@../common/web/keyman-version build" \ + "@../common/web/input-processor build" \ + "@src/tools/building/sourcemap-root build" \ + "clean" \ + "configure" \ + "build" \ + "test Runs unit tests. Only ${DOC_TEST_WEB} is currently defined" \ + ":embed Builds the configuration of KMW used within the Keyman mobile apps" \ + ":engine Builds all common code used by other targets" \ + ":web Builds the website-oriented configuration of Keyman Engine for Web" \ + ":ui Builds the desktop UI modules used by the ${DOC_WEB_PRODUCT}" \ + ":samples Builds only sample & test pages found under src/samples and src/test" \ + ":tools Builds related development + unit-test resources" \ + "--no-minify Skips any minification steps in the build" \ + "--all Sets action to run on KMW's submodules as well if appropriate ($DOC_TEST_SYMBOL)" + +# Possible TODO? +# "upload-symbols Uploads build product to Sentry for error report symbolification. Only defined for $DOC_BUILD_EMBED_WEB" \ + +builder_describe_outputs \ + configure ../node_modules \ + configure:embed ../node_modules \ + configure:engine ../node_modules \ + configure:web ../node_modules \ + configure:ui ../node_modules \ + configure:samples ../node_modules \ + configure:tools ../node_modules \ + build:embed $(output_path $EMBEDDED $RELEASE)/keyman.js \ + build:web $(output_path $WEB $RELEASE)/keymanweb.js \ + build:ui $(output_path $UI $RELEASE)/kmwuibutton.js \ + build:samples $PREDICTIVE_TEXT_OUTPUT +# Deliberately excluding build:tools b/c its script provides the definitions. + +builder_parse "$@" + +#### Build utility methods + definitions #### + +# Build products for each main target. +EMBED_TARGETS=( "keyman.js" ) +WEB_TARGETS=( "keymanweb.js" ) +UI_TARGETS=( "kmwuibutton.js" "kmwuifloat.js" "kmwuitoggle.js" "kmwuitoolbar.js" ) + +: ${CLOSURECOMPILERPATH:=../node_modules/google-closure-compiler-java} +: ${JAVA:=java} + +minifier="$CLOSURECOMPILERPATH/compiler.jar" + +# We'd love to add the argument --source_map_include_content for distribution in the future, +# but Closure doesn't include the TS sources properly at this time. +# +# `checkTypes` is blocked b/c TypeScript can perform our type checking... and it causes an error +# with TypeScript's `extend` implementation (it doesn't recognize a constructor without manual edits). +# We also get a global `this` warning from the same. +# +# `checkVars` is blocked b/c Closure will otherwise fail on TypeScript namespacing, as each original TS +# source file will redeclare the namespace variable, despite being merged into a single file post-compilation. +# +# `jsDocMissingType` prevents errors on type documentation Closure thinks is missing. TypeScript may not +# have the same requirements, and we trust TypeScript over Closure. +minifier_warnings="--jscomp_error=* --jscomp_off=lintChecks --jscomp_off=unusedLocalVariables --jscomp_off=globalThis --jscomp_off=checkTypes --jscomp_off=checkVars --jscomp_off=jsdocMissingType --jscomp_off=uselessCode --jscomp_off=missingRequire --jscomp_off=strictMissingRequire" + +# We use these to prevent Closure from auto-inserting its own polyfills. Turns out, they can break in the +# WebView used by Android API 19, which our app still supported when written. Unsure if it can still occur +# in Android API 21, our current minimum. +# +# Also, we currently apply all needed polyfills either manually or during TS compilation; we don't need the extra, +# excess code. +minifier_lang_specs="--language_in ECMASCRIPT5 --language_out ECMASCRIPT5" +minifycmd="$JAVA -jar $minifier --compilation_level WHITESPACE_ONLY $minifier_warnings --generate_exports $minifier_lang_specs" + +readonly minifier +readonly minifycmd + +minified_sourcemap_cleaner="build/tools/building/sourcemap-root/index.mjs" + +# Fails the build if a specified file does not exist. +assert_exists ( ) { + if ! [ -f $1 ]; then + echo "Build failed: expected file ${COLOR_GREY}$1${COLOR_RESET} is missing." + exit 1 + fi +} + +# $1 - base file name +# $2 - output path +# $3 - optimization level +# $4 - extra path info to add to minified sourcemap "sourceRoot" property. +# $5 - additional output wrapper +minify ( ) { + if [ $# -ge 4 ]; then + cleanerOptions="--clean --sourceRoot $4" + else + cleanerOptions="--clean" + fi + + if [ $# -ge 5 ]; then + wrapper=$5 + else + wrapper="%output%" + fi + + local INPUT="$1" + local INPUT_FILE="$(basename $1)" + local INPUT_DIR="$(dirname $1)" + local INPUT_SOURCEMAP="$INPUT_DIR/$INPUT_FILE.map" + local OUTPUT="$2" + local OUTPUT_FILE="$(basename $2)" + local OUTPUT_SOURCEMAP="$(dirname $2)/$OUTPUT_FILE.map" + + # --source_map_location_mapping - maps paths on INPUT source maps for consumption by Closure. + # ../../.. => keymanapp, ../.. => keymanapp/keyman. We have TS root sources on 'keyman'. + $minifycmd --source_map_input "$INPUT|$INPUT_SOURCEMAP" \ + --create_source_map "$OUTPUT_SOURCEMAP" --source_map_include_content \ + --source_map_location_mapping "$INPUT_DIR|../../.." \ + --js "$INPUT" --compilation_level $3 \ + --js_output_file "$OUTPUT" --warning_level VERBOSE --output_wrapper "$wrapper +//# sourceMappingURL=$INPUT_FILE.map" + + # Now to clean the source map. + assert_exists "$OUTPUT" + assert_exists "$OUTPUT_SOURCEMAP" + + # "Clean" the minified output sourcemaps. + node $minified_sourcemap_cleaner "$INPUT_SOURCEMAP" "$OUTPUT_SOURCEMAP" $cleanerOptions +} + +# Copies specified engine resources to the specified target's build output directories. +# +# ### Parameters +# +# * 1: `product` the product's source path under src/ +# * 2: `outputs` an array of resource types to copy over +# +# ### Example +# +# ```bash +# copy_resources app/web osk ui +# ``` +copy_resources ( ) { + local COMPILE_TARGET=$1 + shift + + local RESOURCES_TO_COPY=("$@") + + # We leave out $INTERMEDIATE here, as it's not a 'release' of any sort and + # thus doesn't need to publish sources or resources. + local CONFIGS=($DEBUG) + + if ! builder_has_option --skip-minify; then + CONFIGS+=($RELEASE) + fi + + echo + + for CONFIG in "${CONFIGS[@]}"; + do + local CONFIG_OUT_PATH="$(output_path $COMPILE_TARGET $CONFIG)" + + echo Copying resources to $CONFIG_OUT_PATH/src + + for RESOURCE in "${RESOURCES_TO_COPY[@]}"; + do + mkdir -p "$CONFIG_OUT_PATH/$RESOURCE" + mkdir -p "$CONFIG_OUT_PATH/src/resources/$RESOURCE" + + echo "- $SOURCE/resources/$RESOURCE/ => $CONFIG_OUT_PATH/$RESOURCE" + cp -Rf "$SOURCE/resources/$RESOURCE" "$CONFIG_OUT_PATH/" >/dev/null + done + + echo + done +} + +# Copies specified source folders corresponding to the specified target's build +# output directories. +# +# ### Parameters +# +# * 1: `product` the product's source path under src/ +# * 2: `outputs` an array of src/ subfolders to copy over +# +# ### Example +# +# ```bash +# copy_sources app/web engine resources/osk +# ``` +copy_sources ( ) { + local COMPILE_TARGET=$1 + shift + + local SOURCES_TO_COPY=("$@") + + # We leave out $INTERMEDIATE here, as it's not a 'release' of any sort and + # thus doesn't need to publish sources or resources. + CONFIGS=($DEBUG) + + if ! builder_has_option --skip-minify; then + CONFIGS+=($RELEASE) + fi + + for CONFIG in "${CONFIGS[@]}"; + do + CONFIG_OUT_PATH="$(output_path $COMPILE_TARGET $CONFIG)" + echo Copying $COMPILE_TARGET sources to $CONFIG_OUT_PATH/src + + rm -rf "$CONFIG_OUT_PATH/src" + mkdir -p "$CONFIG_OUT_PATH/src" + echo $VERSION_PATCH > "$CONFIG_OUT_PATH/src/version.txt" + + for SOURCE_FOLDER in "${SOURCES_TO_COPY[@]}"; + do + echo "- $SOURCE/$SOURCE_FOLDER/ => $CONFIG_OUT_PATH/src/$SOURCE_FOLDER/" + mkdir -p "$CONFIG_OUT_PATH/src/$SOURCE_FOLDER" + cp -Rf "$SOURCE/$SOURCE_FOLDER/"* "$CONFIG_OUT_PATH/src/$SOURCE_FOLDER/" + done + + echo + done +} + +# Compiles compiled scripts from the first folder specified to the second folder specified. +# +# ### Parameters +# +# * 1: `src` the folder containing scripts to be copied +# * 2: `dst` the destination folder for the copy operation +# * 3: `scripts` an array of filenames for expected compiled scripts +# +# ### Example +# +# ```bash +# compile_and_minify build/app/web/obj build/app/web/debug keymanweb.js +# ``` +copy_outputs ( ) { + local src="$1" + local dst="$2" + + shift + shift + + local BASE_SCRIPTS=("$@") + + mkdir -p "$dst" + + for SCRIPTJS in "${BASE_SCRIPTS[@]}"; + do + cp -Rf "$src/$SCRIPTJS" "$dst/" + cp -Rf "$src/$SCRIPTJS.map" "$dst/" + done +} + +# Compiles all build products corresponding to the specified target. +# +# ### Parameters +# +# * 1: `product` the product's source path under src/ +# +# ### Example +# +# ```bash +# compile app/embed +# ``` +compile ( ) { + if [ $# -lt 1 ]; then + fail "Scripting error: insufficient argument count!" + fi + + local COMPILE_TARGET=$1 + local COMPILED_INTERMEDIATE_PATH="$(output_path $COMPILE_TARGET $INTERMEDIATE)" + + $compilecmd -b src/$COMPILE_TARGET -v + + echo $COMPILE_TARGET TypeScript compiled under $COMPILED_INTERMEDIATE_PATH +} + +# Finalizes all build products corresponding to the specified target. +# This should be called after `compile` for all `app/` targets. +# +# ### Parameters +# +# * 1: `product` the product's source path under src/ +# * 2: `outputs` an array of expected output script files for the build +# +# ### Example +# +# ```bash +# compile app/embed +# finalize app/embed keyman.js +# ``` +finalize ( ) { + if [ $# -lt 2 ]; then + fail "Scripting error: insufficient argument count!" + fi + + local COMPILE_TARGET=$1 + local COMPILED_INTERMEDIATE_PATH="$(output_path $COMPILE_TARGET $INTERMEDIATE)" + local DEBUG_OUT_PATH="$(output_path $COMPILE_TARGET $DEBUG)" + local RELEASE_OUT_PATH="$(output_path $COMPILE_TARGET $RELEASE)" + + shift + + local OUTPUT_SCRIPTS=("$@") + + # START: debug output + + mkdir -p "$DEBUG_OUT_PATH" + copy_outputs "$COMPILED_INTERMEDIATE_PATH" "$DEBUG_OUT_PATH" "${OUTPUT_SCRIPTS[@]}" + + echo Compiled $COMPILE_TARGET debug version saved under $DEBUG_OUT_PATH: ${OUTPUT_SCRIPTS[*]} + + # START: release output + if ! builder_has_option --skip-minify; then + for SCRIPT in "${OUTPUT_SCRIPTS[@]}"; + do + minify "$COMPILED_INTERMEDIATE_PATH/$SCRIPT" "$RELEASE_OUT_PATH/$SCRIPT" SIMPLE_OPTIMIZATIONS + done + + echo Compiled $COMPILE_TARGET release version saved under $RELEASE_OUT_PATH: ${OUTPUT_SCRIPTS[*]} + else + # The prior 'release' is now outdated: delete it. + rm -rf "$RELEASE_OUT_PATH" + fi +} + +#### Build action definitions #### + +if builder_start_action configure; then + verify_npm_setup + + if ! builder_has_option --no-minify; then + # NPM install is required for the file to be present. + if ! [ -f $minifier ]; + then + echo File $minifier does not exist: have you set the environment variable \$CLOSURECOMPILERPATH? + exit 1 + fi + fi + + builder_finish_action success configure +fi + +## Clean actions + +# Possible issue: there's no clear rule to `clean` the engine, which is auto-built +# by build:embed and build:web. +# +# Some sort of command to run ONLY for a general `clean` (no target specified) would +# be perfect for that, I think. + +if builder_start_action clean:engine; then + src/engine/build.sh clean + builder_finish_action success clean:engine +fi + +if builder_start_action clean:embed; then + rm -rf "$(output_path $EMBEDDED)" + builder_finish_action success clean:embed +fi + +if builder_start_action clean:web; then + rm -rf "$(output_path $WEB)" + builder_finish_action success clean:web +fi + +if builder_start_action clean:ui; then + rm -rf "$(output_path $UI)" + builder_finish_action success clean:ui +fi + +if builder_start_action clean:samples; then + rm -f $PREDICTIVE_TEXT_OUTPUT + + builder_finish_action success clean:samples +fi + +if builder_start_action clean:tools; then + src/tools/build.sh clean + + builder_finish_action success clean:tools +fi + +## Build actions + +# Adds a simple version 'header' when there's a main engine build product. +if builder_has_action build:embed || \ + builder_has_action build:web || \ + builder_has_action build:ui; then + + echo "" + echo "${COLOR_PURPLE}Compiling version ${VERSION}${COLOR_RESET}" +fi + +echo "" + + +if builder_start_action build:engine; then + src/engine/build.sh build + + builder_finish_action success build:engine +fi + +if builder_start_action build:embed; then + compile $EMBEDDED + finalize $EMBEDDED ${EMBED_TARGETS[@]} + + # The embedded version doesn't use UI modules. + copy_resources $EMBEDDED osk + copy_sources $EMBEDDED app/embed engine resources/osk + + builder_finish_action success build:embed + + # TODO: handle this block somehow. + + # if [ $UPLOAD_EMBED_SENTRY = true ]; then # upload-symbols:embed + # if [ $BUILD_DEBUG_EMBED = true ]; then + # ARTIFACT_FOLDER="release/unminified/embedded" + # pushd $EMBED_OUTPUT_NO_MINI + # else + # ARTIFACT_FOLDER="release/embedded" + # pushd $EMBED_OUTPUTs + # fi + # echo "Uploading to Sentry..." + # npm run sentry-cli -- releases files "$SENTRY_RELEASE_VERSION" upload-sourcemaps --strip-common-prefix $ARTIFACT_FOLDER --rewrite --ext js --ext map --ext ts || fail "Sentry upload failed." + # echo "Upload successful." + # popd + # fi +fi + +### -embed section complete. + +if builder_start_action build:web; then + compile $WEB + finalize $WEB ${WEB_TARGETS[@]} + + # The testing pages need both osk & ui resources in the same place. + copy_resources $WEB osk ui + copy_sources $WEB app/web engine resources/osk + + builder_finish_action success build:web +fi + +if builder_start_action build:ui; then + compile $UI + finalize $UI ${UI_TARGETS[@]} + + copy_resources $UI ui + copy_sources $UI app/ui resources/ui + + builder_finish_action success build:ui +fi + +if builder_start_action build:tools; then + src/tools/build.sh + builder_finish_action success build:tools +fi + +if builder_start_action build:samples; then + # Some test pages actually have build scripts. + ./src/test/manual/embed/android-harness/build.sh # is not yet builder-based. + + echo "Copying samples & test page resources..." + # Should probably be changed into a build script for the `prediction-ui` test page. + cp "${PREDICTIVE_TEXT_SOURCE}" "${PREDICTIVE_TEXT_OUTPUT}" + + # Which could then have a parallel script for `prediction-mtnt` that downloads + extracts + # the current MTNT model. + + builder_finish_action success build:samples; +fi + +if builder_start_action test:web; then + if builder_has_option --all; then + ./test.sh + else + ./test.sh :engine + fi + + builder_finish_action success test:web +fi + +# TODO: handle the block below somehow. + +# # We can only upload 'web' / 'native' artifacts after ALL are done compiling. +# if [ $UPLOAD_WEB_SENTRY = true ]; then +# pushd $WEB_OUTPUT +# echo "Uploading to Sentry..." +# npm run sentry-cli -- releases files "$SENTRY_RELEASE_VERSION" upload-sourcemaps --strip-common-prefix release/web/ --rewrite --ext js --ext map --ext ts || fail "Sentry upload failed." +# echo "Upload successful." +# popd +# fi diff --git a/web/bulk_rendering/tsconfig.json b/web/bulk_rendering/tsconfig.json deleted file mode 100644 index a1ba9c08f7..0000000000 --- a/web/bulk_rendering/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "../../tsconfig-base.json", - - "compilerOptions": { - "allowJs": true, - "inlineSources": true, - "module": "none", - "outFile": "../release/renderer/bulk_render.js", - "sourceMap": true, - "target": "es5" - }, - - "files": [ - "renderer_core.ts", - "../source/kmwdevice.ts", - "../source/utils/styleConstants.ts", - ], - - "references": [ - { "path": "../../common/web/utils", "prepend": true }, - { "path": "../../common/web/keyman-version", "prepend": true }, - { "path": "../../common/web/lm-message-types" }, - ] -} diff --git a/web/ci.sh b/web/ci.sh new file mode 100755 index 0000000000..d9dfcbf586 --- /dev/null +++ b/web/ci.sh @@ -0,0 +1,193 @@ +#!/usr/bin/env bash +# +# Provides a platform-independent implementation of the build steps used for CI when +# building the Keyman Engine for Web. +# + +# set -x +set -eu + +## 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 + +. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" + +WORKING_DIRECTORY=`pwd` + +# This script runs from its own folder +cd "$THIS_SCRIPT_PATH" + +# ################################ Main script ################################ + +S_KEYMAN_COM= + +builder_describe "Defines and implements the CI build steps for Keyman Engine for Web (KMW)." \ + "build" \ + "test Runs all unit tests." \ + "post-test Runs post-test cleanup. Should be run even if a prior step fails." \ + "validate-size Runs the build-size comparison check" \ + "prepare Prepare upload artifacts for specified target(s)" \ + ":s.keyman.com Target: builds artifacts for s.keyman.com " \ + ":downloads.keyman.com Target: builds artifacts for downloads.keyman.com" \ + "--debug Runs this script in local-development mode; reports and tests will be locally logged" \ + "--s.keyman.com=S_KEYMAN_COM Sets the root location of a checked-out s.keyman.com repo" + +builder_parse "$@" + +#### + +if builder_start_action build; then + # Build step: since CI builds start (and should start) from scratch, run the following + # three actions: + # - configure: retrieve all NPM dependencies + # - clean: make extra-sure that no prior build products exist. + # - also useful when validating this script on a local dev machine! + # - build: then do the ACTUAL build. + ./build.sh configure clean build + + builder_finish_action success build +fi + +if builder_start_action test; then + # Testing step: run ALL unit tests, including those of the submodules. + + # For only top-level build-product tests, specify the :engine target + # For all others, specify only the :libraries target + FLAGS= + + if ! builder_has_option --debug; then + FLAGS=--ci + fi + + ./test.sh $FLAGS + + builder_finish_action success test +fi + +if builder_start_action post-test; then + # Always make sure BrowserStack stuff is terminated after the test step. + # Even if it fails and/or hangs. + # No matter what. Otherwise, it may leave a lock-file that breaks a later build! + ../common/test/resources/test_kill_browserstack.sh + + builder_finish_action success post-test +fi + +if builder_start_action validate-size; then + # Performs the web build product size check as reported on Web test PRs. + FLAGS= + + if ! builder_has_option --debug; then + FLAGS=--write-status + fi + + # Do not use --report when in --debug mode; it sets an error code that is VERY difficult to + # catch with our set -e & `trap` setup. + ./src/tools/building/check-build-size.sh $FLAGS + + builder_finish_action success validate-size +fi + +if builder_start_action prepare:s.keyman.com; then + if ! builder_has_option --s.keyman.com; then + builder_die "--s.keyman.com is unset!" + fi + + if builder_has_option --debug; then + # First phase: make sure the s.keyman.com repo is locally-available and up to date. + pushd "$S_KEYMAN_COM" + + # For testing on a local development machine / a machine with the repo already loaded. + git checkout master + git pull + popd + fi + + # Second phase: copy the artifacts over + + # The main build products are expected to reside at the root of this folder. + BASE_PUBLISH_FOLDER="$S_KEYMAN_COM/kmw/engine/$VERSION" + mkdir -p "$BASE_PUBLISH_FOLDER" + + cp -Rf build/app/web/release/* "$BASE_PUBLISH_FOLDER" + cp -Rf build/app/ui/release/* "$BASE_PUBLISH_FOLDER" + + # Third phase: tweak the sourcemaps + # We can use an alt-mode of Web's sourcemap-root tool for this. + for sourcemap in "$BASE_PUBLISH_FOLDER/"*.map; do + node build/tools/building/sourcemap-root/index.mjs null "$sourcemap" --sourceRoot "https://s.keyman.com/kmw/engine/$VERSION/src" + done + + # Actual construction of the PR will be left to CI-config scripting for now. + + builder_finish_action success prepare:s.keyman.com +fi + +# Note: for now, this command is used to prepare the artifacts used by the download site, but +# NOT to actually UPLOAD them via rsync or to produce related .download_info files. +if builder_start_action prepare:downloads.keyman.com; then + UPLOAD_PATH="build/upload/$VERSION" + + # --- First action artifact - the KMW zip file --- + ZIP="$UPLOAD_PATH/keymanweb-$VERSION.zip" + + mkdir -p "$UPLOAD_PATH" + + # On Windows, we use 7-zip (SEVEN_Z_HOME env var). On other platforms, we use zip. + + COMPRESS_CMD= + COMPRESS_ADD= + + # Marc's preference; use $SEVEN_Z_HOME and have the BAs set up with THAT as an env var. + if [ ! -z "${SEVEN_Z_HOME+x}" ]; then + COMPRESS_CMD="$SEVEN_Z_HOME/7z" + COMPRESS_ADD="a -bd -bb0 -r" # add, hide progress, log level 0, recursive + fi + + if [[ -z "${COMPRESS_CMD}" ]] ; then + if command -v zip &> /dev/null; then + # Note: does not support within-archive renames! + COMPRESS_CMD=zip + COMPRESS_ADD="-r" + else + builder_die "7z and zip commands are both unavailable" + fi + fi + + pushd build/app/web/release + "${COMPRESS_CMD}" $COMPRESS_ADD ../../../../$ZIP * + cd .. + "${COMPRESS_CMD}" $COMPRESS_ADD ../../../$ZIP debug + popd + + pushd build/app/ui/release + "${COMPRESS_CMD}" $COMPRESS_ADD ../../../../$ZIP * + cd .. + "${COMPRESS_CMD}" $COMPRESS_ADD ../../../$ZIP debug + popd + + # --- Second action artifact - the 'static' folder (hosted user testing on downloads.keyman.com) --- + + echo "" + echo "Building \`static/\` folder for long-term hosting of testing resources..." + STATIC="$UPLOAD_PATH/static" + mkdir -p "$STATIC" + + mkdir -p "$STATIC/build" + cp -rf build/app "$STATIC/build/app" + cp -rf build/engine "$STATIC/build/engine" + cp -rf build/tools "$STATIC/build/tools" + # avoid build/upload, since that's the folder we're building! + + cp -f index.html "$STATIC/index.html" + + mkdir -p "$STATIC/src/tools" + cp -rf src/tools/testing "$STATIC/src/tools/testing" + cp -rf src/test "$STATIC/src/test" + cp -rf src/samples "$STATIC/src/samples" + + builder_finish_action success prepare:downloads.keyman.com +fi \ No newline at end of file diff --git a/web/index.html b/web/index.html index be2a1c86b7..909d3fc4f3 100644 --- a/web/index.html +++ b/web/index.html @@ -2,17 +2,17 @@ - - + + - + - + - - + + KeymanWeb Testing - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + + - - + +

KeymanWeb Sample Page - Fully Compiled/Minified Source

- -
+

Type in your language in this text area:

- +

or in this input field:

- +

Add a keyboard by keyboard name:

- +

Add a keyboard by BCP-47 language code:

Add a keyboard by language name:

- +

Return to samples home page

- - + * + *** + --> diff --git a/web/samples/multilingual.html b/web/src/samples/multilingual.html similarity index 70% rename from web/samples/multilingual.html rename to web/src/samples/multilingual.html index d4646c5357..de2174a49a 100644 --- a/web/samples/multilingual.html +++ b/web/src/samples/multilingual.html @@ -2,30 +2,30 @@ - - + + - + - + - - + + KeymanWeb Multilingual Sample Page - - - - - + #KeymanWebControl {width:50%; min-width:600px;} + + + + - - + + - - + - - - + + +

KeymanWeb Multilingual Page Example

- -
- +
+

Type in the following text area in your language:

- +

or in this input field:

- +

Return to samples home page

diff --git a/web/samples/samplehdr.js b/web/src/samples/samplehdr.js similarity index 100% rename from web/samples/samplehdr.js rename to web/src/samples/samplehdr.js diff --git a/web/samples/unminified.html b/web/src/samples/unminified.html similarity index 77% rename from web/samples/unminified.html rename to web/src/samples/unminified.html index ca24b402af..8a9b82bac8 100644 --- a/web/samples/unminified.html +++ b/web/src/samples/unminified.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Unminified Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

KeymanWeb Sample Page - Unminified Source

- -
+

Type in your language in this text area:

- +

or in this input field:

- +

Add a keyboard by keyboard name:

- +

Add a keyboard by BCP-47 language code:

Add a keyboard by language name:

- +

Return to samples home page

- - + * + *** + --> diff --git a/web/samples/us-1.0.js b/web/src/samples/us-1.0.js similarity index 100% rename from web/samples/us-1.0.js rename to web/src/samples/us-1.0.js diff --git a/web/src/test/auto/.gitignore b/web/src/test/auto/.gitignore new file mode 100644 index 0000000000..30259a5818 --- /dev/null +++ b/web/src/test/auto/.gitignore @@ -0,0 +1 @@ +modernizr.js \ No newline at end of file diff --git a/web/unit_tests/CI.conf.js b/web/src/test/auto/CI.conf.js similarity index 50% rename from web/unit_tests/CI.conf.js rename to web/src/test/auto/CI.conf.js index c06c62cb78..d3d2b02e40 100644 --- a/web/unit_tests/CI.conf.js +++ b/web/src/test/auto/CI.conf.js @@ -1,4 +1,4 @@ var BASE_CONFIG = require("./base.conf.js"); -var ci_config_adapter = require("../../common/test/resources/karma-browserstack-config.js"); +var ci_config_adapter = require("../../../../common/test/resources/karma-browserstack-config.js"); module.exports = ci_config_adapter(BASE_CONFIG, "full"); \ No newline at end of file diff --git a/web/unit_tests/base.conf.js b/web/src/test/auto/base.conf.js similarity index 60% rename from web/unit_tests/base.conf.js rename to web/src/test/auto/base.conf.js index 8ae6626be8..6a93275e02 100644 --- a/web/unit_tests/base.conf.js +++ b/web/src/test/auto/base.conf.js @@ -6,7 +6,7 @@ module.exports = { // base path that will be used to resolve all patterns (eg. files, exclude) // set to Keyman repo base. - basePath: '../..', + basePath: '../../../..', // Safeguards against disconnecting after starting tests. browserNoActivityTimeout: 60000, @@ -37,31 +37,34 @@ module.exports = { // list of files / patterns to load in the browser files: [ - 'web/unit_tests/modernizr.js', // A dependency-managed utility script that helps with browser feature detection. - 'web/tools/element-wrappers/build/index.js', // Defines com.keyman.dom objects separate from KMW for unit testing. - 'web/tools/device-detect/build/index.js', // Defines com.keyman.utils.Device, separated from KMW for use in unit test setup. - 'web/tools/recorder/build/index.js', // The object definitions used to generate/replicate key events for engine tests. + 'web/src/test/auto/modernizr.js', // A dependency-managed utility script that helps with browser feature detection. + 'web/build/engine/element-wrappers/obj/index.bundled.js', // Defines com.keyman.dom objects separate from KMW for unit testing. + 'web/build/engine/device-detect/obj/index.bundled.js', // Defines com.keyman.utils.Device, separated from KMW for use in unit test setup. + 'web/build/tools/testing/recorder/obj/index.js', // The object definitions used to generate/replicate key events for engine tests. // Includes KMW's Device class, which is used by test_utils below. - 'web/unit_tests/test_init_check.js', // Ensures that tests will initialize properly + 'web/src/test/auto/test_init_check.js', // Ensures that tests will initialize properly 'common/test/resources/timeout-adapter.js', // Handles configuration timeout setup at runtime. - 'web/unit_tests/test_utils.js', // A basic utility script useful for constructing tests - 'web/unit_tests/cases/**/*.js', // Where the tests actually reside. + 'web/src/test/auto/test_utils.js', // A basic utility script useful for constructing tests + 'web/src/test/auto/cases/**/*.js', // Where the tests actually reside. 'common/test/resources/json/**/*.json', // Where pre-loaded JSON resides. {pattern: 'common/test/resources/fixtures/**/*.html', watched: true}, // HTML structures useful for testing. {pattern: 'common/test/resources/**/*.*', watched: true, served: true, included: false}, // General testing resources. - {pattern: 'web/release/unminified/web/**/*.css', watched: false, served: true, included: false}, // OSK resources - {pattern: 'web/release/unminified/web/**/*.gif', watched: false, served: true, included: false}, // OSK resources - {pattern: 'web/release/unminified/web/**/*.png', watched: false, served: true, included: false}, // OSK resources - {pattern: 'web/release/unminified/web/**/*.ttf', watched: false, served: true, included: false}, // OSK resources - {pattern: 'web/release/unminified/web/*.js', watched: true, served: true, included: false}, // The actual KMW code. - {pattern: 'web/release/unminified/web/*.map', watched: true, served: true, included: false}, // + sourcemaps. - {pattern: 'web/tools/recorder/build/index.js.map', watched: true, served: true, included: false}, - {pattern: 'web/tools/element-wrappers/build/index.js.map', watched: true, served: true, included: false}, - {pattern: 'web/tools/device-detect/build/index.js.map', watched: true, served: true, included: false} + {pattern: 'web/build/app/web/debug/**/*.css', watched: false, served: true, included: false}, // OSK resources + {pattern: 'web/build/app/web/debug/**/*.gif', watched: false, served: true, included: false}, // OSK resources + {pattern: 'web/build/app/web/debug/**/*.png', watched: false, served: true, included: false}, // OSK resources + {pattern: 'web/build/app/web/debug/**/*.ttf', watched: false, served: true, included: false}, // OSK resources + {pattern: 'web/build/app/web/debug/*.js', watched: true, served: true, included: false}, // The actual KMW code. + {pattern: 'web/build/app/web/debug/*.map', watched: true, served: true, included: false}, // + sourcemaps. + {pattern: 'web/build/app/ui/debug/*.js', watched: true, served: true, included: false}, // The actual KMW UI code. + {pattern: 'web/build/app/ui/debug/*.map', watched: true, served: true, included: false}, // + sourcemaps. + {pattern: 'web/build/tools/testing/recorder/obj/index.js.map', watched: true, served: true, included: false}, + {pattern: 'web/build/engine/element-wrappers/obj/index.bundled.js.map', watched: true, served: true, included: false}, + {pattern: 'web/build/engine/device-detect/obj/index.bundled.js.map', watched: true, served: true, included: false} ], proxies: { - "/source/": "/base/web/release/unminified/web/", + "/source/": "/base/web/build/app/web/debug/", + "/ui-source/": "/base/web/build/app/ui/debug/", "/resources/": "/base/common/test/resources/", "/source/recorder_InputEvents.js.map": "/base/common/tests/recorder_InputEvents.js.map" }, diff --git a/web/unit_tests/cases/attachmentAPI.js b/web/src/test/auto/cases/attachmentAPI.js similarity index 99% rename from web/unit_tests/cases/attachmentAPI.js rename to web/src/test/auto/cases/attachmentAPI.js index 7cedb476b5..0fe4d933b2 100644 --- a/web/unit_tests/cases/attachmentAPI.js +++ b/web/src/test/auto/cases/attachmentAPI.js @@ -12,7 +12,7 @@ describe('Attachment API', function() { const kbd1 = loadKeyboardFromJSON("/keyboards/lao_2008_basic.json", testconfig.timeouts.scriptLoad, { passive: true }); const kbd2 = loadKeyboardFromJSON("/keyboards/khmer_angkor.json", testconfig.timeouts.scriptLoad, { passive: true }); return Promise.all([kbd1, kbd2]).then(() => { - return keyman.setActiveKeyboard("lao_2008_basic"); + return keyman.setActiveKeyboard("lao_2008_basic", "lo"); }); }); }); diff --git a/web/unit_tests/cases/basics.js b/web/src/test/auto/cases/basics.js similarity index 100% rename from web/unit_tests/cases/basics.js rename to web/src/test/auto/cases/basics.js diff --git a/web/unit_tests/cases/element_interfaces.js b/web/src/test/auto/cases/element_interfaces.js similarity index 100% rename from web/unit_tests/cases/element_interfaces.js rename to web/src/test/auto/cases/element_interfaces.js diff --git a/web/unit_tests/cases/engine.js b/web/src/test/auto/cases/engine.js similarity index 100% rename from web/unit_tests/cases/engine.js rename to web/src/test/auto/cases/engine.js diff --git a/web/unit_tests/cases/engine_chirality.js b/web/src/test/auto/cases/engine_chirality.js similarity index 100% rename from web/unit_tests/cases/engine_chirality.js rename to web/src/test/auto/cases/engine_chirality.js diff --git a/web/unit_tests/cases/events.js b/web/src/test/auto/cases/events.js similarity index 100% rename from web/unit_tests/cases/events.js rename to web/src/test/auto/cases/events.js diff --git a/web/unit_tests/cases/target_mocks.js b/web/src/test/auto/cases/target_mocks.js similarity index 100% rename from web/unit_tests/cases/target_mocks.js rename to web/src/test/auto/cases/target_mocks.js diff --git a/web/unit_tests/cases/test_config.js b/web/src/test/auto/cases/test_config.js similarity index 100% rename from web/unit_tests/cases/test_config.js rename to web/src/test/auto/cases/test_config.js diff --git a/web/unit_tests/cases/text_selection.js b/web/src/test/auto/cases/text_selection.js similarity index 100% rename from web/unit_tests/cases/text_selection.js rename to web/src/test/auto/cases/text_selection.js diff --git a/web/unit_tests/manual.conf.js b/web/src/test/auto/manual.conf.js similarity index 100% rename from web/unit_tests/manual.conf.js rename to web/src/test/auto/manual.conf.js diff --git a/web/unit_tests/modernizr.config.json b/web/src/test/auto/modernizr.config.json similarity index 100% rename from web/unit_tests/modernizr.config.json rename to web/src/test/auto/modernizr.config.json diff --git a/web/unit_tests/test_init_check.js b/web/src/test/auto/test_init_check.js similarity index 100% rename from web/unit_tests/test_init_check.js rename to web/src/test/auto/test_init_check.js diff --git a/web/unit_tests/test_utils.js b/web/src/test/auto/test_utils.js similarity index 99% rename from web/unit_tests/test_utils.js rename to web/src/test/auto/test_utils.js index 4656785c29..939badd473 100644 --- a/web/unit_tests/test_utils.js +++ b/web/src/test/auto/test_utils.js @@ -51,7 +51,7 @@ var setupKMW = function(kmwOptions, timeout) { let uiPromise; if(ui) { - uiPromise = setupScript('source/kmwui' + ui + '.js', timeout, (scriptEle) => { + uiPromise = setupScript('ui-source/kmwui' + ui + '.js', timeout, (scriptEle) => { fixture.el.appendChild(scriptEle); }); diff --git a/web/testing/android-harness/.gitignore b/web/src/test/manual/embed/android-harness/.gitignore similarity index 100% rename from web/testing/android-harness/.gitignore rename to web/src/test/manual/embed/android-harness/.gitignore diff --git a/web/src/test/manual/embed/android-harness/build.sh b/web/src/test/manual/embed/android-harness/build.sh new file mode 100755 index 0000000000..d0ca13f748 --- /dev/null +++ b/web/src/test/manual/embed/android-harness/build.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +set -eu + +## 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 + +THIS_DIR="$(dirname "$THIS_SCRIPT")" + +mkdir -p "$THIS_DIR/host" +cp -R "$KEYMAN_ROOT/android/KMEA/app/src/main/assets/"* "$THIS_DIR/host/" +cp "$KEYMAN_ROOT/web/build/app/embed/debug/keyman.js" "$THIS_DIR/host/keymanandroid.js" +cp "$KEYMAN_ROOT/web/build/app/embed/debug/keyman.js.map" "$THIS_DIR/host/keyman.js.map" +cp "$KEYMAN_ROOT/web/build/app/embed/debug/osk/kmwosk.css" "$THIS_DIR/host/kmwosk.css" +cp "$KEYMAN_ROOT/web/build/app/embed/debug/osk/globe-hint.css" "$THIS_DIR/host/globe-hint.css" +cp "$KEYMAN_ROOT/web/build/app/embed/debug/osk/keymanweb-osk.ttf" "$THIS_DIR/host/keymanweb-osk.ttf" + +# We shouldn't rely on a prior Android build for these files! We can retrieve them separately. +cp "$KEYMAN_ROOT/common/web/sentry-manager/build/index.js" "$THIS_DIR/host/keyman-sentry.js" +cp "$KEYMAN_ROOT/node_modules/es6-shim/es6-shim.min.js" "$THIS_DIR/host/es6-shim.min.js" + +# Test keyboards + +cp "$KEYMAN_ROOT/web/src/test/manual/web/web_context_tests.js" "$THIS_DIR/host/" +# android\KMEA\app\src\main\assets\keyboard.html \ No newline at end of file diff --git a/web/testing/android-harness/host.css b/web/src/test/manual/embed/android-harness/host.css similarity index 100% rename from web/testing/android-harness/host.css rename to web/src/test/manual/embed/android-harness/host.css diff --git a/web/testing/android-harness/host.js b/web/src/test/manual/embed/android-harness/host.js similarity index 100% rename from web/testing/android-harness/host.js rename to web/src/test/manual/embed/android-harness/host.js diff --git a/web/testing/android-harness/index.html b/web/src/test/manual/embed/android-harness/index.html similarity index 100% rename from web/testing/android-harness/index.html rename to web/src/test/manual/embed/android-harness/index.html diff --git a/web/testing/android-harness/jquery.min.js b/web/src/test/manual/embed/android-harness/jquery.min.js similarity index 100% rename from web/testing/android-harness/jquery.min.js rename to web/src/test/manual/embed/android-harness/jquery.min.js diff --git a/web/src/test/manual/embed/index.html b/web/src/test/manual/embed/index.html new file mode 100644 index 0000000000..8d74c612a2 --- /dev/null +++ b/web/src/test/manual/embed/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + KeymanWeb Testing + + + +

KeymanWeb 15 Testing - for embedded contexts

+

Android test harness

+

Return to main index. + + diff --git a/web/testing/attachment-api/editableFrame.html b/web/src/test/manual/web/attachment-api/editableFrame.html similarity index 100% rename from web/testing/attachment-api/editableFrame.html rename to web/src/test/manual/web/attachment-api/editableFrame.html diff --git a/web/testing/attachment-api/iframe.html b/web/src/test/manual/web/attachment-api/iframe.html similarity index 100% rename from web/testing/attachment-api/iframe.html rename to web/src/test/manual/web/attachment-api/iframe.html diff --git a/web/testing/attachment-api/index.html b/web/src/test/manual/web/attachment-api/index.html similarity index 96% rename from web/testing/attachment-api/index.html rename to web/src/test/manual/web/attachment-api/index.html index 69fb497c15..0ee6896af4 100644 --- a/web/testing/attachment-api/index.html +++ b/web/src/test/manual/web/attachment-api/index.html @@ -23,7 +23,7 @@ - + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + - +

KeymanWeb: Test IFrame connectivity

- -
+

This test page exists for IFrame functionality tests.


-
+

Return to testing home page

- - + + - - + * + *** + --> diff --git a/web/testing/build-visual-keyboard/index.html b/web/src/test/manual/web/build-visual-keyboard/index.html similarity index 92% rename from web/testing/build-visual-keyboard/index.html rename to web/src/test/manual/web/build-visual-keyboard/index.html index 5cef51b833..a572a638a7 100644 --- a/web/testing/build-visual-keyboard/index.html +++ b/web/src/test/manual/web/build-visual-keyboard/index.html @@ -24,7 +24,7 @@ - + - + + + + - +

KeymanWeb: Keyboard documentation rendering

diff --git a/web/testing/caps-lock-layer-3620/caps_lock_layer_3620.js b/web/src/test/manual/web/caps-lock-layer-3620/caps_lock_layer_3620.js similarity index 100% rename from web/testing/caps-lock-layer-3620/caps_lock_layer_3620.js rename to web/src/test/manual/web/caps-lock-layer-3620/caps_lock_layer_3620.js diff --git a/web/testing/caps-lock-layer-3620/full_caps_3620_3621.js b/web/src/test/manual/web/caps-lock-layer-3620/full_caps_3620_3621.js similarity index 100% rename from web/testing/caps-lock-layer-3620/full_caps_3620_3621.js rename to web/src/test/manual/web/caps-lock-layer-3620/full_caps_3620_3621.js diff --git a/web/testing/caps-lock-layer-3620/index.html b/web/src/test/manual/web/caps-lock-layer-3620/index.html similarity index 94% rename from web/testing/caps-lock-layer-3620/index.html rename to web/src/test/manual/web/caps-lock-layer-3620/index.html index 9acf2881be..0c8981a725 100644 --- a/web/testing/caps-lock-layer-3620/index.html +++ b/web/src/test/manual/web/caps-lock-layer-3620/index.html @@ -17,7 +17,7 @@ - + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

KeymanWeb Sample Page - Chirality Testing

This page is designed to stress-test the new support for chiral modifiers and state keys.

Be sure to reference the developer console for additional feedback.


- + * + *** + --> diff --git a/web/testing/chirality/utilities.js b/web/src/test/manual/web/chirality/utilities.js similarity index 100% rename from web/testing/chirality/utilities.js rename to web/src/test/manual/web/chirality/utilities.js diff --git a/web/testing/ckeditor/index.html b/web/src/test/manual/web/ckeditor/index.html similarity index 94% rename from web/testing/ckeditor/index.html rename to web/src/test/manual/web/ckeditor/index.html index a7555db699..baa6f9e422 100644 --- a/web/testing/ckeditor/index.html +++ b/web/src/test/manual/web/ckeditor/index.html @@ -17,7 +17,7 @@ - + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - + - + + - - + +

KeymanWeb Testing Page - Desktop UI module Testing

This page is designed to facilitate testing of various aspects of the Button UI for KeymanWeb. @@ -62,16 +62,16 @@

  • Toolbar UI
  • - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -79,20 +79,20 @@
    - - + * + *** + --> diff --git a/web/testing/desktop-ui/float.html b/web/src/test/manual/web/desktop-ui/float.html similarity index 74% rename from web/testing/desktop-ui/float.html rename to web/src/test/manual/web/desktop-ui/float.html index e15381a032..049fa9d316 100644 --- a/web/testing/desktop-ui/float.html +++ b/web/src/test/manual/web/desktop-ui/float.html @@ -2,41 +2,41 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Unminified Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - + - + + - - + +

    KeymanWeb Testing Page - Desktop UI module Testing

    This page is designed to facilitate testing of various aspects of the Float UI for KeymanWeb. @@ -61,10 +61,10 @@

  • Toggle UI
  • Toolbar UI
  • -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -72,20 +72,20 @@
    - - + * + *** + --> diff --git a/web/testing/desktop-ui/index.html b/web/src/test/manual/web/desktop-ui/index.html similarity index 100% rename from web/testing/desktop-ui/index.html rename to web/src/test/manual/web/desktop-ui/index.html diff --git a/web/testing/desktop-ui/toggle.html b/web/src/test/manual/web/desktop-ui/toggle.html similarity index 74% rename from web/testing/desktop-ui/toggle.html rename to web/src/test/manual/web/desktop-ui/toggle.html index 9f7f79df7c..6aa99b1c5a 100644 --- a/web/testing/desktop-ui/toggle.html +++ b/web/src/test/manual/web/desktop-ui/toggle.html @@ -2,41 +2,41 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Unminified Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - + - + + - - + +

    KeymanWeb Testing Page - Desktop UI module Testing

    This page is designed to facilitate testing of various aspects of the Toggle UI for KeymanWeb. @@ -61,10 +61,10 @@

  • Toggle UI (you are here)
  • Toolbar UI
  • -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -72,20 +72,20 @@
    - - + * + *** + --> diff --git a/web/testing/desktop-ui/toolbar.html b/web/src/test/manual/web/desktop-ui/toolbar.html similarity index 74% rename from web/testing/desktop-ui/toolbar.html rename to web/src/test/manual/web/desktop-ui/toolbar.html index b7f0d3432f..8612bb37c9 100644 --- a/web/testing/desktop-ui/toolbar.html +++ b/web/src/test/manual/web/desktop-ui/toolbar.html @@ -2,49 +2,49 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Unminified Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + +

    KeymanWeb Testing Page - Desktop UI module Testing

    This page is designed to facilitate testing of various aspects of the Toolbar UI for KeymanWeb. Originally developed to help address issue #1275. @@ -57,16 +57,16 @@

  • Toolbar UI (you are here)
  • - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -74,20 +74,20 @@
    - - + * + *** + --> diff --git a/web/testing/empty-row/afghan_turkmen-1.1.js b/web/src/test/manual/web/empty-row/afghan_turkmen-1.1.js similarity index 100% rename from web/testing/empty-row/afghan_turkmen-1.1.js rename to web/src/test/manual/web/empty-row/afghan_turkmen-1.1.js diff --git a/web/testing/empty-row/empty_row-1.0.js b/web/src/test/manual/web/empty-row/empty_row-1.0.js similarity index 100% rename from web/testing/empty-row/empty_row-1.0.js rename to web/src/test/manual/web/empty-row/empty_row-1.0.js diff --git a/web/testing/empty-row/index.html b/web/src/test/manual/web/empty-row/index.html similarity index 95% rename from web/testing/empty-row/index.html rename to web/src/test/manual/web/empty-row/index.html index c53b4dad5e..460d544b64 100644 --- a/web/testing/empty-row/index.html +++ b/web/src/test/manual/web/empty-row/index.html @@ -23,7 +23,7 @@ - + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb Sample Page - Keyboard Registration Check

    This page is designed to test KeymanWeb's behavior when being told to load a keyboard multiple times, both via @@ -57,51 +57,51 @@

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Add a keyboard by keyboard name:

    - +

    Add a keyboard by BCP-47 language code:

    Add a keyboard by language name:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/issue103/samplehdr.js b/web/src/test/manual/web/issue103/samplehdr.js similarity index 100% rename from web/testing/issue103/samplehdr.js rename to web/src/test/manual/web/issue103/samplehdr.js diff --git a/web/testing/issue115/index.html b/web/src/test/manual/web/issue115/index.html similarity index 72% rename from web/testing/issue115/index.html rename to web/src/test/manual/web/issue115/index.html index b5b5b770d8..5c9ffeb3af 100644 --- a/web/testing/issue115/index.html +++ b/web/src/test/manual/web/issue115/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - - + + + - - + +

    KeymanWeb: Long-press on numeric and symbolic layer testing

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/issue115/issue115a-layout.js b/web/src/test/manual/web/issue115/issue115a-layout.js similarity index 100% rename from web/testing/issue115/issue115a-layout.js rename to web/src/test/manual/web/issue115/issue115a-layout.js diff --git a/web/testing/issue115/issue115a.js b/web/src/test/manual/web/issue115/issue115a.js similarity index 100% rename from web/testing/issue115/issue115a.js rename to web/src/test/manual/web/issue115/issue115a.js diff --git a/web/testing/issue115/issue115a.kmn b/web/src/test/manual/web/issue115/issue115a.kmn similarity index 100% rename from web/testing/issue115/issue115a.kmn rename to web/src/test/manual/web/issue115/issue115a.kmn diff --git a/web/testing/issue115/issue115a.kmx b/web/src/test/manual/web/issue115/issue115a.kmx similarity index 100% rename from web/testing/issue115/issue115a.kmx rename to web/src/test/manual/web/issue115/issue115a.kmx diff --git a/web/testing/issue115/issue115a.kvk b/web/src/test/manual/web/issue115/issue115a.kvk similarity index 100% rename from web/testing/issue115/issue115a.kvk rename to web/src/test/manual/web/issue115/issue115a.kvk diff --git a/web/testing/issue115/issue115a.kvks b/web/src/test/manual/web/issue115/issue115a.kvks similarity index 100% rename from web/testing/issue115/issue115a.kvks rename to web/src/test/manual/web/issue115/issue115a.kvks diff --git a/web/testing/issue116/index.html b/web/src/test/manual/web/issue116/index.html similarity index 72% rename from web/testing/issue116/index.html rename to web/src/test/manual/web/issue116/index.html index 1b08ac3126..b8b49e1375 100644 --- a/web/testing/issue116/index.html +++ b/web/src/test/manual/web/issue116/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - - + + + - - + +

    KeymanWeb: Next-layer processing testing

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/issue116/next_layer_tests-layout.js b/web/src/test/manual/web/issue116/next_layer_tests-layout.js similarity index 100% rename from web/testing/issue116/next_layer_tests-layout.js rename to web/src/test/manual/web/issue116/next_layer_tests-layout.js diff --git a/web/testing/issue116/next_layer_tests.js b/web/src/test/manual/web/issue116/next_layer_tests.js similarity index 100% rename from web/testing/issue116/next_layer_tests.js rename to web/src/test/manual/web/issue116/next_layer_tests.js diff --git a/web/testing/issue116/next_layer_tests.kmn b/web/src/test/manual/web/issue116/next_layer_tests.kmn similarity index 100% rename from web/testing/issue116/next_layer_tests.kmn rename to web/src/test/manual/web/issue116/next_layer_tests.kmn diff --git a/web/testing/issue1332/ANDIKAAFR-R.TTF b/web/src/test/manual/web/issue1332/ANDIKAAFR-R.TTF similarity index 100% rename from web/testing/issue1332/ANDIKAAFR-R.TTF rename to web/src/test/manual/web/issue1332/ANDIKAAFR-R.TTF diff --git a/web/testing/issue1332/header.js b/web/src/test/manual/web/issue1332/header.js similarity index 100% rename from web/testing/issue1332/header.js rename to web/src/test/manual/web/issue1332/header.js diff --git a/web/testing/issue1332/index.html b/web/src/test/manual/web/issue1332/index.html similarity index 73% rename from web/testing/issue1332/index.html rename to web/src/test/manual/web/issue1332/index.html index e2d6110f47..4b8715a7f1 100644 --- a/web/testing/issue1332/index.html +++ b/web/src/test/manual/web/issue1332/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Issue 1332 - Mixed case of TTF files - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb Sample Page - Mixed Case of TTF font files

    Previously, KMW was not applying .TTF fonts on mobile devices.

    -

    See issue #1332 +

    See issue #1332 for details on what this test is all about.


    - + * + *** + --> diff --git a/web/testing/issue1332/sil_cameroon_qwerty.js b/web/src/test/manual/web/issue1332/sil_cameroon_qwerty.js similarity index 100% rename from web/testing/issue1332/sil_cameroon_qwerty.js rename to web/src/test/manual/web/issue1332/sil_cameroon_qwerty.js diff --git a/web/testing/issue160/index.html b/web/src/test/manual/web/issue160/index.html similarity index 71% rename from web/testing/issue160/index.html rename to web/src/test/manual/web/issue160/index.html index 74d8a2b5d6..ac3191008a 100644 --- a/web/testing/issue160/index.html +++ b/web/src/test/manual/web/issue160/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb #160 - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - - + + + - - + +

    KeymanWeb #160

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/issue160/issue160-layout.js b/web/src/test/manual/web/issue160/issue160-layout.js similarity index 100% rename from web/testing/issue160/issue160-layout.js rename to web/src/test/manual/web/issue160/issue160-layout.js diff --git a/web/testing/issue160/issue160.js b/web/src/test/manual/web/issue160/issue160.js similarity index 100% rename from web/testing/issue160/issue160.js rename to web/src/test/manual/web/issue160/issue160.js diff --git a/web/testing/issue160/issue160.kmn b/web/src/test/manual/web/issue160/issue160.kmn similarity index 100% rename from web/testing/issue160/issue160.kmn rename to web/src/test/manual/web/issue160/issue160.kmn diff --git a/web/testing/issue266/index.html b/web/src/test/manual/web/issue266/index.html similarity index 76% rename from web/testing/issue266/index.html rename to web/src/test/manual/web/issue266/index.html index 233c5e676a..aca186b178 100644 --- a/web/testing/issue266/index.html +++ b/web/src/test/manual/web/issue266/index.html @@ -2,38 +2,38 @@ - + - + - + - - + + KeymanWeb #160 - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - - + + + - - + +

    KeymanWeb #266

    - + * + *** + --> diff --git a/web/testing/issue266/issue266.js b/web/src/test/manual/web/issue266/issue266.js similarity index 100% rename from web/testing/issue266/issue266.js rename to web/src/test/manual/web/issue266/issue266.js diff --git a/web/testing/issue266/issue266.keyman-touch-layout b/web/src/test/manual/web/issue266/issue266.keyman-touch-layout similarity index 100% rename from web/testing/issue266/issue266.keyman-touch-layout rename to web/src/test/manual/web/issue266/issue266.keyman-touch-layout diff --git a/web/testing/issue266/issue266.kmn b/web/src/test/manual/web/issue266/issue266.kmn similarity index 100% rename from web/testing/issue266/issue266.kmn rename to web/src/test/manual/web/issue266/issue266.kmn diff --git a/web/testing/issue266/issue266.kvks b/web/src/test/manual/web/issue266/issue266.kvks similarity index 100% rename from web/testing/issue266/issue266.kvks rename to web/src/test/manual/web/issue266/issue266.kvks diff --git a/web/testing/issue271/header.js b/web/src/test/manual/web/issue271/header.js similarity index 100% rename from web/testing/issue271/header.js rename to web/src/test/manual/web/issue271/header.js diff --git a/web/testing/issue271/index.html b/web/src/test/manual/web/issue271/index.html similarity index 79% rename from web/testing/issue271/index.html rename to web/src/test/manual/web/issue271/index.html index ad3a27775b..8c055c4015 100644 --- a/web/testing/issue271/index.html +++ b/web/src/test/manual/web/issue271/index.html @@ -2,56 +2,56 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + - +

    KeymanWeb: Test page for interactions between setActiveKeyboard and the toolbar UI

    - +

    This version is used to test the interactions of SetActiveKeyboard with the Toolbar UI.

    Automatically-loaded keyboard IDs:

      @@ -65,52 +65,52 @@

    - -
    +

    -
    +

    Set active keyboard:

    Keyboard id: , Language Code:

    - +
    - +

    Add a keyboard by keyboard name:

    - +

    Add a keyboard by BCP-47 language code:

    Add a keyboard by language name:

    - +

    Return to testing home page

    - - + + - - + * + *** + --> diff --git a/web/testing/issue29/index.html b/web/src/test/manual/web/issue29/index.html similarity index 73% rename from web/testing/issue29/index.html rename to web/src/test/manual/web/issue29/index.html index 12e6b1e125..92fed6a8c1 100644 --- a/web/testing/issue29/index.html +++ b/web/src/test/manual/web/issue29/index.html @@ -2,87 +2,87 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + - +

    KeymanWeb: Test desktop MutationObserver functionality

    - -
    +

    This version is used to test KeymanWeb's ability to cope with page mutations.


    -
    +

    Return to testing home page

    - - + + - - + * + *** + --> diff --git a/web/testing/issue29/issue-29-iframe.html b/web/src/test/manual/web/issue29/issue-29-iframe.html similarity index 100% rename from web/testing/issue29/issue-29-iframe.html rename to web/src/test/manual/web/issue29/issue-29-iframe.html diff --git a/web/testing/issue29/issue-29.js b/web/src/test/manual/web/issue29/issue-29.js similarity index 100% rename from web/testing/issue29/issue-29.js rename to web/src/test/manual/web/issue29/issue-29.js diff --git a/web/testing/issue2924/dmg.dv.test.model.js b/web/src/test/manual/web/issue2924/dmg.dv.test.model.js similarity index 100% rename from web/testing/issue2924/dmg.dv.test.model.js rename to web/src/test/manual/web/issue2924/dmg.dv.test.model.js diff --git a/web/testing/issue2924/header.js b/web/src/test/manual/web/issue2924/header.js similarity index 100% rename from web/testing/issue2924/header.js rename to web/src/test/manual/web/issue2924/header.js diff --git a/web/testing/issue2924/index.html b/web/src/test/manual/web/issue2924/index.html similarity index 81% rename from web/testing/issue2924/index.html rename to web/src/test/manual/web/issue2924/index.html index 8f51a81270..61a1be97cd 100644 --- a/web/testing/issue2924/index.html +++ b/web/src/test/manual/web/issue2924/index.html @@ -6,8 +6,8 @@ KeymanWeb Issue 2924 - Variable Stores and Predictive Text - - + + diff --git a/web/testing/issue2924/oldtestvariable.js b/web/src/test/manual/web/issue2924/oldtestvariable.js similarity index 100% rename from web/testing/issue2924/oldtestvariable.js rename to web/src/test/manual/web/issue2924/oldtestvariable.js diff --git a/web/testing/issue2924/source/dmg.dv.test/HISTORY.md b/web/src/test/manual/web/issue2924/source/dmg.dv.test/HISTORY.md similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/HISTORY.md rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/HISTORY.md diff --git a/web/testing/issue2924/source/dmg.dv.test/LICENSE.md b/web/src/test/manual/web/issue2924/source/dmg.dv.test/LICENSE.md similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/LICENSE.md rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/LICENSE.md diff --git a/web/testing/issue2924/source/dmg.dv.test/README.md b/web/src/test/manual/web/issue2924/source/dmg.dv.test/README.md similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/README.md rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/README.md diff --git a/web/testing/issue2924/source/dmg.dv.test/dmg.dv.test.kpj b/web/src/test/manual/web/issue2924/source/dmg.dv.test/dmg.dv.test.kpj similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/dmg.dv.test.kpj rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/dmg.dv.test.kpj diff --git a/web/testing/issue2924/source/dmg.dv.test/dmg.dv.test.model_info b/web/src/test/manual/web/issue2924/source/dmg.dv.test/dmg.dv.test.model_info similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/dmg.dv.test.model_info rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/dmg.dv.test.model_info diff --git a/web/testing/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.kps b/web/src/test/manual/web/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.kps similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.kps rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.kps diff --git a/web/testing/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.ts b/web/src/test/manual/web/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.ts similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.ts rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/source/dmg.dv.test.model.ts diff --git a/web/testing/issue2924/source/dmg.dv.test/source/readme.htm b/web/src/test/manual/web/issue2924/source/dmg.dv.test/source/readme.htm similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/source/readme.htm rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/source/readme.htm diff --git a/web/testing/issue2924/source/dmg.dv.test/source/welcome.htm b/web/src/test/manual/web/issue2924/source/dmg.dv.test/source/welcome.htm similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/source/welcome.htm rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/source/welcome.htm diff --git a/web/testing/issue2924/source/dmg.dv.test/source/wordlist.tsv b/web/src/test/manual/web/issue2924/source/dmg.dv.test/source/wordlist.tsv similarity index 100% rename from web/testing/issue2924/source/dmg.dv.test/source/wordlist.tsv rename to web/src/test/manual/web/issue2924/source/dmg.dv.test/source/wordlist.tsv diff --git a/web/testing/issue2924/source/testvariable/HISTORY.md b/web/src/test/manual/web/issue2924/source/testvariable/HISTORY.md similarity index 100% rename from web/testing/issue2924/source/testvariable/HISTORY.md rename to web/src/test/manual/web/issue2924/source/testvariable/HISTORY.md diff --git a/web/testing/issue2924/source/testvariable/LICENSE.md b/web/src/test/manual/web/issue2924/source/testvariable/LICENSE.md similarity index 100% rename from web/testing/issue2924/source/testvariable/LICENSE.md rename to web/src/test/manual/web/issue2924/source/testvariable/LICENSE.md diff --git a/web/testing/issue2924/source/testvariable/README.md b/web/src/test/manual/web/issue2924/source/testvariable/README.md similarity index 100% rename from web/testing/issue2924/source/testvariable/README.md rename to web/src/test/manual/web/issue2924/source/testvariable/README.md diff --git a/web/testing/issue2924/source/testvariable/source/readme.htm b/web/src/test/manual/web/issue2924/source/testvariable/source/readme.htm similarity index 100% rename from web/testing/issue2924/source/testvariable/source/readme.htm rename to web/src/test/manual/web/issue2924/source/testvariable/source/readme.htm diff --git a/web/testing/issue2924/source/testvariable/source/testvariable.keyman-touch-layout b/web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.keyman-touch-layout similarity index 100% rename from web/testing/issue2924/source/testvariable/source/testvariable.keyman-touch-layout rename to web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.keyman-touch-layout diff --git a/web/testing/issue2924/source/testvariable/source/testvariable.kmn b/web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kmn similarity index 100% rename from web/testing/issue2924/source/testvariable/source/testvariable.kmn rename to web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kmn diff --git a/web/testing/issue2924/source/testvariable/source/testvariable.kps b/web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kps similarity index 100% rename from web/testing/issue2924/source/testvariable/source/testvariable.kps rename to web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kps diff --git a/web/testing/issue2924/source/testvariable/source/testvariable.kvks b/web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kvks similarity index 100% rename from web/testing/issue2924/source/testvariable/source/testvariable.kvks rename to web/src/test/manual/web/issue2924/source/testvariable/source/testvariable.kvks diff --git a/web/testing/issue2924/source/testvariable/source/welcome.htm b/web/src/test/manual/web/issue2924/source/testvariable/source/welcome.htm similarity index 100% rename from web/testing/issue2924/source/testvariable/source/welcome.htm rename to web/src/test/manual/web/issue2924/source/testvariable/source/welcome.htm diff --git a/web/testing/issue2924/source/testvariable/testvariable.keyboard_info b/web/src/test/manual/web/issue2924/source/testvariable/testvariable.keyboard_info similarity index 100% rename from web/testing/issue2924/source/testvariable/testvariable.keyboard_info rename to web/src/test/manual/web/issue2924/source/testvariable/testvariable.keyboard_info diff --git a/web/testing/issue2924/source/testvariable/testvariable.kpj b/web/src/test/manual/web/issue2924/source/testvariable/testvariable.kpj similarity index 100% rename from web/testing/issue2924/source/testvariable/testvariable.kpj rename to web/src/test/manual/web/issue2924/source/testvariable/testvariable.kpj diff --git a/web/testing/issue2924/testvariable.js b/web/src/test/manual/web/issue2924/testvariable.js similarity index 100% rename from web/testing/issue2924/testvariable.js rename to web/src/test/manual/web/issue2924/testvariable.js diff --git a/web/testing/issue3701/index.html b/web/src/test/manual/web/issue3701/index.html similarity index 80% rename from web/testing/issue3701/index.html rename to web/src/test/manual/web/issue3701/index.html index 4e30f4d118..ca2729133a 100644 --- a/web/testing/issue3701/index.html +++ b/web/src/test/manual/web/issue3701/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Testing Page - Fat-Finger interactions with Beep feedback - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + +

    KeymanWeb Sample Page - Fat-finger Interactions with Beep Feedback

    Since erroneous input should not be considered with predictions & corrections, this page uses a US-style keyboard that prohibits use of the letter 'x'.

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -97,20 +97,20 @@
    - - + * + *** + --> diff --git a/web/testing/issue3701/test3701/HISTORY.md b/web/src/test/manual/web/issue3701/test3701/HISTORY.md similarity index 94% rename from web/testing/issue3701/test3701/HISTORY.md rename to web/src/test/manual/web/issue3701/test3701/HISTORY.md index 6682500b33..1df4155def 100644 --- a/web/testing/issue3701/test3701/HISTORY.md +++ b/web/src/test/manual/web/issue3701/test3701/HISTORY.md @@ -1,6 +1,6 @@ -test3701 Change History -==================== - -1.0 (2020-10-19) ----------------- -* Created by Marc Durdin +test3701 Change History +==================== + +1.0 (2020-10-19) +---------------- +* Created by Marc Durdin diff --git a/web/testing/issue3701/test3701/LICENSE.md b/web/src/test/manual/web/issue3701/test3701/LICENSE.md similarity index 98% rename from web/testing/issue3701/test3701/LICENSE.md rename to web/src/test/manual/web/issue3701/test3701/LICENSE.md index 973cee89ac..7c2a8c501b 100644 --- a/web/testing/issue3701/test3701/LICENSE.md +++ b/web/src/test/manual/web/issue3701/test3701/LICENSE.md @@ -1,21 +1,21 @@ -The MIT License (MIT) - -© SIL International - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The MIT License (MIT) + +© SIL International + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/testing/issue3701/test3701/README.md b/web/src/test/manual/web/issue3701/test3701/README.md similarity index 91% rename from web/testing/issue3701/test3701/README.md rename to web/src/test/manual/web/issue3701/test3701/README.md index deca8e95b1..0d04693d20 100644 --- a/web/testing/issue3701/test3701/README.md +++ b/web/src/test/manual/web/issue3701/test3701/README.md @@ -1,29 +1,29 @@ -test3701 keyboard -============== - -© SIL International - -Version 1.0 - -Description ------------ - -test3701 generated from template - -Links ------ - -Supported Platforms -------------------- - * Windows - * macOS - * Linux - * Web - * iPhone - * iPad - * Android phone - * Android tablet - * Mobile devices - * Desktop devices - * Tablet devices - +test3701 keyboard +============== + +© SIL International + +Version 1.0 + +Description +----------- + +test3701 generated from template + +Links +----- + +Supported Platforms +------------------- + * Windows + * macOS + * Linux + * Web + * iPhone + * iPad + * Android phone + * Android tablet + * Mobile devices + * Desktop devices + * Tablet devices + diff --git a/web/testing/issue3701/test3701/build/test3701.js b/web/src/test/manual/web/issue3701/test3701/build/test3701.js similarity index 100% rename from web/testing/issue3701/test3701/build/test3701.js rename to web/src/test/manual/web/issue3701/test3701/build/test3701.js diff --git a/web/testing/issue3701/test3701/debug.log b/web/src/test/manual/web/issue3701/test3701/debug.log similarity index 100% rename from web/testing/issue3701/test3701/debug.log rename to web/src/test/manual/web/issue3701/test3701/debug.log diff --git a/web/testing/issue3701/test3701/source/readme.htm b/web/src/test/manual/web/issue3701/test3701/source/readme.htm similarity index 95% rename from web/testing/issue3701/test3701/source/readme.htm rename to web/src/test/manual/web/issue3701/test3701/source/readme.htm index c15bef97a6..67a6a63781 100644 --- a/web/testing/issue3701/test3701/source/readme.htm +++ b/web/src/test/manual/web/issue3701/test3701/source/readme.htm @@ -1,24 +1,24 @@ - - - - - - test3701 - - - - -

    test3701

    - -

    - test3701 1.0 generated from template. -

    - -

    © SIL International

    - - - + + + + + + test3701 + + + + +

    test3701

    + +

    + test3701 1.0 generated from template. +

    + +

    © SIL International

    + + + diff --git a/web/testing/issue917-context-and-notany/test_917/source/test_917.keyman-touch-layout b/web/src/test/manual/web/issue3701/test3701/source/test3701.keyman-touch-layout similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/test_917.keyman-touch-layout rename to web/src/test/manual/web/issue3701/test3701/source/test3701.keyman-touch-layout diff --git a/web/testing/issue3701/test3701/source/test3701.kmn b/web/src/test/manual/web/issue3701/test3701/source/test3701.kmn similarity index 96% rename from web/testing/issue3701/test3701/source/test3701.kmn rename to web/src/test/manual/web/issue3701/test3701/source/test3701.kmn index fa0f2d93d8..52b56ef8e1 100644 --- a/web/testing/issue3701/test3701/source/test3701.kmn +++ b/web/src/test/manual/web/issue3701/test3701/source/test3701.kmn @@ -1,16 +1,16 @@ -c test3701 generated from template at 2020-10-19 11:32:46 -c with name "test3701" -store(&VERSION) '10.0' -store(&NAME) 'test3701' -store(©RIGHT) '© SIL International' -store(&KEYBOARDVERSION) '1.0' -store(&TARGETS) 'web mobile' -store(&VISUALKEYBOARD) 'test3701.kvks' -store(&LAYOUTFILE) 'test3701.keyman-touch-layout' - -begin Unicode > use(main) - -group(main) using keys - -+ [K_X] > 'x' beep -+ [SHIFT K_X] > 'X' beep +c test3701 generated from template at 2020-10-19 11:32:46 +c with name "test3701" +store(&VERSION) '10.0' +store(&NAME) 'test3701' +store(©RIGHT) '© SIL International' +store(&KEYBOARDVERSION) '1.0' +store(&TARGETS) 'web mobile' +store(&VISUALKEYBOARD) 'test3701.kvks' +store(&LAYOUTFILE) 'test3701.keyman-touch-layout' + +begin Unicode > use(main) + +group(main) using keys + ++ [K_X] > 'x' beep ++ [SHIFT K_X] > 'X' beep diff --git a/web/testing/issue3701/test3701/source/test3701.kps b/web/src/test/manual/web/issue3701/test3701/source/test3701.kps similarity index 96% rename from web/testing/issue3701/test3701/source/test3701.kps rename to web/src/test/manual/web/issue3701/test3701/source/test3701.kps index 61924b3140..fdf625bc0c 100644 --- a/web/testing/issue3701/test3701/source/test3701.kps +++ b/web/src/test/manual/web/issue3701/test3701/source/test3701.kps @@ -1,61 +1,61 @@ - - - - 13.0.9999.0 - 7.0 - - - - readme.htm - - - - - - - - - - test3701 - © SIL International - Marc Durdin - - - - - ..\build\test3701.js - - 0 - .js - - - ..\build\test3701.kvk - - 0 - .kvk - - - welcome.htm - - 0 - .htm - - - readme.htm - - 0 - .htm - - - - - test3701 - test3701 - 1.0 - - English - - - - - + + + + 13.0.9999.0 + 7.0 + + + + readme.htm + + + + + + + + + + test3701 + © SIL International + Marc Durdin + + + + + ..\build\test3701.js + + 0 + .js + + + ..\build\test3701.kvk + + 0 + .kvk + + + welcome.htm + + 0 + .htm + + + readme.htm + + 0 + .htm + + + + + test3701 + test3701 + 1.0 + + English + + + + + diff --git a/web/testing/issue3701/test3701/source/test3701.kvks b/web/src/test/manual/web/issue3701/test3701/source/test3701.kvks similarity index 95% rename from web/testing/issue3701/test3701/source/test3701.kvks rename to web/src/test/manual/web/issue3701/test3701/source/test3701.kvks index 299f419922..6f09cc5182 100644 --- a/web/testing/issue3701/test3701/source/test3701.kvks +++ b/web/src/test/manual/web/issue3701/test3701/source/test3701.kvks @@ -1,8 +1,8 @@ - - -
    - 10.0 - - -
    -
    + + +
    + 10.0 + + +
    +
    diff --git a/web/testing/issue3701/test3701/source/welcome.htm b/web/src/test/manual/web/issue3701/test3701/source/welcome.htm similarity index 95% rename from web/testing/issue3701/test3701/source/welcome.htm rename to web/src/test/manual/web/issue3701/test3701/source/welcome.htm index a6dd6f8ce4..1d6d1b2b95 100644 --- a/web/testing/issue3701/test3701/source/welcome.htm +++ b/web/src/test/manual/web/issue3701/test3701/source/welcome.htm @@ -1,29 +1,29 @@ - - - - - - Start Using test3701 - - - - -

    Start Using test3701

    - -

    - test3701 1.0 generated from template for use in engine testing. - Emits error feedback whenever an 'x' or 'X' is typed. -

    - -

    Keyboard Layout

    - - - -

    © SIL International

    - - + + + + + + Start Using test3701 + + + + +

    Start Using test3701

    + +

    + test3701 1.0 generated from template for use in engine testing. + Emits error feedback whenever an 'x' or 'X' is typed. +

    + +

    Keyboard Layout

    + + + +

    © SIL International

    + + \ No newline at end of file diff --git a/web/testing/issue3701/test3701/test3701.keyboard_info b/web/src/test/manual/web/issue3701/test3701/test3701.keyboard_info similarity index 94% rename from web/testing/issue3701/test3701/test3701.keyboard_info rename to web/src/test/manual/web/issue3701/test3701/test3701.keyboard_info index 31cba8236b..b2b40a5d1e 100644 --- a/web/testing/issue3701/test3701/test3701.keyboard_info +++ b/web/src/test/manual/web/issue3701/test3701/test3701.keyboard_info @@ -1,7 +1,7 @@ -{ - "license": "mit", - "languages": [ - - ], - "description": "test3701 generated from template" -} +{ + "license": "mit", + "languages": [ + + ], + "description": "test3701 generated from template" +} diff --git a/web/testing/issue3701/test3701/test3701.kpj b/web/src/test/manual/web/issue3701/test3701/test3701.kpj similarity index 97% rename from web/testing/issue3701/test3701/test3701.kpj rename to web/src/test/manual/web/issue3701/test3701/test3701.kpj index 6288c84f1d..5db48cd115 100644 --- a/web/testing/issue3701/test3701/test3701.kpj +++ b/web/src/test/manual/web/issue3701/test3701/test3701.kpj @@ -1,94 +1,94 @@ - - - - $PROJECTPATH\build - True - True - True - keyboard - - - - id_4ace41d3c5da7a59be576737b6efdfa8 - test3701.kmn - source\test3701.kmn - 1.0 - .kmn -
    - test3701 - © SIL International -
    -
    - - id_6fde3bf09317bfb25c4710ea06bb0e21 - test3701.kps - source\test3701.kps - - .kps -
    - test3701 - © SIL International -
    -
    - - id_ede98e4633e239f933cbfd1f4e1b766c - HISTORY.md - HISTORY.md - - .md - - - id_53e892b8b41cc4caece1cfd5ef21d6e7 - LICENSE.md - LICENSE.md - - .md - - - id_0730bb7c2e8f9ea2438b52e419dd86c9 - README.md - README.md - - .md - - - id_e18bba9285544da2bad5cb8bf0b153d6 - test3701.keyboard_info - test3701.keyboard_info - - .keyboard_info - - - id_e944ee9b3d06f36294030601f3bd33ae - test3701.js - source\..\build\test3701.js - - .js - id_6fde3bf09317bfb25c4710ea06bb0e21 - - - id_4edf408fcc9bf07a24cd880189622197 - test3701.kvk - source\..\build\test3701.kvk - - .kvk - id_6fde3bf09317bfb25c4710ea06bb0e21 - - - id_356e5d149c1e539356d72698c1e401a6 - welcome.htm - source\welcome.htm - - .htm - id_6fde3bf09317bfb25c4710ea06bb0e21 - - - id_8da344c4cea6f467013357fe099006f5 - readme.htm - source\readme.htm - - .htm - id_6fde3bf09317bfb25c4710ea06bb0e21 - -
    -
    + + + + $PROJECTPATH\build + True + True + True + keyboard + + + + id_4ace41d3c5da7a59be576737b6efdfa8 + test3701.kmn + source\test3701.kmn + 1.0 + .kmn +
    + test3701 + © SIL International +
    +
    + + id_6fde3bf09317bfb25c4710ea06bb0e21 + test3701.kps + source\test3701.kps + + .kps +
    + test3701 + © SIL International +
    +
    + + id_ede98e4633e239f933cbfd1f4e1b766c + HISTORY.md + HISTORY.md + + .md + + + id_53e892b8b41cc4caece1cfd5ef21d6e7 + LICENSE.md + LICENSE.md + + .md + + + id_0730bb7c2e8f9ea2438b52e419dd86c9 + README.md + README.md + + .md + + + id_e18bba9285544da2bad5cb8bf0b153d6 + test3701.keyboard_info + test3701.keyboard_info + + .keyboard_info + + + id_e944ee9b3d06f36294030601f3bd33ae + test3701.js + source\..\build\test3701.js + + .js + id_6fde3bf09317bfb25c4710ea06bb0e21 + + + id_4edf408fcc9bf07a24cd880189622197 + test3701.kvk + source\..\build\test3701.kvk + + .kvk + id_6fde3bf09317bfb25c4710ea06bb0e21 + + + id_356e5d149c1e539356d72698c1e401a6 + welcome.htm + source\welcome.htm + + .htm + id_6fde3bf09317bfb25c4710ea06bb0e21 + + + id_8da344c4cea6f467013357fe099006f5 + readme.htm + source\readme.htm + + .htm + id_6fde3bf09317bfb25c4710ea06bb0e21 + +
    +
    diff --git a/web/testing/issue382/index.html b/web/src/test/manual/web/issue382/index.html similarity index 89% rename from web/testing/issue382/index.html rename to web/src/test/manual/web/issue382/index.html index 10148666f0..12ab6cd7a3 100644 --- a/web/testing/issue382/index.html +++ b/web/src/test/manual/web/issue382/index.html @@ -23,7 +23,7 @@ - + - + diff --git a/web/testing/issue382/issue382-layout.js b/web/src/test/manual/web/issue382/issue382-layout.js similarity index 100% rename from web/testing/issue382/issue382-layout.js rename to web/src/test/manual/web/issue382/issue382-layout.js diff --git a/web/testing/issue382/issue382.js b/web/src/test/manual/web/issue382/issue382.js similarity index 100% rename from web/testing/issue382/issue382.js rename to web/src/test/manual/web/issue382/issue382.js diff --git a/web/testing/issue382/issue382.kmn b/web/src/test/manual/web/issue382/issue382.kmn similarity index 100% rename from web/testing/issue382/issue382.kmn rename to web/src/test/manual/web/issue382/issue382.kmn diff --git a/web/testing/issue382/issue382.kmx b/web/src/test/manual/web/issue382/issue382.kmx similarity index 100% rename from web/testing/issue382/issue382.kmx rename to web/src/test/manual/web/issue382/issue382.kmx diff --git a/web/testing/issue382/issue382.kpj b/web/src/test/manual/web/issue382/issue382.kpj similarity index 100% rename from web/testing/issue382/issue382.kpj rename to web/src/test/manual/web/issue382/issue382.kpj diff --git a/web/testing/issue382/issue382.kvk b/web/src/test/manual/web/issue382/issue382.kvk similarity index 100% rename from web/testing/issue382/issue382.kvk rename to web/src/test/manual/web/issue382/issue382.kvk diff --git a/web/testing/issue382/issue382.kvks b/web/src/test/manual/web/issue382/issue382.kvks similarity index 100% rename from web/testing/issue382/issue382.kvks rename to web/src/test/manual/web/issue382/issue382.kvks diff --git a/web/testing/issue53/index.html b/web/src/test/manual/web/issue53/index.html similarity index 77% rename from web/testing/issue53/index.html rename to web/src/test/manual/web/issue53/index.html index 42d6e94c9e..4093fadd48 100644 --- a/web/testing/issue53/index.html +++ b/web/src/test/manual/web/issue53/index.html @@ -2,81 +2,81 @@ - - - + + + - + - - + + KeymanWeb Testing Page - Mismatched Layer Rows - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb: Tests layering transitions for keyboards with variable layer sizes.

    This test should be run from mobile devices or with Chrome's mobile device emulation settings available within Developer Mode.

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Add a keyboard by keyboard name:

    - +

    Add a keyboard by BCP-47 language code:

    Add a keyboard by language name:

    - +

    Remove a keyboard by keyboard name:

    @@ -86,20 +86,20 @@
    - - + * + *** + --> diff --git a/web/testing/issue53/issue53.js b/web/src/test/manual/web/issue53/issue53.js similarity index 100% rename from web/testing/issue53/issue53.js rename to web/src/test/manual/web/issue53/issue53.js diff --git a/web/testing/issue53/layered_debug_keyboard-layout.js b/web/src/test/manual/web/issue53/layered_debug_keyboard-layout.js similarity index 100% rename from web/testing/issue53/layered_debug_keyboard-layout.js rename to web/src/test/manual/web/issue53/layered_debug_keyboard-layout.js diff --git a/web/testing/issue53/layered_debug_keyboard.ico b/web/src/test/manual/web/issue53/layered_debug_keyboard.ico similarity index 100% rename from web/testing/issue53/layered_debug_keyboard.ico rename to web/src/test/manual/web/issue53/layered_debug_keyboard.ico diff --git a/web/testing/issue53/layered_debug_keyboard.js b/web/src/test/manual/web/issue53/layered_debug_keyboard.js similarity index 100% rename from web/testing/issue53/layered_debug_keyboard.js rename to web/src/test/manual/web/issue53/layered_debug_keyboard.js diff --git a/web/testing/issue53/layered_debug_keyboard.kmn b/web/src/test/manual/web/issue53/layered_debug_keyboard.kmn similarity index 100% rename from web/testing/issue53/layered_debug_keyboard.kmn rename to web/src/test/manual/web/issue53/layered_debug_keyboard.kmn diff --git a/web/testing/issue53/layered_debug_keyboard.kpj b/web/src/test/manual/web/issue53/layered_debug_keyboard.kpj similarity index 100% rename from web/testing/issue53/layered_debug_keyboard.kpj rename to web/src/test/manual/web/issue53/layered_debug_keyboard.kpj diff --git a/web/testing/issue5312-touch-alias-optimization/index.html b/web/src/test/manual/web/issue5312-touch-alias-optimization/index.html similarity index 98% rename from web/testing/issue5312-touch-alias-optimization/index.html rename to web/src/test/manual/web/issue5312-touch-alias-optimization/index.html index 91730b0f55..682e279ab6 100644 --- a/web/testing/issue5312-touch-alias-optimization/index.html +++ b/web/src/test/manual/web/issue5312-touch-alias-optimization/index.html @@ -23,7 +23,7 @@ - + - + + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - +

    KeymanWeb: Light test for touch-based MutationObserver functionality

    - -
    +

    This version is used to test KeymanWeb's ability to cope with page mutations.


    -
    +

    Return to testing home page

    - - + + - - + * + *** + --> diff --git a/web/testing/issue62/issue-62.js b/web/src/test/manual/web/issue62/issue-62.js similarity index 100% rename from web/testing/issue62/issue-62.js rename to web/src/test/manual/web/issue62/issue-62.js diff --git a/web/testing/issue63/index.html b/web/src/test/manual/web/issue63/index.html similarity index 75% rename from web/testing/issue63/index.html rename to web/src/test/manual/web/issue63/index.html index a62b8cade4..43842dc3e9 100644 --- a/web/testing/issue63/index.html +++ b/web/src/test/manual/web/issue63/index.html @@ -2,63 +2,63 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - +

    KeymanWeb: Test/stress-test touch-based MutationObserver functionality

    - -
    +

    This version is used to test KeymanWeb's ability to cope with page mutations.

    @@ -68,26 +68,26 @@
    -
    +

    Return to testing home page

    - - + + - - + * + *** + --> diff --git a/web/testing/issue63/issue-29-iframe.html b/web/src/test/manual/web/issue63/issue-29-iframe.html similarity index 100% rename from web/testing/issue63/issue-29-iframe.html rename to web/src/test/manual/web/issue63/issue-29-iframe.html diff --git a/web/testing/issue63/issue-63.js b/web/src/test/manual/web/issue63/issue-63.js similarity index 100% rename from web/testing/issue63/issue-63.js rename to web/src/test/manual/web/issue63/issue-63.js diff --git a/web/testing/issue917-context-and-notany/index.html b/web/src/test/manual/web/issue917-context-and-notany/index.html similarity index 82% rename from web/testing/issue917-context-and-notany/index.html rename to web/src/test/manual/web/issue917-context-and-notany/index.html index b3417047b3..1db3b10c4d 100644 --- a/web/testing/issue917-context-and-notany/index.html +++ b/web/src/test/manual/web/issue917-context-and-notany/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Testing Page - context() and notany() interaction (#917) - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + +

    KeymanWeb Sample Page -context() and notany() interaction (#917)

    KeymanWeb did not support notany() and context() together. This keyboard tests various scenarios in the implementation (14.0 min):

    @@ -69,16 +69,16 @@
    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -88,20 +88,20 @@
    - - + * + *** + --> diff --git a/web/testing/issue917-context-and-notany/test_917/HISTORY.md b/web/src/test/manual/web/issue917-context-and-notany/test_917/HISTORY.md similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/HISTORY.md rename to web/src/test/manual/web/issue917-context-and-notany/test_917/HISTORY.md diff --git a/web/testing/issue917-context-and-notany/test_917/LICENSE.md b/web/src/test/manual/web/issue917-context-and-notany/test_917/LICENSE.md similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/LICENSE.md rename to web/src/test/manual/web/issue917-context-and-notany/test_917/LICENSE.md diff --git a/web/testing/issue917-context-and-notany/test_917/README.md b/web/src/test/manual/web/issue917-context-and-notany/test_917/README.md similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/README.md rename to web/src/test/manual/web/issue917-context-and-notany/test_917/README.md diff --git a/web/testing/issue917-context-and-notany/test_917/source/readme.htm b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/readme.htm similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/readme.htm rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/readme.htm diff --git a/web/testing/issue3701/test3701/source/test3701.keyman-touch-layout b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.keyman-touch-layout similarity index 95% rename from web/testing/issue3701/test3701/source/test3701.keyman-touch-layout rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.keyman-touch-layout index 62d8af4917..149069b062 100644 --- a/web/testing/issue3701/test3701/source/test3701.keyman-touch-layout +++ b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.keyman-touch-layout @@ -1,1316 +1,1316 @@ -{ - "tablet": { - "font": "Tahoma", - "layer": [ - { - "id": "default", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_Q", - "text": "q" - }, - { - "id": "K_W", - "text": "w" - }, - { - "id": "K_E", - "text": "e" - }, - { - "id": "K_R", - "text": "r" - }, - { - "id": "K_T", - "text": "t" - }, - { - "id": "K_Y", - "text": "y" - }, - { - "id": "K_U", - "text": "u" - }, - { - "id": "K_I", - "text": "i" - }, - { - "id": "K_O", - "text": "o" - }, - { - "id": "K_P", - "text": "p" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_A", - "text": "a", - "pad": 70 - }, - { - "id": "K_S", - "text": "s" - }, - { - "id": "K_D", - "text": "d" - }, - { - "id": "K_F", - "text": "f" - }, - { - "id": "K_G", - "text": "g" - }, - { - "id": "K_H", - "text": "h" - }, - { - "id": "K_J", - "text": "j" - }, - { - "id": "K_K", - "text": "k" - }, - { - "id": "K_L", - "text": "l" - }, - { - "sp": "10", - "width": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_SHIFT", - "text": "*Shift*", - "width": "110", - "sp": "1", - "nextlayer": "shift" - }, - { - "id": "K_Z", - "text": "z" - }, - { - "id": "K_X", - "text": "x" - }, - { - "id": "K_C", - "text": "c" - }, - { - "id": "K_V", - "text": "v" - }, - { - "id": "K_B", - "text": "b" - }, - { - "id": "K_N", - "text": "n" - }, - { - "id": "K_M", - "text": "m" - }, - { - "id": "K_PERIOD", - "text": ".", - "sk": [ - { - "text": ",", - "id": "K_COMMA" - }, - { - "text": "!", - "id": "K_1", - "layer": "shift" - }, - { - "text": "?", - "id": "K_SLASH", - "layer": "shift" - }, - { - "text": "'", - "id": "K_QUOTE" - }, - { - "text": "\"", - "id": "K_QUOTE", - "layer": "shift" - }, - { - "text": "\\", - "id": "K_BKSLASH" - }, - { - "text": ":", - "id": "K_COLON", - "layer": "shift" - }, - { - "text": ";", - "id": "K_COLON" - } - ] - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "width": "90", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_NUMLOCK", - "text": "*123*", - "width": "140", - "sp": "1", - "nextlayer": "numeric" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "630", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "140", - "sp": "1" - } - ] - } - ] - }, - { - "id": "shift", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_Q", - "text": "Q" - }, - { - "id": "K_W", - "text": "W" - }, - { - "id": "K_E", - "text": "E" - }, - { - "id": "K_R", - "text": "R" - }, - { - "id": "K_T", - "text": "T" - }, - { - "id": "K_Y", - "text": "Y" - }, - { - "id": "K_U", - "text": "U" - }, - { - "id": "K_I", - "text": "I" - }, - { - "id": "K_O", - "text": "O" - }, - { - "id": "K_P", - "text": "P" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_A", - "text": "A", - "pad": 70 - }, - { - "id": "K_S", - "text": "S" - }, - { - "id": "K_D", - "text": "D" - }, - { - "id": "K_F", - "text": "F" - }, - { - "id": "K_G", - "text": "G" - }, - { - "id": "K_H", - "text": "H" - }, - { - "id": "K_J", - "text": "J" - }, - { - "id": "K_K", - "text": "K" - }, - { - "id": "K_L", - "text": "L" - }, - { - "sp": "10", - "width": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_SHIFT", - "text": "*Shift*", - "width": "110", - "sp": "2", - "nextlayer": "default" - }, - { - "id": "K_Z", - "text": "Z" - }, - { - "id": "K_X", - "text": "X" - }, - { - "id": "K_C", - "text": "C" - }, - { - "id": "K_V", - "text": "V" - }, - { - "id": "K_B", - "text": "B" - }, - { - "id": "K_N", - "text": "N" - }, - { - "id": "K_M", - "text": "M" - }, - { - "id": "K_PERIOD", - "text": ".", - "layer": "default", - "sk": [ - { - "text": ",", - "id": "K_COMMA", - "layer": "default" - }, - { - "text": "!", - "id": "K_1", - "layer": "shift" - }, - { - "text": "?", - "id": "K_SLASH", - "layer": "shift" - }, - { - "text": "'", - "id": "K_QUOTE", - "layer": "default" - }, - { - "text": "\"", - "id": "K_QUOTE", - "layer": "shift" - }, - { - "text": "\\", - "id": "K_BKSLASH", - "layer": "default" - }, - { - "text": ":", - "id": "K_COLON", - "layer": "shift" - }, - { - "text": ";", - "id": "K_COLON", - "layer": "default" - } - ] - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "width": "90", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_NUMLOCK", - "text": "*123*", - "width": "140", - "sp": "1", - "nextlayer": "numeric" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "630", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "140", - "sp": "1" - } - ] - } - ] - }, - { - "id": "numeric", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_1", - "text": "1" - }, - { - "id": "K_2", - "text": "2" - }, - { - "id": "K_3", - "text": "3" - }, - { - "id": "K_4", - "text": "4" - }, - { - "id": "K_5", - "text": "5" - }, - { - "id": "K_6", - "text": "6" - }, - { - "id": "K_7", - "text": "7" - }, - { - "id": "K_8", - "text": "8" - }, - { - "id": "K_9", - "text": "9" - }, - { - "id": "K_0", - "text": "0" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_4", - "text": "$", - "layer": "shift", - "pad": 70 - }, - { - "id": "K_2", - "text": "@", - "layer": "shift" - }, - { - "id": "K_3", - "text": "#", - "layer": "shift" - }, - { - "id": "K_5", - "text": "%", - "layer": "shift" - }, - { - "id": "K_7", - "text": "&", - "layer": "shift" - }, - { - "id": "K_HYPHEN", - "text": "_", - "layer": "shift" - }, - { - "id": "K_EQUAL", - "text": "=", - "layer": "default" - }, - { - "id": "K_BKSLASH", - "text": "|", - "layer": "shift" - }, - { - "id": "K_BKSLASH", - "text": "\\", - "layer": "default" - }, - { - "text": "", - "width": "10", - "sp": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_SHIFT", - "text": "*Shift*", - "width": "110", - "sp": "1" - }, - { - "id": "K_LBRKT", - "text": "[", - "sk": [ - { - "id": "U_00AB", - "text": "\u00AB" - }, - { - "id": "K_COMMA", - "text": "<", - "layer": "shift" - }, - { - "id": "K_LBRKT", - "text": "{", - "layer": "shift" - } - ] - }, - { - "id": "K_9", - "text": "(", - "layer": "shift" - }, - { - "id": "K_0", - "text": ")", - "layer": "shift" - }, - { - "id": "K_RBRKT", - "text": "]", - "sk": [ - { - "id": "U_00BB", - "text": "\u00BB" - }, - { - "id": "K_PERIOD", - "text": ">", - "layer": "shift" - }, - { - "id": "K_RBRKT", - "text": "}", - "layer": "shift" - } - ] - }, - { - "id": "K_EQUAL", - "text": "+", - "layer": "shift" - }, - { - "id": "K_HYPHEN", - "text": "-", - "layer": "default" - }, - { - "id": "K_8", - "text": "*", - "layer": "shift" - }, - { - "id": "K_SLASH", - "text": "/", - "layer": "default" - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "width": "90", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_LOWER", - "text": "*abc*", - "width": "140", - "sp": "1", - "nextlayer": "default" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "630", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "140", - "sp": "1" - } - ] - } - ] - } - ] - }, - "phone": { - "font": "Tahoma", - "layer": [ - { - "id": "default", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_Q", - "text": "q" - }, - { - "id": "K_W", - "text": "w" - }, - { - "id": "K_E", - "text": "e" - }, - { - "id": "K_R", - "text": "r" - }, - { - "id": "K_T", - "text": "t" - }, - { - "id": "K_Y", - "text": "y" - }, - { - "id": "K_U", - "text": "u" - }, - { - "id": "K_I", - "text": "i" - }, - { - "id": "K_O", - "text": "o" - }, - { - "id": "K_P", - "text": "p" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_A", - "text": "a", - "pad": "50" - }, - { - "id": "K_S", - "text": "s" - }, - { - "id": "K_D", - "text": "d" - }, - { - "id": "K_F", - "text": "f" - }, - { - "id": "K_G", - "text": "g" - }, - { - "id": "K_H", - "text": "h" - }, - { - "id": "K_J", - "text": "j" - }, - { - "id": "K_K", - "text": "k" - }, - { - "id": "K_L", - "text": "l" - }, - { - "text": "", - "width": "10", - "sp": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_SHIFT", - "text": "*Shift*", - "sp": "1", - "nextlayer": "shift" - }, - { - "id": "K_Z", - "text": "z" - }, - { - "id": "K_X", - "text": "x" - }, - { - "id": "K_C", - "text": "c" - }, - { - "id": "K_V", - "text": "v" - }, - { - "id": "K_B", - "text": "b" - }, - { - "id": "K_N", - "text": "n" - }, - { - "id": "K_M", - "text": "m" - }, - { - "id": "K_PERIOD", - "text": ".", - "sk": [ - { - "text": ",", - "id": "K_COMMA" - }, - { - "text": "!", - "id": "K_1", - "layer": "shift" - }, - { - "text": "?", - "id": "K_SLASH", - "layer": "shift" - }, - { - "text": "'", - "id": "K_QUOTE" - }, - { - "text": "\"", - "id": "K_QUOTE", - "layer": "shift" - }, - { - "text": "\\", - "id": "K_BKSLASH" - }, - { - "text": ":", - "id": "K_COLON", - "layer": "shift" - }, - { - "text": ";", - "id": "K_COLON" - } - ] - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "width": "100", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_NUMLOCK", - "text": "*123*", - "width": "150", - "sp": "1", - "nextlayer": "numeric" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "610", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "150", - "sp": "1" - } - ] - } - ] - }, - { - "id": "shift", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_Q", - "text": "Q" - }, - { - "id": "K_W", - "text": "W" - }, - { - "id": "K_E", - "text": "E" - }, - { - "id": "K_R", - "text": "R" - }, - { - "id": "K_T", - "text": "T" - }, - { - "id": "K_Y", - "text": "Y" - }, - { - "id": "K_U", - "text": "U" - }, - { - "id": "K_I", - "text": "I" - }, - { - "id": "K_O", - "text": "O" - }, - { - "id": "K_P", - "text": "P" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_A", - "text": "A", - "pad": "50" - }, - { - "id": "K_S", - "text": "S" - }, - { - "id": "K_D", - "text": "D" - }, - { - "id": "K_F", - "text": "F" - }, - { - "id": "K_G", - "text": "G" - }, - { - "id": "K_H", - "text": "H" - }, - { - "id": "K_J", - "text": "J" - }, - { - "id": "K_K", - "text": "K" - }, - { - "id": "K_L", - "text": "L" - }, - { - "text": "", - "width": "10", - "sp": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_SHIFT", - "text": "*Shift*", - "sp": "2", - "nextlayer": "default" - }, - { - "id": "K_Z", - "text": "Z" - }, - { - "id": "K_X", - "text": "X" - }, - { - "id": "K_C", - "text": "C" - }, - { - "id": "K_V", - "text": "V" - }, - { - "id": "K_B", - "text": "B" - }, - { - "id": "K_N", - "text": "N" - }, - { - "id": "K_M", - "text": "M" - }, - { - "id": "K_PERIOD", - "text": ".", - "layer": "default", - "sk": [ - { - "text": ",", - "id": "K_COMMA", - "layer": "default" - }, - { - "text": "!", - "id": "K_1", - "layer": "shift" - }, - { - "text": "?", - "id": "K_SLASH", - "layer": "shift" - }, - { - "text": "'", - "id": "K_QUOTE", - "layer": "default" - }, - { - "text": "\"", - "id": "K_QUOTE", - "layer": "shift" - }, - { - "text": "\\", - "id": "K_BKSLASH", - "layer": "default" - }, - { - "text": ":", - "id": "K_COLON", - "layer": "shift" - }, - { - "text": ";", - "id": "K_COLON", - "layer": "default" - } - ] - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_NUMLOCK", - "text": "*123*", - "width": "150", - "sp": "1", - "nextlayer": "numeric" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "610", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "150", - "sp": "1" - } - ] - } - ] - }, - { - "id": "numeric", - "row": [ - { - "id": 1, - "key": [ - { - "id": "K_1", - "text": "1" - }, - { - "id": "K_2", - "text": "2" - }, - { - "id": "K_3", - "text": "3" - }, - { - "id": "K_4", - "text": "4" - }, - { - "id": "K_5", - "text": "5" - }, - { - "id": "K_6", - "text": "6" - }, - { - "id": "K_7", - "text": "7" - }, - { - "id": "K_8", - "text": "8" - }, - { - "id": "K_9", - "text": "9" - }, - { - "id": "K_0", - "text": "0" - } - ] - }, - { - "id": 2, - "key": [ - { - "id": "K_4", - "layer": "shift", - "text": "$", - "pad": "50" - }, - { - "id": "K_2", - "layer": "shift", - "text": "@" - }, - { - "id": "K_3", - "layer": "shift", - "text": "#" - }, - { - "id": "K_5", - "layer": "shift", - "text": "%" - }, - { - "id": "K_6", - "layer": "shift", - "text": "&" - }, - { - "id": "K_HYPHEN", - "layer": "shift", - "text": "_" - }, - { - "id": "K_EQUAL", - "text": "=", - "layer": "default" - }, - { - "id": "K_BKSLASH", - "layer": "shift", - "text": "|" - }, - { - "id": "K_BKSLASH", - "text": "\\", - "layer": "default" - }, - { - "text": "", - "width": "10", - "sp": "10" - } - ] - }, - { - "id": 3, - "key": [ - { - "id": "K_LBRKT", - "text": "[", - "pad": "110", - "sk": [ - { - "id": "U_00AB", - "text": "\u00AB" - }, - { - "id": "K_COMMA", - "text": "<", - "layer": "shift" - }, - { - "id": "K_LBRKT", - "text": "{", - "layer": "shift" - } - ] - }, - { - "id": "K_9", - "layer": "shift", - "text": "(" - }, - { - "id": "K_0", - "layer": "shift", - "text": ")" - }, - { - "id": "K_RBRKT", - "text": "]", - "sk": [ - { - "id": "U_00BB", - "text": "\u00BB" - }, - { - "id": "K_PERIOD", - "text": ">", - "layer": "shift" - }, - { - "id": "K_RBRKT", - "text": "}", - "layer": "shift" - } - ] - }, - { - "id": "K_EQUAL", - "layer": "shift", - "text": "+" - }, - { - "id": "K_HYPHEN", - "text": "-" - }, - { - "id": "K_8", - "layer": "shift", - "text": "*" - }, - { - "id": "K_SLASH", - "text": "/" - }, - { - "id": "K_BKSP", - "text": "*BkSp*", - "width": "100", - "sp": "1" - } - ] - }, - { - "id": 4, - "key": [ - { - "id": "K_LOWER", - "text": "*abc*", - "width": "150", - "sp": "1", - "nextlayer": "default" - }, - { - "id": "K_LOPT", - "text": "*Menu*", - "width": "120", - "sp": "1" - }, - { - "id": "K_SPACE", - "text": "", - "width": "610", - "sp": "0" - }, - { - "id": "K_ENTER", - "text": "*Enter*", - "width": "150", - "sp": "1" - } - ] - } - ] - } - ] - } -} +{ + "tablet": { + "font": "Tahoma", + "layer": [ + { + "id": "default", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_Q", + "text": "q" + }, + { + "id": "K_W", + "text": "w" + }, + { + "id": "K_E", + "text": "e" + }, + { + "id": "K_R", + "text": "r" + }, + { + "id": "K_T", + "text": "t" + }, + { + "id": "K_Y", + "text": "y" + }, + { + "id": "K_U", + "text": "u" + }, + { + "id": "K_I", + "text": "i" + }, + { + "id": "K_O", + "text": "o" + }, + { + "id": "K_P", + "text": "p" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_A", + "text": "a", + "pad": 70 + }, + { + "id": "K_S", + "text": "s" + }, + { + "id": "K_D", + "text": "d" + }, + { + "id": "K_F", + "text": "f" + }, + { + "id": "K_G", + "text": "g" + }, + { + "id": "K_H", + "text": "h" + }, + { + "id": "K_J", + "text": "j" + }, + { + "id": "K_K", + "text": "k" + }, + { + "id": "K_L", + "text": "l" + }, + { + "sp": "10", + "width": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "110", + "sp": "1", + "nextlayer": "shift" + }, + { + "id": "K_Z", + "text": "z" + }, + { + "id": "K_X", + "text": "x" + }, + { + "id": "K_C", + "text": "c" + }, + { + "id": "K_V", + "text": "v" + }, + { + "id": "K_B", + "text": "b" + }, + { + "id": "K_N", + "text": "n" + }, + { + "id": "K_M", + "text": "m" + }, + { + "id": "K_PERIOD", + "text": ".", + "sk": [ + { + "text": ",", + "id": "K_COMMA" + }, + { + "text": "!", + "id": "K_1", + "layer": "shift" + }, + { + "text": "?", + "id": "K_SLASH", + "layer": "shift" + }, + { + "text": "'", + "id": "K_QUOTE" + }, + { + "text": "\"", + "id": "K_QUOTE", + "layer": "shift" + }, + { + "text": "\\", + "id": "K_BKSLASH" + }, + { + "text": ":", + "id": "K_COLON", + "layer": "shift" + }, + { + "text": ";", + "id": "K_COLON" + } + ] + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "90", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_NUMLOCK", + "text": "*123*", + "width": "140", + "sp": "1", + "nextlayer": "numeric" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "630", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "140", + "sp": "1" + } + ] + } + ] + }, + { + "id": "shift", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_Q", + "text": "Q" + }, + { + "id": "K_W", + "text": "W" + }, + { + "id": "K_E", + "text": "E" + }, + { + "id": "K_R", + "text": "R" + }, + { + "id": "K_T", + "text": "T" + }, + { + "id": "K_Y", + "text": "Y" + }, + { + "id": "K_U", + "text": "U" + }, + { + "id": "K_I", + "text": "I" + }, + { + "id": "K_O", + "text": "O" + }, + { + "id": "K_P", + "text": "P" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_A", + "text": "A", + "pad": 70 + }, + { + "id": "K_S", + "text": "S" + }, + { + "id": "K_D", + "text": "D" + }, + { + "id": "K_F", + "text": "F" + }, + { + "id": "K_G", + "text": "G" + }, + { + "id": "K_H", + "text": "H" + }, + { + "id": "K_J", + "text": "J" + }, + { + "id": "K_K", + "text": "K" + }, + { + "id": "K_L", + "text": "L" + }, + { + "sp": "10", + "width": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "110", + "sp": "2", + "nextlayer": "default" + }, + { + "id": "K_Z", + "text": "Z" + }, + { + "id": "K_X", + "text": "X" + }, + { + "id": "K_C", + "text": "C" + }, + { + "id": "K_V", + "text": "V" + }, + { + "id": "K_B", + "text": "B" + }, + { + "id": "K_N", + "text": "N" + }, + { + "id": "K_M", + "text": "M" + }, + { + "id": "K_PERIOD", + "text": ".", + "layer": "default", + "sk": [ + { + "text": ",", + "id": "K_COMMA", + "layer": "default" + }, + { + "text": "!", + "id": "K_1", + "layer": "shift" + }, + { + "text": "?", + "id": "K_SLASH", + "layer": "shift" + }, + { + "text": "'", + "id": "K_QUOTE", + "layer": "default" + }, + { + "text": "\"", + "id": "K_QUOTE", + "layer": "shift" + }, + { + "text": "\\", + "id": "K_BKSLASH", + "layer": "default" + }, + { + "text": ":", + "id": "K_COLON", + "layer": "shift" + }, + { + "text": ";", + "id": "K_COLON", + "layer": "default" + } + ] + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "90", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_NUMLOCK", + "text": "*123*", + "width": "140", + "sp": "1", + "nextlayer": "numeric" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "630", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "140", + "sp": "1" + } + ] + } + ] + }, + { + "id": "numeric", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "1" + }, + { + "id": "K_2", + "text": "2" + }, + { + "id": "K_3", + "text": "3" + }, + { + "id": "K_4", + "text": "4" + }, + { + "id": "K_5", + "text": "5" + }, + { + "id": "K_6", + "text": "6" + }, + { + "id": "K_7", + "text": "7" + }, + { + "id": "K_8", + "text": "8" + }, + { + "id": "K_9", + "text": "9" + }, + { + "id": "K_0", + "text": "0" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_4", + "text": "$", + "layer": "shift", + "pad": 70 + }, + { + "id": "K_2", + "text": "@", + "layer": "shift" + }, + { + "id": "K_3", + "text": "#", + "layer": "shift" + }, + { + "id": "K_5", + "text": "%", + "layer": "shift" + }, + { + "id": "K_7", + "text": "&", + "layer": "shift" + }, + { + "id": "K_HYPHEN", + "text": "_", + "layer": "shift" + }, + { + "id": "K_EQUAL", + "text": "=", + "layer": "default" + }, + { + "id": "K_BKSLASH", + "text": "|", + "layer": "shift" + }, + { + "id": "K_BKSLASH", + "text": "\\", + "layer": "default" + }, + { + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "110", + "sp": "1" + }, + { + "id": "K_LBRKT", + "text": "[", + "sk": [ + { + "id": "U_00AB", + "text": "\u00AB" + }, + { + "id": "K_COMMA", + "text": "<", + "layer": "shift" + }, + { + "id": "K_LBRKT", + "text": "{", + "layer": "shift" + } + ] + }, + { + "id": "K_9", + "text": "(", + "layer": "shift" + }, + { + "id": "K_0", + "text": ")", + "layer": "shift" + }, + { + "id": "K_RBRKT", + "text": "]", + "sk": [ + { + "id": "U_00BB", + "text": "\u00BB" + }, + { + "id": "K_PERIOD", + "text": ">", + "layer": "shift" + }, + { + "id": "K_RBRKT", + "text": "}", + "layer": "shift" + } + ] + }, + { + "id": "K_EQUAL", + "text": "+", + "layer": "shift" + }, + { + "id": "K_HYPHEN", + "text": "-", + "layer": "default" + }, + { + "id": "K_8", + "text": "*", + "layer": "shift" + }, + { + "id": "K_SLASH", + "text": "/", + "layer": "default" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "90", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_LOWER", + "text": "*abc*", + "width": "140", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "630", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "140", + "sp": "1" + } + ] + } + ] + } + ] + }, + "phone": { + "font": "Tahoma", + "layer": [ + { + "id": "default", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_Q", + "text": "q" + }, + { + "id": "K_W", + "text": "w" + }, + { + "id": "K_E", + "text": "e" + }, + { + "id": "K_R", + "text": "r" + }, + { + "id": "K_T", + "text": "t" + }, + { + "id": "K_Y", + "text": "y" + }, + { + "id": "K_U", + "text": "u" + }, + { + "id": "K_I", + "text": "i" + }, + { + "id": "K_O", + "text": "o" + }, + { + "id": "K_P", + "text": "p" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_A", + "text": "a", + "pad": "50" + }, + { + "id": "K_S", + "text": "s" + }, + { + "id": "K_D", + "text": "d" + }, + { + "id": "K_F", + "text": "f" + }, + { + "id": "K_G", + "text": "g" + }, + { + "id": "K_H", + "text": "h" + }, + { + "id": "K_J", + "text": "j" + }, + { + "id": "K_K", + "text": "k" + }, + { + "id": "K_L", + "text": "l" + }, + { + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "sp": "1", + "nextlayer": "shift" + }, + { + "id": "K_Z", + "text": "z" + }, + { + "id": "K_X", + "text": "x" + }, + { + "id": "K_C", + "text": "c" + }, + { + "id": "K_V", + "text": "v" + }, + { + "id": "K_B", + "text": "b" + }, + { + "id": "K_N", + "text": "n" + }, + { + "id": "K_M", + "text": "m" + }, + { + "id": "K_PERIOD", + "text": ".", + "sk": [ + { + "text": ",", + "id": "K_COMMA" + }, + { + "text": "!", + "id": "K_1", + "layer": "shift" + }, + { + "text": "?", + "id": "K_SLASH", + "layer": "shift" + }, + { + "text": "'", + "id": "K_QUOTE" + }, + { + "text": "\"", + "id": "K_QUOTE", + "layer": "shift" + }, + { + "text": "\\", + "id": "K_BKSLASH" + }, + { + "text": ":", + "id": "K_COLON", + "layer": "shift" + }, + { + "text": ";", + "id": "K_COLON" + } + ] + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_NUMLOCK", + "text": "*123*", + "width": "150", + "sp": "1", + "nextlayer": "numeric" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "610", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "150", + "sp": "1" + } + ] + } + ] + }, + { + "id": "shift", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_Q", + "text": "Q" + }, + { + "id": "K_W", + "text": "W" + }, + { + "id": "K_E", + "text": "E" + }, + { + "id": "K_R", + "text": "R" + }, + { + "id": "K_T", + "text": "T" + }, + { + "id": "K_Y", + "text": "Y" + }, + { + "id": "K_U", + "text": "U" + }, + { + "id": "K_I", + "text": "I" + }, + { + "id": "K_O", + "text": "O" + }, + { + "id": "K_P", + "text": "P" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_A", + "text": "A", + "pad": "50" + }, + { + "id": "K_S", + "text": "S" + }, + { + "id": "K_D", + "text": "D" + }, + { + "id": "K_F", + "text": "F" + }, + { + "id": "K_G", + "text": "G" + }, + { + "id": "K_H", + "text": "H" + }, + { + "id": "K_J", + "text": "J" + }, + { + "id": "K_K", + "text": "K" + }, + { + "id": "K_L", + "text": "L" + }, + { + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "sp": "2", + "nextlayer": "default" + }, + { + "id": "K_Z", + "text": "Z" + }, + { + "id": "K_X", + "text": "X" + }, + { + "id": "K_C", + "text": "C" + }, + { + "id": "K_V", + "text": "V" + }, + { + "id": "K_B", + "text": "B" + }, + { + "id": "K_N", + "text": "N" + }, + { + "id": "K_M", + "text": "M" + }, + { + "id": "K_PERIOD", + "text": ".", + "layer": "default", + "sk": [ + { + "text": ",", + "id": "K_COMMA", + "layer": "default" + }, + { + "text": "!", + "id": "K_1", + "layer": "shift" + }, + { + "text": "?", + "id": "K_SLASH", + "layer": "shift" + }, + { + "text": "'", + "id": "K_QUOTE", + "layer": "default" + }, + { + "text": "\"", + "id": "K_QUOTE", + "layer": "shift" + }, + { + "text": "\\", + "id": "K_BKSLASH", + "layer": "default" + }, + { + "text": ":", + "id": "K_COLON", + "layer": "shift" + }, + { + "text": ";", + "id": "K_COLON", + "layer": "default" + } + ] + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_NUMLOCK", + "text": "*123*", + "width": "150", + "sp": "1", + "nextlayer": "numeric" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "610", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "150", + "sp": "1" + } + ] + } + ] + }, + { + "id": "numeric", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "1" + }, + { + "id": "K_2", + "text": "2" + }, + { + "id": "K_3", + "text": "3" + }, + { + "id": "K_4", + "text": "4" + }, + { + "id": "K_5", + "text": "5" + }, + { + "id": "K_6", + "text": "6" + }, + { + "id": "K_7", + "text": "7" + }, + { + "id": "K_8", + "text": "8" + }, + { + "id": "K_9", + "text": "9" + }, + { + "id": "K_0", + "text": "0" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_4", + "layer": "shift", + "text": "$", + "pad": "50" + }, + { + "id": "K_2", + "layer": "shift", + "text": "@" + }, + { + "id": "K_3", + "layer": "shift", + "text": "#" + }, + { + "id": "K_5", + "layer": "shift", + "text": "%" + }, + { + "id": "K_6", + "layer": "shift", + "text": "&" + }, + { + "id": "K_HYPHEN", + "layer": "shift", + "text": "_" + }, + { + "id": "K_EQUAL", + "text": "=", + "layer": "default" + }, + { + "id": "K_BKSLASH", + "layer": "shift", + "text": "|" + }, + { + "id": "K_BKSLASH", + "text": "\\", + "layer": "default" + }, + { + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_LBRKT", + "text": "[", + "pad": "110", + "sk": [ + { + "id": "U_00AB", + "text": "\u00AB" + }, + { + "id": "K_COMMA", + "text": "<", + "layer": "shift" + }, + { + "id": "K_LBRKT", + "text": "{", + "layer": "shift" + } + ] + }, + { + "id": "K_9", + "layer": "shift", + "text": "(" + }, + { + "id": "K_0", + "layer": "shift", + "text": ")" + }, + { + "id": "K_RBRKT", + "text": "]", + "sk": [ + { + "id": "U_00BB", + "text": "\u00BB" + }, + { + "id": "K_PERIOD", + "text": ">", + "layer": "shift" + }, + { + "id": "K_RBRKT", + "text": "}", + "layer": "shift" + } + ] + }, + { + "id": "K_EQUAL", + "layer": "shift", + "text": "+" + }, + { + "id": "K_HYPHEN", + "text": "-" + }, + { + "id": "K_8", + "layer": "shift", + "text": "*" + }, + { + "id": "K_SLASH", + "text": "/" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_LOWER", + "text": "*abc*", + "width": "150", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "120", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "610", + "sp": "0" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "150", + "sp": "1" + } + ] + } + ] + } + ] + } +} diff --git a/web/testing/issue917-context-and-notany/test_917/source/test_917.kmn b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kmn similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/test_917.kmn rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kmn diff --git a/web/testing/issue917-context-and-notany/test_917/source/test_917.kps b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kps similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/test_917.kps rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kps diff --git a/web/testing/issue917-context-and-notany/test_917/source/test_917.kvks b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kvks similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/test_917.kvks rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/test_917.kvks diff --git a/web/testing/issue917-context-and-notany/test_917/source/welcome.htm b/web/src/test/manual/web/issue917-context-and-notany/test_917/source/welcome.htm similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/source/welcome.htm rename to web/src/test/manual/web/issue917-context-and-notany/test_917/source/welcome.htm diff --git a/web/testing/issue917-context-and-notany/test_917/test_917.keyboard_info b/web/src/test/manual/web/issue917-context-and-notany/test_917/test_917.keyboard_info similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/test_917.keyboard_info rename to web/src/test/manual/web/issue917-context-and-notany/test_917/test_917.keyboard_info diff --git a/web/testing/issue917-context-and-notany/test_917/test_917.kpj b/web/src/test/manual/web/issue917-context-and-notany/test_917/test_917.kpj similarity index 100% rename from web/testing/issue917-context-and-notany/test_917/test_917.kpj rename to web/src/test/manual/web/issue917-context-and-notany/test_917/test_917.kpj diff --git a/web/testing/issue920/index.html b/web/src/test/manual/web/issue920/index.html similarity index 75% rename from web/testing/issue920/index.html rename to web/src/test/manual/web/issue920/index.html index 994339d1a2..f58dcfe5e7 100644 --- a/web/testing/issue920/index.html +++ b/web/src/test/manual/web/issue920/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Issue 920 - deadkeys and multiple groups - Testing - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + +

    KeymanWeb Sample Page - deadkeys and multiple groups Testing

    See issue #920 for details on what this test is all about. Both ;e and .e should produce ə but ;e uses a deadkey and fails.

    Be sure to reference the developer console for additional feedback.

    - +
    - + * + *** + --> diff --git a/web/testing/issue920/issue920.kpj b/web/src/test/manual/web/issue920/issue920.kpj similarity index 100% rename from web/testing/issue920/issue920.kpj rename to web/src/test/manual/web/issue920/issue920.kpj diff --git a/web/testing/issue920/multigroup.kmn b/web/src/test/manual/web/issue920/multigroup.kmn similarity index 100% rename from web/testing/issue920/multigroup.kmn rename to web/src/test/manual/web/issue920/multigroup.kmn diff --git a/web/testing/issue920/multigroup90.kmn b/web/src/test/manual/web/issue920/multigroup90.kmn similarity index 100% rename from web/testing/issue920/multigroup90.kmn rename to web/src/test/manual/web/issue920/multigroup90.kmn diff --git a/web/testing/keyboard-errors/errorhdr.js b/web/src/test/manual/web/keyboard-errors/errorhdr.js similarity index 100% rename from web/testing/keyboard-errors/errorhdr.js rename to web/src/test/manual/web/keyboard-errors/errorhdr.js diff --git a/web/testing/keyboard-errors/index.html b/web/src/test/manual/web/keyboard-errors/index.html similarity index 71% rename from web/testing/keyboard-errors/index.html rename to web/src/test/manual/web/keyboard-errors/index.html index 913bc484d3..7955f544d3 100644 --- a/web/testing/keyboard-errors/index.html +++ b/web/src/test/manual/web/keyboard-errors/index.html @@ -2,87 +2,87 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Uncompiled Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb Sample Page - Error Testing page

    Pick one of the 'debugging' keyboards to test whether the represented error is handled correctly.

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/keyboard-errors/timeout.js b/web/src/test/manual/web/keyboard-errors/timeout.js similarity index 100% rename from web/testing/keyboard-errors/timeout.js rename to web/src/test/manual/web/keyboard-errors/timeout.js diff --git a/web/testing/keyboard-errors/unparsable.js b/web/src/test/manual/web/keyboard-errors/unparsable.js similarity index 100% rename from web/testing/keyboard-errors/unparsable.js rename to web/src/test/manual/web/keyboard-errors/unparsable.js diff --git a/web/testing/lao_2008_basic-1.2.js b/web/src/test/manual/web/lao_2008_basic-1.2.js similarity index 100% rename from web/testing/lao_2008_basic-1.2.js rename to web/src/test/manual/web/lao_2008_basic-1.2.js diff --git a/web/testing/mnemonic/index.html b/web/src/test/manual/web/mnemonic/index.html similarity index 70% rename from web/testing/mnemonic/index.html rename to web/src/test/manual/web/mnemonic/index.html index 29ac068a91..65331615aa 100644 --- a/web/testing/mnemonic/index.html +++ b/web/src/test/manual/web/mnemonic/index.html @@ -2,45 +2,45 @@ - - - - + + + + - - + + KeymanWeb Testing Page - Basic Mnemonic Support - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb Sample Page - Platform Testing

    This page is designed to test the Platform statement for consistency. Refer to PR #969. @@ -60,7 +60,7 @@

    Be sure to reference the developer console for additional feedback.


    - + * + *** + --> diff --git a/web/testing/platform/platformtest.js b/web/src/test/manual/web/platform/platformtest.js similarity index 100% rename from web/testing/platform/platformtest.js rename to web/src/test/manual/web/platform/platformtest.js diff --git a/web/testing/platform/utilities.js b/web/src/test/manual/web/platform/utilities.js similarity index 100% rename from web/testing/platform/utilities.js rename to web/src/test/manual/web/platform/utilities.js diff --git a/web/testing/prediction-mtnt/index.html b/web/src/test/manual/web/prediction-mtnt/index.html similarity index 80% rename from web/testing/prediction-mtnt/index.html rename to web/src/test/manual/web/prediction-mtnt/index.html index d66ea6adaf..a056bd87c4 100644 --- a/web/testing/prediction-mtnt/index.html +++ b/web/src/test/manual/web/prediction-mtnt/index.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Testing Page - Predictive Text: robust testing - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + + - - + +

    KeymanWeb Sample Page - Predictive Text: robust testing

    This page is set to use a more complete, robust model than the UI-bootstrapping page.

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    @@ -98,20 +98,20 @@
    - - + * + *** + --> diff --git a/web/testing/prediction-mtnt/nrc.en.mtnt.model.js b/web/src/test/manual/web/prediction-mtnt/nrc.en.mtnt.model.js similarity index 99% rename from web/testing/prediction-mtnt/nrc.en.mtnt.model.js rename to web/src/test/manual/web/prediction-mtnt/nrc.en.mtnt.model.js index d088022bb9..f4f3605081 100644 --- a/web/testing/prediction-mtnt/nrc.en.mtnt.model.js +++ b/web/src/test/manual/web/prediction-mtnt/nrc.en.mtnt.model.js @@ -3,42 +3,42 @@ var definitions = { defaults: { version: "1.0.0", - applyCasing: function defaultApplyCasing(casing, text) { - switch (casing) { - case 'lower': - return text.toLowerCase(); - case 'upper': - return text.toUpperCase(); - case 'initial': - var headCode = text.charCodeAt(0); - // The length of the first code unit, as measured in code points. - var headUnitLength = 1; - // Is the first character a high surrogate, indicating possible use of UTF-16 - // surrogate pairs? Also, is the string long enough for there to BE a pair? - if (text.length > 1 && headCode >= 0xD800 && headCode <= 0xDBFF) { - // It's possible, so now we check for low surrogates. - var lowSurrogateCode = text.charCodeAt(1); - if (lowSurrogateCode >= 0xDC00 && lowSurrogateCode <= 0xDFFF) { - // We have a surrogate pair; this pair is the 'first' character. - headUnitLength++; - } - } - // Capitalizes the first code unit of the string, leaving the rest intact. - return text.substring(0, headUnitLength).toUpperCase() // head - uppercased - .concat(text.substring(headUnitLength)); // tail - lowercased - } + applyCasing: function defaultApplyCasing(casing, text) { + switch (casing) { + case 'lower': + return text.toLowerCase(); + case 'upper': + return text.toUpperCase(); + case 'initial': + var headCode = text.charCodeAt(0); + // The length of the first code unit, as measured in code points. + var headUnitLength = 1; + // Is the first character a high surrogate, indicating possible use of UTF-16 + // surrogate pairs? Also, is the string long enough for there to BE a pair? + if (text.length > 1 && headCode >= 0xD800 && headCode <= 0xDBFF) { + // It's possible, so now we check for low surrogates. + var lowSurrogateCode = text.charCodeAt(1); + if (lowSurrogateCode >= 0xDC00 && lowSurrogateCode <= 0xDFFF) { + // We have a surrogate pair; this pair is the 'first' character. + headUnitLength++; + } + } + // Capitalizes the first code unit of the string, leaving the rest intact. + return text.substring(0, headUnitLength).toUpperCase() // head - uppercased + .concat(text.substring(headUnitLength)); // tail - lowercased + } } }, model: { - searchTermToKey: function defaultCasedSearchTermToKey(wordform, applyCasing) { - // While this is a bit WET, as the basic `defaultSearchTermToKey` exists and performs some of - // the same functions, repetition is the easiest way to allow the function to be safely compiled - // with ease by use of `.toString()`. - return Array.from(wordform - .normalize('NFKD') - // Remove any combining diacritics (if input is in NFKD) - .replace(/[\u0300-\u036F]/g, '')) // end of `Array.from` - .map(function (c) { return applyCasing('lower', c); }) - .join(''); + searchTermToKey: function defaultCasedSearchTermToKey(wordform, applyCasing) { + // While this is a bit WET, as the basic `defaultSearchTermToKey` exists and performs some of + // the same functions, repetition is the easiest way to allow the function to be safely compiled + // with ease by use of `.toString()`. + return Array.from(wordform + .normalize('NFKD') + // Remove any combining diacritics (if input is in NFKD) + .replace(/[\u0300-\u036F]/g, '')) // end of `Array.from` + .map(function (c) { return applyCasing('lower', c); }) + .join(''); } }, applyCasing: function(caseToApply, text) { diff --git a/web/testing/prediction-ui/index.html b/web/src/test/manual/web/prediction-ui/index.html similarity index 96% rename from web/testing/prediction-ui/index.html rename to web/src/test/manual/web/prediction-ui/index.html index b83351c30a..3a22ed0a93 100644 --- a/web/testing/prediction-ui/index.html +++ b/web/src/test/manual/web/prediction-ui/index.html @@ -23,7 +23,7 @@ - + - + + - + diff --git a/web/testing/promise-api/promisehdr.js b/web/src/test/manual/web/promise-api/promisehdr.js similarity index 100% rename from web/testing/promise-api/promisehdr.js rename to web/src/test/manual/web/promise-api/promisehdr.js diff --git a/web/testing/promise-api/sil_cameroon_qwerty.js b/web/src/test/manual/web/promise-api/sil_cameroon_qwerty.js similarity index 100% rename from web/testing/promise-api/sil_cameroon_qwerty.js rename to web/src/test/manual/web/promise-api/sil_cameroon_qwerty.js diff --git a/web/testing/regression-tests/.gitignore b/web/src/test/manual/web/regression-tests/.gitignore similarity index 100% rename from web/testing/regression-tests/.gitignore rename to web/src/test/manual/web/regression-tests/.gitignore diff --git a/web/testing/regression-tests/README.md b/web/src/test/manual/web/regression-tests/README.md similarity index 100% rename from web/testing/regression-tests/README.md rename to web/src/test/manual/web/regression-tests/README.md diff --git a/web/testing/regression-tests/index.html b/web/src/test/manual/web/regression-tests/index.html similarity index 96% rename from web/testing/regression-tests/index.html rename to web/src/test/manual/web/regression-tests/index.html index 39b4f9a75c..a2c3864501 100644 --- a/web/testing/regression-tests/index.html +++ b/web/src/test/manual/web/regression-tests/index.html @@ -94,7 +94,7 @@

    Input Receiver

    - + @@ -107,6 +107,7 @@ +

    Return to test-page index.

    \ No newline at end of file diff --git a/web/testing/regression-tests/interactive.js b/web/src/test/manual/web/regression-tests/interactive.js similarity index 100% rename from web/testing/regression-tests/interactive.js rename to web/src/test/manual/web/regression-tests/interactive.js diff --git a/web/testing/regression-tests/karma.conf.js b/web/src/test/manual/web/regression-tests/karma.conf.js similarity index 100% rename from web/testing/regression-tests/karma.conf.js rename to web/src/test/manual/web/regression-tests/karma.conf.js diff --git a/web/testing/regression-tests/node_src/config.js b/web/src/test/manual/web/regression-tests/node_src/config.js similarity index 96% rename from web/testing/regression-tests/node_src/config.js rename to web/src/test/manual/web/regression-tests/node_src/config.js index 3a8318f0b7..8892651f25 100644 --- a/web/testing/regression-tests/node_src/config.js +++ b/web/src/test/manual/web/regression-tests/node_src/config.js @@ -38,7 +38,7 @@ module.exports = { /** * Various relative paths */ - KEYMANWEB_RELATIVE_PATH: 'web/release/unminified/web', + KEYMANWEB_RELATIVE_PATH: 'web/build/app/web/debug', BASE_RELATIVE_PATH: '../../../../', KEYMAN_REPO_BASE_RELATIVE_PATH: '../../../', diff --git a/web/testing/regression-tests/node_src/keyname.js b/web/src/test/manual/web/regression-tests/node_src/keyname.js similarity index 100% rename from web/testing/regression-tests/node_src/keyname.js rename to web/src/test/manual/web/regression-tests/node_src/keyname.js diff --git a/web/testing/regression-tests/node_src/test-host.js b/web/src/test/manual/web/regression-tests/node_src/test-host.js similarity index 100% rename from web/testing/regression-tests/node_src/test-host.js rename to web/src/test/manual/web/regression-tests/node_src/test-host.js diff --git a/web/testing/regression-tests/node_src/util.js b/web/src/test/manual/web/regression-tests/node_src/util.js similarity index 100% rename from web/testing/regression-tests/node_src/util.js rename to web/src/test/manual/web/regression-tests/node_src/util.js diff --git a/web/testing/regression-tests/package.json b/web/src/test/manual/web/regression-tests/package.json similarity index 100% rename from web/testing/regression-tests/package.json rename to web/src/test/manual/web/regression-tests/package.json diff --git a/web/testing/regression-tests/src/known-failures.js b/web/src/test/manual/web/regression-tests/src/known-failures.js similarity index 100% rename from web/testing/regression-tests/src/known-failures.js rename to web/src/test/manual/web/regression-tests/src/known-failures.js diff --git a/web/testing/regression-tests/src/test-runner.js b/web/src/test/manual/web/regression-tests/src/test-runner.js similarity index 100% rename from web/testing/regression-tests/src/test-runner.js rename to web/src/test/manual/web/regression-tests/src/test-runner.js diff --git a/web/testing/regression-tests/src/ui.js b/web/src/test/manual/web/regression-tests/src/ui.js similarity index 100% rename from web/testing/regression-tests/src/ui.js rename to web/src/test/manual/web/regression-tests/src/ui.js diff --git a/web/testing/regression-tests/test-builder.js b/web/src/test/manual/web/regression-tests/test-builder.js similarity index 100% rename from web/testing/regression-tests/test-builder.js rename to web/src/test/manual/web/regression-tests/test-builder.js diff --git a/web/testing/regression-tests/test.html b/web/src/test/manual/web/regression-tests/test.html similarity index 100% rename from web/testing/regression-tests/test.html rename to web/src/test/manual/web/regression-tests/test.html diff --git a/web/testing/regression-tests/test.js b/web/src/test/manual/web/regression-tests/test.js similarity index 100% rename from web/testing/regression-tests/test.js rename to web/src/test/manual/web/regression-tests/test.js diff --git a/web/testing/rotation-events/index.html b/web/src/test/manual/web/rotation-events/index.html similarity index 86% rename from web/testing/rotation-events/index.html rename to web/src/test/manual/web/rotation-events/index.html index f2ba6b4af4..6e884f505a 100644 --- a/web/testing/rotation-events/index.html +++ b/web/src/test/manual/web/rotation-events/index.html @@ -2,28 +2,28 @@ - + KeymanWeb Sample Page - Unminified Source - - + #KeymanWebControl {width:50%;min-width:600px;} + - - + + - - + - + + @@ -47,16 +47,16 @@ var lastW, lastH, lastO; //var lastOSKW, lastOSKH, lastVS; var noRecentChange = 100; - + function doLog(event, onlyIfChanged) { var orient = window.orientation; var orientText = ' w.o='; - + if(orient === undefined) { orient = window.screen.orientation.angle; orientText = ' w.soa='; } - + if(onlyIfChanged) { if(lastW == window.innerWidth && lastH == window.innerHeight && lastO == orient) { if(noRecentChange == 100) { @@ -69,26 +69,26 @@ lastH = window.innerHeight; lastO = orient; } - + e.value = e.value + event + ': w.iw='+window.innerWidth+' w.ih='+window.innerHeight+orientText+orient+'\n'; - + if(event == 'kmw.ri' || event == 'kmw.rh' || event == 'kmw.re') { e.value = e.value + ' osk.w=' + keyman.osk.computedWidth + ' osk.h=' + keyman.osk.computedHeight + ' kmw.vs=' + keyman.util.getViewportScale() + '\n'; } - + e.scrollTop = e.scrollHeight; noRecentChange = 0; } - + window.setInterval(function() { doLog('tick', true); }, 1); - + window.addEventListener('resize', function() { doLog('resize-b', false) }, false); window.addEventListener('resize', function() { doLog('resize-c', false) }, true); window.addEventListener('orientationchange', function() { doLog('orientationchange-b', false) }, false); window.addEventListener('orientationchange', function() { doLog('orientationchange-c', false) }, true); - + var kmw_ri = com.keyman.RotationManager.prototype.initNewRotation; com.keyman.RotationManager.prototype.initNewRotation = function() { doLog('kmw.ri'); diff --git a/web/testing/scrolling/index.html b/web/src/test/manual/web/scrolling/index.html similarity index 95% rename from web/testing/scrolling/index.html rename to web/src/test/manual/web/scrolling/index.html index 6520a448c5..138e5a43c1 100644 --- a/web/testing/scrolling/index.html +++ b/web/src/test/manual/web/scrolling/index.html @@ -24,7 +24,7 @@ - + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - + - + - + + - + - - + +

    KeymanWeb Sample Page - Sentry Setup test host

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Add a keyboard by keyboard name:

    - +

    Add a keyboard by BCP-47 language code:

    Add a keyboard by language name:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/sentry-integration/timeout.js b/web/src/test/manual/web/sentry-integration/timeout.js similarity index 100% rename from web/testing/sentry-integration/timeout.js rename to web/src/test/manual/web/sentry-integration/timeout.js diff --git a/web/testing/sentry-integration/unparsable.js b/web/src/test/manual/web/sentry-integration/unparsable.js similarity index 100% rename from web/testing/sentry-integration/unparsable.js rename to web/src/test/manual/web/sentry-integration/unparsable.js diff --git a/web/testing/spacebar-text/index.html b/web/src/test/manual/web/spacebar-text/index.html similarity index 95% rename from web/testing/spacebar-text/index.html rename to web/src/test/manual/web/spacebar-text/index.html index 0d88b40782..ee1053be0c 100644 --- a/web/testing/spacebar-text/index.html +++ b/web/src/test/manual/web/spacebar-text/index.html @@ -17,7 +17,7 @@ - + - + + - + + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - - + + - - + +

    KeymanWeb Sample Page - Shift Testing

    See issue #978 for details on what this test is all about.

    Be sure to reference the developer console for additional feedback.

    - +
    - + * + *** + --> diff --git a/web/testing/test-updateLayer/rac_balti.js b/web/src/test/manual/web/test-updateLayer/rac_balti.js similarity index 100% rename from web/testing/test-updateLayer/rac_balti.js rename to web/src/test/manual/web/test-updateLayer/rac_balti.js diff --git a/web/testing/test-updateLayer/utilities.js b/web/src/test/manual/web/test-updateLayer/utilities.js similarity index 100% rename from web/testing/test-updateLayer/utilities.js rename to web/src/test/manual/web/test-updateLayer/utilities.js diff --git a/web/testing/test_chirality.js b/web/src/test/manual/web/test_chirality.js similarity index 100% rename from web/testing/test_chirality.js rename to web/src/test/manual/web/test_chirality.js diff --git a/web/testing/unminified - manual.html b/web/src/test/manual/web/unminified - manual.html similarity index 76% rename from web/testing/unminified - manual.html rename to web/src/test/manual/web/unminified - manual.html index 09e39ca797..def037567d 100644 --- a/web/testing/unminified - manual.html +++ b/web/src/test/manual/web/unminified - manual.html @@ -2,38 +2,38 @@ - - - + + + - + - - + + KeymanWeb Sample Page - Unminified Source - - - - - + #KeymanWebControl {width:50%;min-width:600px;} + - + + + - - + + - + + - + - - + +

    KeymanWeb Sample Page - Unminified Source

    - -
    +

    Type in your language in this text area:

    - +

    or in this input field:

    - +

    Add a keyboard by keyboard name:

    - +

    Add a keyboard by BCP-47 language code:

    Add a keyboard by language name:

    - +

    Return to testing home page

    - - + * + *** + --> diff --git a/web/testing/unminified.html b/web/src/test/manual/web/unminified.html similarity index 95% rename from web/testing/unminified.html rename to web/src/test/manual/web/unminified.html index 8cefb8fe60..7f2ab0062d 100644 --- a/web/testing/unminified.html +++ b/web/src/test/manual/web/unminified.html @@ -23,7 +23,7 @@ - + - + - + + - + + - + @@ -90,11 +90,11 @@

    Please ensure that the keyboard(s) being loaded may be referenced at <server-root>/resources/json/keyboards.

    Testing File: - +

    Keyboard Stubs: - +