{"id":30111049,"url":"https://github.com/anmitalidev/poterm","last_synced_at":"2025-08-10T05:06:50.576Z","repository":{"id":305848444,"uuid":"1024131392","full_name":"AnmiTaliDev/poterm","owner":"AnmiTaliDev","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-22T09:01:42.000Z","size":124,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-22T10:36:21.565Z","etag":null,"topics":["gettext","po","ratatui","ratatui-rs","rs"],"latest_commit_sha":null,"homepage":"http://taliildar.anmitali.kz/poterm/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AnmiTaliDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-22T08:26:14.000Z","updated_at":"2025-07-22T08:58:51.000Z","dependencies_parsed_at":"2025-07-22T10:47:25.121Z","dependency_job_id":null,"html_url":"https://github.com/AnmiTaliDev/poterm","commit_stats":null,"previous_names":["anmitalidev/poterm"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/AnmiTaliDev/poterm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnmiTaliDev%2Fpoterm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnmiTaliDev%2Fpoterm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnmiTaliDev%2Fpoterm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnmiTaliDev%2Fpoterm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AnmiTaliDev","download_url":"https://codeload.github.com/AnmiTaliDev/poterm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnmiTaliDev%2Fpoterm/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269677801,"owners_count":24457876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-10T02:00:08.965Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gettext","po","ratatui","ratatui-rs","rs"],"created_at":"2025-08-10T05:06:49.661Z","updated_at":"2025-08-10T05:06:50.555Z","avatar_url":"https://github.com/AnmiTaliDev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Poterm\n\nModern TUI (Terminal User Interface) editor for .po (Portable Object) translation files.\n\n![Poterm Demo](https://img.shields.io/badge/status-in%20development-blue)\n![License](https://img.shields.io/badge/license-Apache%202.0-green)\n![Rust](https://img.shields.io/badge/rust-1.70+-orange)\n[![Built With Ratatui](https://ratatui.rs/built-with-ratatui/badge.svg)](https://ratatui.rs/)\n\n## Features\n\n- **Modern TUI Interface**: Clean and intuitive terminal-based interface built with Ratatui\n- **Full .po File Support**: Complete parsing and writing of Gettext .po files\n- **Real-time Editing**: Edit translations, comments, and metadata inline\n- **Smart Filtering**: Filter by translation status (untranslated, fuzzy, all)\n- **Powerful Search**: Find entries by original text or translation\n- **Progress Tracking**: Visual progress indicators and statistics\n- **Syntax Highlighting**: Color-coded entry states (translated, fuzzy, untranslated)\n- **Multi-field Editing**: Edit msgid, msgstr, and comments\n- **Translation Status Management**: Mark entries as fuzzy or done with hotkeys\n- **Metadata Editing**: Edit header metadata (Language, Translator, etc.)\n- **.pot Template Support**: Create .po files from .pot templates\n- **Keyboard Shortcuts**: Vim-inspired navigation with modern shortcuts\n\n## Installation\n\n### From Source\n\n```bash\ngit clone https://github.com/AnmiTaliDev/poterm.git\ncd poterm\ncargo install --path .\n```\n\n## Usage\n\n### Basic Usage\n\n```bash\n# Edit an existing .po file\npoterm translations.po\n\n# Create a new .po file\npoterm --create new_translations.po\n\n# Create a new .po file from a .pot template\npoterm --from-pot template.pot translations.po\n```\n\n### Keyboard Shortcuts\n\n#### Navigation\n- `j` / `↓` - Next entry\n- `k` / `↑` - Previous entry\n- `Page Up` - Page up\n- `Page Down` - Page down\n- `Home` - First entry\n- `End` - Last entry\n\n#### Editing\n- `i` / `Enter` - Start editing current field\n- `Esc` - Stop editing / Cancel\n- `Tab` - Switch to next field (msgid → msgstr → comments)\n- `Shift+Tab` - Switch to previous field\n\n#### Search \u0026 Filter\n- `Ctrl+F` - Start search\n- `F3` - Find next\n- `Shift+F3` - Find previous\n- `Ctrl+U` - Toggle untranslated entries filter\n- `Ctrl+Z` - Toggle fuzzy entries filter\n\n#### File Operations\n- `Ctrl+S` - Save file\n- `Ctrl+Shift+P` - Save current entry\n- `Ctrl+Q` - Quit\n\n#### Translation Status\n- `F2` / `Ctrl+T` - Toggle fuzzy status of current entry\n- `Ctrl+D` - Mark current entry as done (remove fuzzy flag)\n\n#### Metadata\n- `F9` - Toggle metadata editing mode\n\n#### Help\n- `F1` - Show help overlay\n\n## Metadata Editing\n\nTo edit .po file metadata (header fields):\n\n1. **Enter Metadata Mode**: Press `Ctrl+M`\n2. **Navigate**: Use `↑`/`↓` or `j`/`k` to select metadata field\n3. **Edit Field**: Press `Enter` or `i` to start editing\n4. **Save Changes**: Press `Enter` to save, `Esc` to cancel\n5. **Exit Metadata Mode**: Press `Ctrl+M` again\n\n### Supported Metadata Fields\n\n- **Project-Id-Version**: Project name and version\n- **Language**: Language code (e.g., \"ru\", \"fr\", \"de\")\n- **Language-Team**: Translation team information\n- **Last-Translator**: Translator name and email\n- **Report-Msgid-Bugs-To**: Bug report contact\n- **POT-Creation-Date**: Template creation date\n- **PO-Revision-Date**: Last modification date (auto-updated)\n- **MIME-Version**: MIME version (usually \"1.0\")\n- **Content-Type**: Content type and charset\n- **Content-Transfer-Encoding**: Transfer encoding\n- **Plural-Forms**: Plural form rules for the language\n\n## .po File Format Support\n\nPoterm supports the complete Gettext .po file format including:\n\n- **msgid/msgstr**: Original and translated text\n- **msgctxt**: Message context\n- **Comments**: Translator comments (`# comment`)\n- **Extracted Comments**: Developer comments (`#. comment`)\n- **References**: Source file references (`#: file:line`)\n- **Flags**: Translation flags (`#, fuzzy`, `#, c-format`, etc.)\n- **Multiline strings**: Proper handling of multi-line translations\n- **Escape sequences**: Support for `\\n`, `\\t`, `\\\"`, etc.\n- **Header metadata**: Project information and translation metadata\n\n## Interface Overview\n\n```\n┌─ Poterm - translations.po ─────────────────────────────────────────────┐\n│ Total: 150 | Translated: 120 (80.0%) | Fuzzy: 10 | Untranslated: 20   │\n├────────────────────────────────────────────────────────────────────────┤\n│ ┌─ Entries [All] ────────────────┐ ┌─ Original Text (msgid) ─────────┐ │\n│ │ ✓   1 Hello World              │ │ Hello World                     │ │\n│ │ ~   2 Welcome to the app       │ │                                 │ │\n│ │ ○   3 Please enter your name   │ └─────────────────────────────────┘ │\n│ │ ✓   4 Submit                   │ ┌─ Translation (msgstr) ──────────┐ │\n│ │ ►   5 Cancel                   │ │ Hola Mundo                      │ │\n│ │                                │ │                                 │ │\n│ └────────────────────────────────┘ └─────────────────────────────────┘ │\n│                                    ┌─ Comments ──────────────────────┐ │\n│                                    │ This is a greeting message      │ │\n│                                    │                                 │ │\n│                                    └─────────────────────────────────┘ │\n│                                    ┌─ Information ───────────────────┐ │\n│                                    │ References: main.c:15           │ │\n│                                    │ Flags: c-format                 │ │\n│                                    └─────────────────────────────────┘ │\n├────────────────────────────────────────────────────────────────────────┤\n│ Ctrl+Q: Quit | Ctrl+S: Save | Enter: Edit | Tab: Switch | Ctrl+F: Search│\n└────────────────────────────────────────────────────────────────────────┘\n```\n\n### Status Icons\n- `✓` - Translated entry\n- `~` - Fuzzy translation (needs review)\n- `○` - Untranslated entry\n\n## Development\n\n### Building\n\n```bash\ncargo build\n```\n\n### Running Tests\n\n```bash\ncargo test\n```\n\n### Development Dependencies\n\n- Rust 1.70+\n- Cargo\n\n### Project Structure\n\n```\nsrc/\n├── main.rs        # Application entry point and CLI\n├── ui.rs          # TUI interface and event handling\n└── gettext.rs     # .po file parsing and manipulation\n\nCargo.toml         # Project configuration\nREADME.md          # This file\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nLicensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details.\n\n## Author\n\n**AnmiTaliDev** - [anmitali198@gmail.com](mailto:anmitali198@gmail.com)\n\nGitHub: [AnmiTaliDev/poterm](https://github.com/AnmiTaliDev/poterm)\n\n## Acknowledgments\n\n- Built with [Ratatui](https://github.com/ratatui-org/ratatui) for the terminal interface\n- Inspired by modern text editors and translation tools\n- Thanks to the Rust community for excellent crates and documentation\n\n---\n\n*Poterm aims to make .po file translation faster and more enjoyable for developers and translators alike.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanmitalidev%2Fpoterm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanmitalidev%2Fpoterm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanmitalidev%2Fpoterm/lists"}