Learn all you need about iOS localization with string catalogs and Xcode 26 — from internationalizing your files to testing your localized app.
Making your iOS app multilingual helps you expand to more audiences around the world, increase sales, and grow your user base.
In this guide, you’ll find everything you need to localize your iOS app. We’ll use string catalogs, as it’s Apple’s recommended method for localization.
With our AI localization tool, Private Translation Cloud (PTC), you can translate all Apple formats (.strings, .stringsdict, .xcstrings) and apps (macOS, watchOS, tvOS, and visionOS).
Prerequisites
- Xcode 15 or later
What is iOS localization?
iOS localization is making your iOS app available to multilingual audiences and adapting it to cultural and topical nuances.
Localization in Xcode is specifically about setting up resources for each language you support.
The iOS app localization process involves three main steps:
- Preparing, or Internationalizing (often abbreviated i18n), your iOS app
- Translating user-facing texts
- Importing translations and testing
iOS internationalization is an essential part of localization, because it allows your iOS app to support multilingual content.
Internationalizing Your iOS App
iOS internationalization is adapting your code to ensure strings are translated and formatted correctly. This helps you avoid redesigning layouts or rewriting code later.
Thankfully, with string catalogs, the process is much easier than it used to be.
Step 1: Making Text Localizable
In legacy workflows, you needed to wrap your app’s strings in a way that Xcode and translation tools understood.
But with SwiftUI, you don’t need to do anything: any hard-coded string you place in a SwiftUI Text, Label, Button, etc., is automatically localizable.
You only need to manually make text localizable when:
- You have text outside of SwiftUI, like error messages, ViewModel Text, Login validation strings. In these cases, use String(localized:).
- You’re targeting devices with older versions that don’t support current localization APIs, like iOS 16 or earlier. In this case, wrap all user-facing text in NSLocalizedString().
Step 2: Adding comments for context
Comments are useful when translating strings with both manual and automatic methods. Use comment: within your Text ().
Text("Select an item", comment: “The label of a drop down menu to allow users to navigate.”)
Step 3: Creating a String Catalog
Now, let’s add a string catalog to your iOS project.
1. Right-click on your project and select New File from Template.

