|
| 1 | +# langcodec Roadmap |
| 2 | + |
| 3 | +This document outlines progressive, bite‑sized tasks to enhance langcodec and langcodec‑cli. It’s structured so we can pick items incrementally and track progress over time. |
| 4 | + |
| 5 | +Legend: [ ] todo, [x] done, [~] in progress |
| 6 | + |
| 7 | +## Recently Completed |
| 8 | + |
| 9 | +- [x] Android `<plurals>` parse/write support (library) |
| 10 | +- [x] `.strings` writer escaping (quotes, backslashes, control chars) |
| 11 | +- [x] Symmetric language matching for multi‑language formats (`xcstrings`, `csv`, `tsv`) |
| 12 | +- [x] CLI view prints “Type: Plural” and plural categories |
| 13 | +- [x] Conversion tests: CSV→Android, XCStrings→Android (with plurals) |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## M1. Quality & Safety |
| 18 | + |
| 19 | +- [ ] Placeholder normalization and validation |
| 20 | + - [ ] Mapping between iOS (`%1$@`, `%d`) and Android (`%1$s`, `%d`) |
| 21 | + - [ ] Detect placeholder mismatches across languages; fail in strict mode, warn otherwise |
| 22 | + - [ ] Auto‑fix option for common cases (`%@` → `%s`, `%1$@` → `%1$s`) |
| 23 | + - [ ] Tests across `.strings`, Android, `.xcstrings` |
| 24 | +- [ ] Plural rules engine |
| 25 | + - [ ] CLDR‑driven required category sets per locale (few/many/etc.) |
| 26 | + - [ ] Validation pass: flag missing categories per key+locale |
| 27 | + - [ ] CLI: `view --check-plurals` and `validate` output |
| 28 | +- [ ] Strict vs. permissive parsing |
| 29 | + - [ ] Global setting in lib; CLI `--strict` flag |
| 30 | + - [ ] Consistent error surfaces with actionable context |
| 31 | +- [ ] Better error context |
| 32 | + - [ ] Include file path and entry id for parse/convert errors |
| 33 | + - [ ] (Optional) capture line/column when parser knows it |
| 34 | + |
| 35 | +## M2. Formats |
| 36 | + |
| 37 | +- [ ] Apple `.stringsdict` (plurals/select) |
| 38 | +- [ ] Flutter `.arb` |
| 39 | +- [ ] Gettext `.po` |
| 40 | +- [ ] XLIFF 1.2 / 2.0 |
| 41 | +- [ ] (Later) ICU MessageFormat v2 (exploration) |
| 42 | + |
| 43 | +For each new format: |
| 44 | + |
| 45 | +- [ ] Implement `Parser` and conversions to/from `Resource` |
| 46 | +- [ ] Round‑trip tests + cross‑conversion tests |
| 47 | +- [ ] CLI convert + view coverage |
| 48 | +- [ ] README updates |
| 49 | + |
| 50 | +## M3. CSV/TSV Schema |
| 51 | + |
| 52 | +- [ ] Optional extended columns: `comment`, `status`, `context`, `developer_note` |
| 53 | +- [ ] CLI: `--schema` flag (e.g., `basic`, `extended`, custom mapping) |
| 54 | +- [ ] Lossless round‑trip for supported metadata |
| 55 | +- [ ] Tests to ensure consistent ordering and schema stability |
| 56 | + |
| 57 | +## M4. CLI UX |
| 58 | + |
| 59 | +- [ ] `diff` subcommand |
| 60 | + - [ ] Compare two files; output added/removed/changed keys by language |
| 61 | + - [ ] Machine‑readable JSON output and pretty mode |
| 62 | +- [ ] `stats` subcommand |
| 63 | + - [ ] Per‑language counts by `EntryStatus`, completion %, missing plurals |
| 64 | +- [ ] `normalize` subcommand |
| 65 | + - [ ] Canonicalize whitespace, escapes, key casing; optional rules |
| 66 | +- [ ] Filters and export |
| 67 | + - [ ] `view --where 'status=stale and lang in(en,fr)' --format csv` |
| 68 | + - [ ] `--grep` for key/value regex |
| 69 | +- [ ] Stdio support: `-` for stdin/stdout across commands |
| 70 | +- [ ] Config file: `langcodec.toml` for project defaults (langs, merge strategy, schema, placeholder policy) |
| 71 | + |
| 72 | +## M5. Developer Experience |
| 73 | + |
| 74 | +- [ ] API ergonomics |
| 75 | + - [ ] Borrowed iterators and helpers: `iter_keys()`, `iter_entries(lang)` |
| 76 | + - [ ] Mutators: `rename_key`, `bulk_rename`, `map_values` |
| 77 | +- [ ] Deterministic ordering everywhere (keys, languages) |
| 78 | +- [ ] Provenance tracking (source file, optional line) per entry |
| 79 | +- [ ] Benchmarks (Criterion) for parse/convert/merge |
| 80 | + |
| 81 | +## M6. Ecosystem & Distribution |
| 82 | + |
| 83 | +- [ ] WASM target (browser/Node) for view/convert/diff in web tools |
| 84 | +- [ ] GitHub Action templates |
| 85 | + - [ ] Validate PRs, enforce placeholder policy, fail on regressions |
| 86 | + - [ ] Example workflows in `.github/workflows/examples/` |
| 87 | +- [ ] Documentation site |
| 88 | + - [ ] Task‑oriented guides (convert recipes, plural pitfalls, placeholder mapping) |
| 89 | + - [ ] API docs deep links; examples gallery |
| 90 | + |
| 91 | +## Testing Strategy |
| 92 | + |
| 93 | +- [ ] Start with unit tests near each format parser/writer |
| 94 | +- [ ] Add conversion matrix tests for common paths (strings↔android↔xcstrings↔csv/tsv) |
| 95 | +- [ ] Property tests where feasible (e.g., round‑trip invariants) |
| 96 | +- [ ] Large sample corpora in `tests/data/` for regression |
| 97 | + |
| 98 | +## Contribution Guide Enhancements |
| 99 | + |
| 100 | +- [ ] Add coding standards and commit message conventions |
| 101 | +- [ ] Issue templates for formats vs CLI vs core |
| 102 | +- [ ] Local dev quickstart and common cargo commands |
| 103 | + |
| 104 | +## Release Checklist (per minor) |
| 105 | + |
| 106 | +- [ ] Update README Supported Formats table |
| 107 | +- [ ] Changelog highlights (breaking changes, new formats, CLI flags) |
| 108 | +- [ ] Version bumps in workspace `Cargo.toml` and README |
| 109 | +- [ ] Tag + GitHub release notes |
| 110 | + |
| 111 | +--- |
| 112 | + |
| 113 | +If you pick up an item, feel free to mark it with [~] and open a PR referencing this roadmap. |
0 commit comments