Не делай этого.Даже если у вас есть какое-то необъяснимое отвращение к инструментам локализации, уже встроенным в систему, не делайте этого.
Только представьте, с чем бы я ни столкнулся, если бы вам пришлось поддерживать несколько языков.Представьте, что вы хотите добавить поддержку 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
?Собираетесь ли вы вернуться и изменить его везде? - Что, если вы хотите добавить новый язык?Собираетесь ли вы вернуться и добавить его везде?Что если вы забудете сайт о вызовах?
- Как это будет выглядеть, если вы хотите поддерживать 30 языков?
Это, очевидно, полный стартер.
Вместо этогоиспользуйте полиморфизм, чтобы выбрать правильную строку для вас:
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
И тогда вы можете просто положиться на механизм динамической диспетчеризации, чтобы выполнить ветвление, чтобы выбрать правильную строку для задания, а не перечислять вручнуюкаждый возможный случай, каждый раз.