Title: gettext
Author: Samuel Sidler
Published: March 6, 2014
Last modified: August 18, 2020

---

# gettext

## In this article

 * [Getting Started](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#getting-started)
 * [The PO File Header](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#the-po-file-header)
 * [Message Format](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#message-format)

[↑ Back to top](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#wp--skip-link--target)

WordPress developers chose to use the [GNU gettext](http://www.gnu.org/software/gettext/gettext.html)
localizationLocalization Localization (sometimes shortened to “**l10n**“) is the
process of adapting a product or service to a particular language, culture, and 
desired local “look-and-feel.” framework to provide localization infrastructure 
to WordPress. **gettext** is a mature, widely-used framework for modular translation
of software, and is the _de facto_ standard for localization in the open sourceOpen
Source Open Source denotes software for which the original source code is made freely
available and may be redistributed and modified. Open Source **must be** delivered
via a licensing model, see GPL./free software realm.

**gettext** uses message-level translation – that is, every “message” displayed 
to users is translated individually, whether it be a paragraph or a single word.
In WordPress, such “messages” are generated, translated, and used by the WordPress
PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used 
open source general-purpose scripting language that is especially suited for web
development and can be embedded into HTML. [https://www.php.net/manual/en/index.php](https://www.php.net/manual/en/index.php)
files via two PHP functions. `__()` is used when the message is passed as an argument
to another function; `_e()` is used to write the message directly to the page. More
detail on these two functions:

**__(‘message’)**

Searches the localization module for the translation of ‘message’, and passes the
translation to the PHP return statement. If no translation is found for ‘message’,
it just returns ‘message’.

**_e(‘message’)**

Searches the localization module for the translation of ‘message’, and passes the
translation to the PHP echo statement. If no translation is found for ‘message’,
it just echoes ‘message’.

    ```wp-block-preformatted
    [preserved_text 8be67cb84dc37240ff1c2893ece8582d /]
    ```

There are also other PHP functions for localization like `_n()`, `_x()` and so on,
and you can find them all in `wp-includes/l10n.php`.

The gettext framework takes care of most of WordPress. However, there are a few 
places in the WordPress distribution where gettext cannot be used – see [Files For Direct Translation](https://make.wordpress.org/polyglots/handbook/translating/working-with-core/#files-for-direct-translation)
for more information on how to translate these spots.

## 󠀁[Getting Started](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#getting-started)󠁿

Usually you don’t need to edit the file directly, instead you may use GlotPressGlotPress
GlotPress is the translation management software that powers [Translate.WordPress.org](http://translate.wordpress.org).
More information is available at [glotpress.org](http://glotpress.org/). and/or 
a po file editor like poedit. Though it’s good to know how the files should be edited
and handled.

Or you can edit the file directly like:

 1. Download the [official WordPress POT file](http://svn.automattic.com/wordpress-i18n/pot/trunk/wordpress.pot)
 2. Open the file in your favorite text editor
 3. Update the headerHeader The header of your site is typically the first thing people
    will experience. The masthead or header art located across the top of your page
    is part of the look and feel of your website. It can influence a visitor’s opinion
    about your content and you/ your organization’s brand. It may also look different
    on different screen sizes. information
 4. Translate the messages
 5. Save the file with a .po file extension
 6. Issue msgfmt -o _filename_.moMO files MO, or Machine Object is a binary data file
    that contains object data referenced by a program. It is typically used to translate
    program code, and may be loaded or imported into the GNU gettext program. This 
    is the format used in a WordPress install. These files are normally located inside…/
    wp-content/languages/ _filename_.po

## 󠀁[The PO File Header](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#the-po-file-header)󠁿

At the beginning of the PO file is something called the _header_. This gives information
about what package and version the translation is for, who the translator was, and
when it was created. Certain portions of this header should be universal for all
WordPress translations:

    ```wp-block-preformatted
    # LANGUAGE (LOCALE) translation for WordPress.
    # Copyright (C) YEAR WordPress contributors.
    # This file is distributed under the same license as the WordPress package.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: WordPress VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2005-02-27 17:11-0600\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=CHARSET\n"
    "Content-Transfer-Encoding: 8bit\n"
    ```

Fill in the rest of the capitalized text with the appropriate values.

## 󠀁[Message Format](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/gettext/?output_format=md#message-format)󠁿

The remainder of the file will be in a format as follows:

    ```wp-block-preformatted
    #: wp-comments-post.php:13
    msgid "Sorry, comments are closed for this item."
    msgstr ""

    #: wp-comments-post.php:29
    msgid "Sorry, you must be logged in to post a comment."
    msgstr ""

    #: wp-comments-post.php:35
    msgid "Error: please fill the required fields (name, email)."
    msgstr ""
    ```

The first line of each message contains the location of the message in the WordPress
code. In the case of these messages, they’re all located in wp-comments-post.php,
on lines 13, 29, and 35, respectively. Occasionally you will come across a message
for which you will need to check its context; look at the appropriate line or lines
in the WordPress coreCore Core is the set of software required to run WordPress.
The Core Development Team builds WordPress., and you should be able to figure out
when and where the message is displayed, and even reproduce it yourself using your
web browser. Some messages will also appear with the same text in multiple locations;
in that case, there may be more than one line giving a file and line location.

The next line, msgid, is the _source_ message. This is the stringString A string
is a translatable part of the software. A translation consists of a multitude of
localized strings. that WordPress passes to its __() or _e() functions, and the 
message you will need to translate.

The final line, msgstr, is a blank string where you will fill in your translation.

Here’s how the same few lines would look after being translated, using the **[French (France)](http://svn.automattic.com/wordpress-i18n/fr_FR/trunk/messages/fr_FR.po)**
localeLocale Locale = language version, often a combination of a language code and
a region code, for instance es_MX denotes Spanish as it’s used in Mexico. A list
of all locales supported by WordPress in [https://make.wordpress.org/polyglots/teams/](https://make.wordpress.org/polyglots/teams/)
as an example:

    ```wp-block-preformatted
    #: wp-comments-post.php:13
    msgid "Sorry, comments are closed for this item."
    msgstr "L'ajout de commentaire n'est pas ou plus possible pour cet article."

    #: wp-comments-post.php:29
    msgid "Sorry, you must be logged in to post a comment."
    msgstr "Vous devez être connecté pour rédiger un commentaire."

    #: wp-comments-post.php:35
    msgid "Error: please fill the required fields (name, email)."
    msgstr "Erreur : veuillez remplir les champs obligatoires vides (nom, e-mail)."
    ```

First published

March 6, 2014

Last updated

August 18, 2020

[  Previous: Plugin/Theme Authors Guide](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/)

[  Next: Project Translation Editor (PTE) Request](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/pte-request/)