NSLocalizedString показывает необработанный ключ вместо загрузки строки с другого языка

У меня проблемы с использованием NSLocalizedString(key, comment: "") для загрузки строк из Localizable.strings, когда отсутствует ключ для текущего языка. NSLocalizedString возвращает необработанный ключ

Например, если строка присутствует для английской локализации, но отсутствует для русской:

"config.updating" = "Update in progress...";

Вызов NSLocalizedString, когда язык iOS установлен на русский, возвращает "config.updating"

NSLocalizedString("config.updating", comment: "") // "config.updating"

Разве NSLocalizedString не должен обращаться к ключу «AppleLanguages» в NSUserDefaults, чтобы определить настройки пользователя и выбрать другую строку?


person Laevand    schedule 26.11.2014    source источник


Ответы (2)


Нет, документация для NSLocalizedString(key,comment) довольно ясна -

Начальным значением для key в файле строк будет key. Используйте макрос NSLocalizedStringWithDefaultValue, чтобы указать другое значение для ключа.

Что еще вы ожидаете от него? Код просто ищет ключ в словаре. Он не знает, какое сообщение связано с ключом, не говоря уже о том, как перевести это сообщение на русский язык.

person Paulw11    schedule 26.11.2014
comment
Так в чем же польза от базового файла локализации? - person ViruMax; 11.09.2018
comment
Базовый файл локализации используется, когда нет доступной конкретной локализованной версии файла. Например. если ваше приложение имеет базовую английскую локализацию и вы добавляете французскую локализацию, языки, отличные от французского, получат английские значения - person Paulw11; 11.09.2018
comment
Хорошо, тогда как справиться с ситуацией, когда у меня есть файлы Localizable для Base (английский), английский, японский, но в японский файл я не добавил никаких строк значения ключа. Когда я устанавливаю язык устройства на японский, он показывает только ключ, но должен показывать строки из базового (английского) файла? - person ViruMax; 11.09.2018
comment
Нет, потому что у вас японская локализация. Базовый файл используется только там, где нет локализации для этого языка, а не когда отсутствует ключ в локализованном файле. Если есть локализация, но ключ отсутствует, отображается значение ключа. - person Paulw11; 11.09.2018

Вероятно, вы можете создать Build Phase run script, в котором вы сравниваете ключи вашего перевода между вашей базой (скажем, English) с Russian, а затем, если есть какая-либо разница, вы можете либо остановить сборку (exit 1 после echo "error:...") и показать ошибку сборки с отсутствующим ключи в качестве вывода, или вы можете просто показать их как ошибку и не останавливать сборку.

1) В сценарии выполнения этапа сборки:

MISSING_KEYS_TRANSLATIONS=$(diff <($SRCROOT/tools/localization/check_missing_keys_in_translations.sh en) <($SRCROOT/tools/localization/check_missing_keys_in_translations.sh ru))
if [ "$MISSING_KEYS_TRANSLATIONS" ]; then
echo "error: $MISSING_KEYS_TRANSLATIONS"
fi

2) Я создал в своем project root folder путь к папке, подобный этому tools/localization/, где я поместил сценарий bash check_missing_keys_in_translations.sh:

#!/bin/sh
plutil -convert json 'ProjectRootFolder/Resources/Localization/'"$1"'.lproj/Localizable.strings' -o - | ruby -r json -e 'puts JSON.parse(STDIN.read).keys.sort'

3) Не забудьте сделать свой скрипт исполняемым:

chmod a+x check_missing_keys_in_translations.sh

person denis_lor    schedule 27.02.2019