chore(ios): Merge remote-tracking branch 'origin/stable-14.0' into fix/ios/cherry/stuck-settings-toggles

This commit is contained in:
jahorton 2021-08-23 08:07:38 +07:00
commit 2f8ae04d55
12 changed files with 166 additions and 113 deletions

View file

@ -1,32 +1,32 @@
/* A descriptive message used for errors when the app is already busy downloading */
"alert-download-error-busy" = "Onsuz da yükləməklə məşğuldur.";
"alert-download-error-busy" = "Artıq endirilir.";
/* A descriptive message used when a download fails */
"alert-download-error-detail" = "Yükləmə və ya quraşdırma zamanı xəta baş verdi.";
"alert-download-error-detail" = "Endirmə və ya quraşdırma zamanı xəta baş verdi.";
/* Title for a "download failed" alert */
"alert-download-error-title" = "Yükləmə xətası";
"alert-download-error-title" = "Endirmə xətası";
/* Title for a general alert about errors */
"alert-error-title" = "Xəta";
/* A descriptive message used when no internet connection is detected */
"alert-no-connection-detail" = "Keyman serverinə çata bilmədi. Zəhmət olmasa bir az sonra yenə cəhd edin.";
"alert-no-connection-detail" = "Keyman serverinə çata bilmədi. Zəhmət olmasa daha sonra yenidən sınayın.";
/* Title for a "no connection" alert */
"alert-no-connection-title" = "Əlaqə xətası";
"alert-no-connection-title" = "Bağlantı xətası";
/* Short text for a 'back' navigational command. Used to return to the previous screen */
"command-back" = "Geri";
/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */
"command-cancel" = "Ləğv etmək";
"command-cancel" = "İmtina";
/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */
"command-done" = "Bitdi";
"command-done" = "Hazırdır";
/* Short text for an 'install' command. Used to confirm installation of a package. */
"command-install" = "Yüklemek";
"command-install" = "Quraşdır";
/* Short text for a 'next' navigational command. Used to advance to the next screen */
"command-next" = "Növbəti";
@ -38,25 +38,25 @@
"command-uninstall" = "Sil";
/* Text for the command to uninstall a keyboard */
"command-uninstall-keyboard" = "Klaviaturanı silin";
"command-uninstall-keyboard" = "Klaviaturanı sil";
/* Confirmation text to display before uninstalling a keyboard */
"command-uninstall-keyboard-confirm" = "Bu klaviaturanı silmək istəyirsiniz?";
/* Text for the command to uninstall a lexical model */
"command-uninstall-lexical-model" = "Lüğəti silmək";
"command-uninstall-lexical-model" = "Lüğəti sil";
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "Bu lüğəti silmək istəyirsiniz?";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "Lazımi bir fayl tapılmadı.";
"error-missing-file" = "Tələb olunan fayl tapıla bilmədi.";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file-critical" = "Həlledici bir fayl tapılmadı. Tətbiqi yenidən quraşdırmağa cəhd edin.";
"error-missing-file-critical" = "Kritik fayl tapıla bilmədi. Tətbiqi yenidən quraşdırmağı sınayın.";
/* Text for errors in data received from search queries */
"error-query-decoding" = "Server hazırda texniki çətinliklərlə üzləşir";
"error-query-decoding" = "Hal-hazırda server texniki çətinliklər yaşayır";
/* A descriptive message used when a download fails */
"error-query-general" = "Serverlə əlaqə qurma xətası";
@ -65,7 +65,7 @@
"error-query-no-data" = "Server cavab vermədi";
/* Text for general errors where not much information is known */
"error-unknown" = "Gözlənilməz bir səhv baş verdi";
"error-unknown" = "Gözlənilməz bir xəta baş verdi";
/* Text for error when updating a resource: cannot download because no source is available */
"error-update-no-link" = "Bu paket üçün yeniləmə mənbəyi mövcud deyil";
@ -89,7 +89,7 @@
"installer-label-package-info" = "Paket məlumatı";
/* Label used for the language-selection tab with the package installation prompt on phones. */
"installer-label-select-languages" = "Dil (lər) seçin";
"installer-label-select-languages" = "Dil(lər)i seçin";
/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */
"installer-label-version" = "Versiya: %@";
@ -98,22 +98,22 @@
"installer-section-available-languages" = "Mövcud Dillər";
/* Text for the help popup for changing keyboards with the globe key */
"keyboard-help-change" = "Klaviaturanı dəyişdirmək üçün buraya vurun";
"keyboard-help-change" = "Klaviaturanı dəyişdirmək üçün buraya toxunun";
/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */
"keyboard-menu-exit" = "Bağlamaq %@";
"keyboard-menu-exit" = "%@ bağla";
/* Error installing a Keyman package - could not allocate a location to install it */
"kmp-error-file-system" = "Paketin quraşdırılması zamanı səhv - fayl sistemi xətası";
"kmp-error-file-system" = "Paket quraşdırma xətası - fayl sistem xətası";
/* Error installing a Keyman package - could not copy package files */
"kmp-error-file-copying" = "Paketin quraşdırılması zamanı səhv - tələb olunan faylları köçürə bilmədi";
"kmp-error-file-copying" = "Paket quraşdırma xətası - tələb olunan fayllar kopyalana bilmədi";
/* Error opening a Keyman package - package is not valid */
"kmp-error-invalid" = "Paketin faylı pozulub.";
"kmp-error-invalid" = "Paketin faylı zədəlidir.";
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
"kmp-error-missing-resource" = "Bu paketdə tələb olunan klaviatura və ya lüğət yoxdur.";
"kmp-error-missing-resource" = "Bu paket tələb olunan klaviatura və ya lüğəti ehtiva etmir.";
/* Error opening a Keyman package - cannot parse contents */
"kmp-error-no-metadata" = "Bu paket düzgün qurulmamışdır - məzmunu bilinmir.";
@ -134,16 +134,16 @@
"menu-langsettings-section-settings" = "Dil parametrləri";
/* Title for the language-specific settings menus */
"menu-langsettings-title" = "%@ Parametrlər";
"menu-langsettings-title" = "%@ Parametrləri";
/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-correct" = "Düzəlişləri aktivləşdirmək";
"menu-langsettings-toggle-correct" = "Düzəlişləri fəallaşdır";
/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-predict" = "Proqnozları aktivləşdirmək";
"menu-langsettings-toggle-predict" = "Təxminləri fəallaşdır";
/* 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" = "Bu lüğəti qurmaq istərdinizmi?";
"menu-lexical-model-install-message" = "Bu lüğəti quraşdırmaq istəyirsiniz?";
/* 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$@";
@ -152,55 +152,55 @@
"menu-lexical-model-none-message" = "Heç bir lüğət yoxdur";
/* Title for the lexical model menu, a submenu of the language-specific settings menus */
"menu-lexical-model-title" = "%@ Lüğətlər";
"menu-lexical-model-title" = "%@ Lüğətləri";
/* Title for the keyboard picker */
"menu-picker-title" = "Klaviaturalar";
/* Primary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report" = "Xəta Bildirilməsinə icazə verin";
"menu-settings-error-report" = "Xəta bildirməyə icazə ver";
/* Secondary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report-description" = "\"Tam giriş\" tələb edə bilər";
"menu-settings-error-report-description" = "\"Tam müraciət\" tələb edə bilər";
/* Primary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file" = "Fayldan quraşdırın";
/* Secondary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file-description" = ".Kmp faylları axtarmaq";
"menu-settings-install-from-file-description" = ".kmp fayllarını axtar";
/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */
"menu-settings-system-keyboard-menu" = "Sistem Klaviatura Parametrləri";
/* Label for the "Show Banner" toggle on the main settings screen */
"menu-settings-show-banner" = "Banner göstərmək";
"menu-settings-show-banner" = "Banneri göstər";
/* Label for the "Get Started" automatic display toggle seen in the Settings menu */
"menu-settings-startup-get-started" = "Başlanğıcda 'Başlayın' göstərmək";
"menu-settings-startup-get-started" = "Başlanğıcda 'Başlayın' göstər";
/* Title for the main Settings menu */
"menu-settings-title" = "Keyman Parametrləri";
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "Klaviatura yüklənmədi";
"notification-download-failure-keyboard" = "Klaviatura endirilmədi";
/* Short text for notification: download failure for lexical model */
"notification-download-failure-lexical-model" = "Lüğət yüklənmədi";
"notification-download-failure-lexical-model" = "Lüğət endirilmədi";
/* Short text for notification: download success for keyboard */
"notification-download-success-keyboard" = "Klaviatura uğurla endirildi";
/* Short text for notification: download success for lexical model */
"notification-download-success-lexical-model" = "Leksik model uğurla yükləndi";
"notification-download-success-lexical-model" = "Leksik model uğurla endirildi";
/* Short text for notification: downloading a keyboard */
"notification-downloading-keyboard" = "Klaviatura yüklənir \\ U2026";
"notification-downloading-keyboard" = "Klaviatura endirilir\U2026";
/* Short text for notification: downloading a lexical model */
"notification-downloading-lexical-model" = "Lüğət yüklənir \U2026";
"notification-downloading-lexical-model" = "Lüğət endirilir\U2026";
/* Short text for notification: an update is available */
"notification-update-available" = "Yeniləmə mümkündür";
"notification-update-available" = "Yeniləmə mövcuddur";
/* Short text for notification: currently updating */
"notification-update-processing" = "Yenilənir\U2026";
@ -209,4 +209,4 @@
"success-install" = "Uğurla quraşdırıldı.";
/* A title to use in alerts indicating 'success' at whatever task the user requested */
"success-title" = "Uğur";
"success-title" = "Uğurlu";

