PHP/Symfony Framework 다국어 설정해 보자

composer require symfony/translation
# translation.yaml

framework:
    default_locale: '%locale%'

    translator:
        #  언어 파일이 있는 디폴트 디렉토리
        default_path: '%kenel.project_dir%/translations'

        fallbacks:
            - '%locale%'
# services.yaml

parameters:
    # ...
    # 지정할 언어
    locale: 'en'

1. 템플릿에서는 ..

<html lang="{{ app.request.locale }}"></html>

: %locale%에 해당하는 언어셋이 지정된다.

<html lang="{{ app.request.locale }}">

{% trans %}

{% endtrans %}

</html>

: {% trans %} 안의 내용은 'messages.xx.yaml'의 키값으로 변환된다.

# messages.en.yaml

some:
    key: Hello <b>Symfony</b>

: 계층 형식으로 이용하고 싶은데 ...

{{ some.key|trans }}

: 템플릿에서 컴마로 사용하면 된다!

{{ some.key|trans|raw }}

: raw를 사용한다면 html 태그를 반영해서 출력 할 수 있다.

2. 컨트롤러에서는 ..

// 컨트롤러 샘플

use Symfony\Component\Translation\TranslatorInterface;

/**
 * @Route()
 */
public function index(TranslatorInterface $translator) {

// messages.xx.yaml의 'some.key'를 번역한다.
$message = $translator->trans('some.key');

}

3. 경로를 통해 국적별로 분기하기!

# annotations.yaml

prefix:
    en: '' # 기본설정
    ko: '/ko'
    jp: '/jp'

    # ...

: 접두사로 설정되는 경로.

// 컨트롤러 샘플
/**
 * @Route(
 * "en": "/test",
 * "ko": "/test",
 * "jp": "/test"
 * }, name="test", methods={"GET", "POST"})
 */
public function index() { // ... }

: '/ko/test'로 접속하면 한국어로 번역이 되고, '/jp/test'로 접속하면 일본어로 번역된다.

복수화(Pluralization)

// 컨트롤러 샘플
return $this->render(
    'count' => $number
);
# messages.xx.yaml

test: '{0}A|{1}B|{2}C|{3}D|{4}E'

: 숫자에 해당하는 텍스트가 출력된다. 예를 들면, 'count'가 0이면 A가 출력된다.