Gettext (.po, .pot)
Nick Ustinov avatar
Written by Nick Ustinov
Updated over a week ago

A PO (portable object) file is made up of many entries, each entry holding the relation between an original untranslated string and its corresponding translation. All entries in a PO file usually pertain to a single project, and all translations are expressed in a single target language.


Lokalise parses the following keys:

#: (reference)
# or #@ or #. (comment)
#, fuzzy (fuzzy flag)
msgctxt
msgid
msgid_plural
msgstr

Plural forms are accepted. Obsolete terms marked with (#~) are not imported from .po and .pot files.

Headers

As you upload the source .po files, Lokalise extracts the header and adds an archived key lokalise.po.header with the header content. To edit the contents, in the project editor click Filter > QA > Archived. Copy/paste the contents of the header to all languages if required. You can also manually create this key, if necessary.

Note on descriptions and comments

Please note that if you are uploading a translation file with multiple descriptions, all additional descriptions will be stored under the comments for the key. Upon downloading such keys, you'll need to include both comments and descriptions to the export bundle.

Known limitations

At the moment, Lokalise does not add/update language-specific plural form headers to Gettext files, so you'll have to add those manually, for example (note the last Plural-Forms header):

"Project-Id-Version: Sample 1.0.1\n"
"Report-Msgid-Bugs-To: support@example.com \n"
"Last-Translator: Username <user@example.com>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

You can find the table with all the plural headers in the following document or in the table below:

ISO

English name

Plurals header in .po files

A

ach

Acholi

nplurals=2; plural=(n > 1);

af

Afrikaans

nplurals=2; plural=(n != 1);

ak

Akan

nplurals=2; plural=(n > 1);

am

Amharic

nplurals=2; plural=(n > 1);

an

Aragonese

nplurals=2; plural=(n != 1);

anp

Angika

nplurals=2; plural=(n != 1);

ar

Arabic

nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5);

arn

Mapudungun

nplurals=2; plural=(n > 1);

as

Assamese

nplurals=2; plural=(n != 1);

ast

Asturian

nplurals=2; plural=(n != 1);

ay

Aymará

nplurals=1; plural=0;

az

Azerbaijani

nplurals=2; plural=(n != 1);

B

be

Belarusian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

bg

Bulgarian

nplurals=2; plural=(n != 1);

bn

Bengali

nplurals=2; plural=(n != 1);

bo

Tibetan

nplurals=1; plural=0;

br

Breton

nplurals=2; plural=(n > 1);

brx

Bodo

nplurals=2; plural=(n != 1);

bs

Bosnian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

C

ca

Catalan

nplurals=2; plural=(n != 1);

cgg

Chiga

nplurals=1; plural=0;

cs

Czech

nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;

csb

Kashubian

nplurals=3; plural=(n==1) ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

cy

Welsh

nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;

D

da

Danish

nplurals=2; plural=(n != 1);

de

German

nplurals=2; plural=(n != 1);

doi

Dogri

nplurals=2; plural=(n != 1);

dz

Dzongkha

nplurals=1; plural=0;

E

el

Greek

nplurals=2; plural=(n != 1);

en

English

nplurals=2; plural=(n != 1);

eo

Esperanto

nplurals=2; plural=(n != 1);

es

Spanish

nplurals=2; plural=(n != 1);

es_AR

Argentinean Spanish

nplurals=2; plural=(n != 1);

et

Estonian

nplurals=2; plural=(n != 1);

eu

Basque

nplurals=2; plural=(n != 1);

F

fa

Persian

nplurals=2; plural=(n > 1);

ff

Fulah

nplurals=2; plural=(n != 1);

fi

Finnish

nplurals=2; plural=(n != 1);

fil

Filipino

nplurals=2; plural=(n > 1);

fo

Faroese

nplurals=2; plural=(n != 1);

fr

French

nplurals=2; plural=(n > 1);

fur

Friulian

nplurals=2; plural=(n != 1);

fy

Frisian

nplurals=2; plural=(n != 1);

G

ga

Irish

nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;

gd

Scottish Gaelic

nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;

gl

Galician

nplurals=2; plural=(n != 1);

gu

Gujarati

nplurals=2; plural=(n != 1);

gun

Gun

nplurals=2; plural=(n > 1);

H

ha

Hausa

nplurals=2; plural=(n != 1);

he

Hebrew

nplurals=2; plural=(n != 1);

hi

Hindi

nplurals=2; plural=(n != 1);

hne

Chhattisgarhi

nplurals=2; plural=(n != 1);

hr

Croatian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

hu

Hungarian

nplurals=2; plural=(n != 1);

hy

Armenian

nplurals=2; plural=(n != 1);

I

ia

Interlingua

nplurals=2; plural=(n != 1);

id

Indonesian

nplurals=1; plural=0;

is

Icelandic

nplurals=2; plural=(n%10!=1 || n%100==11);

it

Italian

nplurals=2; plural=(n != 1);

J

ja

Japanese

nplurals=1; plural=0;

jbo

Lojban

nplurals=1; plural=0;

jv

Javanese

nplurals=2; plural=(n != 0);

K

ka

Georgian

nplurals=1; plural=0;

