Как я могу использовать другой массив в зависимости от языка устройства?

В моем приложении у меня есть 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")
        }
    }
}

person Giovanni Filippini    schedule 12.09.2018    source источник
comment
Как насчет использования LocalizedString(). Вы устанавливаете ключ/значение для каждой кавычки, а затем создаете один массив?   -  person Larme    schedule 12.09.2018


Ответы (1)


Сохраните цитаты как ресурс списка локализованных свойств «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)

(Принудительная распаковка и принудительные попытки здесь допустимы, потому что любой сбой будет указывать на ошибку программирования, которую необходимо исправить.)

person Martin R    schedule 12.09.2018