Translate a PO (gettext) File into Korean
Upload your .po or .pot file and Manuce returns a Korean .po with a single-form <code>Plural-Forms</code> header, every <code>msgctxt</code> and comment untouched, and printf variables checked entry by entry. Only the <code>msgstr</code> values change, and a report lists what was translated and what was left as it was.
What it costs
For a PO file (gettext) with about 2,500 words of values, into Korean:
To understand, internal use.
Ready to send, by the technical specialist.
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.
What Korean changes in a PO file
Korean has one plural category (other in CLDR). A .pot template returned in Korean therefore gets Language: ko and Plural-Forms: nplurals=1; plural=0; in its header, and every entry with a msgid_plural is left with a single msgstr[0].
In practice, the source pair "%d file" / "%d files" becomes one string: msgstr[0] "파일 %d개". The noun never changes; the number is followed by a counter word: 개 for things, 명 for people, 건 for requests, results or messages. If your interface shows a special sentence for zero ("No files"), keep that logic in code: the Korean plural rule does not separate 0, 1 and many.
If you start from an existing Korean .po whose header was copied from another language (nplurals=2), fix that header: msgfmt --check reports a mismatch between nplurals and the number of msgstr[n] lines.
Particles, word order and placeholders
The problem specific to Korean in gettext is particles. Their form depends on the last syllable of the preceding word: 을 after a final consonant, 를 after a vowel, and likewise 이/가, 은/는, 으로/로. When that word is a placeholder, nobody knows what it will hold, so "Delete %s?" cannot safely become %s를 삭제하시겠습니까?.
Two approaches are common:
- the dual notation
%s을(를), widely accepted in software; - a phrasing that attaches the particle to a fixed word:
'%s' 항목을 삭제하시겠습니까?, where을agrees with항목("item").
Check the free sample to see which form was used for your placeholder strings.
Korean is subject-object-verb and the verb closes the sentence, so with two placeholders the natural order often flips. In "%s shared %s with you", Korean tends to put the document before the action. If the source uses %s %s, the translation has to keep that order; positional arguments (%1$s, %2$s) in the source, where your language supports them, let the Korean sentence follow its own structure. Manuce checks that every source placeholder is present in the translation.
Register, spacing and display
Politeness is carried by the verb ending. Interface messages usually take the formal polite -습니다 ending (저장되었습니다, "Saved"); some consumer apps prefer the softer polite -요 (저장했어요). Buttons and menus normally use a noun: 저장 for "Save", 취소 for "Cancel". Mixed registers in neighbouring messages stand out, so read a few error messages side by side.
This is where msgctxt earns its place: "Open" as an action (열기) and "Open" as a state (열림) are translated differently. Translator comments (#.) describing where a string appears also help decide between a noun and a full sentence.
Korean separates word groups with spaces (파일을 찾을 수 없습니다), and that spacing is part of correct spelling. A Korean string often has fewer characters than its source, but each Hangul syllable is full width, so test labels in narrow areas. Make sure your app's font covers Hangul, or users will see empty boxes. Punctuation follows English usage, with no space before ? or !.
What Manuce returns, and what it does not do
You get the same file back, ready to drop into the project:
- indentation, entry order, quotes,
#.,#:and#,comments, line endings, encoding and BOM unchanged; msgctxtandmsgid_pluralkept, with onemsgstr[0]per plural entry;- a .pot turned into a Korean .po with
LanguageandPlural-Formsset; - each value compared with its source (
%s,%d,%1$s, tags); if a mismatch persists, the source value is kept and the report says so; - left untranslated:
msgidkeys, empty values, URLs, email addresses, numbers, colours, date formats, identifiers and anything marked as non-translatable.
The report lists translated strings and those left unchanged, with the reason. Manuce does not compile the .mo, does not see your interface and cannot pick a particle at runtime: how %s을(를) reads on the real screen is yours to check. The #, fuzzy flag is kept like any other comment; it is not removed.
Preparing the file and checking the result
Before uploading:
- the encoding is preserved, so the file must be able to hold Hangul: convert an ASCII or ISO-8859-1 .pot to UTF-8 first (
msgconv --to-code=UTF-8) and setcharset=UTF-8in the header; - deal with entries flagged
fuzzy:msgfmtskips them by default, even once translated; - where possible, replace
%s %swith positional arguments in the source.
When the file comes back:
- compile with
msgfmt --check -o ko.mo ko.po; - run the app under
ko_KR.UTF-8and look at placeholder strings, counters (%d개) and short buttons; - read the report: a string left in the source language often points to a placeholder or tag worth fixing in the source.
In practice
- Convert the .po or .pot to UTF-8 if needed, then upload it: the quote counts the words in the values.
- Pick a level and read the free sample: register, particles after placeholders, counter words.
- Pay and download the Korean .po and its report from your account.
- Compile with msgfmt --check and test the interface in Korean.
Frequently asked questions
Why do my plural entries only have msgstr[0]?
Korean has a single plural form, so the header becomes <code>nplurals=1; plural=0;</code>. Both "%d file" and "%d files" map to one string such as <code>파일 %d개</code>. This is exactly what gettext expects for Korean.
How are particles handled after a placeholder?
Since the value of <code>%s</code> is unknown, the translation uses a dual form like <code>을(를)</code> or rephrases so the particle attaches to a fixed word. Check the free sample to confirm the approach suits your interface, then review the real display after compiling.
Which politeness level is used?
The context drives it: <code>msgctxt</code> and <code>#.</code> comments are read. Messages generally take a polite form, while buttons get a short noun such as <code>저장</code>. If you need a particular register, check it in the free sample before ordering.
My file is encoded in ISO-8859-1. Is that a problem?
Yes. Manuce keeps the file's encoding, and ISO-8859-1 cannot store Hangul. Convert it to UTF-8 before uploading, for example with <code>msgconv</code>, and declare <code>charset=UTF-8</code> in the header.
Why does Korean cost more than a European language?
Korean carries a ×1.6 coefficient on the per-word price. Only the words in the values to translate are counted; <code>msgid</code> keys and tags are excluded.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into Korean, other files
See also
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.