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

2.3k views Asked by At

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?

2

There are 2 answers

4
Paulw11 On BEST ANSWER

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.

0
denis_lor On

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