kk

Kazakh

nplurals=2; plural=(n != 1);

kl

Greenlandic

nplurals=2; plural=(n != 1);

km

Khmer

nplurals=1; plural=0;

kn

Kannada

nplurals=2; plural=(n != 1);

ko

Korean

nplurals=1; plural=0;

ku

Kurdish

nplurals=2; plural=(n != 1);

kw

Cornish

nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3;

ky

Kyrgyz

nplurals=2; plural=(n != 1);

L

lb

Letzeburgesch

nplurals=2; plural=(n != 1);

ln

Lingala

nplurals=2; plural=(n > 1);

lo

Lao

nplurals=1; plural=0;

lt

Lithuanian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);

lv

Latvian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);

M

mai

Maithili

nplurals=2; plural=(n != 1);

me

Montenegro

nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

mfe

Mauritian Creole

nplurals=2; plural=(n > 1);

mg

Malagasy

nplurals=2; plural=(n > 1);

mi

Maori

nplurals=2; plural=(n > 1);

mk

Macedonian

nplurals=2; plural= n==1 || n%10==1 ? 0 : 1; Can’t be correct needs a 2 somewhere

ml

Malayalam

nplurals=2; plural=(n != 1);

mn

Mongolian

nplurals=2; plural=(n != 1);

mni

Manipuri

nplurals=2; plural=(n != 1);

mnk

Mandinka

nplurals=3; plural=(n==0 ? 0 : n==1 ? 1 : 2);

mr

Marathi

nplurals=2; plural=(n != 1);

ms

Malay

nplurals=1; plural=0;

mt

Maltese

nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);

my

Burmese

nplurals=1; plural=0;

N

nah

Nahuatl

nplurals=2; plural=(n != 1);

nap

Neapolitan

nplurals=2; plural=(n != 1);

nb

Norwegian Bokmal

nplurals=2; plural=(n != 1);

ne

Nepali

nplurals=2; plural=(n != 1);

nl

Dutch

nplurals=2; plural=(n != 1);

nn

Norwegian Nynorsk

nplurals=2; plural=(n != 1);

no

Norwegian (old code)

nplurals=2; plural=(n != 1);

nso

Northern Sotho

nplurals=2; plural=(n != 1);

O

oc

Occitan

nplurals=2; plural=(n > 1);

or

Oriya

nplurals=2; plural=(n != 1);

P

pa

Punjabi

nplurals=2; plural=(n != 1);

pap

Papiamento

nplurals=2; plural=(n != 1);

pl

Polish

nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

pms

Piemontese

nplurals=2; plural=(n != 1);

ps

Pashto

nplurals=2; plural=(n != 1);

pt

Portuguese

nplurals=2; plural=(n != 1);

pt_BR

Brazilian Portuguese

nplurals=2; plural=(n > 1);

R

rm

Romansh

nplurals=2; plural=(n != 1);

ro

Romanian

nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);

ru

Russian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

rw

Kinyarwanda

nplurals=2; plural=(n != 1);

S

sah

Yakut

nplurals=1; plural=0;

sat

Santali

nplurals=2; plural=(n != 1);

sco

Scots

nplurals=2; plural=(n != 1);

sd

Sindhi

nplurals=2; plural=(n != 1);

se

Northern Sami

nplurals=2; plural=(n != 1);

si

Sinhala

nplurals=2; plural=(n != 1);

sk

Slovak

nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;

sl

Slovenian

nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);

so

Somali

nplurals=2; plural=(n != 1);

son

Songhay

nplurals=2; plural=(n != 1);

sq

Albanian

nplurals=2; plural=(n != 1);

sr

Serbian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

su

Sundanese

nplurals=1; plural=0;

sv

Swedish

nplurals=2; plural=(n != 1);

sw

Swahili

nplurals=2; plural=(n != 1);

T

ta

Tamil

nplurals=2; plural=(n != 1);

te

Telugu

nplurals=2; plural=(n != 1);

tg

Tajik

nplurals=2; plural=(n > 1);

th

Thai

nplurals=1; plural=0;

ti

Tigrinya

nplurals=2; plural=(n > 1);

tk

Turkmen

nplurals=2; plural=(n != 1);

tr

Turkish

nplurals=2; plural=(n > 1);

tt

Tatar

nplurals=1; plural=0;

U

ug

Uyghur

nplurals=1; plural=0;

uk

Ukrainian

nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

ur

Urdu

nplurals=2; plural=(n != 1);

uz

Uzbek

nplurals=2; plural=(n > 1);

V

vi

Vietnamese

nplurals=1; plural=0;

W

wa

Walloon

nplurals=2; plural=(n > 1);

wo

Wolof

nplurals=1; plural=0;

Y

yo

Yoruba

nplurals=2; plural=(n != 1);

Z

zh

Chinese [1]

nplurals=1; plural=0;

zh

Chinese [2]

nplurals=2; plural=(n > 1);

[1] All districts and all variants of Chinese, such as zh_CN, zh_HK, zh_TW, and so on.

[2] In rare cases where plural form introduces difference in personal pronoun (such as her vs. they, we vs. I), the plural form is different.

Did this answer your question?