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组件。你可以阅读翻译组件来了解更多。整体上,翻译的过程有如下几步:

  1. 开启和配置Symfony的翻译服务;

  2. 将字符串抽象出来(如“xxxx”),这是通过调用Translator去剥离它们来实现的 ;(参考 翻译基础)

  3. 针对每个被支持的locale,创建翻译资源/文件,用于翻译程序中每一个待译字串;

  4. 针对request(请求)和可选的 基于用户整个session过程,来 确定、设置和管理用户的locale信息

配置 

翻译的过程是通过translatorCode pays (par exemple, fr_FR cette locale fait référence à "Français Français" Français/France).

🎜Dans ce chapitre, vous apprendrez à utiliser le composant de traduction dans le framework Symfony. Vous pouvez lire les Composants de traduction🎜 pour en savoir plus. Dans l'ensemble, le processus de traduction comporte les étapes suivantes : 🎜
  1. 🎜Ouvrir et configurer 🎜Le service de traduction de Symfony ; 🎜
  2. 🎜Chaînes abstraites (telles que "xxxx"), ce qui est obtenu en appelant Translator pour les supprimer (Référence Bases de la traduction🎜) 🎜
  3. 🎜Pour chaque langue prise en charge, créez des ressources/fichiers de traduction🎜 pour chaque chaîne à traduire dans le programme de traduction ;🎜
  4. 🎜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 via traducteur, 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'utiliser

Pour 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_FRfr_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
    locale de secours

    seront également chargées et fusionnées dans le répertoire. Le résultat final est un « dictionnaire de traduction »

    Si les informations à traduire peuvent être trouvées dans l'annuaire, les résultats de la traduction seront renvoyés. Sinon, le traducteur renvoie les informations originales.

    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标签(transtranschoice),用于对“静态文本块”信息提供翻译帮助。

    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 ;