번역하다
"국제화"(종종 i18n으로 약칭됨)는 프로그램(추상)에서 지역적 특성이 있는 문자열 및 기타 조각을 추출하여 다음과 같은 레이어에 배치하는 것을 의미합니다. 사용자의 지역(언어, 국가 등)에 따라 번역, 변형됩니다. 텍스트의 경우 이는 텍스트(또는 "정보")를 사용자가 원하는 언어로 번역하는 기능을 사용하여 텍스트의 각 부분을 제거하는 것을 의미합니다.
// 文本始终以英语输出echo 'Hello World'; // 文本将以用户指定语言或默认英语输出echo $translator->trans('Hello World');
locale 단순히 사용자의 언어와 국가를 의미합니다. 이는 프로그램의 임의의 문자열일 수 있으며 번역 및 기타 형식 정보(예: 통화)를 관리하는 데 사용됩니다. ISO 639-1 언어 코드를 사용하고 밑줄(_
)을 추가한 후 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
국가 코드(예: fr_FR
이 로캘은 "프랑스어 프랑스어" 프랑스어/를 나타냅니다. 프랑스).
- #🎜🎜##🎜🎜#Symfony의 번역 서비스를 열고 구성합니다. #🎜🎜#
- #🎜🎜#Translator를 호출하여 수행되는 문자열(예: "xxxx")을 추상화합니다. 스트리핑으로 구현됩니다. (번역 기본 사항#🎜🎜# 참조)#🎜🎜#
- #🎜🎜#지원되는 각 로케일에 대해 번역 프로그램에서 번역할 각 문자열에 대한 번역 리소스/파일 #🎜🎜#을 생성합니다. #🎜🎜#
- #🎜🎜# 요청(요청)에 사용 가능합니다. 선택한 은 사용자의 전체 세션 프로세스에 따라 결정됩니다#🎜🎜#, 사용자의 로케일 정보를 설정 및 관리#🎜🎜#. #🎜🎜#
구성 ¶#🎜🎜#
#🎜🎜#Translated 프로세스는 사용자가 지정한 로케일을 사용하여 번역된 정보를 찾아 반환하는translator
서비스를 통해 처리됩니다. 번역기를 사용하기 전에 구성 파일에서 활성화하세요: #🎜🎜#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] }#🎜🎜#
fallbacks 키워드 및 번역 언어를 찾을 수 없을 때 Symfony가 처리하는 방법에 대한 자세한 내용은 번역 중 로컬 롤백을 참조하세요.
번역에 사용된 로캘 정보는 요청 개체에 저장됩니다. 일반적으로 라우팅 시 _locale
속성으로 설정됩니다. 로캘 및 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
을 참조하세요.
번역 기본 사항 ¶translator🎜
서비스는 텍스트 번역을 완료하는 역할을 합니다. 텍스트 블록("메시지", 이하 "정보"라고 함)을 번역하려면 trans() 메서드를 사용합니다. 예를 들어, 컨트롤러에서 간단한 메시지를 번역하려고 합니다. 🎜PHP:// messages.fr.phpreturn array('Symfony is great' => 'J\'aime Symfony',);
🎜위 코드가 실행된 후 Symfony는 사용자의 로케일
을 기반으로 "Symfony is great" 메시지를 번역하려고 시도합니다. 이 프로세스가 작동하려면 "번역 리소스"를 통해 번역을 수행하는 방법을 Symfony에 알려야 합니다. 일반적으로 번역 소스는 지정된 로케일에 해당하는 번역 정보 그룹이 포함된 파일입니다. 번역을 위한 '사전'과 같아서 다양한 형식으로 생성이 가능하지만, 활용을 권장합니다.해당 파일의 저장 위치에 대한 자세한 내용은 번역 소스/파일 이름 및 위치
를 참조하세요. 이제 사용자의 로케일이 프랑스어인 경우(예: fr_FR
또는 fr_BE< /code> ) 이전 정보가 J'aime Symfony
로 변환됩니다. 템플릿fr_FR
或 fr_BE
),那么前面的信息将被翻译为 J'aime Symfony
。你也可以在 模板(templates) 中完成翻译。
翻译的处理过程 ¶
为了能翻译一条信息,Symfony执行以下简明流程:
先确定request对象中所存储的当前用户的 locale
信息;
某一目录(一大组message)的已经翻译好的信息,将从由 locale
(比如 fr_FR
에서 번역을 완료할 수도 있습니다. 번역 프로세스 ¶
- 메시지를 번역하기 위해 Symfony는 다음과 같은 간결한 프로세스를 수행합니다.
먼저 요청 개체에 저장된 현재 사용자의 로케일
정보
특정 디렉터리(대규모 메시지 그룹)의 번역된 정보는 로케일
(예를 들어 fr_FR
에 의해 결정된 번역 소스가 로드됩니다. 해당 로캘이 존재하지 않으면 trans() 메소드를 사용할 때 Symfony는 해당 메시지 디렉토리에서 정확한 문자열을 찾아 반환합니다(존재하는 경우).
번역 참고:
메시지 카탈로그
여기서의 카탈로그, 원문은 카탈로그이며 Symfony의 "번역" 과정에서 번역 소스에서 추출한 번역 정보 모음, 즉 xliff 파일을 말합니다. 많은 메시지가 포함되어 있습니다. 아래 "번역 소스/파일 명명 및 위치"의 도메인 섹션을 참조하세요) 때때로 변수가 포함된 메시지를 번역해야 합니다: YAML:# messages.fr.ymlSymfony is great: J'aime Symfony
그러나 이를 위해서는 문자열의 경우 , 번역가는 항상 변수 값 자체를 포함하여 "결정론적 정보"를 찾으려고 하기 때문에 해당 번역을 만드는 것은 불가능합니다(예를 들어 번역가의 관점에서 "Hello Ryan"과 "Hello Fabien"은 서로 다른 두 메시지입니다). .
이 경우 구성 요소 설명서의 메시지 자리 표시자/메시지 자리 표시자
fr_FR
또는 fr_BE< /code> ) 이전 정보가 J'aime Symfony
로 변환됩니다. 템플릿fr_FR
或 fr_BE
),那么前面的信息将被翻译为 J'aime Symfony
。你也可以在 模板(templates) 中完成翻译。
先确定request对象中所存储的当前用户的 locale
信息;
某一目录(一大组message)的已经翻译好的信息,将从由 locale
(比如 fr_FR
에서 번역을 완료할 수도 있습니다. 번역 프로세스 ¶
로케일
정보 로케일
(예를 들어 fr_FR
에 의해 결정된 번역 소스가 로드됩니다. 해당 로캘이 존재하지 않으면 YAML:# messages.fr.ymlSymfony is great: J'aime Symfony