Get human-quality translations for PO and POT files with AI. Generate production-ready .po and .mo files, free for 30 days—no credit card required. Just upload your .pot file, choose your target languages, and get context-aware translations in minutes.
Translating PO and POT Files for the First Time with PTC
Private Translation Cloud (PTC) was built for software localization and development teams. It makes it easy to take a .pot
file and turn it into fully translated .po
and .mo
files you can use in your WordPress plugin, theme, or any gettext-based project.
Step 1
Sign Up for a 30-Day Free Trial
Create a free PTC account to begin translating. You will have unlimited access for 30 days without needing to provide any payment details.
After the trial, you can keep full access by upgrading to a paid plan, which costs €30 per user per month. If you do not upgrade, you will still be able to view existing translations, but you will not be able to create new ones.
Step 2
Choose How to Translate Your POT File
In the PTC setup, choose the Manual File Upload option. This is the simplest way to upload a single .pot
file and generate .po
and .mo
translations before adopting an automated workflow.

Step 3
Tell PTC About Your Plugin or Theme
Add short but comprehensive context about your product, such as:
- Your product name
- What it does
- Who it is for
This information helps PTC choose accurate terminology, tone, and phrasing, which guarantees the highest translation quality.

Step 4
Upload Your POT File for Translation
Upload your .pot
file. This file should contain all the original strings from your plugin or theme that need translation.
For each language, PTC will generate a .po
file (editable text). If you also want to receive a .mo
file (compiled binary, used by WordPress and gettext at runtime), make sure to select the Create .mo
files option and set the output path.
Depending on your project type, you can also ask PTC to create .l10n.php
and .json
files.

Step 5
Select the Languages You Want to Translate Into
Choose your target languages from over 33 languages supported by PTC. You can translate into just one language or as many as you need.
For each language, PTC will generate a .po
file and any other translation output files you selected in the previous step.
Step 6
View and Download the PO and MO Translation Files
Once PTC finishes generating AI translations, go to the Translations tab to see all translated strings for all chosen languages in one clean table.
Any translation that exceeds your set length limit is highlighted in yellow:
- If your user interface can handle longer strings, you can keep them
- If not, you can ask PTC to retranslate them so they fit the length limit

When you’re ready, go to the Resource Files tab to download your translation files as a ZIP archive.

