Skip to content

feat(dataset-updater): Scenarii FR→EN/RU/PT translation configs (#219) - #232

Merged
jsboige merged 1 commit into
masterfrom
feat/scenarii-translation-configs
Apr 24, 2026
Merged

feat(dataset-updater): Scenarii FR→EN/RU/PT translation configs (#219)#232
jsboige merged 1 commit into
masterfrom
feat/scenarii-translation-configs

Conversation

@jsboige

@jsboige jsboige commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds DatasetUpdater infrastructure to translate the 76 untranslated scenarios per target language, closing the translation gap for Scenarii (167 total, 76-85 missing per lang).

Same pattern as PR #231 (Virtues translation configs), but adapted for the game-scenario context.

Changes

3 new DatasetUpdaterConfig entries (all Enabled = false)

  • Scenarii FR → EN — 85 scenarios with ≥1 missing EN field
  • Scenarii FR → RU — 76 scenarios missing _ru fields
  • Scenarii FR → PT — 76 scenarios missing _pt fields

Pattern: SequentialChunks, ChunkSize=8, SelectEmptyTargets=true, MaxGroupItemNb=12, UseFunctionCalling=true, MaxChildren=8, MaxDegreeOfParallelismWebService=4, model gpt-5.4-mini.

6 new Scenarii-specific prompt files

  • PromptScenariiTranslate{En,Ru,Pt}{User,Assistant}.txt

Why dedicated prompts? Scenarii are narrative game situations (not abstract taxonomy), so the prompts specifically enforce:

  • Field mapping discipline — EN target fields do NOT use _en suffix (historical design): catégorie→category, baratineur→smoothTalker, piocheur→drawer, enjeu→issue, suggestion→suggestion_en (sole suffixed field)
  • Narrative tone — rhythm, humor, brevity; avoid heavy/scholarly phrasing
  • Lexical consistency across the category taxonomy
  • pt-PT vs pt-BR — explicitly requests European Portuguese vocabulary (e.g. "telemóvel" not "celular")
  • Russian register — contemporary/natural for daily-life scenarios, not archaic/philosophical
  • Measured cultural adaptation — French personal names / cultural refs preserved or adapted depending on naturalness

Audit (empirical measurement)

Run on Cards/Scenarii/Argumentum Scenarii - Cards.csv:

Lang FR-complete rows with ≥1 missing target field
EN 85 / 167
RU 76 / 167
PT 76 / 167

All 167 rows have all 8 FR source fields populated. path is unique (167/167) and non-empty — valid PrimaryField.

Prerequisites

Validation

  • ✅ Build: 0 errors, 17 warnings (all pre-existing)
  • ✅ Tests: 88 pass, 1 skip (Freeplane GUI — interactive-only), 0 fail

Test plan

  • Merge & regenerate AssetConverterConfig.json from C# source
  • Set Enabled = true on one Scenarii config (e.g. EN) with TakeChunkNb = 1 for a dry-run on 8 scenarios
  • Verify UpdateRecord function calls fire, CSV is updated with translations
  • Validate translation quality on a sample (tone, field mapping, lexical consistency)
  • Run full translation campaign (EN then RU then PT) once sample validated

Closes

Closes #219 (pending successful end-to-end run with OpenAI key).

🤖 Generated with Claude Code

Adds 3 DatasetUpdaterConfig entries (Enabled=false) for translating the 76
untranslated scenarios per target language (EN/RU/PT) via OpenAI GPT-5.4-mini,
plus 6 Scenarii-specific prompt files (User + Assistant x 3 languages).

Audit (167 total FR-complete scenarios):
- EN: 85 scenarios missing ≥1 field (category, subcategory, title,
  smoothTalker, drawer, context, issue, suggestion_en)
- RU: 76 scenarios missing _ru fields
- PT: 76 scenarios missing _pt fields

Config pattern mirrors #231 (Virtues): SequentialChunks, ChunkSize=8,
SelectEmptyTargets=true, MaxGroupItemNb=12, UseFunctionCalling=true.
Each config uses a dedicated prompt pair tailored to scenario context:
- Scenarii-specific field mapping (catégorie→category, baratineur→smoothTalker,
  piocheur→drawer, enjeu→issue, suggestion→suggestion_en — only one with suffix)
- Narrative-tone instructions (rhythm, humor, brevity)
- pt-PT (not pt-BR); Russian contemporary register (not archaic)
- Category/subcategory consistency across scenarios
- Measured adaptation of French cultural references

Prerequisites satisfied: SDK migration #183 (PR #210) + GPT-5.x models (PR #222).
Scenario.cs entity already had complete i18n scaffolding (EN without _en suffix
is historical design; RU/PT use suffix).

Build: 0 errors, 17 warnings (pre-existing).
Tests: 88 pass, 1 skip (Freeplane GUI), 0 fail.

Closes #219 (pending successful end-to-end run with OpenAI key).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feat/scenarii-translation-configs branch from acd983b to 5f47e68 Compare April 24, 2026 00:52
@jsboige
jsboige merged commit dbae5d5 into master Apr 24, 2026
1 check passed
jsboige added a commit that referenced this pull request Apr 25, 2026
…anslations + fix BOM bug + csproj wildcards (#236)

Closes #236.

## Summary

### Prompt refinement (#236)
- Fix hallucinated "Vous → impératif" instruction (FR descriptions are declarative/nominal, not 2nd person)
- Add canonical family mapping (9 EN / 12 PT / 12 RU families with fixed translations)
- Wikipedia link caveat (no fabricated URLs, leave empty if uncertain)
- Align assistant prompts with corrected user prompts

### csproj copy gap fix (#236)
- Replace 21 explicit `<None Update>` entries with 2 wildcards (`*.txt`, `*.json`)
- Fixes latent bug from #228/#231/#232: 21 resource files (Virtues/Scenarii/Rules prompts, CSV samples, Fallacies JSON) were not copied to bin output, blocking DatasetUpdater runs

### Virtues taxonomy translation campaign
- EN: 218/223 (97.8%), 1468 _en fields
- PT: 223/223 (100%), 1503 _pt fields (links cleared due to hallucination risk — see follow-up note)
- RU: 220/223 (98.7%), 1480 _ru fields
- All 8 family translations consistent across each language

### TokenManager fix
- SharpToken throws on unknown models (e.g. gpt-5.4-mini) — added try/catch with cl100k_base fallback

### Critical bug fix: BOM accumulation in DatasetUpdater
- `UtilityExtensions.cs`: strip BOM on read with `TrimStart('')`
- `DataSetInfo.cs`: write without BOM via `new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)`
- CSV: stripped 3 accumulated BOMs from header (1 per translation cycle EN/PT/RU)
- Without fix: CsvHelper would silently mismatch `pk` column header → empty PK column → broken `SelectEmptyTargets` idempotency for all future DatasetUpdater runs

### Review feedback follow-ups
1. EN subsubfamily inconsistency — pk=4,5 "Actual argument" → "Real argument" (matching pk=3, canonical mapping)
2. PT links cleared (203 URLs) — conservative cleanup vs hallucination risk, can be regenerated via future PT run with corrected prompt + caveat

## Validation
- ✅ Build: 0 errors, 17 warnings (identical to master)
- ✅ Tests: 88 pass / 0 fail / 1 skip (identical to master)
- ✅ CSV: 0 BOM, header `pk` clean
- ✅ EN consistency: 3× "Real argument", 0× "Actual argument"

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@clusterManager-Myia

Copy link
Copy Markdown
Collaborator

Post-hoc review — PR #232 feat(dataset-updater): Scenarii FR→EN/RU/PT translation configs (#219)

Verdict: ✅ LGTM

Well-structured DatasetUpdater configs for translating 76 untranslated scenarios per language. Same proven pattern as other translation configs.

Positive:

  • All 6 new configs (EN, RU, PT × 2 division modes) are Enabled = false.
  • SelectEmptyTargets = true — safe, won't overwrite.
  • Field mapping is explicit and correct: catégorie→category, baratineur→smoothTalker, piocheur→drawer, enjeu→issue.
  • Prompt templates are thorough: function calling instructions, lexical consistency requirements, narrative tone guidance, pt-PT vs pt-BR distinction.
  • EN prompt correctly notes suggestionsuggestion_en is the only field with a suffix.

Observations:

  • PT prompt includes explicit pt-PT examples ("telemóvel" pas "celular") — excellent.
  • RU prompt allows "Аргументум" transliteration — good cultural adaptation.
  • 7 fields per scenario × 76 scenarios × 3 languages = significant translation surface area. The MaxDegreeOfParallelismWebService = 3 is conservative and appropriate.

No regressions. Good infrastructure addition.

@jsboige
jsboige deleted the feat/scenarii-translation-configs branch June 1, 2026 21:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(data): complete Scenarii translations (77 missing EN/RU/PT)

2 participants