Поскольку идентификаторы элементов раскадровок изменяются, и их невозможно использовать в качестве «ключей» в вашей локализованной паре «ключ-значение», еще одним лучшим решением при локализации элементов раскадровок (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 в вашей раскадровке.
5) Чтобы проверить его с помощью симулятора, вы должны изменить язык в Edit Scheme > Run > Options > Application Language
, и после сохранения вы можете запустить приложение в симуляторе, и оно будетсимулируйте, что ваша система ОС симулятора будет настроена на шведский язык, поэтому метка, установленная с этим ключом, покажет шведское значение для этого ключа.
Поддержка большего количества представлений пользовательского интерфейса (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
}
}
}