Ziman
Ziman (زمان) means language in Kurdish. It translates your app into Kurdish without leaving VS Code.
Built for developers in Kurdistan who ship apps in English and Kurdish. Works with any JSON-based i18n setup: react-i18next, next-intl, vue-i18n, i18next, or your own t() function.
Features
Select text (or put the cursor inside a string) and press Ctrl+Alt+T (Cmd+Alt+T on Mac), or use the 💡 lightbulb → Extract to translation.
- A key is suggested from the file and the text, like
productCard.add_to_cart.
- The text is saved to
locales/en.json.
- Your code becomes
t('productCard.add_to_cart'). Text between JSX tags becomes {t('…')}, and Vue templates get {{ t('…') }}.
- You're asked for the Kurdish translation right away. Press Esc to skip.
If the same text already has a key, it's reused instead of duplicated.
See translations in your code
Every t('key') shows its text faded at the end of the call, so t('home.title') reads as t('home.title') Welcome. Set ziman.hintLanguage to "ku" to see the Kurdish text instead. Hover any key to see both languages.
Missing translations are flagged
- A yellow squiggle when a key doesn't exist in your source language.
- A blue hint when the Kurdish translation is still missing.
Translation Table with right-to-left Kurdish
Run Ziman: Open Translation Table to edit every key side by side. The Kurdish column is right-to-left with a proper Kurdish font. Search, show only missing translations, and watch your progress. Changes save straight to the JSON files.
Find hard-coded text
Run Ziman: Find Hard-coded Text in This File to list every untranslated label and sentence. Pick one to extract it.
Setup
Put one JSON file per language in a folder:
locales/
en.json
ku.json
Using a different folder? Set ziman.localesPath, for example src/locales, public/locales or src/i18n.
Sorani and Kurmanji: to ship both, set "ziman.languages": ["en", "ckb", "kmr"] and you get ckb.json (Sorani, right-to-left) and kmr.json (Kurmanji).
Settings
| Setting |
Default |
Description |
ziman.localesPath |
"locales" |
Folder with <lang>.json files. |
ziman.languages |
["en","ku"] |
Language codes. |
ziman.sourceLanguage |
"en" |
The language you write first. |
ziman.callTemplate |
"t('{key}')" |
What extracted text becomes, e.g. $t('{key}') or __('{key}'). |
ziman.functionNames |
["t","$t","i18n.t","__"] |
Functions that read translations. |
ziman.nestedKeys |
true |
Write home.title as { "home": { "title": … } }. |
ziman.inlineHints |
true |
Show text next to each t('key'). |
ziman.hintLanguage |
"" |
Show hints in another language, e.g. "ku". |
ziman.askForTranslations |
true |
Ask for Kurdish right after extracting. |
Notes
- In multi-folder workspaces, the folder of the file you're editing is used.
- Vue attributes need a binding: change
placeholder="t('…')" to :placeholder="t('…')" after extracting.
Made by Rashid Farhad.