如何在 iOS 项目中找到所有可用的字符串表?
How to find all available Strings-Tables in iOS project?
是否可以找到 iOS 项目中可用的所有本地化表?
背景:
在基于 Swift 的 iOS 项目中,我使用了多个本地化的 .strings
文件。例如,一个文件包含不同项目中使用的常用字符串,一个文件项目特定字符串等。
使用自定义本地化方法可以正常工作,该方法检查是否在 file/table A 中找到给定字符串,如果未找到翻译,则继续在 file/table B 中搜索:
func localizedString(forKey key: String) -> String {
// Search in project specific, default file Localizable.strings
var result = Bundle.main.localizedString(forKey: key, value: nil, table: nil)
// If now translation was found, continue search in shared file "Common.strings"
if result == key {
result = Bundle.main.localizedString(forKey: key, value: nil, table: "Common")
}
if result == key {
result = Bundle.main.localizedString(forKey: key, value: nil, table: "OtherFile")
}
...
return result
}
是否可以将其扩展为更通用的解决方案,我不必手动指定 files/tables,而是自动完成?这将允许在具有不同字符串文件的不同项目中使用相同的代码。
// PSEUDOCODE
func localizedString(forKey key: String) -> String {
for tableName in Bundle.main.allLocalizdationTables { // DOES NOT EXIST...
var result = Bundle.main.localizedString(forKey: key, value: nil, table: tableName)
if result != key {
return result
}
}
return key
}
那么:有没有可能
这应该可以解决问题:
func localizedString(forKey key: String) -> String {
guard let filesURL = Bundle.main.urls(forResourcesWithExtension: "strings", subdirectory: nil) else { return key }
let tablesName = filesURL.map { [=10=].deletingPathExtension().lastPathComponent }
for aTableName in tablesName {
var result = Bundle.main.localizedString(forKey: key, value: nil, table: aTableName)
if result != key {
return result
}
}
return key
}
是否可以找到 iOS 项目中可用的所有本地化表?
背景:
在基于 Swift 的 iOS 项目中,我使用了多个本地化的 .strings
文件。例如,一个文件包含不同项目中使用的常用字符串,一个文件项目特定字符串等。
使用自定义本地化方法可以正常工作,该方法检查是否在 file/table A 中找到给定字符串,如果未找到翻译,则继续在 file/table B 中搜索:
func localizedString(forKey key: String) -> String {
// Search in project specific, default file Localizable.strings
var result = Bundle.main.localizedString(forKey: key, value: nil, table: nil)
// If now translation was found, continue search in shared file "Common.strings"
if result == key {
result = Bundle.main.localizedString(forKey: key, value: nil, table: "Common")
}
if result == key {
result = Bundle.main.localizedString(forKey: key, value: nil, table: "OtherFile")
}
...
return result
}
是否可以将其扩展为更通用的解决方案,我不必手动指定 files/tables,而是自动完成?这将允许在具有不同字符串文件的不同项目中使用相同的代码。
// PSEUDOCODE
func localizedString(forKey key: String) -> String {
for tableName in Bundle.main.allLocalizdationTables { // DOES NOT EXIST...
var result = Bundle.main.localizedString(forKey: key, value: nil, table: tableName)
if result != key {
return result
}
}
return key
}
那么:有没有可能
这应该可以解决问题:
func localizedString(forKey key: String) -> String {
guard let filesURL = Bundle.main.urls(forResourcesWithExtension: "strings", subdirectory: nil) else { return key }
let tablesName = filesURL.map { [=10=].deletingPathExtension().lastPathComponent }
for aTableName in tablesName {
var result = Bundle.main.localizedString(forKey: key, value: nil, table: aTableName)
if result != key {
return result
}
}
return key
}