From 319c81e4469235b046d58aa26f3526fd77d551bb Mon Sep 17 00:00:00 2001
From: Prince Yadav <66916296+prince-0408@users.noreply.github.com>
Date: Wed, 25 Mar 2026 02:44:24 +0530
Subject: [PATCH 1/5] feat: add download data empty state button to keyboard
(#627)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When a Scribe keyboard is installed but language data has not been
downloaded yet, a blue 'Please download language data' button now
appears at the top of the keyboard. Tapping it opens the Scribe app
and navigates directly to the Download Data screen.
Changes:
- KeyboardViewController.swift
- Added downloadDataBtn (UIButton?) property
- Added hasLanguageData() to check if the language SQLite file
exists in the shared app group container
- Added showDownloadDataBtn() to create and layout the blue CTA
button at the top of the keyboard view
- Added conditionallyShowDownloadDataBtn() to show/hide the button
based on data availability and current command state (only shown
in .idle state, hidden during translate/conjugate/plural/info)
- Added openScribeApp() using the UIResponder chain to open the
scribe:// URL scheme and direct the user to the download screen
- Called conditionallyShowDownloadDataBtn() at the end of loadKeys()
- Button is also hidden during displayInformation state
- CommandVariables.swift
- Added downloadDataMsg variable with default English fallback text
'Please download language data'
- Language interface variables (all 11 keyboards)
- ENInterfaceVariables: 'Please download language data'
- DEInterfaceVariables: 'Bitte Sprachdaten herunterladen'
- FRInterfaceVariables: 'Veuillez télécharger les données linguistiques'
- ESInterfaceVariables: 'Por favor descarga los datos del idioma'
- ITInterfaceVariables: 'Scarica i dati della lingua'
- PTInterfaceVariables: 'Por favor baixe os dados do idioma'
- RUInterfaceVariables: 'Загрузите языковые данные'
- SVInterfaceVariables: 'Ladda ner språkdata'
- NBInterfaceVariables: 'Last ned språkdata'
- HEInterfaceVariables: 'אנא הורד נתוני שפה'
- IDInterfaceVariables: 'Unduh data bahasa'
- Scribe/Info.plist
- Registered scribe:// URL scheme (CFBundleURLSchemes) so the app
can be opened from the keyboard extension
- Scribe/AppDelegate.swift
- Added application(_:open:options:) handler for the scribe:// URL
- Posts NavigateToDownloadScreen notification which InstallationVC
already handles to push the DownloadDataScreen
Closes #627
---
.../KeyboardViewController.swift | 96 +++++++++++++++++++
.../CommandVariables.swift | 5 +
.../English/ENInterfaceVariables.swift | 1 +
.../French/FR-AZERTYInterfaceVariables.swift | 1 +
.../German/DEInterfaceVariables.swift | 1 +
.../Hebrew/HEInterfaceVariables.swift | 1 +
.../Indonesian/IDInterfaceVariables.swift | 1 +
.../Italian/ITInterfaceVariables.swift | 1 +
.../Norwegian/NBInterfaceVariables.swift | 1 +
.../Portuguese/PTInterfaceVariables.swift | 1 +
.../Russian/RUInterfaceVariables.swift | 1 +
.../Spanish/ESInterfaceVariables.swift | 1 +
.../Swedish/SVInterfaceVariables.swift | 1 +
Scribe/AppDelegate.swift | 9 ++
Scribe/Info.plist | 11 +++
15 files changed, 132 insertions(+)
diff --git a/Keyboards/KeyboardsBase/KeyboardViewController.swift b/Keyboards/KeyboardsBase/KeyboardViewController.swift
index d74847f9..61dfee62 100644
--- a/Keyboards/KeyboardsBase/KeyboardViewController.swift
+++ b/Keyboards/KeyboardsBase/KeyboardViewController.swift
@@ -290,6 +290,100 @@ class KeyboardViewController: UIInputViewController {
pluralKey.isHidden = state
}
+ // MARK: Download Data Button
+
+ /// A button shown above the keyboard when no language data has been downloaded.
+ var downloadDataBtn: UIButton?
+
+ /// Checks whether language data has been downloaded for the current keyboard language.
+ func hasLanguageData() -> Bool {
+ let langAbbr = getControllerLanguageAbbr()
+ guard !langAbbr.isEmpty,
+ let containerURL = FileManager.default.containerURL(
+ forSecurityApplicationGroupIdentifier: "group.be.scri.userDefaultsContainer"
+ ) else {
+ return true // default to true to avoid showing the button unnecessarily
+ }
+ let dbPath = containerURL.appendingPathComponent("\(langAbbr.uppercased())LanguageData.sqlite").path
+ return FileManager.default.fileExists(atPath: dbPath)
+ }
+
+ /// Opens the Scribe app via the responder chain so the user can download language data.
+ @objc func openScribeApp() {
+ guard let url = URL(string: "scribe://") else { return }
+ var responder: UIResponder? = self
+ while responder != nil {
+ if let application = responder as? UIApplication {
+ application.open(url)
+ return
+ }
+ responder = responder?.next
+ }
+ }
+
+ /// Shows or hides the download data button based on whether language data is available.
+ func conditionallyShowDownloadDataBtn() {
+ // Only show the download button in idle state (not during commands).
+ guard commandState == .idle else {
+ downloadDataBtn?.isHidden = true
+ return
+ }
+ if hasLanguageData() {
+ downloadDataBtn?.isHidden = true
+ } else {
+ showDownloadDataBtn()
+ }
+ }
+
+ /// Creates and displays the download data button above the keyboard.
+ func showDownloadDataBtn() {
+ // Remove any existing button first.
+ downloadDataBtn?.removeFromSuperview()
+
+ let btn = UIButton(type: .system)
+ btn.translatesAutoresizingMaskIntoConstraints = false
+ btn.backgroundColor = scribeCTAColor
+ btn.setTitleColor(.white, for: .normal)
+ btn.setTitle(downloadDataMsg, for: .normal)
+ btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium)
+ btn.layer.cornerRadius = commandKeyCornerRadius
+ btn.layer.masksToBounds = true
+
+ // Add a download icon on the left side.
+ let iconConfig = UIImage.SymbolConfiguration(pointSize: 14, weight: .medium)
+ btn.setImage(UIImage(systemName: "arrow.down.circle.fill", withConfiguration: iconConfig), for: .normal)
+ btn.tintColor = .white
+ if #available(iOS 15.0, *) {
+ var config = UIButton.Configuration.plain()
+ config.baseForegroundColor = .white
+ config.image = UIImage(systemName: "arrow.down.circle.fill", withConfiguration: iconConfig)
+ config.imagePadding = 8
+ config.imagePlacement = .leading
+ config.title = downloadDataMsg
+ config.attributedTitle = AttributedString(
+ downloadDataMsg,
+ attributes: AttributeContainer([.font: UIFont.systemFont(ofSize: 16, weight: .medium)])
+ )
+ btn.configuration = config
+ btn.backgroundColor = scribeCTAColor
+ } else {
+ btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 8)
+ btn.contentEdgeInsets = UIEdgeInsets(top: 8, left: 12, bottom: 8, right: 12)
+ }
+
+ btn.addTarget(self, action: #selector(openScribeApp), for: .touchUpInside)
+
+ view.addSubview(btn)
+ downloadDataBtn = btn
+
+ NSLayoutConstraint.activate([
+ btn.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
+ btn.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
+ btn.topAnchor.constraint(equalTo: view.topAnchor, constant: 4),
+ btn.heightAnchor.constraint(equalToConstant: scribeKey.frame.height > 0 ? scribeKey.frame.height : 36)
+ ])
+ }
+
/// Logic to create notification tooltip.
func createInformationStateDatasource(text: NSMutableAttributedString, backgroundColor: UIColor)
-> ToolTipViewDatasource {
@@ -1714,6 +1808,7 @@ class KeyboardViewController: UIInputViewController {
deactivateBtn(btn: padEmojiKey2)
setInformationState()
+ downloadDataBtn?.isHidden = true
return // return to skip normal keyboard setup
}
@@ -1835,6 +1930,7 @@ class KeyboardViewController: UIInputViewController {
}
setKeyPadding()
+ conditionallyShowDownloadDataBtn()
}
func setCommaAndPeriodKeysConditionally() {
diff --git a/Keyboards/KeyboardsBase/ScribeFunctionality/CommandVariables.swift b/Keyboards/KeyboardsBase/ScribeFunctionality/CommandVariables.swift
index 236fd9e5..43778e4f 100644
--- a/Keyboards/KeyboardsBase/ScribeFunctionality/CommandVariables.swift
+++ b/Keyboards/KeyboardsBase/ScribeFunctionality/CommandVariables.swift
@@ -177,3 +177,8 @@ var pluralPromptAndCursor = ""
var pluralPromptAndPlaceholder = ""
var pluralPromptAndColorPlaceholder = NSMutableAttributedString()
var alreadyPluralMsg = ""
+
+// MARK: Download Data Variables
+
+/// The message shown on the download data button when no language data has been downloaded.
+var downloadDataMsg = "Please download language data"
diff --git a/Keyboards/LanguageKeyboards/English/ENInterfaceVariables.swift b/Keyboards/LanguageKeyboards/English/ENInterfaceVariables.swift
index 28f5f4fc..4812c060 100644
--- a/Keyboards/LanguageKeyboards/English/ENInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/English/ENInterfaceVariables.swift
@@ -294,4 +294,5 @@ func setENKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Already plural"
+ downloadDataMsg = "Please download language data"
}
diff --git a/Keyboards/LanguageKeyboards/French/FR-AZERTYInterfaceVariables.swift b/Keyboards/LanguageKeyboards/French/FR-AZERTYInterfaceVariables.swift
index 8be89a71..8882feca 100644
--- a/Keyboards/LanguageKeyboards/French/FR-AZERTYInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/French/FR-AZERTYInterfaceVariables.swift
@@ -293,4 +293,5 @@ func setFRKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Déjà pluriel"
+ downloadDataMsg = "Veuillez télécharger les données linguistiques"
}
diff --git a/Keyboards/LanguageKeyboards/German/DEInterfaceVariables.swift b/Keyboards/LanguageKeyboards/German/DEInterfaceVariables.swift
index de063eb9..4da5a232 100644
--- a/Keyboards/LanguageKeyboards/German/DEInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/German/DEInterfaceVariables.swift
@@ -356,4 +356,5 @@ func setDEKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Schon Plural"
+ downloadDataMsg = "Bitte Sprachdaten herunterladen"
}
diff --git a/Keyboards/LanguageKeyboards/Hebrew/HEInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Hebrew/HEInterfaceVariables.swift
index 3e3f6319..5cc7cee4 100644
--- a/Keyboards/LanguageKeyboards/Hebrew/HEInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Hebrew/HEInterfaceVariables.swift
@@ -254,4 +254,5 @@ func setHEKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "כבר בצורת רבים"
+ downloadDataMsg = "אנא הורד נתוני שפה"
}
diff --git a/Keyboards/LanguageKeyboards/Indonesian/IDInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Indonesian/IDInterfaceVariables.swift
index 8acfbe95..57b04d32 100644
--- a/Keyboards/LanguageKeyboards/Indonesian/IDInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Indonesian/IDInterfaceVariables.swift
@@ -244,4 +244,5 @@ func setIDKeyboardLayout() {
textForAttribute: translatePlaceholder,
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
+ downloadDataMsg = "Unduh data bahasa"
}
diff --git a/Keyboards/LanguageKeyboards/Italian/ITInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Italian/ITInterfaceVariables.swift
index 8337b9f7..256ee789 100644
--- a/Keyboards/LanguageKeyboards/Italian/ITInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Italian/ITInterfaceVariables.swift
@@ -281,4 +281,5 @@ func setITKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Già plurale"
+ downloadDataMsg = "Scarica i dati della lingua"
}
diff --git a/Keyboards/LanguageKeyboards/Norwegian/NBInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Norwegian/NBInterfaceVariables.swift
index 2d7e8a74..9e08ac1e 100644
--- a/Keyboards/LanguageKeyboards/Norwegian/NBInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Norwegian/NBInterfaceVariables.swift
@@ -300,4 +300,5 @@ func setNBKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Allerede flertall"
+ downloadDataMsg = "Last ned språkdata"
}
diff --git a/Keyboards/LanguageKeyboards/Portuguese/PTInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Portuguese/PTInterfaceVariables.swift
index eeee3642..4d5f19d3 100644
--- a/Keyboards/LanguageKeyboards/Portuguese/PTInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Portuguese/PTInterfaceVariables.swift
@@ -279,4 +279,5 @@ func setPTKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Já plural"
+ downloadDataMsg = "Por favor baixe os dados do idioma"
}
diff --git a/Keyboards/LanguageKeyboards/Russian/RUInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Russian/RUInterfaceVariables.swift
index 40e17c4c..282238e8 100644
--- a/Keyboards/LanguageKeyboards/Russian/RUInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Russian/RUInterfaceVariables.swift
@@ -269,4 +269,5 @@ func setRUKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Уже во множ-ом"
+ downloadDataMsg = "Загрузите языковые данные"
}
diff --git a/Keyboards/LanguageKeyboards/Spanish/ESInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Spanish/ESInterfaceVariables.swift
index 200d9b7b..b33cdb99 100644
--- a/Keyboards/LanguageKeyboards/Spanish/ESInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Spanish/ESInterfaceVariables.swift
@@ -353,4 +353,5 @@ func setESKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Ya en plural"
+ downloadDataMsg = "Por favor descarga los datos del idioma"
}
diff --git a/Keyboards/LanguageKeyboards/Swedish/SVInterfaceVariables.swift b/Keyboards/LanguageKeyboards/Swedish/SVInterfaceVariables.swift
index 3943138d..f326ba38 100644
--- a/Keyboards/LanguageKeyboards/Swedish/SVInterfaceVariables.swift
+++ b/Keyboards/LanguageKeyboards/Swedish/SVInterfaceVariables.swift
@@ -349,4 +349,5 @@ func setSVKeyboardLayout() {
withColor: UIColor(cgColor: commandBarPlaceholderColorCG)
)
alreadyPluralMsg = "Redan plural"
+ downloadDataMsg = "Ladda ner språkdata"
}
diff --git a/Scribe/AppDelegate.swift b/Scribe/AppDelegate.swift
index b00aa906..e86a60b8 100644
--- a/Scribe/AppDelegate.swift
+++ b/Scribe/AppDelegate.swift
@@ -82,6 +82,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
*/
}
+ func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
+ // Handle scribe:// URL scheme to navigate to the download data screen.
+ if url.scheme == "scribe" {
+ NotificationCenter.default.post(name: NSNotification.Name("NavigateToDownloadScreen"), object: nil)
+ return true
+ }
+ return false
+ }
+
func applicationDidBecomeActive(_: UIApplication) {
/*
Restart any tasks that were paused (or not yet started) while the application was inactive.
diff --git a/Scribe/Info.plist b/Scribe/Info.plist
index 633b5171..5c2f37fe 100644
--- a/Scribe/Info.plist
+++ b/Scribe/Info.plist
@@ -46,5 +46,16 @@
UIViewControllerBasedStatusBarAppearance
+ CFBundleURLTypes
+
+
+ CFBundleURLSchemes
+
+ scribe
+
+ CFBundleURLName
+ be.scri.scribe
+
+
From 6b4e15f10fc4519fa8fe567c399b995a7dd77915 Mon Sep 17 00:00:00 2001
From: Prince Yadav <66916296+prince-0408@users.noreply.github.com>
Date: Tue, 31 Mar 2026 15:15:32 +0530
Subject: [PATCH 2/5] Fix circular reference compilation errors by using
classes
---
Keyboards/DataManager/DataContract.swift | 2 +-
Keyboards/KeyboardsBase/NavigationStructure.swift | 9 +++++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Keyboards/DataManager/DataContract.swift b/Keyboards/DataManager/DataContract.swift
index 0eb96a77..4ca89639 100644
--- a/Keyboards/DataManager/DataContract.swift
+++ b/Keyboards/DataManager/DataContract.swift
@@ -38,7 +38,7 @@ struct DeclensionSection: Codable {
let declensionForms: [Int: DeclensionNode]?
}
-struct DeclensionNode: Codable {
+class DeclensionNode: Codable {
let label: String?
let value: String?
let displayValue: String?
diff --git a/Keyboards/KeyboardsBase/NavigationStructure.swift b/Keyboards/KeyboardsBase/NavigationStructure.swift
index 54f5d558..64ef35f3 100644
--- a/Keyboards/KeyboardsBase/NavigationStructure.swift
+++ b/Keyboards/KeyboardsBase/NavigationStructure.swift
@@ -6,15 +6,20 @@
import Foundation
/// Represents a single option in the navigation.
-enum NavigationNode {
+indirect enum NavigationNode {
case nextLevel(NavigationLevel, displayValue: String?) // navigate deeper, with optional display value
case finalValue(String) // terminal node, insert this text
}
/// Represents a level in the navigation hierarchy.
-struct NavigationLevel {
+class NavigationLevel {
let title: String // title for command bar
let options: [(label: String, node: NavigationNode)] // buttons to display
+
+ init(title: String, options: [(label: String, node: NavigationNode)]) {
+ self.title = title
+ self.options = options
+ }
}
/// Builds navigation trees for conjugations and declensions.
From ef2bbf57294b441ef6cf5b72ea5f29f120d113cc Mon Sep 17 00:00:00 2001
From: Prince Yadav <66916296+prince-0408@users.noreply.github.com>
Date: Tue, 31 Mar 2026 18:08:26 +0530
Subject: [PATCH 3/5] Fix: Resolve Conjugate target compilation errors and
restore missing project memberships
---
Scribe.xcodeproj/project.pbxproj | 92 +++++++++++++++++++++++++++++---
1 file changed, 85 insertions(+), 7 deletions(-)
diff --git a/Scribe.xcodeproj/project.pbxproj b/Scribe.xcodeproj/project.pbxproj
index 2ad3e9d9..9ed48e43 100644
--- a/Scribe.xcodeproj/project.pbxproj
+++ b/Scribe.xcodeproj/project.pbxproj
@@ -609,6 +609,7 @@
E91980BB2F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980BC2F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980BD2F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
+ E91980BE2F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980BF2F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980C02F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980C12F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
@@ -765,6 +766,8 @@
EDEE62252B2DE65A00A0B9C1 /* UIEdgeInsetsExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEE62242B2DE65A00A0B9C1 /* UIEdgeInsetsExtensions.swift */; };
F725CADE2F6A72BC00A8C950 /* ConjugateApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F725CADD2F6A72BC00A8C950 /* ConjugateApp.swift */; };
F725CAE72F6A783400A8C950 /* SettingsTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = F725CAE62F6A782D00A8C950 /* SettingsTab.swift */; };
+ F786BADB2F1E8F70003F7505 /* DownloadStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9202DEF2F0FAA0C001590FC /* DownloadStateManager.swift */; };
+ F786BB102F1E8F70003F7505 /* CommandBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D111E9A127AFE4F300746F92 /* CommandBar.swift */; };
F786BB252F1E8F70003F7505 /* SwiftyJSON in Frameworks */ = {isa = PBXBuildFile; productRef = F786BACB2F1E8F70003F7505 /* SwiftyJSON */; };
F786BB262F1E8F70003F7505 /* SwipeableTabBarController in Frameworks */ = {isa = PBXBuildFile; productRef = F786BACF2F1E8F70003F7505 /* SwipeableTabBarController */; };
F786BB272F1E8F70003F7505 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = F786BACD2F1E8F70003F7505 /* GRDB */; };
@@ -790,6 +793,74 @@
F7A17EBB2F6A8C1C0040B09B /* AboutTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A17EAC2F6A8BFE0040B09B /* AboutTab.swift */; };
F7A17EBC2F6A8C200040B09B /* ConjugateTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A17EAE2F6A8BFE0040B09B /* ConjugateTab.swift */; };
F7A17EBD2F6A8C230040B09B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A17EB42F6A8BFE0040B09B /* ContentView.swift */; };
+ E97E65172F2CDD730070810A /* ESInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = E97E65092F2CDD5B0070810A /* ESInterfaceVariables.swift */; };
+ F786BAD42F1E8F70003F7505 /* ThirdPartyLicense.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140158982A430DD000D14E52 /* ThirdPartyLicense.swift */; };
+ F786BAD62F1E8F70003F7505 /* AppTextStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193BF27AEA33A0038660B /* AppTextStyling.swift */; };
+ F786BAD72F1E8F70003F7505 /* ScribeColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1378C228F5D7AC00E1CBC2 /* ScribeColor.swift */; };
+ F786BAD82F1E8F70003F7505 /* Conjugate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D171946427AF31770038660B /* Conjugate.swift */; };
+ F786BAD92F1E8F70003F7505 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147797B42A2CFB490044A53E /* SettingsViewController.swift */; };
+ F786BADA2F1E8F70003F7505 /* AboutTableData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1406B7862A2DFCDD001DF45B /* AboutTableData.swift */; };
+ F786BADC2F1E8F70003F7505 /* IDInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9FAC3892E9894F9008E00AC /* IDInterfaceVariables.swift */; };
+ F786BADE2F1E8F70003F7505 /* ToolTipViewDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3045396C293B9DDC003AE55B /* ToolTipViewDatasource.swift */; };
+ F786BADF2F1E8F70003F7505 /* Translate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D111E9B127AFE79500746F92 /* Translate.swift */; };
+ F786BAE32F1E8F70003F7505 /* ScribeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = D171945727AF237C0038660B /* ScribeKey.swift */; };
+ F786BAE42F1E8F70003F7505 /* AppExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1406B78B2A3209CF001DF45B /* AppExtensions.swift */; };
+ F786BAE62F1E8F70003F7505 /* FR-AZERTYInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D180EC0228FDFABF0018E29B /* FR-AZERTYInterfaceVariables.swift */; };
+ F786BAE72F1E8F70003F7505 /* ENInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CDED7A2A859FBF00098546 /* ENInterfaceVariables.swift */; };
+ F786BAE82F1E8F70003F7505 /* InstallationVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38BD213522D5907F00C6795D /* InstallationVC.swift */; };
+ F786BAE92F1E8F70003F7505 /* DEInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193CF27AEC9EC0038660B /* DEInterfaceVariables.swift */; };
+ F786BAEA2F1E8F70003F7505 /* SettingsTableData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147797BF2A2D0CDF0044A53E /* SettingsTableData.swift */; };
+ F786BAEB2F1E8F70003F7505 /* InformationScreenVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14AC56892A261663006B1DDF /* InformationScreenVC.swift */; };
+ F786BAEC2F1E8F70003F7505 /* InfoChildTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147797AE2A2CD3370044A53E /* InfoChildTableViewCell.swift */; };
+ F786BAED2F1E8F70003F7505 /* AppUISymbols.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A2DCB327AD3EB50057A10D /* AppUISymbols.swift */; };
+ F786BAEE2F1E8F70003F7505 /* KeyboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D190B2592742565500705659 /* KeyboardViewController.swift */; };
+ F786BAEF2F1E8F70003F7505 /* InstallationDownload.swift in Sources */ = {isa = PBXBuildFile; fileRef = E96111472F04EC62001E4F95 /* InstallationDownload.swift */; };
+ F786BAF02F1E8F70003F7505 /* UIEdgeInsetsExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEE62242B2DE65A00A0B9C1 /* UIEdgeInsetsExtensions.swift */; };
+ F786BAF22F1E8F70003F7505 /* KeyboardStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D171943727AEF0560038660B /* KeyboardStyling.swift */; };
+ F786BAF32F1E8F70003F7505 /* Annotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D111E9B927AFE7B200746F92 /* Annotate.swift */; };
+ F786BAF42F1E8F70003F7505 /* KeyboardBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DC85F92C7772FC006E32FD /* KeyboardBuilder.swift */; };
+ F786BAF52F1E8F70003F7505 /* KeyboardProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198369CB2C7980BA00C1B583 /* KeyboardProvider.swift */; };
+ F786BAF62F1E8F70003F7505 /* UIColor+ScribeColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1378C328F5D7AC00E1CBC2 /* UIColor+ScribeColors.swift */; };
+ F786BAF72F1E8F70003F7505 /* SVInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193EF27AECB350038660B /* SVInterfaceVariables.swift */; };
+ F786BAF92F1E8F70003F7505 /* TableViewTemplateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140158A12A4EDB2200D14E52 /* TableViewTemplateViewController.swift */; };
+ F786BAFB2F1E8F70003F7505 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38BD213322D5907F00C6795D /* AppDelegate.swift */; };
+ F786BAFC2F1E8F70003F7505 /* ToolTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30489C1D2936DAB700B59393 /* ToolTipView.swift */; };
+ F786BAFD2F1E8F70003F7505 /* ToolTipViewTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3045396E293B9DF2003AE55B /* ToolTipViewTheme.swift */; };
+ F786BAFE2F1E8F70003F7505 /* RadioTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A68DA3D2CDE7B7900897FAD /* RadioTableViewCell.swift */; };
+ F786BAFF2F1E8F70003F7505 /* CommandVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D190B2462741B24F00705659 /* CommandVariables.swift */; };
+ F786BB002F1E8F70003F7505 /* DownloadDataScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CE5EA72F063D870068A930 /* DownloadDataScreen.swift */; };
+ F786BB012F1E8F70003F7505 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16DD3A429E78A1500FB9022 /* Utilities.swift */; };
+ F786BB022F1E8F70003F7505 /* BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDB460202B03B3E400BEA967 /* BaseTableViewController.swift */; };
+ F786BB032F1E8F70003F7505 /* DAInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CDED742A859DDD00098546 /* DAInterfaceVariables.swift */; };
+ F786BB052F1E8F70003F7505 /* UIDeviceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AF4D872C3575EA009AE0D2 /* UIDeviceExtensions.swift */; };
+ E97E65222F2CDEC50070810A /* ESCommandVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = E97E65182F2CDEC50070810A /* ESCommandVariables.swift */; };
+ F786BB062F1E8F70003F7505 /* TipCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69B81EBB2BFB8C77008CAB85 /* TipCardView.swift */; };
+ F786BB072F1E8F70003F7505 /* InformationToolTipData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30453963293B9D18003AE55B /* InformationToolTipData.swift */; };
+ F786BB082F1E8F70003F7505 /* ToolTipViewUpdatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30453968293B9DB4003AE55B /* ToolTipViewUpdatable.swift */; };
+ F786BB092F1E8F70003F7505 /* RUInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193DF27AECAA60038660B /* RUInterfaceVariables.swift */; };
+ F786BB0A2F1E8F70003F7505 /* ITInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B81D5227BBBA360085FE5E /* ITInterfaceVariables.swift */; };
+ F786BB0B2F1E8F70003F7505 /* PTInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193D727AECA450038660B /* PTInterfaceVariables.swift */; };
+ F786BB0C2F1E8F70003F7505 /* HEInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D12EB9B92C81C0E700181765 /* HEInterfaceVariables.swift */; };
+ F786BB0D2F1E8F70003F7505 /* AppStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17193C327AEAD7D0038660B /* AppStyling.swift */; };
+ F786BB0E2F1E8F70003F7505 /* Plural.swift in Sources */ = {isa = PBXBuildFile; fileRef = D111E9A927AFE78600746F92 /* Plural.swift */; };
+ F786BB0F2F1E8F70003F7505 /* InterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D190B2492741B31F00705659 /* InterfaceVariables.swift */; };
+ F786BB122F1E8F70003F7505 /* ViewThemeable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30453966293B9D31003AE55B /* ViewThemeable.swift */; };
+ F786BB132F1E8F70003F7505 /* ColorVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D190B240274056D400705659 /* ColorVariables.swift */; };
+ F786BB142F1E8F70003F7505 /* SelectionViewTemplateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A68DA3F2CDE7B7900897FAD /* SelectionViewTemplateViewController.swift */; };
+ F786BB152F1E8F70003F7505 /* AboutTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2486F12B0B4E8C0038AE6A /* AboutTableViewCell.swift */; };
+ F786BB162F1E8F70003F7505 /* InstallScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A2DCB027AD37BD0057A10D /* InstallScreen.swift */; };
+ F786BB182F1E8F70003F7505 /* KeyboardKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = D171942E27AEDE110038660B /* KeyboardKeys.swift */; };
+ F786BB192F1E8F70003F7505 /* ParentTableCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147797B22A2CD5AB0044A53E /* ParentTableCellModel.swift */; };
+ F786BB1A2F1E8F70003F7505 /* WrapperCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9FEE6CA2EF1433E003A9266 /* WrapperCell.swift */; };
+ F786BB1B2F1E8F70003F7505 /* WikimediaAndScribe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1401589A2A45A07200D14E52 /* WikimediaAndScribe.swift */; };
+ F786BB1C2F1E8F70003F7505 /* ToolTipViewDatasourceable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3045396A293B9DC9003AE55B /* ToolTipViewDatasourceable.swift */; };
+ F786BB1D2F1E8F70003F7505 /* KeyAltChars.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B0719F27C6A1AA00FD7DBD /* KeyAltChars.swift */; };
+ F786BB1E2F1E8F70003F7505 /* NBInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CDED802A85A12400098546 /* NBInterfaceVariables.swift */; };
+ F786BB1F2F1E8F70003F7505 /* FR-QWERTYInterfaceVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17693DC28FC8CC300DF0FBB /* FR-QWERTYInterfaceVariables.swift */; };
+ F786BB202F1E8F70003F7505 /* KeyAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B0719627C63C9100FD7DBD /* KeyAnimation.swift */; };
+ F786BB212F1E8F70003F7505 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14AC56832A24AED3006B1DDF /* AboutViewController.swift */; };
+ F786BB222F1E8F70003F7505 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DD94F022D6A40000FF8845 /* Extensions.swift */; };
+ F786BB232F1E8F70003F7505 /* InterfaceConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC364682AE408F20001E456 /* InterfaceConstants.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -1347,15 +1418,18 @@
F7A17EA92F6A8BC90040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
- CTAButton.swift,
- DownloadButton.swift,
);
target = F786BAB22F1E8F70003F7505 /* Conjugate */;
};
F7A17EAA2F6A8BE30040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
- ConfirmDialogView.swift,
+ );
+ target = F786BAB22F1E8F70003F7505 /* Conjugate */;
+ };
+ F7A17EAC2F6A8C230040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
+ isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+ membershipExceptions = (
);
target = F786BAB22F1E8F70003F7505 /* Conjugate */;
};
@@ -1365,7 +1439,7 @@
E943457E2F05638700DFDB20 /* Button */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (F7A17EA92F6A8BC90040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Button; sourceTree = ""; };
E98E73BE2F20D8AA005EEDA3 /* Data */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (E98E74352F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E74362F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E74372F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E74382F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E74392F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743A2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743B2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743C2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743D2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743E2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E743F2F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E98E74402F20EA5E005EEDA3 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Data; sourceTree = ""; };
E98E73BF2F20D8C3005EEDA3 /* DataContracts */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = DataContracts; sourceTree = ""; };
- E9B89DCD2F226757003E396F /* DataManager */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (E9B89DCE2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DCF2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD02F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD12F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD22F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD32F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD42F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD52F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD62F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD72F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD82F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD92F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DDA2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = DataManager; sourceTree = ""; };
+ E9B89DCD2F226757003E396F /* DataManager */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (E9B89DCE2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DCF2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD02F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD12F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD22F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD32F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD42F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD52F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD62F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD72F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD82F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DD92F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, E9B89DDA2F22676B003E396F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, F7A17EAC2F6A8C230040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = DataManager; sourceTree = ""; };
E9DADB332EF3CF9B00702783 /* ConfirmDialog */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (F7A17EAA2F6A8BE30040B09B /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = ConfirmDialog; sourceTree = ""; };
/* End PBXFileSystemSynchronizedRootGroup section */
@@ -1515,6 +1589,7 @@
F786BB252F1E8F70003F7505 /* SwiftyJSON in Frameworks */,
F786BB262F1E8F70003F7505 /* SwipeableTabBarController in Frameworks */,
F786BB272F1E8F70003F7505 /* GRDB in Frameworks */,
+ E97D5A572F43237B00DE18B7 /* Yams in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2567,12 +2642,15 @@
E90EF8AD2F485B91007D967C /* Data */,
E943457E2F05638700DFDB20 /* Button */,
E9DADB332EF3CF9B00702783 /* ConfirmDialog */,
+ E9B89DCD2F226757003E396F /* DataManager */,
+ E98E73BF2F20D8C3005EEDA3 /* DataContracts */,
);
name = Conjugate;
packageProductDependencies = (
F786BACB2F1E8F70003F7505 /* SwiftyJSON */,
F786BACD2F1E8F70003F7505 /* GRDB */,
F786BACF2F1E8F70003F7505 /* SwipeableTabBarController */,
+ E97D5A562F43237B00DE18B7 /* Yams */,
);
productName = EmojiKeyboard;
productReference = F786BB3F2F1E8F70003F7505 /* Conjugate.app */;
@@ -3634,7 +3712,6 @@
E97E65172F2CDD730070810A /* ESInterfaceVariables.swift in Sources */,
E9ED938A2F2A3C45008D7451 /* DynamicConjugationViewController.swift in Sources */,
F786BAD42F1E8F70003F7505 /* ThirdPartyLicense.swift in Sources */,
- F786BAD52F1E8F70003F7505 /* (null) in Sources */,
F786BAD62F1E8F70003F7505 /* AppTextStyling.swift in Sources */,
E91980BE2F2F540A00B5852F /* NavigationStructure.swift in Sources */,
F786BAD72F1E8F70003F7505 /* ScribeColor.swift in Sources */,
@@ -3658,7 +3735,6 @@
F786BAEE2F1E8F70003F7505 /* KeyboardViewController.swift in Sources */,
F786BAEF2F1E8F70003F7505 /* InstallationDownload.swift in Sources */,
F786BAF02F1E8F70003F7505 /* UIEdgeInsetsExtensions.swift in Sources */,
- F786BAF12F1E8F70003F7505 /* (null) in Sources */,
F786BAF22F1E8F70003F7505 /* KeyboardStyling.swift in Sources */,
F786BAF32F1E8F70003F7505 /* Annotate.swift in Sources */,
F786BAF42F1E8F70003F7505 /* KeyboardBuilder.swift in Sources */,
@@ -3666,7 +3742,6 @@
F786BAF62F1E8F70003F7505 /* UIColor+ScribeColors.swift in Sources */,
F786BAF72F1E8F70003F7505 /* SVInterfaceVariables.swift in Sources */,
F786BAF92F1E8F70003F7505 /* TableViewTemplateViewController.swift in Sources */,
- F786BAFB2F1E8F70003F7505 /* AppDelegate.swift in Sources */,
F786BAFC2F1E8F70003F7505 /* ToolTipView.swift in Sources */,
F786BAFD2F1E8F70003F7505 /* ToolTipViewTheme.swift in Sources */,
F786BAFE2F1E8F70003F7505 /* RadioTableViewCell.swift in Sources */,
@@ -3712,6 +3787,9 @@
F7A17EBA2F6A8C180040B09B /* AppNavigation.swift in Sources */,
F725CADE2F6A72BC00A8C950 /* ConjugateApp.swift in Sources */,
F725CAE72F6A783400A8C950 /* SettingsTab.swift in Sources */,
+ E9F7273E2F45A6DE0060B92D /* LanguageDataService.swift in Sources */,
+ E9F7273F2F45A6E60060B92D /* APIClient.swift in Sources */,
+ E9F7273D2F45A6CE0060B92D /* LanguageData.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
From 835940b80264a72f1c974b9e52b74636d62973f2 Mon Sep 17 00:00:00 2001
From: Prince Yadav <66916296+prince-0408@users.noreply.github.com>
Date: Tue, 31 Mar 2026 19:27:41 +0530
Subject: [PATCH 4/5] fix: restore missing KeyboardsBase source files to
Conjugate target
---
Scribe.xcodeproj/project.pbxproj | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/Scribe.xcodeproj/project.pbxproj b/Scribe.xcodeproj/project.pbxproj
index f3224fcd..ec565ad3 100644
--- a/Scribe.xcodeproj/project.pbxproj
+++ b/Scribe.xcodeproj/project.pbxproj
@@ -619,6 +619,7 @@
E91980C52F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980C62F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E91980C72F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
+ E91980C82F2F540A00B5852F /* NavigationStructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91980B92F2F540000B5852F /* NavigationStructure.swift */; };
E9202DF02F0FAA0C001590FC /* DownloadStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9202DEF2F0FAA0C001590FC /* DownloadStateManager.swift */; };
E93179A42F03AE78002ED334 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = E93179A32F03AE77002ED334 /* Localizable.xcstrings */; };
E96111482F04EC6B001E4F95 /* InstallationDownload.swift in Sources */ = {isa = PBXBuildFile; fileRef = E96111472F04EC62001E4F95 /* InstallationDownload.swift */; };
@@ -3691,7 +3692,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
-
F7A17EBD2F6A8C230040B09B /* ContentView.swift in Sources */,
F7A17EBC2F6A8C200040B09B /* ConjugateTab.swift in Sources */,
F7A17EBB2F6A8C1C0040B09B /* AboutTab.swift in Sources */,
@@ -3701,6 +3701,26 @@
E9F7273E2F45A6DE0060B92D /* LanguageDataService.swift in Sources */,
E9F7273F2F45A6E60060B92D /* APIClient.swift in Sources */,
E9F7273D2F45A6CE0060B92D /* LanguageData.swift in Sources */,
+ E91980C82F2F540A00B5852F /* NavigationStructure.swift in Sources */,
+ F786BB0F2F1E8F70003F7505 /* InterfaceVariables.swift in Sources */,
+ F786BB232F1E8F70003F7505 /* InterfaceConstants.swift in Sources */,
+ F786BAF52F1E8F70003F7505 /* KeyboardProvider.swift in Sources */,
+ F786BAF42F1E8F70003F7505 /* KeyboardBuilder.swift in Sources */,
+ F786BB1D2F1E8F70003F7505 /* KeyAltChars.swift in Sources */,
+ F786BAFF2F1E8F70003F7505 /* CommandVariables.swift in Sources */,
+ F786BB132F1E8F70003F7505 /* ColorVariables.swift in Sources */,
+ F786BAD72F1E8F70003F7505 /* ScribeColor.swift in Sources */,
+ F786BAF62F1E8F70003F7505 /* UIColor+ScribeColors.swift in Sources */,
+ F786BAE72F1E8F70003F7505 /* ENInterfaceVariables.swift in Sources */,
+ F786BAE62F1E8F70003F7505 /* FR-AZERTYInterfaceVariables.swift in Sources */,
+ F786BAE92F1E8F70003F7505 /* DEInterfaceVariables.swift in Sources */,
+ F786BADC2F1E8F70003F7505 /* IDInterfaceVariables.swift in Sources */,
+ F786BB0A2F1E8F70003F7505 /* ITInterfaceVariables.swift in Sources */,
+ F786BB1E2F1E8F70003F7505 /* NBInterfaceVariables.swift in Sources */,
+ F786BB0B2F1E8F70003F7505 /* PTInterfaceVariables.swift in Sources */,
+ F786BB092F1E8F70003F7505 /* RUInterfaceVariables.swift in Sources */,
+ E97E65172F2CDD730070810A /* ESInterfaceVariables.swift in Sources */,
+ F786BAF72F1E8F70003F7505 /* SVInterfaceVariables.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
From 25e083f29ee7f37dae25eb80d843ed62c90c061b Mon Sep 17 00:00:00 2001
From: Prince Yadav <66916296+prince-0408@users.noreply.github.com>
Date: Tue, 31 Mar 2026 19:33:23 +0530
Subject: [PATCH 5/5] fix: add Extensions.swift to Conjugate target for
NSMutableAttributedString extension
---
Scribe.xcodeproj/project.pbxproj | 1 +
1 file changed, 1 insertion(+)
diff --git a/Scribe.xcodeproj/project.pbxproj b/Scribe.xcodeproj/project.pbxproj
index ec565ad3..f7cec5e6 100644
--- a/Scribe.xcodeproj/project.pbxproj
+++ b/Scribe.xcodeproj/project.pbxproj
@@ -3711,6 +3711,7 @@
F786BB132F1E8F70003F7505 /* ColorVariables.swift in Sources */,
F786BAD72F1E8F70003F7505 /* ScribeColor.swift in Sources */,
F786BAF62F1E8F70003F7505 /* UIColor+ScribeColors.swift in Sources */,
+ F786BB222F1E8F70003F7505 /* Extensions.swift in Sources */,
F786BAE72F1E8F70003F7505 /* ENInterfaceVariables.swift in Sources */,
F786BAE62F1E8F70003F7505 /* FR-AZERTYInterfaceVariables.swift in Sources */,
F786BAE92F1E8F70003F7505 /* DEInterfaceVariables.swift in Sources */,