Weblate Merge Conflict Blocks October Next Fest String Freeze for Store Capsules - How to Fix
Problem: Your Weblate project shows merge conflicts on multiple components. Export is blocked or produces stale PO files. October Next Fest is two weeks out, but Steam capsule screenshots and short description are still English-only while translators insist they “finished CN/JP/KR.”
Who is affected now: Teams that refreshed the 18 Free localization tooling list for CN/JP/KR capsules but skipped the dedicated Weblate string-freeze workflow. June–July 2026 fest prep stacks parallel translator edits, fuzzy flags, and wrong VCS branches into a hard stop the week before creative lock—not a missing translation API.
Fastest safe fix: Declare a string-freeze window → open Weblate Alerts / conflict list → resolve every conflict with glossary lock (no ad-hoc CSV bypass) → export clean PO per locale → run store-page QA checklist screenshot text vs PO → file string_freeze_receipt_v1.json with conflict_count: 0 → set string_freeze_date on BUILD_RECEIPT before trailer subtitle burn-in.
Direct answer
Weblate will not export trustworthy PO while merge conflicts exist—the TMS is protecting you from shipping two different truths for the same string key. Fix conflicts in Weblate, not by emailing CSVs around the repo. Store capsules stay English until exported PO is imported into the engine and screenshots are recaptured from the localized build.
Why this issue spikes in June–July 2026
- October creative lock — Trailer and capsule art need final UI strings; late PO breaks burn-in.
- CN/JP/KR rush — Three locales edited in parallel on the same keys.
- Fuzzy flags ignored — “100% translated” in dashboard but conflicts still open.
- Wrong branch — Weblate tracks
mainwhile fest strings live onfest_demo. - CSV bypass temptation — Producer merges spreadsheets; Weblate state diverges from git.
- Store-truth week — 7-day metadata sprint expects localized screenshots, not English captures with translated PO sitting in Drive.
Symptoms and search phrases
- Weblate Alerts: merge conflict on one or more components.
- Download translation greyed out or exports old commit hash.
- Translators marked done; English screenshots still on Steam backend.
- Engine shows mixed languages—some keys CN, some EN on same screen.
- Git shows manual
.poedits bypassing Weblate. - Trailer already rendered with English subs; PO “finished” yesterday.
string_freeze_datemissing on BUILD_RECEIPT row.
Root causes (check in order)
- Parallel edits on same string without review merge.
- Fuzzy / needs editing not cleared before export.
- Wrong repository branch in Weblate component settings.
- Manual CSV import desynced from VCS truth.
- Glossary not locked — translators invent conflicting terms for UI buttons.
- Export before conflict resolution — partial PO imported to Unity/Godot.
- Screenshot capture from English build — PO correct, store still wrong.
Beginner path (first 60 minutes)
Prerequisites: Weblate admin access, fest target locales listed (e.g. zh_Hans, ja, ko), engine project that imports PO or CSV.
- Open Weblate → Manage → Alerts — note conflict count.
- Post freeze window in team chat: no new English source changes until receipt passes.
- Resolve top 10 conflicts using glossary (Step 2 below).
- Export one locale smoke PO → import to engine → launch localized build.
- Capture one screenshot — text must match PO for that locale.
- If pass → continue until all locales export; if fail → stop store uploads.
Common mistake: Recapturing screenshots from Editor English play mode while PO targets fest branch only.
Fastest safe fix path
Step 1 — String-freeze window policy
| Rule | Detail |
|---|---|
| Freeze start | Document UTC timestamp in release-evidence/l10n/FREEZE.md |
| English source | No new keys on fest branch without Weblate admin approval |
| Hotfix path | Only P0 gameplay blockers; re-open freeze explicitly |
| Trailer | No subtitle burn-in until string_freeze_receipt passes |
Announce freeze before asking translators to “finish everything tonight.”
Step 2 — Resolve conflicts with glossary lock
- Lock glossary in Weblate — character names, ability names, UI verbs (
Start,Options). - Open Browse → filter “Has conflict” (or Alerts list).
- For each conflict: pick source-faithful or glossary-compliant side; never leave “both” ambiguous.
- Clear fuzzy on resolved rows.
- Re-run repository push / commit hook if your integration requires it.
Official: Weblate translating, Glossary and checks.
Step 3 — Verify component branch and export
| Check | Pass |
|---|---|
Component tracks fest git branch (not stale main) |
Yes |
| Alerts show 0 merge conflicts | Yes |
| Export produces new file hash vs yesterday | Yes |
msgfmt / engine import reports 0 errors |
Yes |
# Example: verify PO compiles (gettext)
msgfmt --check -o NUL .\export\game_zh_Hans.po
Unity / Godot: import via your localization tooling path—do not hand-merge cells into production CSV on fest SKU.
Step 4 — Export proof bundle
Zip per locale for producers:
release-evidence/l10n/string-freeze-2026-10/
game_zh_Hans.po
game_ja.po
game_ko.po
weblate_export_log.txt
screenshot_zh_Hans.png
screenshot_ja.png
screenshot_ko.png
Step 5 — string_freeze_receipt_v1.json
{
"schema": "string_freeze_receipt_v1",
"freeze_date": "2026-07-15",
"weblate_project": "your-game",
"conflict_count": 0,
"locales_exported": ["zh_Hans", "ja", "ko"],
"fuzzy_count": 0,
"store_screenshot_parity_ok": true,
"trailer_subtitle_burn_in_allowed": true,
"pass": true
}
Attach to BUILD_RECEIPT:
| Column | Example |
|---|---|
string_freeze_date |
2026-07-15 |
string_freeze_receipt |
pass |
locales |
zh_Hans,ja,ko |
Step 6 — Store-page QA pass
Run 18 Free store-page QA localization checklist:
- [ ] Short description matches supported languages matrix on Steamworks
- [ ] Each capsule screenshot shows correct script (not English UI with “fully localized” claim)
- [ ] FAQ rows match demo scope parity
- [ ] Trailer frames audited per trailer frame checklist
Working dev path — CI gate
Fail promotion if Weblate API or export artifact reports conflicts:
import json, subprocess, sys
receipt = {
"schema": "string_freeze_receipt_v1",
"conflict_count": int(subprocess.check_output(
["weblate", "list-alerts", "--format=json"], text=True
).count("merge_conflict")), # adapt to your CLI/wrapper
}
if receipt["conflict_count"] != 0:
print(json.dumps(receipt, indent=2))
sys.exit(1)
| Check | Artifact | Pass |
|---|---|---|
| Conflicts | Weblate Alerts | 0 |
| PO compile | msgfmt --check |
exit 0 |
| Screenshots | screenshot_*.png |
script matches locale |
| Receipt | string_freeze_receipt_v1.json |
pass: true |
| BUILD_RECEIPT | upload log | string_freeze_date set |
Pair with Wednesday demo smoke metadata diff.
Verification checklist
- [ ] Weblate 0 merge conflicts on fest components
- [ ] All target locales export clean PO
- [ ] Engine build shows localized UI for each locale smoke-tested
- [ ] Store screenshots recaptured from localized builds
- [ ]
string_freeze_receipt_v1.jsonpass: true - [ ] BUILD_RECEIPT includes
string_freeze_date - [ ] Trailer burn-in not started before receipt (or subs re-rendered after)
- [ ] No manual CSV bypass on fest branch without Weblate sync
Prevention
- Use 14 Free Weblate string-freeze tools as the freeze-week bookmark spine.
- Lock glossary before inviting community translators.
- One fest branch in Weblate—mirror playtest isolation discipline for strings.
- Schedule freeze two weeks before creative lock, not two days.
- Ban spreadsheet bypass on fest SKU—Weblate is source of truth.
Troubleshooting
| Symptom | Fix |
|---|---|
| Conflicts return after export | New English commits during freeze—re-freeze or cherry-pick |
| PO OK, screenshots English | Wrong build captured—install localized fest build |
| 100% translated, conflicts remain | Dashboard metric ≠ conflict clearance—open Alerts |
| Only one locale blocked | Component split per locale—fix branch on that component |
| Engine import errors | Plural rules—see gettext manual in tooling resource |
| Trailer already wrong language | Re-render after PO import; update receipt |
FAQ
Can we ship English store page and patch locales after fest?
You can, but declare honest Supported Languages on Steam—do not claim CN/JP/KR on capsules you have not captured. Misrepresentation drives refunds per store-demo mismatch case study.
Is Crowdin/Poedit enough without Weblate?
Different stack—this article is Weblate merge conflicts. If you use POEditor only, enforce the same conflict_count: 0 discipline via review locks.
Does string freeze block gameplay bugfixes?
Freeze applies to user-visible strings on fest branch—code fixes without new keys are fine; new UI copy requires freeze exception logged on BUILD_RECEIPT.
Related links
- Steam Short Description Over 300 Characters After CJK Export
- 14 Free Weblate String Freeze and PO Export Tools (2026)
- 18 Free Game Localization and Translation Tooling Picks
- 18 Free Store Page QA Localization Checklist
- 7-day Store Metadata Parity Sprint
- Steam Store Trailer Frame and Demo Scope Audit
- 18 Free Localization QA Tools (listicle)
- Your First BUILD_RECEIPT JSON and Upload Log
- Wednesday Demo Build Smoke Ritual
- Official: Weblate documentation, Steamworks Supported Languages
Clear Weblate conflicts before PO export—English capsules with “done” translations in a spreadsheet are not a string freeze.