View file

@ -13,9 +13,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u lüğət quraşdırılıb</string>
<string>%u lüğət quraşdırıldı</string>
<key>other</key>
<string>%u lüğətlər quraşdırıldı</string>
<string>%u lüğət quraşdırıldı</string>
</dict>
</dict>
<key>notification-update-failed</key>

View file

@ -28,6 +28,7 @@ class GetStartedViewController: UIViewController, UITableViewDelegate, UITableVi
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshTable),
name: UIApplication.didBecomeActiveNotification, object: nil)
navItem.title = NSLocalizedString("menu-get-started", comment: "")
tableView.isScrollEnabled = false
let icon = UIImageView(image: #imageLiteral(resourceName: "887-notepad.png"))

View file

@ -1,5 +1,5 @@
/* Title for the bookmarks menu within the embedded browser */
"browser-bookmarks-add-title" = "Əlfəcin əlavə etmək";
"browser-bookmarks-add-title" = "Əlfəcin əlavə et";
/* Title for the bookmarks menu within the embedded browser */
"browser-bookmarks-none" = "Əlfəcin yoxdur";
@ -17,7 +17,7 @@
"error-opening-page" = "Səhifə açıla bilmir";
/* Long-form used when installing a font in order to display a language properly. */
"font-install-description" = "Bütün tətbiqlərinizdə %@ görüntüsünü düzgün görünmək üçün Quraşdır'a toxunun";
"font-install-description" = "Bütün tətbiqlərinizdə %@ in düzgün görünməsi üçün \"Quraşdır\"a toxunun";
/* The name of the iOS Settings menu option for keyboards */
"ios-settings-keyboards" = "Klaviaturalar";
@ -30,13 +30,13 @@ underneath the app's name within the app-specific keyboard menu.) */
"language-for-font" = "%@ Şrift";
/* Used for 'add' options within menus */
"menu-add" = "Əlavə etmək";
"menu-add" = "Əlavə et";
/* 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" = "Ləğv etmək";
"menu-cancel" = "İmtina";
/* Menu option that erases all previously-typed text. */
"menu-clear-text" = "Mətni təmizlə";
@ -51,13 +51,13 @@ underneath the app's name within the app-specific keyboard menu.) */
"menu-more" = "Daha çox";
/* Menu option used to edit keyboard and dictionary settings */
"menu-settings" = "Parametrlər";
"menu-settings" = "Tənzimləmələr";
/* Menu option that displays the iOS Share menu */
"menu-share" = "Paylaş";
/* Menu option that displays an embedded web browser. */
"menu-show-browser" = "Brauzer";
"menu-show-browser" = "Səyyah";
/* Menu option used to control in-app font size. */
"menu-text-size" = "Mətn ölçüsü";
@ -66,16 +66,16 @@ underneath the app's name within the app-specific keyboard menu.) */
"text-size-label" = "Mətn ölçüsü:%i";
/* Text to indicate that a user should set a toggle within iOS Settings to 'active'. */
"toggle-to-enable" = "%@ İşə salmaq";
"toggle-to-enable" = "Fəallaşdır: %@";
/* First option on the Get Started tutorial - Add a keyboard for your language */
"tutorial-add-keyboard" = "Sizin diliniz üçün klaviaturanı əlavə edin";
"tutorial-add-keyboard" = "Diliniz üçün klaviatura əlavə edin";
/* Third option on the Get Started tutorial - Displays app help. */
"tutorial-show-help" = "Ətraflı məlumat";
/* Second option on the Get Started tutorial - Set up Keyman as system-wide keyboard */
"tutorial-system-keyboard" = "Keyman ümumsistem klaviatura kimi işə salmaq";
"tutorial-system-keyboard" = "\"Keyman\"ı geniş sistem klaviaturası kimi quraşdırın";
/* Used to display app version (as in \"Version: 1.0.2\" */
"version-label" = "Versiya %@";
"version-label" = "Versiya: %@";

View file

@ -5,6 +5,7 @@ from urllib.parse import parse_qs, urlparse
from keyman_config import KeymanComUrl, __tier__
from keyman_config.install_window import InstallKmpWindow
from keyman_config.get_kmp import get_download_folder, download_kmp_file
from zipfile import is_zipfile
def download_and_install_package(url):
@ -42,6 +43,10 @@ def download_and_install_package(url):
logging.critical("Invalid URL: " + url)
return
if not is_zipfile(packageFile):
logging.critical("Not a valid KMP package: " + url)
return
if packageFile and not _install_package(packageFile, bcp47):
logging.log(severity, "Can't find file " + url)

View file

@ -22,6 +22,7 @@ from keyman_config.install_window import InstallKmpWindow, find_keyman_image
from keyman_config.uninstall_kmp import uninstall_kmp
from keyman_config.accelerators import bind_accelerator, init_accel
from keyman_config.get_kmp import user_keyboard_dir
from gi.overrides.GLib import GError
class ViewInstalledWindowBase(Gtk.Window):
@ -228,19 +229,26 @@ class ViewInstalledWindow(ViewInstalledWindowBase):
welcome_file = os.path.join(path, "welcome.htm")
options_file = os.path.join(path, "options.htm")
icofile = os.path.join(path, kmpdata['packageID'] + bmppng)
icofile_name = os.path.join(path, kmpdata['packageID'] + bmppng)
if not os.path.isfile(welcome_file):
welcome_file = None
if not os.path.isfile(options_file):
options_file = None
if not os.path.isfile(icofile):
icofile = os.path.join(path, kmpdata['keyboardID'] + bmppng)
if not os.path.isfile(icofile):
icofile = find_keyman_image("icon_kmp.png")
if not os.path.isfile(icofile_name):
icofile_name = os.path.join(path, kmpdata['keyboardID'] + bmppng)
if not os.path.isfile(icofile_name):
icofile_name = find_keyman_image("icon_kmp.png")
try:
icofile = GdkPixbuf.Pixbuf.new_from_file_at_size(icofile_name, 16, 16)
except GError:
_, value, _ = sys.exc_info()
logging.info("Error reading icon file %s: %s" % (icofile_name, value.message))
icofile = None
store.append([
GdkPixbuf.Pixbuf.new_from_file_at_size(icofile, 16, 16),
icofile,
kmpdata['name'],
kmpdata['version'],
kmpdata['packageID'],

View file

@ -9,6 +9,7 @@ from keyman_config.uninstall_kmp import uninstall_kmp
import datetime
import time
from zipfile import is_zipfile
def get_languages():
@ -120,7 +121,7 @@ def main():
if args.file:
name, ext = os.path.splitext(args.file)
if ext != ".kmp":
if ext != ".kmp" or not is_zipfile(args.file):
logging.error("km-package-install: Input file %s is not a kmp file.", args.file)
logging.error("km-package-install -f <kmpfile>")
sys.exit(2)

View file

@ -71,14 +71,14 @@ class GnomeKeyboardsUtilTests(unittest.TestCase):
self.MockSettingsClass.return_value.set_value.assert_called_once_with(
"sources", keyboards)
@patch('keyman_config.install_kmp.os.system')
@patch('keyman_config.os.system')
def test_IsGnomeShell_RunningGnomeShell(self, mockSystem):
# Setup
mockSystem.return_value = 0
# Execute/Verify
self.assertEqual(is_gnome_shell(), True)
@patch('keyman_config.install_kmp.os.system')
@patch('keyman_config.os.system')
def test_IsGnomeShell_NotRunningGnomeShell(self, mockSystem):
# Setup
mockSystem.return_value = 1

View file

@ -8,53 +8,79 @@ from keyman_config.handle_install import download_and_install_package
class HandleInstallTests(unittest.TestCase):
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
def test_downloadAndInstallPackage_file(self, installPackageMethod):
def test_downloadAndInstallPackage_file(self, installPackageMethod, mockIsZipfile):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package('/tmp/keyboard/sil_euro_latin.kmp')
# Verify
installPackageMethod.assert_called_with('/tmp/keyboard/sil_euro_latin.kmp', '')
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
def test_downloadAndInstallPackage_fileUrl(self, installPackageMethod):
def test_downloadAndInstallPackage_fileUrl(self, installPackageMethod, mockIsZipfile):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package('file:///tmp/keyboard/sil_euro_latin.kmp')
# Verify
installPackageMethod.assert_called_with('/tmp/keyboard/sil_euro_latin.kmp', '')
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
def test_downloadAndInstallPackage_fileUrlWithBcp47(self, installPackageMethod):
def test_downloadAndInstallPackage_fileUrlWithBcp47(self, installPackageMethod,
mockIsZipfile):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package('file:///tmp/keyboard/sil_euro_latin.kmp?bcp47=dyo')
# Verify
installPackageMethod.assert_called_with('/tmp/keyboard/sil_euro_latin.kmp', 'dyo')
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
def test_downloadAndInstallPackage_fileUrlWithBcp47AndVersion(self, installPackageMethod):
def test_downloadAndInstallPackage_fileUrlWithBcp47AndVersion(self, installPackageMethod,
mockIsZipfile):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package('file:///tmp/keyboard/sil_euro_latin.kmp?bcp47=dyo&version=1')
# Verify
installPackageMethod.assert_called_with('/tmp/keyboard/sil_euro_latin.kmp', 'dyo')
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
def test_downloadAndInstallPackage_InvalidUrl(self, installPackageMethod):
def test_downloadAndInstallPackage_InvalidUrl(self, installPackageMethod, mockIsZipfile):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package('http://localhost/keyboard/sil_euro_latin.kmp')
# Verify
installPackageMethod.assert_not_called()
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
@patch('keyman_config.get_kmp.download_kmp_file')
def test_downloadAndInstallPackage_invalidUrl(self, downloadKmpFileMethod,
installPackageMethod):
installPackageMethod, mockIsZipfile):
for url in ['foo://download/keyboard/sil_euro_latin', 'keyman://keyboard/sil_euro_latin',
'keyman://download/sil_euro_latin', 'keyman://download/keyboard/']:
with self.subTest(url=url):
# Setup
mockIsZipfile.return_value = True
# Execute
download_and_install_package(url)
@ -62,15 +88,18 @@ class HandleInstallTests(unittest.TestCase):
downloadKmpFileMethod.assert_not_called()
installPackageMethod.assert_not_called()
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
@patch('keyman_config.get_kmp.keyman_cache_dir')
@patch('keyman_config.handle_install.download_kmp_file')
def test_downloadAndInstallPackage_keymanUrl(self, downloadKmpFileMethod,
keymanCacheDirMethod, installPackageMethod):
keymanCacheDirMethod, installPackageMethod,
mockIsZipfile):
# Setup
mockPackagePath = '/tmp/sil_euro_latin'
keymanCacheDirMethod.return_value = '/tmp'
downloadKmpFileMethod.return_value = mockPackagePath
mockIsZipfile.return_value = True
# Execute
download_and_install_package('keyman://download/keyboard/sil_euro_latin')
@ -81,16 +110,18 @@ class HandleInstallTests(unittest.TestCase):
mockPackagePath)
installPackageMethod.assert_called_with(mockPackagePath, '')
@patch('keyman_config.handle_install.is_zipfile')
@patch('keyman_config.handle_install._install_package')
@patch('keyman_config.get_kmp.keyman_cache_dir')
@patch('keyman_config.handle_install.download_kmp_file')
def test_downloadAndInstallPackage_keymanUrlWithBcp47(self, downloadKmpFileMethod,
keymanCacheDirMethod,
installPackageMethod):
installPackageMethod, mockIsZipfile):
# Setup
mockPackagePath = '/tmp/sil_euro_latin'
keymanCacheDirMethod.return_value = '/tmp'
downloadKmpFileMethod.return_value = mockPackagePath
mockIsZipfile.return_value = True
# Execute
download_and_install_package('keyman://download/keyboard/sil_euro_latin?bcp47=de')