Step 7
Load the Translations in WordPress
To make sure your plugin or theme uses the translations, you need to load the text domain in your code. This tells WordPress where to find your .mo
files so it can load the correct translations when the site language matches one of the available languages in your plugin or theme.
load_plugin_textdomain( 'your-text-domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
In this example:
'your-text-domain'
should match the text domain defined in your plugin or theme- The final argument points to the languages folder where your
.mo
files are stored
If your plugin or theme is hosted on WordPress.org, WordPress may try to overwrite your .mo
files with translations created by the WordPress community. To prevent this, see how to make WordPress load your bundled translation files.
Translating Additional Text Like Readme.txt
In most projects, not all text is included in your .pot
file. You may have other content that users will see, such as:
- Plugin or theme
readme.txt
files - Release notes or changelogs
- Email templates or onboarding instructions
You can translate this type of content with PTC’s Paste to translate feature:
- In your PTC project dashboard, go to Translations → Paste to translate
- Paste the text you want to translate (for example, sections of your
readme.txt
). - Click Translate

PTC will instantly translate the pasted text into the languages you selected. You can then copy the translations and bundle them with your theme or plugin.


To learn how to make readme.txt
translations appear on WordPress.org, check our WordPress internationalization guide.
Setting Up Continuous Localization
You don’t need to upload files manually each time your .pot
file changes. PTC can keep your translations up to date automatically, saving you time and keeping your project fully localized.
Option 1
Automate Translations with Git Integration
Connect your GitHub, GitLab, or Bitbucket repository to PTC.
- Select the repository and branches you want PTC to monitor
- Define the output paths for your
.pot
files - Whenever a change is detected, PTC automatically translates the updated strings
- Translations are delivered back to your repository via a merge request

Option 2
Automate Translations with the PTC API
If you prefer not to connect your repository directly, you can integrate translations into your CI/CD process.
- Use the API to upload your
.pot
files automatically whenever your build pipeline generates them - PTC translates the files and sends back the
.po
and.mo
files in the API response - Your CI system can then save the translated files as artifacts or commit them back to your repository, depending on how you configure it
Best Practices for Preparing POT Files for Translation
The way you prepare your .pot
file affects how smoothly the translation process goes. When your source files follow best practices, translations load correctly and you avoid the common headaches of missing or untranslated text.
Wrap All User-Facing Text in Gettext Functions
Make sure any text your users see is wrapped in a gettext function such as __()
or _e()
. If you hardcode strings, they won’t be extracted into the .pot
file and won’t get translated.
Example
Correct — wrapped in gettext functions:
echo __( 'Read more', 'your-plugin' );
_e( 'Submit', 'your-plugin' );
Incorrect — hardcoded strings:
echo 'Read more';
echo 'Submit';
Use Placeholders for Dynamic Text
When your text includes variables (like numbers or names), always use placeholders (%s
, %d
) instead of breaking a sentence into separate strings. Breaking sentences makes them difficult or impossible to translate correctly, because grammar and word order vary in different languages.
Example
Correct — using a placeholder:
printf( __( 'You have %d new messages.', 'your-plugin' ), $count );
Incorrect — concatenated strings:
echo __( 'You have', 'your-plugin' ) . $count . __( 'new messages.', 'your-plugin' );
Keep Your Text Domain Consistent
WordPress loads translations by matching a text domain string used in your code with the file names and the loader you call in PHP. If any of these do not match, WordPress will not load your .mo
files, even if the files exist.
Make sure you use the same text domain everywhere: in your code, in your headers, in your file names, and when you load translations.
Example
Correct — text domain matches everywhere:
/* Plugin header (main plugin file) */
/*
* Plugin Name: Order Notes Manager
* Text Domain: order-notes-manager
* Domain Path: /languages
*/
/* In code (gettext calls) */
echo __( 'Settings saved', 'order-notes-manager' );
printf( _n( '%d note', '%d notes', $count, 'order-notes-manager' ), $count );
/* Loader (e.g., in plugin init) */
load_plugin_textdomain(
'order-notes-manager',
false,
dirname( plugin_basename( __FILE__ ) ) . '/languages'
);
/* File structure */
/my-plugin/
order-notes-manager.php
/languages/
order-notes-manager-es_ES.po
order-notes-manager-es_ES.mo
order-notes-manager-de_DE.po
order-notes-manager-de_DE.mo
Incorrect — mismatched domains or paths:
//* Header says one domain, code uses another */
/*
* Text Domain: order-notes-manager
*/
echo __( 'Settings saved', 'plugin-settings' ); // ❌ different domain
/* Loader points to the wrong folder */
load_plugin_textdomain(
'order-notes-manager',
false,
dirname( plugin_basename( __FILE__ ) ) . '/lang' // ❌ folder is /languages
);
Generate POT Files Regularly
Your .pot
file is the template for all translations. If you don’t regenerate it after adding or changing strings in your code, PTC will not see the new text. This often results in missing translations.
To keep translations up to date:
- Regenerate the
.pot
file every time you change user-facing text - Commit the updated
.pot
file to your repository along with your code changes
Translate More Than Just PO and POT Files
While this guide focuses on .po
and .pot
files for WordPress and gettext projects, PTC supports many other resource file formats used across different platforms. You can upload and translate files such as:
.json
.yaml
/.yml
.xml
(Android).strings
(iOS)- and more
You can use the same workflow to localize other projects beyond WordPress, whether it’s a web app, mobile app, or desktop software.

Start Translating Your PO and POT Files Today
Turn .pot
files into .po
and .mo
automatically with AI — saving you hours of manual work. Faster than manual translation, more consistent than crowdsourced, and free to try for 30 days.
