This line is 1.2.x (stable). Patch and minor releases follow semver unless noted in docs/CHANGELOG.md. Always read the changelog before upgrading.
- Breaking for insecure setups: if
missing_translation_log.web_ui.enabled: trueand the app has no SecurityBundle (security.authorization_checker), the container will not compile (enforced byMissingLogWebUiSecurityPass). Fix by either:- Installing
symfony/security-bundle, enabling it inbundles.php, grantingrequired_role(defaultROLE_ADMIN), plus firewall /access_control; or - Setting
allow_unauthenticated: trueunderweb_ui— only for local tests without Security (the Symfony 8 demo uses option 1).
- Installing
- Demos:
demo/symfony7was removed; usedemo/symfony8(make -C demo up-symfony8). - YAML parsing: translation files larger than 2 MiB, deeper than 64 levels, or with more than 50 000 nodes are rejected. Raise limits only by constructing a custom
TranslationYamlFileHandlerif you override the service (defaults are intentional). - LibreTranslate: if you set a custom
libretranslate_base_url, add its hostname tolibretranslate_allowed_hosts(default onlylibretranslate.com). Uselibretranslate_allow_http: trueonly for local HTTP instances. fill-missing:--target-locale/ domain values with characters outside[a-zA-Z0-9_-]are rejected.- Optional MT limits (defaults keep previous behaviour):
machine_translation_min_interval_ms,machine_translation_max_requests_per_run,machine_translation_http_timeout(30s). - Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^1.0or^1.1already allows 1.2.0; prefer^1.2if you want this line explicitly).
- Optional: tag 1.1.3 adds Contributor Covenant, REQ-GIT-001 Git hygiene (hooks, CI, docs), expanded tests, and a refreshed
composer.lock. Applications depending onnowo-tech/translation-yaml-tools-bundlebehave the same as 1.1.2; bump withcomposer update nowo-tech/translation-yaml-tools-bundle(constraint^1.1already allows 1.1.3). - Contributors / maintainers: run
make setup-hooksonce per clone so commit messages cannot gain Cursor co-author trailers.
- Optional: tag 1.1.2 adds demo
.gitignorecoverage for/.phpunit.result.cache, ignores.cursor/sandbox.jsonat the repository root, and refreshes maintainer lockfiles. Applications depending onnowo-tech/translation-yaml-tools-bundlebehave the same as 1.1.1; bump withcomposer update nowo-tech/translation-yaml-tools-bundle(constraint^1.1already allows 1.1.2).
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^1.0or^1.1already allows 1.1.1). - Optional: patch release for Doctrine DBAL 4.x compatibility in
MissingTranslationLogRepository(deprecatedquoteIdentifier()replaced withquoteSingleIdentifier()). No configuration, route, or database migration.
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^1.0or^1.1already allows 1.1.0). - Missing-log Web UI: when
missing_translation_log.web_ui.enabledistrueand SecurityBundle is installed, the bundle now enforcesmissing_translation_log.web_ui.required_role(defaultROLE_ADMIN) onnowo_translation_yaml_tools_missing_log_*routes. Grant that role to integrators who should open the UI, or setrequired_role: nullunderweb_uito keep bundle-level checks disabled (same as 1.0.x when SecurityBundle was present but no subscriber existed). - No database migration. Spec Kit files (.specify/, specs/) are maintainer documentation only; they do not affect runtime in consuming apps.
- In Composer, require
^1.0(or pin1.0.x) to receive this line;^0.4does not pull 1.0.0. - No configuration, route, or database migration is required if you are already on 0.4.x with PHP 8.2+ and Symfony 7+ (or 8.x).
- 1.0.0 is a stability marker plus PHPStan / demo maintenance; runtime behaviour for normal bundle usage matches 0.4.1 unless you relied on calling
MissingTranslationLogRepository::getEntityManager()from custom code — useflush()/clearManaged()or your own repository API instead.
- Upgrade to 0.4.0 first (PHP 8.2+, Symfony 7+ — see To 0.4.0 below), then require
^1.0and runcomposer update nowo-tech/translation-yaml-tools-bundle.
The 0.4.x line ended at 0.4.1. It required PHP 8.2+ and Symfony 7+ from 0.4.0 onward.
- Optional: tag 0.4.1 fixes the Symfony 8 CI matrix (dev-only packages,
doctrine/doctrine-bundle^3.1 on Symfony 8) and enables Doctrine native lazy objects in missing-log unit tests on PHP 8.4+. Applications depending onnowo-tech/translation-yaml-tools-bundlebehave the same as 0.4.0; bump withcomposer update nowo-tech/translation-yaml-tools-bundle(constraint^0.4already allows 0.4.1).
- Breaking: requires PHP 8.2+ and Symfony 7+ (Symfony 6.x and PHP 8.1 are no longer supported).
- In Composer, require
^0.4(or pin0.4.x) to receive this line;^0.3does not pull 0.4.0. - Upgrade your application to PHP 8.2+ and Symfony 7+ (or 8.x) before running
composer update nowo-tech/translation-yaml-tools-bundle. - No YAML, route, or database migration changes are required beyond the platform bump.
- Optional: tag 0.3.10 refreshes the CI Symfony matrix,
symfony/var-exporterdev constraint, and demo lockfiles (Symfony 7.4 / 8.1). Applications depending onnowo-tech/translation-yaml-tools-bundlebehave the same as 0.3.9; bump only if you want the tag to matchmainafter those maintenance commits.
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.9). - Recommended if
missing_translation_log.enabledistrueand you use LexikTranslationBundle (or any bundle that calls extra methods on thetranslatorservice, such asgetFormats()): 0.3.9 makesRecordingTranslatorDecoratortransparent for those calls. No YAML or migration changes.
- Optional: tag 0.3.8 only refreshes demo lockfiles and
demo/symfony8/config/reference.php. Applications depending onnowo-tech/translation-yaml-tools-bundlebehave the same as 0.3.7; bump only if you want the tag to matchmainafter those demo-only commits.
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.7). - Deprecation fix only: constructor parameter order in
RecordingTranslatorDecoratorwas adjusted to avoid PHP runtime deprecations. - If you instantiate
RecordingTranslatorDecoratormanually with positional arguments in custom code/tests, update calls to:new RecordingTranslatorDecorator($inner, $recorder, $callSiteBuilder, $recordCallSite, $recordRequestContext)
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.6). - Missing-log API: if you implement
MissingTranslationRecorderInterfaceyourself, remove the previously introduced optional Twig-template argument fromrecord()so your signature matches 0.3.6. - Database: runtime persistence no longer writes
twig_template. Keeping that nullable column in existing tables is harmless. If you want a fully clean schema, drop it in your migration:- MySQL/MariaDB:
ALTER TABLE <prefix>missing_log DROP COLUMN twig_template; - PostgreSQL:
ALTER TABLE <prefix>missing_log DROP COLUMN twig_template; - SQLite: recreate table via migration / Doctrine diff as usual.
- MySQL/MariaDB:
- UI/ops: missing-log Web UI now includes two reset actions (clear all, clear current status) so manual SQL cleanup is usually unnecessary for day-to-day usage.
- Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.5). - Database: when
missing_translation_log.enabledistrue, run a migration ordoctrine:schema:updateso table{table_prefix}missing_loggainsrequest_route,request_method, andrequest_path(nullable strings). Existing rows keep whatevercall_sitealready contained; new hits store backtrace only incall_siteand HTTP data in the new columns. - PHP: if you implement
MissingTranslationRecorderInterfaceyourself, extendrecord()with the three new optional parameters (same defaults as the bundle’sDoctrineMissingTranslationRecorder). MissingTranslationBufferMessage/MissingTranslationBufferEvent: buffered rows includerequestRoute,requestMethod, andrequestPathkeys when async persist is used.
- No breaking changes for apps that do not customize the missing-log recorder. Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.4). sort,flatten,tree: if you relied on non-interactive mode requiring--locale,--domainalone now runs the command for all locales of that domain. Pass--localewhen you need a single file (same as before).tree: optional--fix-leaf-prefixand configyaml_tree_leaf_prefix_suffix(defaultindex) — seedocs/USAGE.mdanddocs/CONFIGURATION.md.
- No configuration or migration changes are required. Upgrade with
composer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.3). - 0.3.3 is primarily test-suite and internal clean-up (full line coverage on
src/,TranslationCallSiteResolver/ extension refactors,persistBuffercolumn-name fix). Runtime behaviour for normal bundle usage matches 0.3.2. DotKeyTreeAnalyzer,YamlArraySorter, andTranslationDefaultLocaleResolverare no longer declaredfinal. This does not change supported configuration or services; it only matters if custom tooling assumedfinalfor those classes (subclassing them was never part of the public API).
- Recommended if
missing_translation_log.enabledistrue: 0.3.2 fixes duplicate-key database errors when the same missing translation is recorded concurrently (e.g. parallel HTTP requests or multiple workers flushing the buffer). Persistence is unchanged from an app-configuration perspective: no migration beyond what you already have for{table_prefix}missing_log, and no YAML changes. Upgrade withcomposer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.2). - If you subclass or replace
MissingTranslationLogRepository, ensure yourpersistBufferimplementation remains consistent with the unique index onmessage_id,domain, andlocale(or call the parent).
- Strongly recommended if
missing_translation_log.web_ui.enabledistrue: 0.3.0 registered the bundle Twig namespace against…/translation-yaml-tools-bundle/Resources/views, which does not exist in the Composer package (views live undersrc/Resources/views). That breaksbin/console cache:clearwhen Twig warms the native filesystem loader. 0.3.1 fixes the path and keeps REQ-TWIG-001: whentemplates/bundles/NowoTranslationYamlToolsBundle/exists, the bundle callsprependPath()on the Twig loader so overrides win withouttwig.paths. Upgrade withcomposer update nowo-tech/translation-yaml-tools-bundle(constraint^0.3already allows 0.3.1). - No YAML, route, or PHP API changes are required beyond updating the dependency.
- If you added
twig.pathsentries only to work around the 0.3.0 path error, you can remove them after upgrading; the compiler pass registers the namespace when the Web UI is enabled.
- In Composer, require
^0.3(or pin0.3.x) to receive this line;^0.2does not pull 0.3.0. - Optional
missing_translation_log: requiresdoctrine/ormanddoctrine/doctrine-bundlein the app. Table name is{table_prefix}missing_log(default prefixnowo_translation_). The bundle prepends Doctrine mapping whenenabled: true. Seedocs/CONFIGURATION.md(“Missing translation log”). - Optional
missing_translation_log.web_ui: requiressymfony/twig-bundle, importing the bundle routes, andframework.csrf_protection+symfony/security-csrffor the Mark added form. The Flex recipe ships a dev-only route import. Use 0.3.1+ for a correct Twig loader path (see To 0.3.1 above). missing_translation_log.record_call_site(default true) fills columncall_sitewithabsolutePath:lineNumberof the calling code (not the YAML translation file path). Setfalseif you want to avoiddebug_backtracecost.missing_translation_log.async_persistandasync_persist_strategy(messenger|event_dispatcher): optional deferred flush.messengerneedssymfony/messengerandmessenger.default_bus(routeMissingTranslationBufferMessageto an async transport for workers).event_dispatcherusesMissingTranslationBufferEventon the appevent_dispatcher; callstopPropagation()in your listener if you enqueue and persist elsewhere so the builtin Doctrine listener is skipped.- Symfony 8 apps: the container may not define
translator.default_locale; the bundle’sTranslationDefaultLocaleResolveralready falls back tokernel.default_locale. If you read that parameter yourself, use the same pattern (seeTranslationDefaultLocaleResolver). - The bundle declares a direct Composer dependency on
symfony/translation(already pulled by FrameworkBundle in typical apps).
- In Composer, require
^0.2(or pin0.2.x) to receive this line;^0.1does not pull 0.2.0. - New console command
nowo:translation-yaml:audit(read-only; optional in your workflow). Seedocs/USAGE.md. machine_translator_by_locale(optional): route google / deepl / libretranslate per Symfony locale. If you omit it, behaviour matches 0.1.0 (singlemachine_translatordefault).machine_translation_locale_map(optional): map Symfony locale identifiers to exact API language codes for the active backend. Omit it if default normalization is enough.- The autowired
MachineTranslatorInterfaceis implemented byRoutingMachineTranslator, which delegates to the three built-in backends. All three services remain registered; set env keys for any backend you might route to (e.g.DEEPL_AUTH_KEYif any locale usesdeepl). - Custom
MachineTranslatorInterfacealiases in your app still replace the router entirely.
There is no earlier semver tag. If you tracked dev-main or a commit hash:
- Prefer requiring
^0.1(or an exact0.1.xtag) in Composer once published on Packagist. - Default machine translator remains
google; setmachine_translator: deeplorlibretranslateonly if you intend to use those backends (seedocs/CONFIGURATION.md). libretranslate_base_urlandlibretranslate_api_keyare optional and default to the public LibreTranslate origin and an empty key; no change is required for existing Google-only setups.