ChatGPT解决这个技术问题 Extra ChatGPT

How to localise a string inside the iOS info.plist file?

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.

Did you ever work this out, I'm struggling to get NSLocationWhenInUseUsageDescription localised too?

A
Ahmed Shendy

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!


After creating the strings file, do you need to include the key in the Info.plist file as well, or is it safe to delete from there?
Tip: Use exactly the name "InfoPlist.strings" and nothing else. For example my original infoplist file was named something else but I needed to use this name exactly in order to get it to work.
When testing the localizations on the simulator. I had to change the language on the simulator itself not just the language in the xcode target. Just a warning for anyone else.
the correct usage is keyname = "your text"; e.g: NSLocationWhenInUseUsageDescription = "your text"
Caution: the key in this file should not have quotation mark, which is different with the normal localization. e.g: NSMicrophoneUsageDescription = "your description";
h
hyde

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.


Why did't include the link to appropriate document?
Here the link to Apple doc's relevant page in case anyone is interested: developer.apple.com/library/archive/documentation/General/…
and how we decide that xx? for example for english it can be en, En, Eng, English etc? Sorry if its a stupid question because I am a beginner
Your answer worked for me except the fallback language scenario, app is getting fallback language always the previously used language and not english, my english value is present in Info.plist file though, also I have tried base.lproj as well
A
Andy Weinstein

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!


It is great advice: "Then in Save As field write InfoPlist ONLY ("I" capital and "P" capital)"
If you get lost in some step, I recommend this short YouTube video tutorial: youtube.com/watch?v=e-T_8jZTrv0
G
Giuseppe Beccari

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";


Valuable additions, but I think this should be a comment under the respective answer, not a new answer. Also note that "363" is not a post identifier but the number of votes the answer has (the number has since changed).
I have not 50 reputation to add a comment there.
It doesn't matter whether you use quotes "..." around the key e.g: ("NSLocationWhenInUseUsageDescription"="description" is valid). It can be with or without.
Xcode 12.0.1 - keys with quotes work as well.
Keys with quotes have always worked fine. In fact, some keys MUST have quotes around them.
A
Alex Zavatone

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.


M
Matt S.

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.


Translating the entire plist for just one key is an overkill. Find more info here: bit.ly/1yBUTru
It simply does not true for XCode 9. It nevers asks for plist localization when adding a new language.
I will need to look into that for Xcode 9 - have not had a chance to test in the new Xcode yet.
E
Edward

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


Did you encounter any problems? I can't build project when I add two languages to Localization since xcode is saying "The file info.plist couldn't be opened because there is no such file.
@mkkrolik I'm having the same issue now. Have you found a solution?
@Todanley skip this solution it doesn't work for me. Use InfoPlist.strings instead.
@mkkrolik Thank you that works. And also when testing with simulator, I had to change the language setting of simulator rather than that of my target for it to work.
K
Kirill Karmazin

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.


"no quotes around the key and with a semicolon at the end" - Xcode 12.0.1 - Actually, it works fine even if keys have quotes.
C
Cap

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.


o
ofundefined

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


H
Hourglasser

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


d
d.ennis

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.


M
Mike Glukhov

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.