Метка в раскадровке не принимает правильное значение локализации - PullRequest
2 голосов
/ 08 марта 2019

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

Изображение одно: Итак, во-первых, я добавил шведский язык внутри

"Проект -> Локализации"

img1

Чем я зашел в "LaunchScreen.storyboard" и отредактировал файл. Вот этот: img2

Отредактировано для этого: second

После этого я убедился, что мой экран запуска поддерживает такой язык: this

И для последнего шага .. Я отредактировал язык приложения на шведский так: enter image description here


Но когда я запускаю его на симуляторе, текст не переводится. Это все тот же текст, и я не знаю, как его решить. Вы? Не стесняйтесь помочь мне, я был бы очень признателен!

Итак, я не уверен, должен ли я добавить какой-то код или что-то еще, чтобы это работало, но я следовал руководству, а они нет. Это одна из причин, почему я так растерялся. И заранее спасибо!

ПЕРЕД ОТНОШЕНИЕМ: По крайней мере, дайте мне причину этого, чтобы я мог улучшить его в будущем!

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Мне нравится решение denis_lor, но я подумал, что сначала я хочу начать работать над тем, что уже должно работать (перевод раскадровки с простым файлом строк), без необходимости повторной реализации этой функциональности аналогичным образом.

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

Решение, которое я нашел, было воссоздание файла строк с использованием ibtool:

ibtool AppName/Base.lproj/Main.storyboard --generate-strings-file tmp.strings

После резервного копирования моего текущего (только частично работающего) файла Main.strings (AppName / de.lproj / Main.strings) я перезаписал его вновь сгенерированным файлом tmp.strings

mv tmp.strings AppName/de.lproj/Main.strings

И затем вручную изменилзначения этого файла в резервные значения.

Теперь все снова переведено правильно.Я думаю, что проблема могла быть связана с проблемами кодирования, потому что эти строковые файлы имеют кодировку UTF16.

1 голос
/ 08 марта 2019

Поскольку идентификаторы элементов раскадровок изменяются, и их невозможно использовать в качестве «ключей» в вашей локализованной паре «ключ-значение», еще одним лучшим решением при локализации элементов раскадровок (UI) может быть предоставление пользовательского User Define Attribute, определенного какLocale Key, который будет использоваться для этого UIView.

Затем вы можете определить в своем Storyboard Attribute Inspector для конкретного пользовательского интерфейса. Просмотреть поле ввода, которое будет заполнено localized key, определенным в вашем * 1008.* файлы (один для английского, один для шведского, оба должны иметь одинаковые ключи, но с разными значениями - в английском один будет иметь перевод на английский в значениях, а в шведском - наоборот.

1) ДляНапример, если вы хотите локализовать UI View UILabel, чем вы можете иметь это, например, в быстром файле Localizable.swift (код делает возможным:

import UIKit

// MARK: Localizable
public protocol Localizable {
    var localized: String { get }
}

extension String: Localizable {
    public var localized: String {
        return NSLocalizedString(self, comment: "")
    }
}

// MARK: XIBLocalizable
public protocol XIBLocalizable {
    var localeKey: String? { get set }
}

extension UILabel: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            text = key?.localized
        }
    }
}

2) Вы можете uncheck your storyboard translations, чтобы вы моглив итоге получится 1 раскадровка без дублирования раскадровки на несколько переведенных версий.

3) Теперь вы можете создать Localizable.strings файл, содержащий ваши ключи и перевод.ons и localize этот файл, чтобы иметь ваши переводы (как вы делали с раскадровкой, но вместо того, чтобы локализовать раскадровку в несколько переведенных версий, вы локализуете файл Localizable.strings (так что вы увидите два файла после локализациичто на обоих языках один будет называться Localizable.strings (English), а другой Localizable.strings (Swedish).

Ваш Localizable.strings (English) может выглядеть так, например:

"main_page_title_label" = "Main Page Title in English";

Ваш Localizable.strings (Swedish) можетнапример, вот так:

"main_page_title_label" = "Huvudsida Titel på engelska";

4) Теперь перейдите к вашему LaunchScreen.storyboard, который у вас должен быть un-localized, чтобы у вас была только одна его версия, а не две, как на ваших примерах изображений (английский,Шведский).Найдите UILabel, который вы хотите локализовать, и под Attribute Inspector вы увидите новое поле ввода с именем Locale Key, которое вы можете указать в качестве значения main_page_title_label.И теперь вы только что локализовали UILabel в вашей раскадровке.enter image description here

5) Чтобы проверить его с помощью симулятора, вы должны изменить язык в Edit Scheme > Run > Options > Application Language, и после сохранения вы можете запустить приложение в симуляторе, и оно будетсимулируйте, что ваша система ОС симулятора будет настроена на шведский язык, поэтому метка, установленная с этим ключом, покажет шведское значение для этого ключа.enter image description here

Поддержка большего количества представлений пользовательского интерфейса (UIButton, UITextField, UISearchBar ..)

Если вы хотите иметь возможность локализовать больше пользовательского интерфейсаПросмотр, а не только пользовательский интерфейс Вид типа UILabel, чем вы можете добавить больше поддержки для файла Localizable.swift.

Если вы хотите иметь возможность локализовать также вид интерфейса пользователя типа Button, вы можете добавьте это к Localizable.swift:

extension UIButton: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            setTitle(key?.localized, for: .normal)
        }
    }
}

Для поддержки локализации в раскадровках для UITextField и UISearchBar текст заполнителя добавьте к вашему Localizable.swift:

// MARK: Special protocol to localizaze UI's placeholder
public protocol UIPlaceholderXIBLocalizable {
    var localePlaceholderKey: String? { get set }
}

extension UITextField: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}

extension UISearchBar: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}
...