2. Search for String Catalog and add it. The default name will be Localizable.xcstrings. No need to change it.
3. Populate your string catalog with your text. Go to Product → Build. Xcode takes care of the rest. You can review the text later by clicking on your .xcstrings file and then go to Editor → Assistant from the menu.
Step 4: Add variants by plural or by device
Some strings need different versions depending on context, such as plural forms in different languages or text that changes by device. These variations help ensure your text feels natural and appropriate across languages, devices, and contexts.
You can manage both in the String Catalog.
Pluralization
For plurals, start by localizing a string that depends on a numeric value, such as:
Text("\(count) items")
Go to the string catalog and right-click in the key view. Choose Vary by Plural. Xcode automatically adds all required plural categories for that language. Fill in the text for each plural form, and the system will pick the right one at runtime.
Here’s an example .xcstrings file with plural variations:
Example
{
"version": "1.0",
"sourceLanguage": "en",
"strings": {
"items_count": {
"comment": "Number of items - English only supports 'one' and 'other'",
"extractionState": "manual",
"localizations": {
"en": {
"variations": {
"plural": {
"one": {
"stringUnit": {
"state": "translated",
"value": "%lld item"
}
},
"other": {
"stringUnit": {
"state": "translated",
"value": "%lld items"
}
}
}
}
}
}
},
"messages_count": {
"comment": "Number of messages",
"extractionState": "manual",
"localizations": {
"en": {
"variations": {
"plural": {
"one": {
"stringUnit": {
"state": "translated",
"value": "You have %lld new message"
}
},
"other": {
"stringUnit": {
"state": "translated",
"value": "You have %lld new messages"
}
}
}
}
}
}
}
}
}
Device variations
For device-specific text — like “Tap” on iOS versus “Click” on macOS — Control-click the same key and choose Vary by Device.
Add the devices you want to customize and enter the appropriate message for each. When the app runs, it displays the version that matches the current device.
Step 5: Add Languages
Here’s an easy way to add (and remove) languages:
- Select your project file and then see the Info tab on the right-hand panel.
- Under the Localizations section, click on the plus (+) sign at the bottom left.
- Add languages you want to display your iOS app in.
All language files and translations will be added to the same .xcstrings file.
(Optional) Step 6: Export your xcstrings File
Though an API or Git integration with a software localization tool is the fastest way to get translations, you may want to send files manually. In this case, just grab the .xcstrings file from your iOS folder.
When you re-upload it after PTC is done translating, PTC will replace the original.
Translating Your iOS App Files
With PTC’s AI, you can translate every file type you may use in an iOS app: .strings, .stringsdict, .xcstrings. PTC is optimized for iOS Developers, especially when you want continuous localization with minimal manual work.
Once you sign up for a free trial or log into your PTC account, create a new project. The setup wizard will guide you through the basics:
- Choose how you want to use PTC (upload files, connect Git, or use the API)
- Tell PTC about your project
- Select your target languages
You can choose both manual file upload or connect your repository via API and Git integration.
Manual File Upload: Uploading your .xcstrings Files
If you’ve chosen manual file upload, upload your .xcstrings file at the Resource Files step.
Once the file is uploaded, choose the languages you want to translate it into and let PTC translate.
PTC is done translating in minutes. Download a zip with the translations or check them in PTC. PTC’s Translations view makes translated text easier to read and edit compared to the view in Xcode.
Notice that PTC preserves pluralization and other placeholders.
Automatic Integration: Using API or Connecting your Git Repo
Integrating PTC with your repository is easy and the most efficient way to keep your iOS app localized with every release.
At project setup, simply choose API or Git Integration options. The setup process will guide you through essential steps. All you’ll need is the right access token. Check more about:
The workflow for these integrations is:
- Connect your repo
- PTC translates the branches you indicate
- PTC sends a merge request to your repo with translations — just accept it and you’re all set!
- PTC keeps monitoring the branches and sends you new merge requests as you change your code.
Testing and Launching Your Localized iOS App
First, go to Xcode and back up your existing .xcstrings file. This is a really important practice as the new file with translations will replace the existing one.
Once you have translations, you need to add them to your iOS app. If you’re using an automatic integration method with PTC, just accept the merge request the platform sends.
If you downloaded files manually, open in finder, right-click on the project and overwrite the file with the new one. Then, restart Xcode so translations can appear.
Testing your iOS app
Now that translations are in place, it’s time to test them.
In Xcode, you can easily test different languages by changing the App Language and App Region setting in your Scheme. This is especially useful for right-to-left languages (e.g. Arabic).
- Go to Product → Scheme → Edit Scheme and switch to the Options tab
- Change App Language and App Region
- Run the app and check that layouts and UI elements mirror correctly
You should see the same layout and design of your app, just with the text translated into the selected language.
To test with a simulator, go to Product → Destination to choose a device simulator and then run it:
- Go to Settings → General → Language & Region
- Select one of your translated languages (e.g., Arabic, Spanish, French)
- Relaunch your app and confirm the UI strings appear in the selected language
iOS Localization Best Practices
Use String Catalogs
.strings is still a popular choice for building iOS apps. But when you want a properly localized iOS app, it’s better to opt for string catalogs.
With .strings, there are extra steps you need to take to internationalize your iOS app such as creating a base Localizable.strings file and then adding every language’s file in its own lproj folder.
But with string catalogs, the process is far easier.
Check your UI for varied text length
Different languages require different text length. For example, words in German are typically longer than their English counterparts, so German text has the potential to break your UI.
Make sure to:
- Use Auto Layout or SwiftUI’s flexible layout system
- Allow labels to grow and wrap naturally
- Avoid fixed-width constraints
Don’t skip pluralization variants
Languages don’t express quantities or context the same way. English might only need singular and plural, but many languages need three, four, or even six plural categories. For example:
- Russian distinguishes zero, one, few, many, and other
- Arabic has six plural forms
- Japanese doesn’t have numerical plurals
Ensuring correct pluralization practices gets you the best possible translations to engage audiences in their language.

Ready to Localize Your iOS App?
Localizing your iOS app with PTC takes minutes, not weeks. Add new languages, deliver a consistent user experience, and grow your audience across markets.


Localize iOS Apps with AI
Get context-aware translations in minutes
Upload files, or automate via API or Git integration
1
Start a free trial
Translate 2500 words for free.
2
Add quick project details
Give context about your app and users.
3
Get translations
Download a ZIP, or merge in your repo.