traduire
"Internationalisation" (souvent abrégé en i18n) fait référence à l'extraction de chaînes et d'autres fragments ayant des caractéristiques régionales de votre programme et en fonction de la région de l'utilisateur (comme la langue, le pays) et à les placer sur un calque qui peut être traduit et transformé. Pour le texte, cela signifie supprimer chaque partie du texte avec une fonction qui le traduit (ou "informations") dans la langue souhaitée par l'utilisateur :
// 文本始终以英语输出echo 'Hello World'; // 文本将以用户指定语言或默认英语输出echo $translator->trans('Hello World');
locale signifie, en termes simples, la langue et le pays de l'utilisateur. Il peut s'agir de n'importe quelle chaîne du programme et est utilisé pour gérer la traduction et d'autres informations de format (telles que la devise). Il est recommandé d'utiliser le code de langue ISO 639-1, d'ajouter un trait de soulignement (_
), suivi d'un ISO 3166-1 alpha-2_
),再跟一个ISO 3166-1 alpha-2国家代码(比如fr_FR
这个locale是指“法国法语”French/France)。
在本章,你将学习如何使用Symfony框架中的translation组件。你可以阅读翻译组件来了解更多。整体上,翻译的过程有如下几步:
开启和配置Symfony的翻译服务;
将字符串抽象出来(如“xxxx”),这是通过调用Translator去剥离它们来实现的 ;(参考 翻译基础)
针对每个被支持的locale,创建翻译资源/文件,用于翻译程序中每一个待译字串;
针对request(请求)和可选的 基于用户整个session过程,来 确定、设置和管理用户的locale信息。
配置 ¶
翻译的过程是通过translator
Code pays (par exemple, fr_FR
cette locale fait référence à "Français Français" Français/France).
- 🎜Ouvrir et configurer 🎜Le service de traduction de Symfony ; 🎜
- 🎜Chaînes abstraites (telles que "xxxx"), ce qui est obtenu en appelant Translator pour les supprimer (Référence Bases de la traduction🎜) 🎜
- 🎜Pour chaque langue prise en charge, créez des ressources/fichiers de traduction🎜 pour chaque chaîne à traduire dans le programme de traduction ;🎜
- 🎜Pour demande (request) et facultative basée sur l'ensemble du processus de session de l'utilisateur 🎜, venez à déterminer, définir et gérer les informations locales de l'utilisateur🎜. 🎜
Configuration ¶🎜
🎜Le processus de traduction se fait viatraducteur code>, qui utilise les paramètres régionaux spécifiés par l'utilisateur pour rechercher et renvoyer les informations traduites. Avant d'utiliser le traducteur, activez-le dans le fichier de configuration : 🎜PHP:// app/config/config.php$container->loadFromExtension('framework', array('translator' => array('fallbacks' => array('en')),));
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:framework="http://symfony.com/schema/dic/symfony" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> <framework:config>
<framework:translator>
<framework:fallback>en</framework:fallback>
</framework:translator>
</framework:config></container>
🎜YAML:# app/config/config.ymlframework:translator: { fallbacks: [en] }
🎜À propos du mot-clé fallbacks et de la façon dont Symfony gère lorsque la langue de traduction est introuvable, veuillez vous référer à Rollback des paramètres régionaux pendant la traduction pour plus de détails.
Les informations locales utilisées dans la traduction sont stockées dans l'objet de requête. Il est généralement défini sur l'attribut _locale
dans le routage. Veuillez vous référer à Les paramètres régionaux et l'URL_locale
属性。请参考 The Locale and the URL。
翻译基础 ¶
translator
服务负责完成对文本的翻译。为了翻译一个文本块(被称为“message”,以下称作“信息”),使用trans()方法。例如,你要在controller中翻译一个简单的信息:
// ...use Symfony\Component\HttpFoundation\Response; public function indexAction(){$translated = $this->get('translator')->trans('Symfony is great'); return new Response($translated);}
上述代码被执行后,Symfony就尝试基于用户的 locale
.
Bases de la traduction ¶translator🎜
se charge de finaliser la traduction du texte. Pour traduire un bloc de texte (appelé « message », ci-après appelé « information »), utilisez la méthode trans(). Par exemple, vous souhaitez traduire un message simple dans le contrôleur : 🎜PHP:// messages.fr.phpreturn array('Symfony is great' => 'J\'aime Symfony',);
🎜Une fois le code ci-dessus exécuté, Symfony essaiera de traduire le message "Symfony is great" en fonction du locale
de l'utilisateur. Pour que ce processus fonctionne, vous devez indiquer à Symfony comment effectuer la traduction via une « ressource de traduction ». De manière générale, une source de traduction est un fichier contenant des groupes d'informations de traduction correspondant à des paramètres régionaux spécifiés. C'est comme un « dictionnaire » de traduction et peut être créé dans une variété de formats, mais il est recommandé d'utiliserPour plus d'informations sur l'emplacement de stockage de ces fichiers, veuillez vous référer à Source de traduction/nom et emplacement du fichier
Maintenant, si les paramètres régionaux de l'utilisateur sont le français (comme fr_FR
ou fr_BE< /code> ), alors le message précédent sera traduit en J'aime Symfony
. Vous pouvez également compléter la traduction dans des modèlesfr_FR
或 fr_BE
),那么前面的信息将被翻译为 J'aime Symfony
。你也可以在 模板(templates) 中完成翻译。
翻译的处理过程 ¶
为了能翻译一条信息,Symfony执行以下简明流程:
先确定request对象中所存储的当前用户的 locale
信息;
某一目录(一大组message)的已经翻译好的信息,将从由 locale
(比如 fr_FR
. Processus de traduction ¶
- Afin de traduire un message, Symfony effectue le processus concis suivant :
Déterminez d'abord le request Les informations locale
de l'utilisateur actuel stockées dans l'objet ;
Les informations traduites d'un certain répertoire (un grand groupe de messages) seront générées à partir de locale
(Pour Par exemple, la source de traduction déterminée par fr_FR
est chargée. Si les paramètres régionaux n'existent pas, les informations de traduction déterminées par Lors de l'utilisation de la méthode trans(), Symfony recherche la chaîne exacte dans le répertoire de messages correspondant et la renvoie (si elle existe).
Note de traduction :
catalogue de messages
Le catalogue ici, le texte original est catalogue, fait référence à l'ensemble des informations traduites extraites de la source de traduction lors du processus de "traduction" de Symfony, c'est-à-dire un fichier xliff contenant de nombreux messages. Reportez-vous à la section domaine dans "Source de traduction/nom et emplacement du fichier" ci-dessous) Espace réservé aux informations ¶
Parfois, un message contenant des variables doit être traduit : YAML:# messages.fr.ymlSymfony is great: J'aime Symfony
Cependant, pour cela Pour une chaîne , il est impossible de créer une traduction correspondante, car le traducteur essaie toujours de trouver des "informations déterministes", y compris la valeur de la variable elle-même (par exemple, "Bonjour Ryan" et "Bonjour Fabien" sont deux messages différents du point de vue du traducteur) .
Pour ce cas, veuillez vous référer à Message Placeholders/Message Placeholders dans la documentation du composant. Pour savoir comment gérer la même situation dans les modèles, reportez-vous à Twig Templates. Traitement pluriel ¶ Une autre situation compliquée est que vous devez faire face à des "situations plurielles" basées sur certaines variables de traduction
🎜🎜🎜XML:<!-- messages.fr.xlf --><?xml version="1.0"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="symfony_is_great">
<source>Symfony is great</source>
<target>J'aime Symfony</target>
</trans-unit>
</body>
</file></xliff>
🎜🎜🎜🎜use Symfony\Component\HttpFoundation\Response; public function indexAction($name){$translated = $this->get('translator')->trans('Hello '.$name); return new Response($translated);}
🎜🎜🎜 🎜🎜Pour gérer cela, vous devez utiliser la méthode transChoice()
, ou utiliser la balise/régulateur transchoice
dans le modèle, veuillez Référence ici. transChoice()
方法,或者用模板中的transchoice
标签/调节器,请 参考这里。
更多信息,参考Translation组件文档的 复数处理章节。
模板中的翻译 ¶
多数情况下,翻译发生在模板中,对于Twig和PHP模板,Symfony提供了原生支持。
Twig模板 ¶
Symfony提供了特殊的Twig标签(trans
和 transchoice
),用于对“静态文本块”信息提供翻译帮助。
1
2
transchoice
标签,自动地从当前上下文关系中得到%count%
变量,并将其传给translator。这种机制,只在你使用%var%
这种格式的占位符时生效。
在Twig模板中使用 trans/transchoice 标签进行翻译时,%var%
Pour plus d'informations, reportez-vous au Chapitre sur le traitement pluriel de la documentation du composant Traduction. Traduction dans les modèles ¶
Dans la plupart des cas, la traduction s'effectue dans les modèles, pour les modèles Twig et PHP , Symfony fournit un support natif. Modèle Twig ¶
Symfony fournit des balises Twig spéciales (trans
et transchoice
), utilisé pour fournir une aide à la traduction des informations de type "bloc de texte statique". There is one apple.
There are 5 apples.
La balise transchoice
récupère automatiquement la variable %count%
du contexte actuel et la transmet au traducteur. Ce mécanisme ne prend effet que lorsque vous utilisez des espaces réservés au format %var%
. Lors de l'utilisation de balises trans/transchoice pour la traduction dans les modèles Twig, l'annotation d'espace réservé %var%
doit être fournie. Si vous devez utiliser le signe pourcentage % dans une chaîne, échappez-le en l'écrivant deux fois :
{% trans %}Hello %name%{% endtrans %} {% transchoice count %}{0} There are no apples|{1} There is one apple|]1,Inf[ There are %count% apples{% endtranschoice %}
1
Vous pouvez également spécifier le domaine du message et transmettre quelques variables supplémentaires : {% trans %}Percent: %percent%%%{% endtrans %}
modificateurs trans et transchoice, qui peuvent être utilisés pour traduire du texte variable et des expressions complexes : {% trans with {'%name%': 'Fabien'} from "app" %}Hello %name%{% endtrans %} {% trans with {'%name%': 'Fabien'} from "app" into "fr" %}Hello %name%{% endtrans %} {% transchoice count with {'%name%': 'Fabien'} from "app" %}{0} %name%, there are no apples|{1} %name%, there is one apple|]1,Inf[ %name%, there are %count% apples{% endtranschoice %}
en traduction Qu'il s'agisse d'étiquettes ou de régulateurs, le L'effet est le même, avec une légère différence : l'échappement automatique de la sortie ne fonctionne que pour les régulateurs. En d'autres termes, si vous avez besoin que les informations traduites ne soient "pas échappées", vous devez suivre le régulateur de traduction avec un régulateur brut : {{ message|trans }} {{ message|transchoice(5) }} {{ message|trans({'%name%': 'Fabien'}, "app") }} {{ message|transchoice(5, {'%name%': 'Fabien'}, 'app') }}
Vous pouvez en définir un pour l'ensemble du modèle de brindille via une seule balise de traduction. domaine :
🎜🎜{# 标签中被翻译的文本从不被转义#}{% trans %}<h3>foo</h3>{% endtrans %} {% set message = '<h3>foo</h3>' %} {# 变量调节器翻译的字符串和变量,默认将被转义 #}{{ message|trans|raw }}{{ '<h3>bar</h3>'|trans|raw }}
🎜🎜🎜🎜1
🎜🎜🎜🎜🎜Notez que cela n'affectera que le modèle actuel, pas les modèles "inclus" (pour réduire les effets secondaires).
Modèles PHP ¶
le traducteur peut également être utilisé dans les modèles PHP via l'assistant de traduction :
{% trans_default_domain "app" %}
Nom et emplacement des sources/fichiers de traduction ¶
Symfony recherche des fichiers d'informations (c'est-à-dire des traductions/traductions). informations) :
Répertoire app/Resources/translations
app/Resources/translations
目录;
app/Resources/<bundle name>/translations
目录;
任何bundle下的 Resources/translations/
目录
上面的位置是按照“高优先权在前”的顺序排列的。这意味着,你可以用前面两个目录之一,来覆写某个bundle中的翻译信息。
覆写机制基于键等级(key level)而执行:只有被覆写的键需要被列在高优先级的信息文件中。当一个键没有在信息文件中被找到时,translator将自动回滚到低优先级的信息文件中。
信息文件的文件名也很重要,每一个信息文件必须按下列命名路径来命名:domain.locale.loader
:
domain: 这是一个可选项,用于组织信息文件成为群组(例如admin, navigation 或default messages)。参阅 使用翻译信息的域 Using Message Domains;
locale: 这是翻译信息的locale (例如 en_GB, en, 等等);
loader: 这是Symfony如何来加载和解析信息文件 (也就是 xlf
, php
, yml
等文件后缀).
加载器(loader)可以是任何已注册加载器的名称。Symfony默认提供了许多加载器,包括:
xlf
: 加载XLIFF文件;
php
: 加载PHP文件;
yml
: 加载YAML文件;
使用何种加载器的选择权完全在你,随你喜好。推荐使用xlf作为翻译的信息文件。更多选择,参考 加载信息目录 Loading Message Catalogs。
你也可以将翻译信息存在数据库中,或任何其他介质,只要提供一个自定义的类去实现 LoaderInterface
接口即可。参考 translation.loader
Répertoire app/Resources/<bundle name>/translations
; < /li>🎜🎜Le répertoire Resources/translations/
sous n'importe quel bundle🎜🎜Les positions ci-dessus sont classées par ordre de "haute priorité en premier". Cela signifie que vous pouvez utiliser l'un des deux premiers répertoires pour écraser les informations de traduction dans un ensemble. 🎜🎜Le mécanisme d'écrasement est effectué en fonction du niveau de clé : seules les clés écrasées doivent être répertoriées dans le fichier d'informations haute priorité. Lorsqu'une clé n'est pas trouvée dans le fichier de message, le traducteur revient automatiquement à un fichier de message de priorité inférieure. 🎜🎜Le nom du fichier d'informations est également très important. Chaque fichier d'informations doit être nommé selon le chemin de dénomination suivant : domain.locale.loader
:🎜🎜🎜🎜domain
. strong> : Il s'agit d'une option utilisée pour organiser les fichiers de messages en groupes (tels que les messages d'administrateur, de navigation ou par défaut). Voir Utilisation des domaines de message🎜;🎜🎜🎜locale : il s'agit des paramètres régionaux du message de traduction (tels que en_GB, en, etc.) ; 🎜🎜🎜loader : c'est ainsi que Symfony charge et analyse les fichiers d'informations (c'est-à-dire xlf
, php
, yml
et autres suffixes de fichiers).🎜🎜Loader (loader) peut être le nom de n'importe quel chargeur enregistré. Symfony fournit de nombreux chargeurs par défaut, notamment : 🎜🎜🎜🎜xlf
: charge les fichiers XLIFF ; 🎜🎜🎜php
: charge les fichiers PHP 🎜🎜🎜yml
: Chargez les fichiers YAML ; 🎜🎜Le choix du chargeur à utiliser dépend entièrement de vous, comme vous le souhaitez. Il est recommandé d'utiliser xlf comme fichier d'informations traduites. Pour plus d'options, consultez Chargement des catalogues de messages🎜. 🎜LoaderInterface🎜 code > Juste une interface. Reportez-vous à la balise translation.loader🎜
pour en savoir plus. 🎜🎜🎜Vous pouvez ajouter un répertoire dans le fichier de configuration via l'option paths
:
<?php echo $view['translator']->trans('Symfony is great') ?> <?php echo $view['translator']->transChoice('{0} There are no apples|{1} There is one apple|]1,Inf[ There are %count% apples',10,array('%count%' => 10)) ?>
PHP:// app/config/config.php$container->loadFromExtension('framework', array('translator' => array('paths' => array('%kernel.root_dir%/../translations',),),));
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:framework="http://symfony.com/schema/dic/symfony" xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> <framework:config>
<framework:translator>
<framework:path>%kernel.root_dir%/../translations</framework:path>
</framework:translator>
</framework:config></container>
Chaque fois que vous créez une nouvelle ressource de traduction (ressource de traduction) ou installez un bundle contenant une source de traduction, assurez-vous pour vider le cache afin que Symfony puisse découvrir cette nouvelle source de traduction.
YAML:# app/config/config.ymlframework:translator:paths:- '%kernel.root_dir%/../translations'
1
Annulation des paramètres régionaux pendant la traduction ¶
Supposons que les informations de paramètres régionaux d'un utilisateur soient fr_FR
et que la clé que vous traduisez soit Symfony is great
. Pour trouver les messages en français, Symfony vérifie plusieurs sources de traduction locale : fr_FR
,而你正翻译的键是 Symfony is great
。为了找到法语信息,Symfony切实地检查若干locale的翻译源:
首先,Symfony在一个 fr_FR
的翻译源(例如messages.fr_FR.xlf)寻找翻译信息;
如果没找到,Symfony在一个 fr
翻译源(比如messages.fr.xlf)继续寻找翻译信息;
如果仍然没找到,Symfony使用fallbacks这个配置参数, 它被默认设为 en
- Tout d'abord, Symfony recherche les informations de traduction dans une source de traduction
fr_FR
(par exemple messages.fr_FR.xlf) ; S'il n'est toujours pas trouvé, Symfony continue de rechercher des informations de traduction dans une source de traduction fr
(telle que messages.fr.xlf);
La version 2.6 de Symfony a introduit la possibilité d'écrire les informations de traduction manquantes dans le journal. Lorsque Symfony ne trouve pas d'informations de traduction pour une langue donnée, il ajoutera les informations de traduction manquantes au fichier journal. Voir logging
. Traduire le contenu de la base de données ¶
Note de traduction : 🎜Il existe deux façons d'utiliser l'extension Doctrine🎜🎜🎜L'une est la méthode de la bibliothèque de classes et l'autre est la méthode du bundle. Le comportement traduisible fait ici référence à l'utilisation qui doit être référencée lors de la traduction du contenu de la base de données après l'avoir installé avec le bundle)🎜🎜🎜Traduire les messages de contrainte ¶
Référez-vous à Comment traduire les messages de contrainte de validation pour en savoir plus.
Traitement des paramètres régionaux de l'utilisateur ¶
Le processus de traduction dépend des paramètres régionaux de l'utilisateur. Lisez Comment utiliser les paramètres régionaux d'un utilisateur pour savoir comment procéder.
Debug traductions ¶
debug: instruction de ligne de commande de traduction introduite à partir de Symfony 2.5.
Avant Symfony 2.6, cette commande était translation:debug.
Lorsque vous travaillez avec de grandes quantités d'informations traduites dans différentes langues, il peut être difficile de savoir quelles informations manquent et lesquelles ne sont pas utilisées. Lisez Comment trouver des traductions manquantes ou inutilisées pour savoir comment les retrouver.
Résumé ¶
Créer une application internationalisée à l'aide du composant de traduction de Symfony ne sera plus un "processus pénible" mais se résume aux étapes simples suivantes :
Résumer la traduction des informations du programme, remplacer chaque morceau de informations avec la méthode trans()
或 transChoice()
(en savoir plus dans l'article Utiliser le traducteur)
traduire les informations à traduire dans plusieurs langues locales en créant un fichier de message (fichier de message de traduction). Symfony peut trouver et traiter chaque fichier car les noms de ces fichiers suivent la convention de dénomination spécifiée
gère les paramètres régionaux de l'utilisateur, ils peuvent être stockés dans la requête, mais ils peuvent également être stockés dans la session de l'utilisateur.