@@ -1312,6 +1312,136 @@ adapted to the format required by GitHub, but you can force that format too:
1312
1312
1313
1313
$ php vendor/bin/yaml-lint translations/
1314
1314
1315
+ Pseudo-localization translator
1316
+ ------------------------------
1317
+
1318
+ .. versionadded :: 5.2
1319
+
1320
+ The pseudolocalization translator was introduced in Symfony 5.2.
1321
+
1322
+ .. note ::
1323
+
1324
+ The pseudolocalization translator is meant to be used for development only.
1325
+
1326
+ The following image shows the main menu of the interface of a popular Internet
1327
+ service:
1328
+
1329
+ .. image :: /_images/translation/pseudolocalization-interface-original.png
1330
+
1331
+ This other image shows the same menu when the user switches the language to
1332
+ Spanish. Unexpectedly, some text is cut and other contents are so long that
1333
+ they overflow and you can't see them:
1334
+
1335
+ .. image :: /_images/translation/pseudolocalization-interface-translated.png
1336
+
1337
+ These kind of errors are very common, because different languages can be longer
1338
+ or shorter than the original application language. Another common issue is to
1339
+ only check if the application works when using basic accented letters, instead
1340
+ of checking for more complex characters such as the ones found in Polish,
1341
+ Czech, etc.
1342
+
1343
+ These problems can be solved with `pseudolocalization `_, a software testing method
1344
+ used for testing internationalization. In this method, instead of translating
1345
+ the text of the software into a foreign language, the textual elements of an
1346
+ application are replaced with an altered version of the original language.
1347
+
1348
+ For example, ``Account Settings `` is *translated * as ``[!!! Àççôûñţ
1349
+ Šéţţîñĝš !!!] ``. First, the original text is expanded in length with characters
1350
+ like ``[!!! !!!] `` to test the application when using languages more verbose
1351
+ than the original one. This solves the first problem.
1352
+
1353
+ In addition, the original characters are replaced by similar but accented
1354
+ characters. This makes the text highly readable, while allowing to test the
1355
+ application with all kinds of accented and special characters. This solves the
1356
+ second problem.
1357
+
1358
+ Full support for pseudolocalization was added to help you debug
1359
+ internationalization issues in your applications. You can enable and configure
1360
+ it in the translator configuration:
1361
+
1362
+ .. configuration-block ::
1363
+
1364
+ .. code-block :: yaml
1365
+
1366
+ # config/packages/translation.yaml
1367
+ framework :
1368
+ translator :
1369
+ pseudo_localization :
1370
+ # replace characters by their accented version
1371
+ accents : true
1372
+ # wrap strings with brackets
1373
+ brackets : true
1374
+ # controls how many extra characters are added to make text longer
1375
+ expansion_factor : 1.4
1376
+ # maintain the original HTML tags of the translated contents
1377
+ parse_html : true
1378
+ # also translate the contents of these HTML attributes
1379
+ localizable_html_attributes : ['title']
1380
+
1381
+ .. code-block :: xml
1382
+
1383
+ <!-- config/packages/translation.xml -->
1384
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
1385
+ <container xmlns =" http://symfony.com/schema/dic/services"
1386
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
1387
+ xmlns : framework =" http://symfony.com/schema/dic/symfony"
1388
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
1389
+ https://symfony.com/schema/dic/services/services-1.0.xsd
1390
+ http://symfony.com/schema/dic/symfony
1391
+ https://symfony.com/schema/dic/symfony/symfony-1.0.xsd" >
1392
+
1393
+ <framework : config >
1394
+ <framework : translator >
1395
+ <!-- accents: replace characters by their accented version -->
1396
+ <!-- brackets: wrap strings with brackets -->
1397
+ <!-- expansion_factor: controls how many extra characters are added to make text longer -->
1398
+ <!-- parse_html: maintain the original HTML tags of the translated contents -->
1399
+ <framework : pseudo-localization
1400
+ accents =" true"
1401
+ brackets =" true"
1402
+ expansion_factor =" 1.4"
1403
+ parse_html =" true"
1404
+ >
1405
+ <!-- also translate the contents of these HTML attributes -->
1406
+ <framework : localizable-html-attribute >title</framework : localizable-html-attribute >
1407
+ </framework : pseudo-localization >
1408
+ </framework : translator >
1409
+ </framework : config >
1410
+ </container >
1411
+
1412
+ .. code-block :: php
1413
+
1414
+ // config/packages/translation.php
1415
+ use Symfony\Config\FrameworkConfig;
1416
+
1417
+ return static function (FrameworkConfig $framework) {
1418
+ // ...
1419
+ $framework
1420
+ ->translator()
1421
+ ->pseudoLocalization()
1422
+ // replace characters by their accented version
1423
+ ->accents(true)
1424
+ // wrap strings with brackets
1425
+ ->brackets(true)
1426
+ // controls how many extra characters are added to make text longer
1427
+ ->expansionFactor(1.4)
1428
+ // maintain the original HTML tags of the translated contents
1429
+ ->parseHtml(true)
1430
+ // also translate the contents of these HTML attributes
1431
+ ->localizableHtmlAttributes(['title'])
1432
+ ;
1433
+ };
1434
+
1435
+ That's all. The application will now start displaying those strange, but
1436
+ readable, contents to help you internationalize it. See for example the
1437
+ difference in the `Symfony Demo `_ application. This is the original page:
1438
+
1439
+ .. image :: /_images/translation/pseudolocalization-symfony-demo-disabled.png
1440
+
1441
+ And this is the same page with pseudolocalization enabled:
1442
+
1443
+ .. image :: /_images/translation/pseudolocalization-symfony-demo-enabled.png
1444
+
1315
1445
Summary
1316
1446
-------
1317
1447
@@ -1349,3 +1479,5 @@ Learn more
1349
1479
.. _`Machine object format` : https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
1350
1480
.. _`QT Translations TS XML` : https://doc.qt.io/qt-5/linguist-ts-file-format.html
1351
1481
.. _`GitHub Actions` : https://docs.github.com/en/free-pro-team@latest/actions
1482
+ .. _`pseudolocalization` : https://en.wikipedia.org/wiki/Pseudolocalization
1483
+ .. _`Symfony Demo` : https://github.com/symfony/demo
0 commit comments