Как реализовать локализацию в Swift UI

10

Кто-нибудь может мне помочь? Я не могу найти описание локализации в Swift UI. Кто-нибудь может дать совет или лучше пример как локализовать например Text()?

Олег Х
источник

Ответы:

15

Когда вы посмотрите на документацию по Text, вы увидите, что он берет LocalizedStringKey, а не String, в свой инициализатор:

init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)

Это делает локализацию очень простой. Все, что вам нужно сделать, это:

  • создайте новый файл типа Strings File, назовите его Localizable
  • выберите новый файл и перейдите к File Inspector на правой боковой панели и нажмите Localize ...
  • перейдите в файл проекта в раздел «Локализации» и добавьте другой язык в список - Xcode создаст для вас файлы локализации

Когда вы выберете Localizable.strings, вы увидите, что он содержит файлы для исходного языка и языка, который вы только что добавили. Вот где вы размещаете свои переводы, т.е. ключевые - локализованные текстовые пары.

Если у вас есть текст, как это ваше приложение:

Text("Hello World!")

Теперь вы должны добавить в ваши Localizable.strings ваши переводы:

для вашего базового языка:

"Hello World!" = "Hello World!";

и для вашего второго языка (в данном случае немецкого):

"Hello World!" = "Hallo Welt!";

Чтобы увидеть ваши превью локализованными, вы можете определить их следующим образом:

struct ContentViewView_Previews: PreviewProvider {

    static var previews: some View {
        ForEach(["en", "de"], id: \.self) { id in
            ContentView()
                .environment(\.locale, .init(identifier: id))
        }
    }
}
LuLuGaGa
источник
Спасибо, это было полезно! Но у меня были некоторые проблемы, потому что было добавлено несколько языков.
Олег Х
Я следовал этим инструкциям к письму, и оно не сработало. Я использую iOS 10.15.1 Beta и Xcode 11.1. Любые советы с радостью принимаются. А пока я собираюсь допустить сбой в бета-версии программного обеспечения и больше не терять время на это
мама Джозефа Бойса
В чем именно была проблема?
LuLuGaGa
1
Я нашел проблему @LuLuGaGa. Получается, что я не следовал инструкциям к письму, как я сказал, что у меня было. Мой файл строк локализации находился в подпапке. Поместите это на уровне проекта, и это работает хорошо
мама Джозефа Бойса
1
Также обнаружили (я думаю), что вызов файла строк, отличный от Localizable, означает, что он не будет работать
мама Джозефа Бойса
3

Для быстрого UI-файла вам просто нужно вставить строковый ключ из файла .strings локализации

импорт SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("selectLanguage")
            Text("languagesList")
        }



    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.locale, .init(identifier: "en"))
    }
}

и это пример из файла .strings

"selectLanguage" = "Select language";
"languagesList" = "Languages list";

результат здесь

Олег Х
источник
0

Для локализации вашего приложения вам необходимо:

  1. Используйте элементы SwiftUI, такие как: Text («Nice») . Nice становится ключом в Localizable.strings.
  2. В тех случаях, когда текст отсутствует в элементе SwiftUI, необходимо использовать NSLocalizedString .
  3. Выберите цель приложения.
  4. Экспорт локализации: Правка -> Экспорт для локализации ...
  5. Дайте экспортированные файлы переводчику.
  6. Импорт переводов: Редактировать -> Импорт локализаций ...
Рамис
источник
0

Чтобы использовать Localazable в SwiftUI, вы можете выполнить это:

импортируйте SwiftUI для использования LocalizedStringKey в ваших файлах

//MARK: - File where you enum your keys to your Localized file
enum ButtonName: LocalizedStringKey {
case submit
case cancel
}

//MARK: - Your Localized file where are your translation
"submit" = "Submit is pressed";
"cancel" = "Cancel";

//MARK: - In your code
let submitButtonName = ButtonName.submit.rawValue
let cancelButtonName = ButtonName.cancel.rawValue

VStack {
Text(submitButtonName)
Text(cancelButtonName)
}
Ролан Лариотт
источник