Я впервые использую стратегию локализации 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. Опять же: почему бы и нет?