Learn software localization best practices for structuring code, preparing content, and designing interfaces for different text lengths.
The work you do before software localization determines the quality of your final product. Hard-coded strings, concatenated dynamic text, and fixed-width UI elements often lead to broken translations or UI bugs later on.
This guide walks you through the entire software localization process, from planning to production. Each section includes clear examples and highlights what makes the biggest difference to translation quality.
On this page
- Plan Your Localization Strategy
- Use Separate Files for Localizable Content
- Handle Placeholders and Dynamic Content
- Design the UI for Text Expansion and Different Languages
- Write Content that Translates Well
- Configure Your Application to Load Translations
- Translate Your Resource Files
- Test Localized Versions Before Launch
1. Plan Your Localization Strategy
Start by deciding which markets to target and how translations will fit into your development process.
Decide Which Markets to Target First
You don’t need to localize into 20 languages at once. Start with 2-3 markets where you have actual demand.
- Check analytics for traffic outside of English-speaking countries
- Review support tickets and feature requests for language patterns
- Align language support with your business expansion plans
Choose Your Localization Workflow
You can localize your software in different ways, and the method you choose depends on your project:
| Waterfall model | Agile methodology | Continuous localization |
| → Localization takes place at a specific time, usually at the very end of the development cycle. → Slower rollout in multiple languages. → Post-development translation increases the chance of UX and localization bugs. | → String changes are sent for translation at the end of the sprint. → Releases go live as soon as translations are complete. → Efficient, but can block the completion of the sprint and product release. | →Translations happen in parallel with development. → Strings are sent for translation automatically the moment you commit them to version control. → Requires automation (CI/CD integration) and a translation system that handles real-time updates. |
2. Use Separate Files for Localizable Content
Translation tools can’t detect hard-coded strings in your source code. Move all user-facing text into resource files. This includes:
- UI labels, buttons, and menu items
- Error messages and validation text
- Email templates and notifications
- Help text, tooltips, and placeholder text
- Success/confirmation messages
Then, use your framework’s internationalization functions to mark translatable text instead of hard-coding strings.
React example:
// Wrong - hard-coded
<button>Submit</button>
// Right - using react-intl
<button>{t('submit_button')}</button>
WordPress example:
// Wrong - hard-coded
echo 'Submit';
// Right - using WordPress i18n
echo __( 'Submit', 'your-textdomain' );
Rails example:
# Wrong - hard-coded
flash[:notice] = "Profile updated successfully"
# Right - using Rails I18n
flash[:notice] = t('profile.update_success')
Make sure to choose the file format that fits your project based on the programming language or framework you’re using. Popular file formats include:
- .
json– JavaScript frameworks (React, Vue, Angular) .po/.pot– WordPress, PHP, Python (gettext).yaml/.yml– Ruby on Rails.xml– Android (strings.xml).xcstrings– iOS/macOS
3. Handle Placeholders and Dynamic Content
When text includes dynamic values like usernames, counts, or dates, use placeholders instead of string concatenation. Different languages have different word orders. Concatenation breaks this by splitting sentences into fragments that can’t be reordered.

Correct Examples
PO File:
msgid "Hello, %s!"
msgstr ""JSON File:
{
"greeting": "Hello, {name}!"
}YAML File:
greeting: "Hello, %{name}!"
Incorrect Example (String Concatenation)
const name = 'John';
const message = 'Hello, ' + name + '!';Make sure to use placeholder syntax that works with your framework. Here are some common patterns:
| File Format | Common Placeholder Syntax | Used In |
|---|---|---|
.json | {name} | JavaScript (React, Vue) |
.yaml | %{name} | Ruby on Rails |
.po | %s, %d, %1$s, %2$d | WordPress, PHP |
.xml | %1$s, %2$d | Android |
.strings | %@, %d, %f | iOS/macOS |
Design the UI for Text Expansion and Different Languages
Text length changes dramatically across languages:
- German text is typically 30% longer than English
- French runs about 20% longer
- Asian languages like Chinese and Japanese are often shorter
- Fixed-width layouts, buttons, and navigation menus break when text expands or when you support right-to-left languages like Arabic

