В моем приложении есть 3 массива: один для базового языка (английский), а два других - для локализации. Могу ли я выбрать конкретный массив на основе языка, установленного на пользовательском устройстве? Например, если устройство настроено на использование немецкого языка, я хочу использовать фразы, переведенные на немецкий язык.
Это переменные, которые я создаю
var enQuotes:[String] = []
var itQuotes:[String] = []
var deQuotes:[String] = []
и это метод получения цитат из файла
enQuotes = quotes_en.getEnQuotes()
itQuotes = quotes_it.getItQuotes()
deQuotes = quotes_de.getDeQuotes()
и это код, который я использую для установки случайных фраз
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let firstTouch = touches.first {
let hitView = self.view.hitTest(firstTouch.location(in: self.view), with: event)
if hitView === backgroundView {
let randomArray = Int(arc4random_uniform(UInt32(enQuotes.count)))
phraseLbl.text = (enQuotes[randomArray])
print("touch is inside")
} else {
print("touch is outside")
}
}
}
Сохраните цитаты как локализованный ресурс списка свойств «Quotes.plist» в приложении. Например, английская версия будет выглядеть так:
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version = "1.0">
<array>
<string>First Quote</string>
<string>Second Quote</string>
<string>Third Quote</string>
</array>
</plist>
Добавьте локализации для всех поддерживаемых языков.
Во время выполнения найдите список свойств с помощью метода Bundle.url(forResource:withExtension:)
, он автоматически выберет
нужная версия в соответствии с языковыми настройками пользователя.
Затем прочтите данные и десериализуйте их в массив строк:
let url = Bundle.main.url(forResource: "Quotes", withExtension: "plist")!
let data = try! Data(contentsOf: url)
let quotes = try! PropertyListDecoder().decode([String].self, from: data)
(Принудительное разворачивание и принудительные попытки здесь допустимы, потому что любые сбой будет указывать на ошибка программирования, который необходимо исправить.)
А как насчет использования
LocalizedString()
. Вы устанавливаете пары "ключ-значение" для каждой кавычки, а затем создаете один единственный массив?