diff --git a/WDBFontOverwrite.xcodeproj/project.pbxproj b/WDBFontOverwrite.xcodeproj/project.pbxproj index 811c441..cec1c6e 100644 --- a/WDBFontOverwrite.xcodeproj/project.pbxproj +++ b/WDBFontOverwrite.xcodeproj/project.pbxproj @@ -36,6 +36,9 @@ C5C9A7A12959263A00466D87 /* OverwriteFontImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5C9A7A02959263A00466D87 /* OverwriteFontImpl.swift */; }; C5C9A7A32959341600466D87 /* RepackedFonts in Resources */ = {isa = PBXBuildFile; fileRef = C5C9A7A22959341600466D87 /* RepackedFonts */; }; C5C9A7AA2959417100466D87 /* vm_unaligned_copy_switch_race.c in Sources */ = {isa = PBXBuildFile; fileRef = C5C9A7A92959417100466D87 /* vm_unaligned_copy_switch_race.c */; }; + EE205E7E29A37AF50086D58E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EE205E8029A37AF50086D58E /* Localizable.strings */; }; + EE205E8329A3924D0086D58E /* ToolsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE205E8229A3924D0086D58E /* ToolsManager.swift */; }; + EEFA4D3E29A4762B00D51F8D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EEFA4D4029A4762B00D51F8D /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -75,6 +78,11 @@ C5C9A7A82959417100466D87 /* WDBFontOverwrite-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WDBFontOverwrite-Bridging-Header.h"; sourceTree = ""; }; C5C9A7A92959417100466D87 /* vm_unaligned_copy_switch_race.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vm_unaligned_copy_switch_race.c; sourceTree = ""; }; C5C9A7AB2959438600466D87 /* vm_unaligned_copy_switch_race.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vm_unaligned_copy_switch_race.h; sourceTree = ""; }; + EE205E7F29A37AF50086D58E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + EE205E8129A37AF80086D58E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + EE205E8229A3924D0086D58E /* ToolsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsManager.swift; sourceTree = ""; }; + EEFA4D3F29A4762B00D51F8D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + EEFA4D4129A4763000D51F8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -119,6 +127,7 @@ 4FF28A1129679EEC00143640 /* ExplanationView.swift */, 4FF28A132967AA2D00143640 /* ActionButtons.swift */, 4F085E382994EF2F004099C1 /* ActionButtons.ViewModel.swift */, + EE205E8229A3924D0086D58E /* ToolsManager.swift */, ); path = MainInterface; sourceTree = ""; @@ -182,6 +191,8 @@ C5C9A7AB2959438600466D87 /* vm_unaligned_copy_switch_race.h */, C5C9A7A82959417100466D87 /* WDBFontOverwrite-Bridging-Header.h */, C5C9A7982959261200466D87 /* Preview Content */, + EE205E8029A37AF50086D58E /* Localizable.strings */, + EEFA4D4029A4762B00D51F8D /* InfoPlist.strings */, ); path = WDBFontOverwrite; sourceTree = ""; @@ -236,7 +247,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, - Base, + "zh-Hans", ); mainGroup = C5C9A7862959261000466D87; productRefGroup = C5C9A7902959261000466D87 /* Products */; @@ -253,6 +264,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + EE205E7E29A37AF50086D58E /* Localizable.strings in Resources */, + EEFA4D3E29A4762B00D51F8D /* InfoPlist.strings in Resources */, C5A95F46295964AE00C58FDB /* PreviewFonts in Resources */, C5C9A79A2959261200466D87 /* Preview Assets.xcassets in Resources */, C5C9A7A32959341600466D87 /* RepackedFonts in Resources */, @@ -276,6 +289,7 @@ 4FE5EF452966AD87003384EC /* FontDiscoveryScene.swift in Sources */, 4FD690992986395B00B751B2 /* helpers.m in Sources */, 4FF28A1229679EEC00143640 /* ExplanationView.swift in Sources */, + EE205E8329A3924D0086D58E /* ToolsManager.swift in Sources */, C5C9A7932959261000466D87 /* WDBFontOverwriteApp.swift in Sources */, 4FE5EF38296561A5003384EC /* FileEditorView.swift in Sources */, 4FD690952986367C00B751B2 /* grant_full_disk_access.m in Sources */, @@ -297,6 +311,27 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXVariantGroup section */ + EE205E8029A37AF50086D58E /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + EE205E7F29A37AF50086D58E /* en */, + EE205E8129A37AF80086D58E /* zh-Hans */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + EEFA4D4029A4762B00D51F8D /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + EEFA4D3F29A4762B00D51F8D /* zh-Hans */, + EEFA4D4129A4763000D51F8D /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ C5C9A79B2959261200466D87 /* Debug */ = { isa = XCBuildConfiguration; @@ -419,9 +454,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_ASSET_PATHS = "\"WDBFontOverwrite/Preview Content\""; - DEVELOPMENT_TEAM = WNUZX4NA7T; + DEVELOPMENT_TEAM = DB7Q3NDCDU; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WDBFontOverwrite/Info.plist; @@ -440,7 +475,7 @@ "$(inherited)", "$(PROJECT_DIR)/WDBFontOverwrite", ); - MARKETING_VERSION = 1.10.8; + MARKETING_VERSION = 1.10.10; PRODUCT_BUNDLE_IDENTIFIER = com.ginsudev.WDBFontOverwrite; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -458,9 +493,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_ASSET_PATHS = "\"WDBFontOverwrite/Preview Content\""; - DEVELOPMENT_TEAM = WNUZX4NA7T; + DEVELOPMENT_TEAM = DB7Q3NDCDU; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WDBFontOverwrite/Info.plist; @@ -479,7 +514,7 @@ "$(inherited)", "$(PROJECT_DIR)/WDBFontOverwrite", ); - MARKETING_VERSION = 1.10.8; + MARKETING_VERSION = 1.10.10; PRODUCT_BUNDLE_IDENTIFIER = com.ginsudev.WDBFontOverwrite; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/WDBFontOverwrite/MainInterface/ActionButtons.ViewModel.swift b/WDBFontOverwrite/MainInterface/ActionButtons.ViewModel.swift index 8a3520d..9883bf2 100644 --- a/WDBFontOverwrite/MainInterface/ActionButtons.ViewModel.swift +++ b/WDBFontOverwrite/MainInterface/ActionButtons.ViewModel.swift @@ -26,7 +26,7 @@ extension ActionButtons { print("can't get disk access, using backup respring") respringLegacy() } else { - xpc_crasher(UnsafeMutablePointer(mutating: "com.apple.frontboard.systemappservices")) + respring() } } } @@ -43,3 +43,4 @@ extension ActionButtons { } } } + diff --git a/WDBFontOverwrite/MainInterface/ActionButtons.swift b/WDBFontOverwrite/MainInterface/ActionButtons.swift index f968fda..b4d4629 100644 --- a/WDBFontOverwrite/MainInterface/ActionButtons.swift +++ b/WDBFontOverwrite/MainInterface/ActionButtons.swift @@ -17,7 +17,7 @@ struct ActionButtons: View { } label: { AlignedRowContentView( imageName: "trash", - text: "Clear keyboard cache" + text: NSLocalizedString("Clear keyboard cache", comment: "Clear keyboard cache") ) } } @@ -30,7 +30,7 @@ struct ActionButtons: View { } label: { AlignedRowContentView( imageName: "arrow.triangle.2.circlepath", - text: "Restart SpringBoard" + text: NSLocalizedString("Restart SpringBoard", comment: "Restart SpringBoard") ) } } diff --git a/WDBFontOverwrite/MainInterface/CustomFontsScene.swift b/WDBFontOverwrite/MainInterface/CustomFontsScene.swift index f53a265..a4eef36 100644 --- a/WDBFontOverwrite/MainInterface/CustomFontsScene.swift +++ b/WDBFontOverwrite/MainInterface/CustomFontsScene.swift @@ -20,7 +20,7 @@ struct CustomFontsScene: View { Section { ExplanationView( systemImage: "textformat", - description: "Import & manage custom fonts that have been ported to iOS.", + description: NSLocalizedString("Import & manage custom fonts that have been ported to iOS.", comment: "Import & manage custom fonts that have been ported to iOS."), canShowProgress: true ) } @@ -64,25 +64,25 @@ struct CustomFontsScene: View { .pickerStyle(.segmented) Button { - progressManager.message = "Importing..." + progressManager.message = NSLocalizedString("Importing...", comment: "Importing...") viewModel.importTTCRepackMode = .woff2 viewModel.importPresented = true } label: { AlignedRowContentView( imageName: "square.and.arrow.down", - text: "Import custom \(viewModel.selectedCustomFontType.rawValue)" + text: NSLocalizedString("Import custom \(viewModel.selectedCustomFontType.rawValue)", comment: "Import custom") ) } Button { progressManager.isBusy = true - progressManager.message = "Running" + progressManager.message = NSLocalizedString("Running", comment: "Running") Task { await viewModel.batchOverwriteFonts() } } label: { AlignedRowContentView( imageName: "checkmark.circle", - text: "Apply \(viewModel.selectedCustomFontType.rawValue)" + text: NSLocalizedString("Apply \(viewModel.selectedCustomFontType.rawValue)", comment: "Apply") ) } } header: { @@ -97,14 +97,14 @@ struct CustomFontsScene: View { } label: { AlignedRowContentView( imageName: "doc.badge.gearshape", - text: "Manage imported fonts" + text: NSLocalizedString("Manage imported fonts", comment: "Manage imported fonts") ) } ActionButtons() } header: { Text("Actions") } footer: { - Text("Originally created by [@zhuowei](https://twitter.com/zhuowei). Updated & maintained by [@GinsuDev](https://twitter.com/GinsuDev).") + Text("Originally created by [@zhuowei](https://twitter.com/zhuowei). Updated & maintained by [@GinsuDev](https://twitter.com/GinsuDev). Chinese translation by [@chihaodong](https://twitter.com/chihaodong).") } } } diff --git a/WDBFontOverwrite/MainInterface/FileEditor/FileEditorView.swift b/WDBFontOverwrite/MainInterface/FileEditor/FileEditorView.swift index aacb5c2..7443c6e 100644 --- a/WDBFontOverwrite/MainInterface/FileEditor/FileEditorView.swift +++ b/WDBFontOverwrite/MainInterface/FileEditor/FileEditorView.swift @@ -41,7 +41,7 @@ struct FileEditorView: View { } } } - .navigationTitle("Imported fonts (\(viewModel.files.count))") + .navigationTitle(NSLocalizedString("Imported fonts", comment: "Imported fonts") + " (\(viewModel.files.count))") } .alert(isPresented: $viewModel.isVisibleRemoveAllAlert) { Alert( diff --git a/WDBFontOverwrite/MainInterface/FontDiscovery/FontDiscoveryScene.swift b/WDBFontOverwrite/MainInterface/FontDiscovery/FontDiscoveryScene.swift index f91b130..e1321d4 100644 --- a/WDBFontOverwrite/MainInterface/FontDiscovery/FontDiscoveryScene.swift +++ b/WDBFontOverwrite/MainInterface/FontDiscovery/FontDiscoveryScene.swift @@ -16,7 +16,7 @@ struct FontDiscoveryScene: View { VStack(spacing: 10) { ExplanationView( systemImage: "star.fill", - description: "Find fonts and emojis from these talented developers and themers.", + description: NSLocalizedString("Find fonts and emojis from these talented developers and themers.", comment: "Find fonts and emojis from these talented developers and themers."), canShowProgress: false ) ForEach(viewModel.descriptors, id: \.name) { descriptor in diff --git a/WDBFontOverwrite/MainInterface/PresetFontsScene.swift b/WDBFontOverwrite/MainInterface/PresetFontsScene.swift index 2aef7d1..e46317f 100644 --- a/WDBFontOverwrite/MainInterface/PresetFontsScene.swift +++ b/WDBFontOverwrite/MainInterface/PresetFontsScene.swift @@ -10,6 +10,7 @@ import SwiftUI struct PresetFontsScene: View { @EnvironmentObject private var progressManager: ProgressManager private let viewModel = ViewModel() + @State private var versionBuildString: String? var body: some View { NavigationView { @@ -17,17 +18,26 @@ struct PresetFontsScene: View { Section { ExplanationView( systemImage: "textformat", - description: "Choose from a selection of preset fonts.", + description: NSLocalizedString("Choose from a selection of preset fonts.", comment: "Choose from a selection of preset fonts."), canShowProgress: true ) } .listRowBackground(Color(UIColor(red: 0.44, green: 0.69, blue: 0.67, alpha: 1.00))) fontsSection actionSection + Section { + } header: { + Label("Version \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "UNKNOWN") (\(versionBuildString ?? "Release"))", systemImage: "info") + } } .navigationTitle("Presets") } .navigationViewStyle(.stack) + .onAppear { + if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String, build != "0" { + versionBuildString = "Beta \(build)" + } + } } } @@ -60,7 +70,7 @@ private extension PresetFontsScene { } header: { Text("Actions") } footer: { - Text("Originally created by [@zhuowei](https://twitter.com/zhuowei). Updated & maintained by [@GinsuDev](https://twitter.com/GinsuDev).") + Text("Originally created by [@zhuowei](https://twitter.com/zhuowei). Updated & maintained by [@GinsuDev](https://twitter.com/GinsuDev). Chinese translation by [@chihaodong](https://twitter.com/chihaodong).") } } } diff --git a/WDBFontOverwrite/MainInterface/ToolsManager.swift b/WDBFontOverwrite/MainInterface/ToolsManager.swift new file mode 100644 index 0000000..745e62e --- /dev/null +++ b/WDBFontOverwrite/MainInterface/ToolsManager.swift @@ -0,0 +1,29 @@ +// +// ToolsManager.swift +// WDBFontOverwrite +// +// Created by 迟浩东 on 2023/2/20. +// + +import UIKit + +/* 注销重启 */ +func respring() { + UIImpactFeedbackGenerator(style: .soft).impactOccurred() + + let view = UIView(frame: UIScreen.main.bounds) + view.backgroundColor = .black + view.alpha = 0 + + for window in UIApplication.shared.connectedScenes.map({ $0 as? UIWindowScene }).compactMap({ $0 }).flatMap({ $0.windows.map { $0 } }) { + window.addSubview(view) + UIView.animate(withDuration: 0.2, delay: 0, animations: { + view.alpha = 1 + }) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: { + restartFrontboard() + exit(0) + }) +} diff --git a/WDBFontOverwrite/Progress/ProgressManager.swift b/WDBFontOverwrite/Progress/ProgressManager.swift index e4a0ec1..360ad31 100644 --- a/WDBFontOverwrite/Progress/ProgressManager.swift +++ b/WDBFontOverwrite/Progress/ProgressManager.swift @@ -18,13 +18,13 @@ final class ProgressManager: ObservableObject { @Published var completedProgress: Double = 0 @Published var totalProgress: Double = 0 @Published var importResults = [ImportStatus]() - @Published var message: String = "Choose a font." + @Published var message: String = NSLocalizedString("Choose a font.", comment: "Choose a font.") @Published var isPresentedResultsAlert = false { didSet { if !isPresentedResultsAlert { importResults = [] - message = "Done." + message = NSLocalizedString("Done.", comment: "Done.") } } } diff --git a/WDBFontOverwrite/WDBFontOverwriteApp.swift b/WDBFontOverwrite/WDBFontOverwriteApp.swift index 8094cf1..4aa2964 100644 --- a/WDBFontOverwrite/WDBFontOverwriteApp.swift +++ b/WDBFontOverwrite/WDBFontOverwriteApp.swift @@ -46,7 +46,7 @@ struct WDBFontOverwriteApp: App { for result in progressManager.importResults { switch result { case .success: - message += "Successfully imported.\n" + message += NSLocalizedString("Successfully imported.\n", comment: "Successfully imported.\n") case .failure(let string): message += "\(string)\n" } diff --git a/WDBFontOverwrite/WDBImportCustomFontPickerViewControllerDelegate.swift b/WDBFontOverwrite/WDBImportCustomFontPickerViewControllerDelegate.swift index 99730b2..469e52b 100644 --- a/WDBFontOverwrite/WDBImportCustomFontPickerViewControllerDelegate.swift +++ b/WDBFontOverwrite/WDBImportCustomFontPickerViewControllerDelegate.swift @@ -25,7 +25,7 @@ class WDBImportCustomFontPickerViewControllerDelegate: NSObject, UIDocumentPicke func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { Task { @MainActor in - ProgressManager.shared.message = "Cancelled" + ProgressManager.shared.message = NSLocalizedString("Cancelled", comment: "Cancelled") } } @@ -55,10 +55,10 @@ class WDBImportCustomFontPickerViewControllerDelegate: NSObject, UIDocumentPicke } ProgressManager.shared.message = String( - format: "Successfully imported %d/%d files.%@", + format: NSLocalizedString("Successfully imported %d/%d files.%@", comment: "Successfully imported %d/%d files.%@"), successfullyImportedCount, urls.count, - successfullyImportedCount == urls.count ? "" : " Some files were skipped because your device doesn't have those fonts or because they don't support your iOS/device." + successfullyImportedCount == urls.count ? "" : NSLocalizedString(" Some files were skipped because your device doesn't have those fonts or because they don't support your iOS/device.", comment: " Some files were skipped because your device doesn't have those fonts or because they don't support your iOS/device.") ) } diff --git a/WDBFontOverwrite/en.lproj/InfoPlist.strings b/WDBFontOverwrite/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..762370c --- /dev/null +++ b/WDBFontOverwrite/en.lproj/InfoPlist.strings @@ -0,0 +1,12 @@ +/* + InfoPlist.strings + WDBFontOverwrite + + Created by 迟浩东 on 2023/2/21. + +*/ +/* Bundle display name */ +"CFBundleDisplayName" = "WDBFontOverwrite"; + +/* Bundle name */ +"CFBundleName" = "WDBFontOverwrite"; diff --git a/WDBFontOverwrite/en.lproj/Localizable.strings b/WDBFontOverwrite/en.lproj/Localizable.strings new file mode 100644 index 0000000..e2116df --- /dev/null +++ b/WDBFontOverwrite/en.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + WDBFontOverwrite + + Created by 迟浩东 on 2023/2/20. + +*/ diff --git a/WDBFontOverwrite/helpers.h b/WDBFontOverwrite/helpers.h index aaf9f94..c9d70c2 100644 --- a/WDBFontOverwrite/helpers.h +++ b/WDBFontOverwrite/helpers.h @@ -6,6 +6,8 @@ void test_nsexpressions(void); char* set_up_tmp_file(void); void xpc_crasher(char* service_name); +void restartBackboard(void); +void restartFrontboard(void); #define ROUND_DOWN_PAGE(val) (val & ~(PAGE_SIZE - 1ULL)) diff --git a/WDBFontOverwrite/helpers.m b/WDBFontOverwrite/helpers.m index 6231ec6..1069727 100644 --- a/WDBFontOverwrite/helpers.m +++ b/WDBFontOverwrite/helpers.m @@ -128,3 +128,13 @@ void xpc_crasher(char* service_name) { return; } + +void restartBackboard(void) { + xpc_crasher("com.apple.backboard.TouchDeliveryPolicyServer"); +} + +void restartFrontboard(void) { + // NOTE: This will not kill your app on some versions + // You may also need to exit(0) afterwards + xpc_crasher("com.apple.frontboard.systemappservices"); +} diff --git a/WDBFontOverwrite/zh-Hans.lproj/InfoPlist.strings b/WDBFontOverwrite/zh-Hans.lproj/InfoPlist.strings new file mode 100644 index 0000000..7a54a41 --- /dev/null +++ b/WDBFontOverwrite/zh-Hans.lproj/InfoPlist.strings @@ -0,0 +1,13 @@ +/* + InfoPlist.strings + WDBFontOverwrite + + Created by 迟浩东 on 2023/2/21. + +*/ + +/* Bundle display name */ +"CFBundleDisplayName" = "WDB字体修改"; + +/* Bundle name */ +"CFBundleName" = "WDB字体修改"; diff --git a/WDBFontOverwrite/zh-Hans.lproj/Localizable.strings b/WDBFontOverwrite/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..db61c72 --- /dev/null +++ b/WDBFontOverwrite/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,43 @@ +/* + Localizable.strings + WDBFontOverwrite + + Created by 迟浩东 on 2023/2/20. + +*/ + +"Successfully imported.\n" = "导入成功\n"; +"Import log" = "导入日志"; +"Dismiss" = "关闭"; +"iOS version not supported. Don't ask us to support newer versions because the exploit used just simply does not support newer iOS versions." = "不支持iOS版本。不要要求我们支持较新版本,因为所使用的漏洞在较新的iOS版本已经被修复。"; +"Custom fonts require font files that are ported for iOS. See https://github.com/ginsudev/WDBFontOverwrite for details." = "自定义字体需要为iOS移植的字体文件。请参阅https://github.com/ginsudev/WDBFontOverwrite详细信息。"; +"Keyboard fonts may not be applied immediately due to iOS caching issues. IF POSSIBLE, remove the folder /var/mobile/Library/Caches/com.apple.keyboards/ if you wish for changes to take effect immediately." = "由于iOS缓存问题,键盘字体可能无法立即应用。如果可能,如果希望更改立即生效,请删除/var/mobile/Library/Caches/com.apple.keyboards/文件夹。"; +"Clear keyboard cache" = "清除键盘缓存"; +"Restart SpringBoard" = "重启SpringBoard"; +"Choose a font." = "选择字体"; +"Done." = "完成"; +"Custom" = "自定义"; +"Presets" = "预设"; +"Discovery" = "发现"; +"Choose from a selection of preset fonts." = "从预设字体中选择"; +"Fonts" = "字体"; +"Actions" = "动作"; +"Custom font" = "自定义字体"; +"Custom Emoji" = "自定义Emoji"; +"Import & manage custom fonts that have been ported to iOS." = "导入并管理自定义的iOS字体"; +"Importing..." = "导入中..."; +"Import custom fonts" = "导入自定义字体"; +"Import custom emojis" = "导入自定义Emoji"; +"Apply emojis" = "应用Emoji"; +"Apply fonts" = "应用字体"; +"Manage imported fonts" = "管理已导入字体"; +"Successfully imported %d/%d files.%@" = "成功导入 %d/%d 文件 %@"; +" Some files were skipped because your device doesn't have those fonts or because they don't support your iOS/device." = "某些文件被跳过,因为您的设备没有这些字体,或者它们不支持您的iOS/设备。"; +"Imported fonts" = "已导入字体"; +"Remove all" = "移出所有"; +"Are you sure you want to remove all imported font files?" = "确实要删除所有导入的字体文件吗?"; +"Running" = "运行中"; +"Find fonts and emojis from these talented developers and themers." = "从这些才华横溢的开发人员和主题作者那里找到字体和表情符号"; +"Cancelled" = "已取消"; +"Originally created by [@zhuowei](https://twitter.com/zhuowei). Updated & maintained by [@GinsuDev](https://twitter.com/GinsuDev). Chinese translation by [@chihaodong](https://twitter.com/chihaodong)." = "由[@zhuowei](https://twitter.com/zhuowei)原创。 由[@GinsuDev](https://twitter.com/GinsuDev)更新和维护。中文由[@chihaodong](https://twitter.com/chihaodong)翻译和维护。"; +"Version %@ (%@)" = "版本 %@ (%@)";