Before you start coding, think through how different languages impact space during the design phase and save yourself headaches down the road.
For implementation details and code examples, see our guide on preventing layout issues with long translations.
5. Write Content that Translates Well
If your content is hard to read in your original language, it will be even harder to translate. The more complex your language, the more editing you’ll need to do after translation.
✓ Write full sentences with clear subjects and actions.

Correct Example
"You have no saved items in your cart."
This clearly states what’s empty (cart) and what it should contain (saved items).

Incorrect Example
"No cart items."This example is missing the subject (“you”) and action (“have”). These fragments could mean “There is no cart” or “Items not in cart” depending on how they’re interpreted.
✓ Keep it simple. Short, clear words produce better translations than complex vocabulary.

Correct Example
"Remove item from cart"
Incorrect Example
"Eliminate this article from your shopping cart"
✓ Avoid idioms and cultural references.
Phrases like “piece of cake” or “hit a home run” don’t translate literally and may not make sense in other cultures.
6. Configure Your Application to Load Translations
Set up your application to detect the user’s language and load the appropriate translation file.
Set Up Language Detection and File Loading
Most modern frameworks include i18n libraries that handle language detection and file loading. For example:
- React with react-i18next
React doesn’t include i18n by default, so you’ll need react-i18next. Install it with npm install react-i18next i18next, then configure it to detect the browser language and load your translation files.
- Ruby on Rails
Rails includes I18n by default. Configure it in config/application.rb. Then, detect the user’s language in your ApplicationController.
- WordPress
WordPress handles language detection automatically. Users set their site language in Settings → General, and WordPress loads the corresponding .mo file from wp-content/languages/. For multilingual sites where different users need different languages, you’ll need a plugin like WPML to handle per-user language selection.
Handle Missing Translations
Set your fallback language to your primary language. When a translation file doesn’t exist or strings are missing, users see the fallback instead of broken text or translation keys.
Add a Language Switcher (If Needed)
Most applications should respect the user’s browser or device language settings automatically. But if you want to let users manually override this—common for web applications—add a language switcher and store their choice:
// Save user's manual language selection
localStorage.setItem('userLanguage', selectedLanguage);
// Check for manual selection first, then use browser default
const userLanguage = localStorage.getItem('userLanguage') || navigator.language;
Mobile apps typically don’t include language switchers since users expect apps to follow their device settings.
7. Translate Your Resource Files
Manually sending files to translators creates a bottleneck that slows every release. Automating translation keeps all languages in sync without manual work.
PTC is an AI translation tool that automates this process. You can integrate it with your GitHub, GitLab, or Bitbucket repository, or use the API for CI/CD integration. When you update strings, translations happen automatically.
Creating an account is free, and you can translate 2,500 words into 2 languages at no cost. After that, there’s no subscription fee—you pay only for what you translate.
8. Test Localized Versions Before Launch
Testing ensures your translations display correctly and your UI works across different languages. Don’t just check if translated text appears. Also test functionality:
| Layout and display: | Functionality: | Locale-specific formatting: |
| ✓ Text fits in buttons, menus, and form fields without truncation, ✓ No horizontal scrolling or overflow. ✓ Multi-line text doesn’t break layouts. ✓ Navigation remains usable. | ✓ Forms validate and submit correctly. ✓ Error messages display in the right language. ✓ Date pickers and number inputs work. ✓ Search and filtering handle non-English characters. | ✓ Dates display in the correct format. ✓ Numbers use correct separators. ✓ Currency symbols appear in the right position. ✓ Times show in 12-hour or 24-hour format as expected. |
Ready to Localize Your Software?
You’ve prepared your code, structured your content, and designed for global users. Now translate your resource files with PTC and ship software that works in every language.

Translate Your Software Using 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.