我的应用程序可用德语提供,大约有30个Xcode生成的Localizable.strings文件(意味着该应用程序还可以使用30种语言提供),我正在慢慢转换为迅速的structs
,个人观点。
struct German {
let contacting_app_services: String = "Kontaktiere App Service.."
let validating_user: String = "Validiere Nutzer"
let email_in_use: String = "Diese e-mail wird bereits von einem andern Konto genutzt"
let account_not_found: String = "Nutzerkonto nicht gefunden. Bitte prüfen und nochmals versuchen"
let valid_email: String = "Bitte geben Sie eine gültige e-mail Adresse ein"
}
现在,我检查设备是否为德语:
extension Locale {
func isGerman() -> Bool {
return Locale.preferredLanguages[0].range(of:"de") != nil
}
}
并使用以下内容更新我的用户界面:
if Locale.current.isGerman() {
self.errorLabel.text = German().valid_email
}
我要做什么:
if statement
,使用更简洁的方式。答案 0 :(得分:2)
不要这样做。即使您已经对系统中已内置的本地化工具产生了莫名其妙的排斥,也不要这样做。
试想一下,如果您必须支持多种语言,您会遇到什么麻烦。想象一下您想增加对联合国6种正式语言的支持。
if Locale.current.isArabic {
self.errorLabel.text = Arabic().valid_email
}
else if Locale.current.isChinese {
self.errorLabel.text = Chinese().valid_email
}
else if Locale.current.isEnglish {
self.errorLabel.text = English().valid_email
}
else if Locale.current.isFrench {
self.errorLabel.text = French().valid_email
}
else if Locale.current.isGerman {
self.errorLabel.text = German().valid_email
}
else if Locale.current.isRussian {
self.errorLabel.text = Russian().valid_email
}
else if Locale.current.isSpanish {
self.errorLabel.text = Spanish().valid_email
} else {
// What would you even put here?
}
真是一场灾难。有这么多问题:
if
/ else if
/ else
梯形图! else
案子中放什么?默认语言?else
情况下改变主意怎么办?您要回头在每个地方进行更改吗?那显然是一个完全的初学者。
相反,使用多态为您选择合适的字符串:
protocol LocalizedStrings {
var contactingAppServices: String { get }
var validatingUser: String { get }
var emailInUse: String { get }
var accountNotFound: String { get }
var validEmail: String { get }
}
struct EnglishLocalizedStrings: LocalizedStrings {
let contactingAppServices = "Contacting App Services, please wait."
let validatingUser = "Validating user, please wait."
let emailInUse = "This e-mail is already in use."
let accountNotFound = "Account not found."
let invalidEmail = "This e-mail is not valid"
}
struct ArabicLocalizedStrings: LocalizedStrings {
// ...
}
// Somewhere in the initalization of your app
let localizedStrings: LocalizedString = PickTheRightLocalizationStringsObjectForTheUser()
// somewhere where you need localized strings:
self.errorLabel.text = localizedStrings.validEmail
然后,您可以仅依靠动态调度机制为您进行分支,以为工作选择合适的字符串,而不必每次手动手动枚举每种可能的情况。
答案 1 :(得分:0)
我会选择:
protocol Translations {
var valid_email: String { get }
}
struct German: Translations {
var valid_email: String = "Bitte geben Sie eine gültige e-mail Adresse ein"
}
struct English: Translations {
var valid_email: String = ""
}
extension Locale {
static func isGerman() -> Bool {
return Locale.preferredLanguages[0].range(of:"de") != nil
}
static func language() -> Translations {
if isGerman() {
return German()
}
return English()
}
}
用法:
let errorLabel = UILabel()
errorLabel.text = Locale.language().valid_email