Edit PO/Gettext files entry-by-entry, validate plurals, and convert to XLIFF, ARB, JSON, YAML, or ICU — all from a vault you already know.
مرحبا
안녕
Olá
Hej!
Ciao
안녕!
Browse entries as a structured list — ID, status, and context at a glance. Click any entry to open the editor panel. Switch to raw PO source for direct access.
Filter by status, format flag, comment, or context. Find the 12 fuzzy entries hiding in a 4,000-entry catalog in seconds.
Step through entries one by one with keyboard shortcuts. No distractions, no mouse — pure kilometer translation mode for translators who need to ship.
Flag fuzzy entries, missing translations, and move obsolete strings out of your active catalog — keep your PO files clean without leaving Obsidian.
Pick a language when creating a PO file and the correct
Plural-Forms header is written automatically from CLDR rules.
First-class support for msgid_plural with all required forms per locale. Integrity
checks catch missing or mismatched forms before you ship.
Track progress per language — translated, fuzzy, obsolete counts — then export to any format from the sidebar.
Round-trip to XLIFF, ARB, ARB Enhanced, JSON, YAML, and ICU MessageFormat without losing flags or comments.
Treat a folder of PO files as one project. Switch locales, compare progress, sync settings across the set.
No lag on thousands of entries. The list renders instantly whether you're editing 50 strings or 50,000 — your vault stays responsive.
Define labeled buttons that apply flags or translator comments in one click. Assign
a PO flag (e.g. #, c-format), a comment, and a color. Buttons appear in
the editor panel — tag entries without breaking your translation flow.
Dock the editor panel top, bottom, left, or right. Define custom placeholder
patterns (%s, %(key)s, %1$d) that render as
clickable chips in translation cells. Auto-check headers on open or keep it on
demand.
Missing something? An Idea for better UX? Open a feature request on GitHub — describe your use case and we’ll take a look.
Request a feature →Every entry has context, source, translation, optional plurals, flags, and translator notes. PO Editor renders all of it as a structured form — but the underlying file stays a perfectly clean .po.
msgctxt
Disambiguates same-text-different-meaning entries
msgid_plural
CLDR plural forms with full integrity checks
#, fuzzy
Mark entries that need a human review
#: source.ts:42
Jump straight to where the string lives in code
# Translator: claude · 2 hours ago #: src/views/inbox.tsx:91 msgctxt "inbox" msgid "You have one unread message" msgid_plural "You have {count} unread messages" msgstr[0] "Tu as un message non lu" msgstr[1] "Tu as {count} messages non lus" #, fuzzy, c-format #: src/net/client.ts:77 msgctxt "errors" msgid "Could not connect to %s" msgstr "Connexion à %s impossible"
Click any .po file in the file explorer to open it in the editor, or
use the PO ribbon button to create a new file. Pick a language and an output folder.
Click any entry in the list to open the editor panel — set msgstr, toggle flags, add comments. Or jump to raw mode for direct source editing.
Run "Validate PO File" to scan for empty msgstr, fuzzy entries, and obsolete strings. Flag issues before committing.
Round-trip to XLIFF for translators, ARB for Flutter, JSON/YAML for web stacks, or ICU for runtime use.
Comments, flags, and source references survive every conversion (when you want them to).
Settings → Community plugins → Browse
"PO Editor"
then Enable
from Community plugins
Settings → Add Beta Plugin
Kodaskills/obsidian-po-editor
main.js, manifest.json, styles.css
<vault>/.obsidian/plugins/po-editor/
and enable the plugin
Not yet — PO Editor is desktop-only (isDesktopOnly: true in the
manifest). Mobile support is on the roadmap once the core feature set settles.
No. Everything happens inside Obsidian, on files in your vault. The plugin reads and writes PO files (and any conversions) to your chosen output directory.
Yes. Round-trip your PO files to XLIFF for sending to translators, ARB for Flutter, JSON/YAML/ICU for web, then back to PO. Comments, flags, and references survive every hop (when configured).
Obsolete entries are strings no longer in your source but still present in the PO file. Instead of deleting them, the plugin lets you move them to the obsolete section — they're preserved for reference but excluded from active translation counts.
Yes. msgid_plural with all required forms per language, plus integrity checks that warn when the count of msgstr[] doesn't match the language's expected plural categories.
Most actions live in the command palette (⌘P / Ctrl+P). You can also bind
any editor action via the keyMapping setting — no restart
needed.
Yes — a focus workflow is built in. Filter the entry list to untranslated entries, then click the fullscreen button in the editor panel header to expand it to overlay mode. Type your translation, then press Alt+↓ to save and jump to the next entry instantly. Alt+↑ goes back. The command palette also has “Navigate to next untranslated entry” if you want keyboard-only flow without touching the mouse.
Free, MIT-licensed, and crafted with care by Kodaskills.