Thank you for your interest in contributing. Zen UI is a small, focused plugin — contributions that keep it clean, minimal, and well-behaved are most welcome.
| 🐛 Bug report | Open an Issue describing what went wrong |
| 💡 Feature request | Open an Issue with your idea |
| 🌍 Translation | Add or improve a .po file in locales/ |
| 🔧 Code | Fork, branch, change, and open a Pull Request |
| 📝 Documentation | Improve the README or add inline comments |
Open an Issue and include:
If the bug causes a crash, the KOReader log (crash.log or reader.log in the KOReader folder) is very helpful.
Open an Issue describing the feature and why it would be useful. Keep Zen UI’s philosophy in mind — features should reduce clutter or add something genuinely useful. Screenshots or mockups are welcome.
Translations live in the locales/ folder as standard .po files. No programming knowledge is needed.
locales/en.po to locales/<lang>.po using the standard locale code — for example de.po, ja.po, ko.po."Language: de\n"
msgstr field with your translation:
msgid "Quick settings"
msgstr "Schnelleinstellungen"
Open the existing .po file for your language, correct or complete the msgstr values, and submit a Pull Request.
msgid — only edit msgstr%d, %s, %%, and \n must appear in msgstr exactly as they do in msgidmsgstr "" empty for any string you are unsure about — the English original will be shown as a fallbackPlural-Forms in the header accordinglyZen UI is a standard KOReader plugin written in Lua. No build system or compilation step is required. The plugin runs directly from source.
To test changes:
zen_ui.koplugin folder to the plugins/ directory on your device or the KOReader emulator.The KOReader emulator is the fastest way to iterate without a physical device.
git checkout -b fix/my-bug-description
_():
-- correct
text = _("Something went wrong.")
-- incorrect — not translatable
text = "Something went wrong."
locales/en.po:
msgid "Your new string"
msgstr ""
git commit -m "Fix progress bar not updating after resume"
main.If you have Python 3 available, you can scan all Lua files for translatable strings and print any that are missing from locales/en.po:
import re, pathlib
strings = set()
pattern = re.compile(r'_\("([^"]+)"\)')
for f in pathlib.Path(".").rglob("*.lua"):
strings.update(pattern.findall(f.read_text(errors="ignore")))
existing = pathlib.Path("locales/en.po").read_text(errors="ignore")
for s in sorted(strings):
if f'msgid "{s}"' not in existing:
print(f'msgid "{s}"\nmsgstr ""\n')
local variables; avoid polluting the module-level scope_()zen_ui.koplugin/
├── main.lua — plugin entry point and lifecycle
├── _meta.lua — plugin metadata
├── config/
│ ├── defaults.lua — schema and default values
│ └── manager.lua — persistence, migration, getters/setters
├── common/
│ └── utils.lua — shared utilities
├── modules/
│ ├── registry.lua — module loader and feature registry
│ ├── filebrowser/ — file browser patches and layout
│ ├── menu/ — menu patches (quick settings, zen mode)
│ └── reader/ — reader patches (clock, status, banner)
├── settings/
│ ├── zen_settings.lua — unified settings menu entry
│ ├── zen_settings_build.lua — menu tree builder
│ ├── zen_settings_apply.lua — apply settings to live state
│ ├── zen_settings_updater.lua — update checker and installer
│ └── zen_updater.lua — GitHub release fetcher
├── locales/ — gettext .po translation files
├── icons/ — UI icons
├── CONTRIBUTING.md
├── SECURITY.md
└── README.md
Before submitting, please check:
_()locales/en.poThank you for helping make Zen UI better.