#ios #swift #xcode #localization #storyboard
#iOS #swift #xcode #локализация #раскадровка
Вопрос:
Я создал приложение, и теперь пришло время перевести его на разные языки. Но некоторые ярлыки, которые, как мне кажется, я локализовал, не отображаются на разных языках с разными значениями.
Изображение первое: Итак, сначала я добавил шведский язык внутри
«Проект -> локализации»
Затем я зашел внутрь «LaunchScreen.storyboard» и отредактировал файл. Этот:
После этого я убедился, что мой экран запуска поддерживает такой язык:
И для последнего шага.. Я отредактировал язык приложения на шведский следующим образом:
Но когда я запускаю его на симуляторе, текст не переводится. Текст по-прежнему остается тем же, и я понятия не имею, как это решить. Так ли это? Не стесняйтесь помочь мне, я был бы действительно признателен!
Итак, я не уверен, нужно ли мне добавлять какой-то код или что-то еще, чтобы это заработало, но я следовал руководству, а они этого не делают. Это одна из причин, почему я так запутался. И заранее спасибо!
ПРЕЖДЕ ЧЕМ НЕ ПОНРАВИТЬСЯ: по крайней мере, объясните мне причину этого, чтобы я мог улучшить его в будущем!
Комментарии:
1. Это ваша работа — сделать перевод для выбранного вами языка. Приложение не будет автоматически выполнять работу по переводу за вас.
2. @ElTomato Nono, конечно. Но, как вы видите, я добавил «123123123123» просто для того, чтобы попробовать, но когда я вхожу в приложение с правильным языком, оно не меняется. Она остается обычной строкой.
3. О, я понимаю. Извините за это. Однако не делайте раскадровку локализуемой. Используйте локализуемый строковый файл.
4. @ElTomato Как я могу это сделать?
5. Создайте файл под названием Localizable. Затем измените тип файла на strings. Поместите в нее все строки перевода.
Ответ №1:
Поскольку идентификаторы элементов раскадровки меняются, и ими невозможно управлять для использования в качестве «ключей» в вашей локализованной паре «ключ-значение», одним из лучших решений при локализации элементов раскадровки (UI) может быть предоставление пользовательского, User Define Attribute
определенного как Locale Key
, который будет использоваться для этого UIView
.
Затем вы можете определить в своем Storyboard Attribute Inspector
для конкретного пользовательского интерфейса поле ввода, которое будет заполнено localized key
определенными в ваших Localizable.strings
файлах (одно для английского, другое для шведского, оба должны иметь одинаковые ключи, но с разными значениями — в английском значении значения будут иметь английский перевод, а в шведском — наоборот.
1) Например, поскольку вы хотите локализовать представление пользовательского интерфейса, UILabel
вы можете разместить это, например, в файле swift 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
файл, содержащий ваши ключи и переводы, и 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
}
}
}
Комментарии:
1. Я попробую это чуть позже сегодня, большое спасибо за ваши усилия. Только один вопрос: нужно ли мне просматривать все ярлыки. (Поскольку есть looooooot) и добавить что-то вроде: label1.text = NSLocalizedString(«», «»») и т.д.? или я могу каким-то образом выполнить все это, используя одну страницу? Или я должен вручную добавлять NS-строку ко всем ярлыкам и кнопкам? Спасибо!
2. Ответ, который я дал, должен использоваться для локализации жестко закодированных строк, предназначенных для использования в раскадровках (UI), и вам нужно вручную добавить ключ локали через инспектор атрибутов> Поле ввода ключа локали для каждого жестко закодированного текста в вашем представлении пользовательского интерфейса. Для жестко закодированных строк / текста, которые вы задаете программно через swift с помощью
myview.text = ..
, вы можете использовать, как вы сказали, NSLocalizedString(«your_key», «») для каждой жестко закодированной строки, которую вы хотите локализовать на нескольких языках, а также добавлять каждый отдельный ключ во все ваши версии Localizable.strings с их соответствующим переведенным значением3. Какой потрясающий ответ! Подробный и действительно полезный. Спасибо!
Ответ №2:
Мне нравится решение denis_lor, но я подумал, что сначала хочу начать работать с тем, что уже должно работать (перевод раскадровки с помощью простого файла strings), без необходимости повторно реализовывать эту функциональность аналогичным образом.
Моя проблема была похожа на то, что описано в вопросе. Переводы уже работали до определенного момента, но были добавлены вручную, а некоторые измененные переводы вообще не были переведены.
Решением, которое я нашел, было воссоздание файла strings с помощью 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
И затем я вручную изменил значения этого файла на резервные значения.
Теперь все снова переводится правильно. Я думаю, что проблема могла быть как-то связана с проблемами кодирования, потому что файлы strings имеют кодировку UTF16.
Ответ №3:
Согласно документам Apple, LaunchScreen.storyboard
является статическим и не должен содержать текстов, потому что эти тексты не будут локализованы.
Избегайте включения текста на экране запуска. Поскольку экраны запуска статичны, любой отображаемый текст не будет локализован.
источник: https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/launch-screen /