View file

@ -12,8 +12,6 @@
37150F74231637EA00C73C6A /* Reachability.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F6F231637EA00C73C6A /* Reachability.framework */; };
37150F75231637EA00C73C6A /* Zip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F70231637EA00C73C6A /* Zip.framework */; };
37150F76231637EA00C73C6A /* XCGLogger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F71231637EA00C73C6A /* XCGLogger.framework */; };
3729344024613C9900C5428C /* ObjcExceptionBridging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F6E231637EA00C73C6A /* ObjcExceptionBridging.framework */; };
3729344124613CA700C5428C /* XCGLogger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F71231637EA00C73C6A /* XCGLogger.framework */; };
3729344224613CB600C5428C /* Sentry.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 372A4B9C245E904A001C1F80 /* Sentry.framework */; };
3729344324613CC200C5428C /* Zip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37150F70231637EA00C73C6A /* Zip.framework */; };
372A4B9D245E904A001C1F80 /* Sentry.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 372A4B9C245E904A001C1F80 /* Sentry.framework */; };
@ -664,6 +662,7 @@
CODE_SIGN_STYLE = Manual;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = D7TR486TEH;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
@ -694,6 +693,7 @@
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = D7TR486TEH;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
@ -721,6 +721,7 @@
CODE_SIGN_STYLE = Manual;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = D7TR486TEH;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
@ -752,6 +753,7 @@
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = D7TR486TEH;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",

