ManuceTranslate a fileTranslate a PO (gettext) file into Polish

Translate a PO (gettext) file into Polish

Upload your .po or .pot file: Manuce translates the msgstr entries into Polish, sets the Language and Plural-Forms headers and fills in as many plural forms as Polish needs. You get the same file back, ready to compile, with a report listing every string left unchanged and why.

Upload my file See pricing

What it costs

For a PO file (gettext) with about 2,500 words of values, into Polish:

Essentiel
€19

To understand, internal use.

Professional
€57

Ready to send, by the technical specialist.

Premium
€110

Cross-checked. For documents that commit you.

Price for one language, original layout included. VAT not applicable — article 293 B of the French General Tax Code (CGI). The exact quote, based on your file's word count, is shown before you pay.

Polish plurals in a PO file: two msgstr entries are not enough

This is the first thing that breaks when a PO file moves to Polish. Polish has a singular, one plural for numbers ending in 2, 3 or 4 (except 12 to 14), and another plural for everything else. A plural entry therefore needs three msgstr lines:

  • msgstr[0] "%d plik" for 1
  • msgstr[1] "%d pliki" for 2, 3, 4, 22, 23, 104…
  • msgstr[2] "%d plików" for 0, 5, 11, 12, 13, 25…

CLDR lists four categories (one, few, many, other); the fourth covers decimals ("1,5 pliku"). Because ngettext receives an integer, the gettext convention for Polish is nplurals=3, with the usual expression plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);. Manuce fills the number of msgstr[n] entries that matches Polish. If your app shows decimal quantities, phrase those strings without a plural, for example Rozmiar: %s.

Cases, gender and placeholders: the Polish-specific traps

Polish declines nouns. A value injected through %s stays in the nominative, while the sentence may require another case:

  • Settings for %s would become Ustawienia dla %s, which needs the genitive: "dla Jan" is wrong, it should be "dla Jana". Wording such as Ustawienia: %s or Ustawienia projektu %s sidesteps the issue.
  • Past tense agrees with gender: %s joined the project becomes dołączył or dołączyła. When the person is unknown, a common solution is Użytkownik %s dołączył do projektu.

Strings assembled from fragments in code (a verb in one entry, a noun in another) cannot be declined correctly; where possible, turn them into full sentences before translation. msgctxt matters too: Open in a button context gives Otwórz, while the status of a ticket (zgłoszenie, neuter) gives Otwarte. Manuce relies on that context and on your #. comments to choose.

Polish typography and conventions

A few conventions catch out developers working from English or French sources:

  • No space before :, ;, ? or !, so a French-style Fichier : becomes Plik:.
  • Quotation marks are written „ ”: Click "Save" becomes Kliknij „Zapisz”.
  • Month and day names are lower case, and menu titles capitalise only the first word, unlike English title case.
  • Short dates are usually written 31.12.2025. Date formats are not translated: a string such as %m/%d/%Y in the PO file stays as it is, and adapting it is up to you.

Polish text often runs longer than the source, so check buttons and narrow columns. The interface font must include ą, ć, ę, ł, ń, ó, ś, ź and ż.

What Manuce returns, and what it does not do

You get the same file back: indentation, entry order, quotes, #. #: #, comments, line endings, encoding and BOM are preserved; only the msgstr values change. A .pot template comes back as a Polish .po, with Language: pl and Plural-Forms headers set.

  • Placeholders such as %s, %d, %1$s and tags are compared with the source for every string; if a mismatch persists, the source value is kept and the report says so.
  • Not translated: identifiers, empty values, URLs, email addresses, numbers, colours, date formats, and anything marked as non-translatable.

Manuce does not compile the .mo file, cannot know the gender of whoever fills a %s, does not take glossaries or translation memories, and does not produce sworn or certified translations. For a product name that must stay as it is, check the free sample and then the translation.

Preparing the file and checking the result

  1. Check the encoding: since it is preserved, a PO file in ISO-8859-1 or Windows-1252 cannot hold ł or ę. Convert it to UTF-8 and declare charset=UTF-8 in the header before uploading.
  2. Add a msgctxt or a #. comment to short, ambiguous words ("Open", "Post", "Archive").
  3. After delivery, run msgfmt --check -o pl.mo pl.po: it checks the header, the number of plural forms and format consistency on c-format entries.
  4. Entries flagged #, fuzzy in your file keep that flag and are skipped at compile time: review them and remove the flag.
  5. Test plurals in the running app with 1, 2, 5, 12 and 22.

In practice

  1. Convert the .po or .pot file to UTF-8 and add context to ambiguous strings.
  2. Upload the file, choose Polish and read the quote based on the words in the values.
  3. Check the free sample, ideally on a plural or placeholder string.
  4. Download the .po file and report, then compile with msgfmt --check.
  5. Test the interface with 1, 2, 5, 12 and 22 items.

Frequently asked questions

Why three msgstr entries when Polish has four plural categories?

The fourth CLDR category covers decimal numbers, which ngettext never receives. The gettext convention for Polish is therefore nplurals=3. Just check that the Plural-Forms header matches what your tooling expects.

Can I upload a .pot template instead of a .po file?

Yes. The template comes back as a Polish .po file, with the Language and Plural-Forms headers set and the msgstr entries filled in. msgctxt, msgid_plural and comments are kept.

Could placeholders like %s or %1$s get broken?

Every translated value is compared with the source for placeholders and tags. If a mismatch persists, the source string is kept and flagged in the report so you can handle it by hand. Positional placeholders such as %1$s let the Polish sentence reorder safely.

How do I handle a sentence where the inserted name should be declined?

Manuce cannot decline a value that only exists at runtime. The fix lies in the wording: put the placeholder after a colon or behind a noun that carries it, as in "Ustawienia projektu %s". If there are many such strings, it is worth rewording them in the source code.

Does Polish cost more than other languages?

Yes, Polish carries a surcharge, with a ×1.25 coefficient on the per-word rate. The quote is immediate and counts only the words in the values, excluding identifiers and tags.

The specialist in charge

This subject goes to Dédale, the technical specialist. See how it works.

Try it on your own file, free

A sample of your file translated at the level you choose, before any payment. You judge, then you decide.

Upload my file