Каков наилучший способ обработки логических значений? - PullRequest
0 голосов
/ 20 сентября 2019

Мое приложение доступно на немецком языке, существует около 30 сгенерированных Xcode файлов Localizable.strings (означает, что приложение доступно на еще 30 языках), я медленно конвертирую в swift 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 и используйте более чистый способ.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Не делай этого.Даже если у вас есть какое-то необъяснимое отвращение к инструментам локализации, уже встроенным в систему, не делайте этого.

Только представьте, с чем бы я ни столкнулся, если бы вам пришлось поддерживать несколько языков.Представьте, что вы хотите добавить поддержку 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?
}

Какая абсолютная катастрофа.С ним так много проблем:

  1. В итоге вы бы повторили эту if / else if / else лестницу в каждом месте, где вы хотите локализованную строку!
  2. Что вы положите в else чехол?Язык по умолчанию?
  3. Что если вы когда-нибудь передумаете, что делать в случае else?Собираетесь ли вы вернуться и изменить его везде?
  4. Что, если вы хотите добавить новый язык?Собираетесь ли вы вернуться и добавить его везде?Что если вы забудете сайт о вызовах?
  5. Как это будет выглядеть, если вы хотите поддерживать 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

И тогда вы можете просто положиться на механизм динамической диспетчеризации, чтобы выполнить ветвление, чтобы выбрать правильную строку для задания, а не перечислять вручнуюкаждый возможный случай, каждый раз.

0 голосов
/ 20 сентября 2019

Я бы пошел с:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...