Система локализации SwiftUI без использования Localizable.strings? - PullRequest
0 голосов
/ 07 апреля 2020

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

Что не так привлекательно, так это отсутствие type- безопасность, включая возможное глобальное переименование строковых свойств, проверки согласованности во время компиляции (все переведено?), ремонтопригодность. Список можно продолжить.

Предложение

Я написал проект другого подхода. (Это предназначено исключительно для среды SwiftUI, не думая о какой-либо локализации раскадровки)

Интересно, есть ли что-нибудь об этом решении в будущем, которое может запретить использовать это. Будет это будет принято в обзоре приложений? (Почему бы и нет?)
После нескольких исследований я удивляюсь, почему всем кажется, что go кажется, что только замена имен строк на перечисления и, возможно, использование какого-либо внешнего инструмента.



Это будет объект верхнего уровня для доступа (интервал имен потребуется позже):

enum Localizables {
    case headlineForSomething
    case bodytext
    case somethingElse
    case buttonTitle
}



Фактические результаты перевода находятся в эти расширения.
Каждое расширение живет в отдельном файле .swift. Эквивалент Localizable.strings / Language X:

extension Localizables {
        private var en: String {
        switch self {
        case .headlineForSomething:
            return "Headline for something in English"
        case .bodytext:
            return "Bodytext in English"
        case .somethingElse:
            return "Something else in English"
        case .buttonTitle:
            return "Button title in English"
        }
    }
}


extension Localizables {
    private var de: String {
        switch self {
        case .headlineForSomething:
            return "Headline for something in German"
        case .bodytext:
            return "Bodytext in German"
        case .somethingElse:
            return "Something else in German"
        case .buttonTitle:
            return "Button title in German"
        }
    }
}



Простое ядро ​​системы
1. Включенные языки должны быть перечислены изначально.
2. Это свойство предоставляется с результирующей строкой.

extension Localizables {
    // 1: 
    private var availableLocales: [Language] {
               [
                   Language(ressources: self.en, name: "en"),
                   Language(ressources: self.de, name: "de")
               ]
           }
            // 2:
           var localized: String {
               return self.translate()
           }

           private func translate() -> String {
               for lang in self.availableLocales {
                   if Locale.current.languageCode == lang.name {
                       return lang.ressources
                   }
                   else { return "not tranlated" }
               }
                return "not tranlated xxx"
           }
}

struct Language {
    let ressources: String
    let name: String
}



Использование моего маленького подхода так просто:

let someStringToBeLocalized: String = Localizables.headlineForSomething.localized



Текущие задачи и недостатки, которые я вижу:

Случаи, безусловно, должны быть разделены именами для лучшей доступности Случаи могут (?) Включать переменные для вставки вычисляемых свойств, таких как числа, в ie. фразы. Я не уверен, что поставщики услуг перевода будут работать с чем-то еще, кроме файлов Localizable.string. Опять же: почему бы и нет?



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...