https://i.stack.imgur.com/6gzmx.png
How can I use translation string inside the plist file ?
-- Update --
I already have a Localizable string. I'm just wondering that can I use something like NSLocalizedString(MYSTRING,nil) inside the plist string. I know that I can create multiple file of info.plist for localisation but I was wondering there might be an easier way.
You should use InfoPlist.strings
file (keep both I
& P
capital) to localize values of Info.plist
. To do this, go to File->New->File
, choose Strings File
under Resource
tab of iOS
, name it InfoPlist
, and create. Open and insert the Info.plist
values you want to localize like:
NSLocationWhenInUseUsageDescription = "Description of this";
Now you can localize InfoPlist.strings
file with translations.
Select the localization options, or enable localization if needed,
https://i.stack.imgur.com/B4hNo.png
You should be able to see the file also on the left side editor.
https://i.stack.imgur.com/mG8eT.png
NOTE: When testing the localizations on the simulator. You have to change the language on the simulator itself not just the language in the Xcode target. (Credits to John Webb)
Here is the official documentation for Info.plist
keys localization.
Credits to Marco, thanks for including the pics in this answer!
All the above did not work for me (XCode 7.3) so I read Apple reference on how to do, and it is much simpler than described above. According to Apple:
Localized values are not stored in the Info.plist file itself. Instead, you store the values for a particular localization in a strings file with the name InfoPlist.strings. You place this file in the same language-specific project directory that you use to store other resources for the same localization.
Accordingly, I created a string file named InfoPlist.strings and placed it in the xx.lproj folder of the "xx" language (and added it to the project using File->Add Files to ...). That's it. No need for the key "Localized resources can be mixed" = YES, and no need for InfoPlist.strings in base.lproj or en.lproj.
The application uses the Info.plist key-value as the default value if it can not find a key in the language specific file. Thus, I put my English value in the Info.plist file and the translated one in the language specific file, tested and everything works.
In particular, there is no need to localize the InfoPlist.strings (which creates a version of the file in the base.lproj, en.lroj, and xx.lproj), and in my case going that way did not work.
Step by step localize Info.plist:
Find in the Xcode the folder Resources (is placed in root) Select the folder Resources Then press the main menu File->New->File... Select in section "Resource" Strings File and press Next Then in Save As field write InfoPlist ONLY ("I" (eye) capital and "P" capital - the l (ell) after the P should not be capital) Then press Create Then select the file InfoPlist.strings that created in Resources folder and press in the right menu the button "Localize" Then you Select the Project from the Project Navigator and select the The project from project list In the info tab at the bottom you can as many as language you want (There is in section Localizations) The language you can see in Resources Folder To localize the values ("key") from info.plist file you can open with a text editor and get all the keys you want to localize You write any key as the example in any InfoPlist.strings like the above example
"NSLocationAlwaysAndWhenInUseUsageDescription"="blabla";
"NSLocationAlwaysUsageDescription"="blabla2";
That's all work and you have localize your info.plist file!
Tips
Remember that the iOS Simulator exploits by default your system language. Please change the language (and region) in the iOS Simulator Setting too in order to test your translations. The localisation string (see Apple docs here) should be NSLocationWhenInUseUsageDescription = "Description of this"; and not (with quote "...") "NSLocationWhenInUseUsageDescription" = "Description of this";
"NSLocationWhenInUseUsageDescription"="description"
is valid). It can be with or without.
If something is not working make sure you added:
"Localized resources can be mixed" = YES
into the info.plist. In my case the InfoPlist.strings files were just ignored.
I would highly recommend reading Apple's guides, and viewing the WWDC resources listed here: Internationalization and Localization Topics
https://i.stack.imgur.com/tKc4E.png
Once you've added, it will create the necessary string files in the appropriate lproj directories for the given language.
--EDIT--
Just to be clear, iOS will swap out the string for your Plist file based upon the user's currently selected language using the plist entry's key as the key in the localized strings file.
For anyone experiencing the problem of the info.plist not being included when trying to add localizations, like in Xcode 9.
You need make the info.plist localiazble by going into it and clicking on the localize button in the file inspector, as shown below.
The info.plist will then be included in the file resources for when you go to add new Localizations.
https://i.stack.imgur.com/e17bt.png
In addition to the accepted answer (the project is on Flutter but it's basically the same as native):
I do have folders Base.lproj
, en.lproj
, xx.kproj.
etc. with InfoPlist.strings
in each. This file has lines like this (no quotes around the key and with a semicolon at the end):
NSLocationWhenInUseUsageDescription = "My explanation why I need this";
https://i.stack.imgur.com/kSDuZ.png
Also, check the project.pbxproj
file, it is in XXX.xcodeproj/project.pbxproj: it should have all your languages in codes (en, fr, etc.)
https://i.stack.imgur.com/JatRz.png
But even then it didn't work. Finally, I noticed the CFBundleLocalizations
key in the Info.plist
file. (to open it as raw key-values in XCode - right mouse button on the Info.plist
file -> Open As -> Source Code) Make sure that the values in array are codes rather than complete words, for example fr
instead of French
etc.
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ru</string>
<string>lv</string>
</array>
And double-check that your device is set to the language you're testing. Cheers
P.S. "Development Language" doesn't affect your issue, don't bother changing it.
As RGML say, you can create an InfoPlist.strings, localize it then add your key and the value like this: "NSLocationWhenInUseUsageDescription" = "Help To locate me!";
It will add the key to your info.plist for the specified language.
For newer XCode 12 / 13 /...
1. Create a new InfoPlist.string file in your project.
https://i.stack.imgur.com/egzN8.png
https://i.stack.imgur.com/fQbDO.png
https://i.stack.imgur.com/88PcT.png
2. Select your file, and you should see the right sidebar option "Localize"
https://i.stack.imgur.com/Ohyby.png
https://i.stack.imgur.com/wbg7G.png
3. If you want add more languages in your project's Info >> Localizations
It will create automatically a copy of your "InfoPlist.string" for the new languages you add.
https://i.stack.imgur.com/abXYm.png
When using InfoPlist.strings
file (in XCode it should be placed next to Info.plist
file - real file location can be anywhere within the project probably
https://i.stack.imgur.com/MfCAu.png
) be careful to use the key's short name for the translation.
I was trying to use Privacy - Camera Usage Description
, but the working key is NSCameraUsageDescription
In my case everything was set up correctly but still the InfoPlist.strings file was not found.
The only thing that really worked was, to remove and add the InfoPlist.strings files again to the project.
In my case the localization not worked cause of '-' symbol in the name. Example: "aero-Info.plist" And localized files: "aero-InfoPlist.strings" and "aeroInfoPlist.strings" did not work.
Success story sharing