Ярлык в раскадровке не принимает правильного значения локализации

#ios #swift #xcode #localization #storyboard

#iOS #swift #xcode #локализация #раскадровка

Вопрос:

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

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

«Проект -> локализации»

img1

Затем я зашел внутрь «LaunchScreen.storyboard» и отредактировал файл. Этот: img2

Отредактировано до этого: второй

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

И для последнего шага.. Я отредактировал язык приложения на шведский следующим образом: введите описание изображения здесь


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

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

ПРЕЖДЕ ЧЕМ НЕ ПОНРАВИТЬСЯ: по крайней мере, объясните мне причину этого, чтобы я мог улучшить его в будущем!

Комментарии:

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 /