NSLocalizedString shows raw key instead of loading a string from another language

爱⌒轻易说出口 提交于 2019-12-01 05:18:43

问题


I'm having trouble using NSLocalizedString(key, comment: "") to load strings from Localizable.strings when the key is missing for the current language. NSLocalizedString returns a raw key

For instance, when string is present for English localization, but is missing for Russian:

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

Calling NSLocalizedString when iOS language set to Russian returns "config.updating"

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

Shouldn't NSLocalizedString access the "AppleLanguages" key in NSUserDefaults to determine what the user's settings are and pick some other string?


回答1:


No, the documentation for NSLocalizedString(key,comment) is pretty clear -

The initial value for key in the strings file will be key. Use the NSLocalizedStringWithDefaultValue macro to specify another value for key.

What else would you expect it to return? The code simply looks up the key in a dictionary. It has no idea what message is associated with the key, let alone how to translate that message into Russian.




回答2:


You can probably create a Build Phase run script where you compare the keys of your translation between your base (say its English) with Russian and then if there is any difference you can either stop the build (exit 1 after echo "error:...") and show a build error with the missing keys as output or you can just show them as error and not stop the build.

1) In your Build Phase Run Script:

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) I have created in my project root folder a folder path like this tools/localization/ where I have put a bash script 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) Don't forget to make your script executable:

chmod a+x check_missing_keys_in_translations.sh



来源:https://stackoverflow.com/questions/27144984/nslocalizedstring-shows-raw-key-instead-of-loading-a-string-from-another-languag

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!