View file

@ -125,6 +125,7 @@ else
fi
KEYMAN_ENGINE_FRAMEWORK_SRC="$KMEI_BUILD_DIR/build/Build/Products/$CONFIG-$PLATFORM_TARGET/KeymanEngine.framework"
KEYMAN_ENGINE_SIM_FRAMEWORK_SRC="$KMEI_BUILD_DIR/build/Build/Products/$CONFIG-iphonesimulator/KeymanEngine.framework"
KEYMAN_ENGINE_FRAMEWORK_DST=./
if [ $DO_UPDATE = true ]; then
@ -217,6 +218,10 @@ else
fi
if [ $DO_SIMULATOR_TARGET == true ]; then
echo "Replacing .framework with Simulator-compatible version"
# Replace the previous framework copy in case the main build was for release.
cp -Rf "$KEYMAN_ENGINE_SIM_FRAMEWORK_SRC" "$KEYMAN_ENGINE_FRAMEWORK_DST"
echo "Preparing .app file as Simulator-targeted build artifact."
xcodebuild CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO \
$XCODEFLAGS_EXT -scheme "$TARGET" \

View file

@ -31,11 +31,11 @@
<!-- Context: General Strings -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Button_Cancel" comment="Cancel button term">Ləğv etmək</string>
<string name="S_Button_Cancel" comment="Cancel button term">İmtina</string>
<!-- Context: General Strings -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Button_Close" comment="Close button term">Bağlamaq</string>
<string name="S_Button_Close" comment="Close button term">Bağla</string>
<!-- Context: Formatted Messages -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
@ -43,7 +43,7 @@
<!-- Context: Formatted Messages -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="SKButtonCancel" comment="Cancel button in message boxes">Ləğv etmək</string>
<string name="SKButtonCancel" comment="Cancel button in message boxes">İmtina</string>
<!-- Context: Formatted Messages -->
<!-- String Type: FormatString -->
<!-- Introduced: 8.0.330.0 -->
@ -51,11 +51,11 @@
<!-- Context: Formatted Messages -->
<!-- String Type: FormatString -->
<!-- Introduced: 8.0.330.0 -->
<string name="SKBalloonOSKClosed" comment="Balloon that shows when OSK is closed">Keyman hələ də çalışır. Dil klaviaturanızı istənilən vaxt istifadə etmək üçün bu işarəni vurun</string>
<string name="SKBalloonOSKClosed" comment="Balloon that shows when OSK is closed">Keyman hələ də işləyir. Dil klaviaturanızı istənilən vaxt istifadə etmək üçün bu nişana klikləyin</string>
<!-- Context: Formatted Messages -->
<!-- String Type: FormatString -->
<!-- Introduced: 14.0.234 -->
<string name="SKBalloonKeymanIsRunning" comment="Balloon that shows when user tries to start Keyman but it is already running">Keyman artıq çalışır. Dil klaviaturanızı istifadə etmək üçün sistem bildiriş sahəsindəki Keyman simgesini vurun</string>
<string name="SKBalloonKeymanIsRunning" comment="Balloon that shows when user tries to start Keyman but it is already running">Keyman artıq işləyir. Dil klaviaturanızı istifadə etmək üçün sistem bildiriş sahəsindəki Keyman nişanına klikləyin</string>
<!-- Context: Configuration Dialog -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -67,7 +67,7 @@
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Keyboards" comment="Keyboard Layouts tab name">Klaviatura tərtibləri</string>
<string name="S_Keyboards" comment="Keyboard Layouts tab name">Klaviatura düzülüşləri</string>
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -79,7 +79,7 @@
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Options_AccessChar" comment="Direct access to the Options tab using alt+">O</string>
<string name="S_Options_AccessChar" comment="Direct access to the Options tab using alt+">S</string>
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -87,7 +87,7 @@
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Hotkeys_AccessChar" comment="Direct access to the Hotkeys tab using alt+">H</string>
<string name="S_Hotkeys_AccessChar" comment="Direct access to the Hotkeys tab using alt+">Q</string>
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -95,15 +95,15 @@
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Support_AccessChar" comment="Direct access to the Support tab using alt+">S</string>
<string name="S_Support_AccessChar" comment="Direct access to the Support tab using alt+">D</string>
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 9.0.493.0 -->
<string name="S_KeepInTouch" comment="Keep in touch tab name">Əlaqə saxlayın</string>
<string name="S_KeepInTouch" comment="Keep in touch tab name">Əlaqədə qalın</string>
<!-- Context: Configuration Dialog - Tab names -->
<!-- String Type: PlainText -->
<!-- Introduced: 9.0.492.0 -->
<string name="S_KeepInTouch_AccessChar" comment="Direct access to the Keep in Touch tab using alt+">T</string>
<string name="S_KeepInTouch_AccessChar" comment="Direct access to the Keep in Touch tab using alt+">Ə</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -115,7 +115,7 @@
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 9.0.442.0 -->
<string name="S_Caption_KeyboardVersion" comment="Keyboard download window, etc. - term for keyboard version">Klaviatura versiyası</string>
<string name="S_Caption_KeyboardVersion" comment="Keyboard download window, etc. - term for keyboard version">Klaviatura versiyası:</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -123,7 +123,7 @@
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Caption_Website" comment="Keyboard download window, etc. - term for website">Veb səhifə:</string>
<string name="S_Caption_Website" comment="Keyboard download window, etc. - term for website">Veb sayt:</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
@ -135,11 +135,11 @@
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Caption_Keyboards" comment="Keyboard download window, etc. - term for keyboard layouts">Klaviatura tərtibləri:</string>
<string name="S_Caption_Keyboards" comment="Keyboard download window, etc. - term for keyboard layouts">Klaviatura düzülüşləri:</string>
<!-- Context: Keyboard Install Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 14.0 -->
<string name="S_Caption_Keyboard" comment="Keyboard install dialog - term for a single keyboard layout">Klaviatura tərtibləri:</string>
<string name="S_Caption_Keyboard" comment="Keyboard install dialog - term for a single keyboard layout">Klaviatura düzülüşü:</string>
<!-- Context: Keyboard Install Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 14.0 -->
@ -155,11 +155,11 @@
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_LayoutType_Positional" comment="Keyboard download window, etc. - term for the fixed keyboard layout type">Fixed (Mövqə)</string>
<string name="S_LayoutType_Positional" comment="Keyboard download window, etc. - term for the fixed keyboard layout type">Sabit (Mövqe)</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_LayoutType_Mnemonic" comment="Keyboard download window, etc. - term for the mnemonic keyboard layout type">Windows tərtibatına uyğunlaşdırıldı (Yadda salıcı)</string>
<string name="S_LayoutType_Mnemonic" comment="Keyboard download window, etc. - term for the mnemonic keyboard layout type">Windows düzülüşünə gətirildi (Xatırladıcı)</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 9.0.420.0 -->
@ -171,43 +171,43 @@
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 9.0.420.0 -->
<string name="S_Languages_Install" comment="Add language profile">Dil əlavə etmək</string>
<string name="S_Languages_Install" comment="Add language profile">Dil əlavə et</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Caption_OnScreenKeyboard" comment="Term for the On Screen Keyboard">Ekran klaviaturasında:</string>
<string name="S_Caption_OnScreenKeyboard" comment="Term for the On Screen Keyboard">Ekran klaviaturası:</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 8.0.306.0 -->
<string name="S_OnScreenKeyboard_Custom" comment="(OSK) Custom term">Fərdiləşdirilən</string>
<string name="S_OnScreenKeyboard_Custom" comment="(OSK) Custom term">Özəl</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_OnScreenKeyboard_Installed" comment="(OSK) Installed term">Qurulmuş</string>
<string name="S_OnScreenKeyboard_Installed" comment="(OSK) Installed term">Quraşdırılmış</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_OnScreenKeyboard_NotInstalled" comment="(OSK) Not installed term">Qurulmamış</string>
<string name="S_OnScreenKeyboard_NotInstalled" comment="(OSK) Not installed term">Quraşdırılmamış</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 8.0.306.0 -->
<string name="S_Caption_Documentation" comment="Term for the Documentation">Sənədləşməsi</string>
<string name="S_Caption_Documentation" comment="Term for the Documentation">Sənədləşdirmə:</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 8.0.306.0 -->
<string name="S_Documentation_Installed" comment="(Documentation) Installed term">Qurulmuş</string>
<string name="S_Documentation_Installed" comment="(Documentation) Installed term">Quraşdırılmış</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 8.0.306.0 -->
<string name="S_Documentation_NotInstalled" comment="(Documentation) Not installed term">Qurulmamış</string>
<string name="S_Documentation_NotInstalled" comment="(Documentation) Not installed term">Quraşdırılmamış</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Caption_Message" comment="Keyboard download window, etc. - term for additional messages">Mesaj</string>
<string name="S_Caption_Message" comment="Keyboard download window, etc. - term for additional messages">Mesaj:</string>
<!-- Context: Configuration Dialog - Captions -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Caption_Copyright" comment="Keyboard download window, etc. - term for copyright">Müəllif hüquqları:</string>
<string name="S_Caption_Copyright" comment="Keyboard download window, etc. - term for copyright">Müəllif hüququ:</string>
<!-- Context: Configuration Dialog - Footer -->
<!-- String Type: PlainText -->
<!-- Introduced: 14.0 -->
@ -215,11 +215,11 @@
<!-- Context: Configuration Dialog - Footer -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Button_InstallKeyboard" comment="Keyboard Layouts - install keyboard button">Klaviaturanı quraşdırmaq</string>
<string name="S_Button_InstallKeyboard" comment="Keyboard Layouts - install keyboard button">Klaviaturanı quraşdır...</string>
<!-- Context: Configuration Dialog - Footer -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Button_DownloadKeyboard" comment="Keyboard Layouts - download keyboard button">Klaviatura yüklənir...</string>
<string name="S_Button_DownloadKeyboard" comment="Keyboard Layouts - download keyboard button">Klaviaturanı endir...</string>
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 8.0.287.0 -->
@ -227,24 +227,24 @@
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 7.0.230.0 -->
<string name="S_Keyboards_NoKeyboardsInstalled" comment="Keyboard Layouts - notice of no keyboard layouts installed">Quraşdırılmış klaviatura yoxdur. Keyman veb saytından klaviatura düzeni qurmaq üçün Klaviaturanı Yüklə düyməsini vurun.</string>
<string name="S_Keyboards_NoKeyboardsInstalled" comment="Keyboard Layouts - notice of no keyboard layouts installed">Qurulu heç bir klaviaturanız yoxdur. Keyman veb saytından klaviatura düzülüşünü quraşdırmaq üçün Klaviatura Endir düyməsini klikləyin.</string>
<!-- Parameters: %1$s = keyboard layout name -->
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- Introduced: 7.1.251.0 -->
<!-- String Type: PlainText -->
<string name="SKUninstallRequireAdmin" comment="Keyboard Layouts - notice of ineligibility to uninstall a keyboard">Yalnız bir idarəedicisinizsə \'%1$s\' klaviaturasını silə bilərsiniz</string>
<string name="SKUninstallRequireAdmin" comment="Keyboard Layouts - notice of ineligibility to uninstall a keyboard">Əgər administratorsunuzsa, \"%1$s\" klaviaturasını silə bilərsiniz</string>
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 13.0.40.0 -->
<string name="S_Keyboard_Share" comment="Keyboard Layouts - share selected keyboard button">Klaviaturanı paylaşmaq</string>
<string name="S_Keyboard_Share" comment="Keyboard Layouts - share selected keyboard button">Klaviaturanı paylaş</string>
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 13.0.40.0 -->
<string name="S_Keyboard_Share_QRCode" comment="Keyboard Layouts - caption explaining QRCode, plus prefix to link to share">Bu klaviaturanı başqa bir cihaza yükləmək üçün bu kodu tarayın</string>
<string name="S_Keyboard_Share_QRCode" comment="Keyboard Layouts - caption explaining QRCode, plus prefix to link to share">Bu klaviaturanı başqa bir cihazda yükləmək üçün bu kodu skan edin və ya </string>
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 13.0.40.0 -->
<string name="S_Keyboard_Share_Link" comment="Keyboard Layouts - text for link to share">onlayn paylaşmaq</string>
<string name="S_Keyboard_Share_Link" comment="Keyboard Layouts - text for link to share">onlayn paylaşın</string>
<!-- Context: Configuration Dialog - Keyboard Layouts tab -->
<!-- String Type: PlainText -->
<!-- Introduced: 13.0.40.0 -->
@ -256,35 +256,35 @@
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="kogStartup" comment="Options section - Startup">Başlamaq</string>
<string name="kogStartup" comment="Options section - Startup">Açılış</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.244.0 -->
<string name="kogOSK" comment="Options section - OSK">Ekran klaviaturasında</string>
<string name="kogOSK" comment="Options section - OSK">Ekran klaviaturası</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="kogAdvanced" comment="Options section - Advanced">Genişləndirilmiş</string>
<string name="kogAdvanced" comment="Options section - Advanced">Qabaqcıl</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="koKeyboardHotkeysAreToggle" comment="General options - hotkeys toggle on AND off a keyboard layout">Klaviatura qısa yol düymələri klaviatura aktivləşdirməsini dəyişir</string>
<string name="koKeyboardHotkeysAreToggle" comment="General options - hotkeys toggle on AND off a keyboard layout">Klaviatura qısayol düymələri klaviatura aktivləşdirməsini dəyişdirir</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="koAltGrCtrlAlt" comment="General options - Ctrl+Alt simulates AltGr on computers without AltGr">Ctrl + Alt ilə AltGr simulyasiya edin</string>
<string name="koAltGrCtrlAlt" comment="General options - Ctrl+Alt simulates AltGr on computers without AltGr">Ctrl + Alt ilə \"AltGr\"i simulyasiya edin</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 9.0.480.0 -->
<string name="koDeadkeyConversion" comment="Advanced options - Base keyboard deadkeys are treated as normal keys">Donanım açar düymələrini düz açarlar kimi qəbul edin</string>
<string name="koDeadkeyConversion" comment="Advanced options - Base keyboard deadkeys are treated as normal keys">Aparat təminatı özəl düymələrinə düz düymələr kimi davran</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.244.0 -->
<string name="koShowHints" comment="General options - show/hide hint messages (resets hint messages individually disabled)">Eyham mesajlarını göstərin</string>
<string name="koShowHints" comment="General options - show/hide hint messages (resets hint messages individually disabled)">Məsləhət mesajlarını göstər</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 14.0 -->
<string name="koAutomaticallyReportErrors" comment="General options - report errors to Keyman team automatically">Səhvləri avtomatik olaraq keyman.com saytına bildirmək</string>
<string name="koAutomaticallyReportErrors" comment="General options - report errors to Keyman team automatically">Xətaları avtomatik olaraq keyman.com-da bildir</string>
<!-- Context: Configuration Dialog - Options tab -->
<!-- String Type: FormatString -->
<!-- Introduced: 14.0 -->
@ -641,11 +641,11 @@
<!-- Context: _LanguageInfo -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="SKUILanguageName" comment="User interface language name in the UI language">İngilis dili</string>
<string name="SKUILanguageName" comment="User interface language name in the UI language">Azərbaycanca (Azəricə)</string>
<!-- Context: _LanguageInfo -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->
<string name="SKUILanguageNameWithEnglish" comment="UI language name in the UI language with the English name in parentheses (this message is used when the user gets stuck in a strange UI language)">İngilis dili</string>
<string name="SKUILanguageNameWithEnglish" comment="UI language name in the UI language with the English name in parentheses (this message is used when the user gets stuck in a strange UI language)">Azərbaycanca (Azerbaijani)</string>
<!-- Context: _LanguageInfo -->
<!-- String Type: FormatString -->
<!-- Introduced: 7.0.230.0 -->