{"id":48235215,"url":"https://github.com/valpere/peretran","last_synced_at":"2026-04-04T19:57:37.921Z","repository":{"id":276765647,"uuid":"928941361","full_name":"valpere/peretran","owner":"valpere","description":"CLI Google Translator written on Golang","archived":false,"fork":false,"pushed_at":"2026-02-18T16:03:54.000Z","size":149,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-18T18:39:38.460Z","etag":null,"topics":["cobra-cli","csv","golang","google-api","translation","viper"],"latest_commit_sha":null,"homepage":"","language":"Go","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/valpere.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-07T14:19:21.000Z","updated_at":"2026-02-18T16:06:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"0a69ba42-defb-4451-8b42-417b460de49f","html_url":"https://github.com/valpere/peretran","commit_stats":null,"previous_names":["valpere/gootrago","valpere/peretran"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/valpere/peretran","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valpere%2Fperetran","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valpere%2Fperetran/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valpere%2Fperetran/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valpere%2Fperetran/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/valpere","download_url":"https://codeload.github.com/valpere/peretran/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valpere%2Fperetran/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31411420,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T19:29:44.979Z","status":"ssl_error","status_checked_at":"2026-04-04T19:29:11.535Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cobra-cli","csv","golang","google-api","translation","viper"],"created_at":"2026-04-04T19:57:37.333Z","updated_at":"2026-04-04T19:57:37.907Z","avatar_url":"https://github.com/valpere.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# peretran\n\nA CLI tool for translating text and CSV files using multiple translation services in parallel. It aggregates results and selects the best translation using an LLM arbiter, with an optional two-pass literary refinement stage.\n\n## Features\n\n- **Multi-service parallel translation** — Google Translate, Systran, MyMemory, Ollama (local LLM), OpenRouter (cloud LLM)\n- **LLM arbiter** — optional LLM-based evaluation selects or composes the best result from all services\n- **Two-pass refinement** — optional Stage 2 literary editor pass for higher-quality output\n- **Translation memory** — SQLite cache for instant retrieval of repeated translations\n- **Auto language detection** — detects source language automatically via [lingua-go](https://github.com/pemistahl/lingua-go)\n- **CSV support** — translate selected columns or all columns in CSV files\n\n## Installation\n\n### Prerequisites\n\n- Go 1.24+\n\n### Build from Source\n\n```bash\ngit clone https://github.com/valpere/peretran.git\ncd peretran\ngo build -o peretran\n```\n\n### Verify\n\n```bash\n./peretran --version\n```\n\n## Quick Start\n\n```bash\n# Translate with Google Translate (requires GOOGLE_APPLICATION_CREDENTIALS)\n./peretran translate -i input.txt -o output.txt -t uk\n\n# Translate with Ollama (local LLM, no API key required)\n./peretran translate -i input.txt -o output.txt -t uk --services ollama\n\n# Translate with multiple services and LLM arbiter\n./peretran translate -i input.txt -o output.txt -t uk \\\n  --services google,ollama,openrouter \\\n  --openrouter-key sk-or-... \\\n  --arbiter\n\n# Two-pass translation (parallel services + arbiter + literary refinement)\n./peretran translate -i input.txt -o output.txt -t uk \\\n  --services google,ollama \\\n  --arbiter --refine\n\n# Translate a CSV file (all columns)\n./peretran translate csv -i data.csv -o translated.csv -t uk\n\n# Translate specific columns (0-indexed)\n./peretran translate csv -i data.csv -o translated.csv -t uk -l 1 -l 3\n\n# Manage translation memory\n./peretran cache stats\n./peretran cache list\n./peretran cache clear\n```\n\n## Commands\n\n### `peretran translate`\n\nTranslate a text file using one or more services in parallel.\n\n```\nUsage:\n  peretran translate -i \u003cinput\u003e -o \u003coutput\u003e -t \u003clang\u003e [flags]\n\nFlags:\n  -i, --input string             Input file to translate (required)\n  -o, --output string            Output file for translation (required)\n  -t, --target string            Target language code, e.g. uk, es, fr (required)\n  -s, --source string            Source language code (default \"auto\")\n  -c, --credentials string       Path to Google Cloud credentials JSON\n  -p, --project string           Google Cloud Project ID\n\n  --services strings             Services to use, comma-separated (default [google])\n                                 Available: google, systran, mymemory, ollama, openrouter\n\n  --arbiter                      Use LLM arbiter to select/compose best translation\n  --arbiter-model string         Arbiter Ollama model (default \"llama3.2\")\n  --arbiter-url string           Arbiter Ollama URL (default \"http://localhost:11434\")\n\n  --refine                       Enable Stage 2 literary refinement (two-pass)\n  --refiner-model string         Refiner Ollama model (default \"llama3.2\")\n  --refiner-url string           Refiner Ollama URL (default \"http://localhost:11434\")\n\n  --ollama-url string            Ollama base URL (default \"http://localhost:11434\")\n  --ollama-models strings        Ollama models to rotate (uses default list if empty)\n  --openrouter-key string        OpenRouter API key\n  --openrouter-models strings    OpenRouter models to rotate (uses default list if empty)\n  --systran-key string           Systran API key\n  --mymemory-email string        MyMemory email for higher daily limits\n\n  --db string                    SQLite database path (default \"./data/peretran.db\")\n  --no-cache                     Disable translation memory cache\n```\n\n### `peretran translate csv`\n\nTranslate columns of a CSV file.\n\n```\nUsage:\n  peretran translate csv -i \u003cinput.csv\u003e -o \u003coutput.csv\u003e -t \u003clang\u003e [flags]\n\nFlags:\n  -i, --input string    Input CSV file (required)\n  -o, --output string   Output CSV file (required)\n  -t, --target string   Target language code (required)\n  -s, --source string   Source language code (default \"auto\")\n  -l, --column int      Column index to translate, 0-indexed (repeatable; default: all columns)\n\n  All --services, --arbiter, --refine, --ollama-*, --openrouter-* flags apply\n```\n\n### `peretran cache`\n\nManage the SQLite translation memory.\n\n```\nperetran cache stats               # Show entry counts and total hits\nperetran cache list                # List all entries\nperetran cache delete \u003cid\u003e         # Delete one entry by ID\nperetran cache clear               # Remove all entries\n```\n\n## Translation Services\n\n| Service | Free | Requires |\n|---------|------|----------|\n| `google` | Paid | `GOOGLE_APPLICATION_CREDENTIALS` or `-c` flag |\n| `systran` | Free tier | `--systran-key` |\n| `mymemory` | 5000 chars/day | Nothing (or `--mymemory-email` for higher limits) |\n| `ollama` | Free | Local Ollama instance running |\n| `openrouter` | Free models available | `--openrouter-key` |\n| `amazon` | — | Not implemented yet |\n| `ibm` | — | Not implemented yet |\n\n## How It Works\n\n```\nInput text\n    │\n    ▼\nCheck translation memory (SQLite cache)\n    │\n    ├── Hit → return cached result\n    │\n    └── Miss:\n        ▼\n        Stage 1: Parallel translation\n        ┌──────────┬──────────┬──────────┐\n        │ Google   │ Systran  │ Ollama   │ ...\n        └──────────┴──────────┴──────────┘\n            │\n            ▼\n        Arbiter (--arbiter, optional)\n        LLM selects or composes best result\n            │\n            ▼\n        Stage 2: Refinement (--refine, optional)\n        Literary editor pass for natural fluency\n            │\n            ▼\n        Save to cache → Write output file\n```\n\n## Configuration File\n\nOptional `~/.peretran.yaml`:\n\n```yaml\nservices:\n  google:\n    enabled: true\n  ollama:\n    enabled: true\n    base_url: \"http://localhost:11434\"\n    models:\n      - llama3.2\n      - gemma2:27b\n  openrouter:\n    enabled: false\n    api_key: \"${OPENROUTER_API_KEY}\"\n\narbiter:\n  enabled: true\n  model: \"llama3.2\"\n\nstorage:\n  database: \"./data/peretran.db\"\n```\n\n## Project Structure\n\n```\nperetran/\n├── main.go\n├── cmd/\n│   ├── root.go          # CLI entry, version\n│   ├── translate.go     # translate subcommand\n│   ├── csv.go           # translate csv subcommand\n│   ├── cache.go         # cache subcommand\n│   └── common.go        # shared service builder\n├── internal/\n│   ├── types.go         # common types\n│   ├── translator/      # service implementations\n│   │   ├── service.go   # TranslationService interface\n│   │   ├── google.go\n│   │   ├── systran.go\n│   │   ├── ollama.go\n│   │   ├── openrouter.go\n│   │   ├── mymemory.go\n│   │   ├── amazon.go    # stub\n│   │   └── ibm.go       # stub\n│   ├── orchestrator/    # parallel execution\n│   ├── arbiter/         # LLM evaluation\n│   ├── refiner/         # Stage 2 literary refinement\n│   ├── store/           # SQLite cache\n│   ├── detector/        # language detection\n│   └── markdown/        # markdown utilities\n├── docs/\n└── go.mod\n```\n\n## Language Codes\n\nUse ISO 639-1 codes: `en`, `uk`, `es`, `fr`, `de`, `zh`, `ja`, `ko`, `pl`, `pt`, ...\n\nUse `auto` to let peretran detect the source language automatically.\n\n## Documentation\n\n- [Installation Guide](docs/installation.md)\n- [Usage Examples](docs/usage.md)\n- [Configuration](docs/configuration.md)\n- [CSV Translation](docs/csv-translation.md)\n- [Quality Principles](docs/quality-principles.md)\n\n## License\n\nApache License 2.0. See [LICENSE](LICENSE).\n\n## Author\n\nValentyn Solomko — [valentyn.solomko@gmail.com](mailto:valentyn.solomko@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalpere%2Fperetran","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvalpere%2Fperetran","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalpere%2Fperetran/lists"}