InfoPlist.strings, click Localize, add each language, and put the translated values under the same keys as in Info.plist, for example NSLocationWhenInUseUsageDescription.Why this happens
An Info.plist file is static data. It is read by the system before your code runs, so you cannot put NSLocalizedString(...) inside it. Whatever text you type there is shown as-is, in one language.
This matters most for permission prompts. Keys such as NSLocationWhenInUseUsageDescription, NSCameraUsageDescription or NSPhotoLibraryUsageDescription are shown by the system in an alert, and users expect them in their own language. The same applies to CFBundleDisplayName, the name shown under your app icon.
Apple’s mechanism for this is a special file named InfoPlist.strings. The system looks for it in each localization folder (en.lproj, de.lproj, and so on) and uses its values in place of the ones in Info.plist. Your own Localizable.strings file is not used for this, which is why reusing existing translations does not work automatically.
How to fix it
1. Create and localize InfoPlist.strings
- In Xcode choose File > New > File…
- Under the Resource section pick Strings File and click Next.
- Name it exactly
InfoPlist. The capitalization matters: capital I, capital P, and a lowercase l in “Plist”. Any other spelling is silently ignored. - Pick your app target and create the file. It is fine to put it in a Resources group.
- Select
InfoPlist.stringsin the Project Navigator. In the File Inspector (right panel) click Localize…, and choose a base language. - After localizing, the File Inspector shows a checkbox list of languages. Tick every language you want to support.
If a language you need is not listed, first add it: select the project in the Project Navigator, open the project (not the target) settings, and under Info > Localizations click +.
In the Project Navigator the file now expands into one entry per language.
2. Add the keys and translations
Open each language variant and add the Info.plist key with the translated text. Keys and values are quoted, and every line ends with a semicolon.
English:
"NSLocationWhenInUseUsageDescription" = "We use your location to show nearby stores.";
"CFBundleDisplayName" = "Store Finder";
German:
"NSLocationWhenInUseUsageDescription" = "Wir verwenden deinen Standort, um Geschäfte in der Nähe anzuzeigen.";
"CFBundleDisplayName" = "Geschäftsfinder";
To find the exact key names, open Info.plist as source code (right-click > Open As > Source Code). The raw key names, not the friendly names shown in the property list editor, are what you need on the left side of each line.
Other keys you may want to localize the same way:
"NSCameraUsageDescription" = "...";
"NSMicrophoneUsageDescription" = "...";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "...";
Keep a default value in Info.plist itself. It is used as a fallback if no translation matches the user’s language.
3. Test it correctly
Changing the language in the Xcode scheme (Options > App Language) is not always enough for system-owned text. For permission prompts and the home screen name, the most reliable test is:
- Change the language on the simulator or device itself: Settings > General > Language & Region.
- Delete the app so the permission prompt appears again. iOS remembers earlier answers.
- Reinstall and run.
If you test a permission dialog, remember that a previous allow/deny decision suppresses the prompt. Reset it by deleting the app, or on a simulator via Device > Erase All Content and Settings.
4. Alternative: String Catalogs (newer Xcode)
Recent Xcode versions can use a String Catalog named InfoPlist.xcstrings instead of the classic .strings file. The file name rule is the same: it must be called InfoPlist. Add the plist keys as entries and translate them in the catalog editor. If your project already uses catalogs, this keeps everything in one tool. If you are unsure which your Xcode supports, the classic .strings method above works everywhere.
5. Alternative: one Info.plist per language
The question mentions keeping multiple Info.plist files. That is not the supported route and is harder to maintain, because every key has to be duplicated. Prefer InfoPlist.strings.
How to prevent it
- Name the file exactly
InfoPlist.strings(orInfoPlist.xcstrings) from the start. - Keep a default value for every key in
Info.plistas a fallback. - Add new permission keys to every language file when you add the feature, not at release time.
- Always end each line with a semicolon. One missing semicolon can break the whole file.
- Test each language on a clean install, with the device language changed.
FAQ
Can I use NSLocalizedString inside Info.plist?
No. Info.plist is read as static data, so no code runs in it. Use InfoPlist.strings for the translated values instead.
Why is my translated permission text not showing?
Check the file name spelling and capitalization, make sure the file is localized and ticked for the language, and confirm the key matches the one in Info.plist exactly. Then delete the app and change the device language rather than only the scheme language.
Can I localize the app name on the home screen?
Yes. Add "CFBundleDisplayName" = "Your Name"; to each language’s InfoPlist.strings. Also make sure the key exists in Info.plist.
Parts of this guide are adapted from content licensed under CC BY-SA 3.0; this article is shared under the same license.
