Skip to content

지역화

소개

lightbulb

기본적으로 라라벨 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. 라라벨의 언어 파일을 사용자 정의하려면 lang:publish Artisan 명령을 통해 게시할 수 있습니다.

라라벨의 지역화 기능은 다양한 언어로 된 문자열을 편리하게 검색할 수 있는 방법을 제공하여 애플리케이션 내에서 여러 언어를 쉽게 지원할 수 있도록 합니다.

라라벨은 번역 문자열을 관리하는 두 가지 방법을 제공합니다. 첫째, 언어 문자열은 애플리케이션의 lang 디렉터리 내 파일에 저장될 수 있습니다. 이 디렉터리 내에는 애플리케이션에서 지원하는 각 언어에 대한 하위 디렉터리가 있을 수 있습니다. 이것은 라라벨이 유효성 검사 오류 메시지와 같은 내장 라라벨 기능에 대한 번역 문자열을 관리하는 데 사용하는 접근 방식입니다.

/lang
/en
messages.php
/es
messages.php

또는 lang 디렉터리 내에 배치된 JSON 파일 내에 번역 문자열을 정의할 수 있습니다. 이 접근 방식을 취하면 애플리케이션에서 지원하는 각 언어에 해당 디렉터리 내에 해당 JSON 파일이 있습니다. 이 접근 방식은 번역 가능한 문자열이 많은 애플리케이션에 권장됩니다.

/lang
en.json
es.json

이 문서에서 번역 문자열 관리의 각 접근 방식에 대해 설명합니다.

언어 파일 게시

기본적으로 라라벨 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. 라라벨의 언어 파일을 사용자 정의하거나 직접 만들려면 lang:publish Artisan 명령을 통해 lang 디렉터리를 스캐폴딩해야 합니다. lang:publish 명령은 애플리케이션에 lang 디렉터리를 만들고 라라벨에서 사용하는 기본 언어 파일 세트를 게시합니다.

php artisan lang:publish

php artisan lang:publish는 Laravel 프레임워크에서 언어 파일을 게시하는 명령어입니다. 즉, Laravel의 기본 언어 파일을 사용자의 프로젝트 내의 resources/lang 디렉토리로 복사하여 편집할 수 있도록 합니다.

로케일 설정하기

애플리케이션의 기본 언어는 config/app.php 설정 파일의 locale 설정 옵션에 저장되며, 일반적으로 APP_LOCALE 환경 변수를 사용하여 설정됩니다. 이 값은 애플리케이션의 요구 사항에 맞게 자유롭게 수정할 수 있습니다.

기본 언어에 특정 번역 문자열이 없는 경우 사용될 "대체 언어"를 구성할 수도 있습니다. 기본 언어와 마찬가지로 대체 언어도 config/app.php 설정 파일에서 구성되며, 해당 값은 일반적으로 APP_FALLBACK_LOCALE 환경 변수를 사용하여 설정됩니다.

App 파사드에서 제공하는 setLocale 메소드를 사용하여 런타임 시 단일 HTTP 요청에 대한 기본 언어를 수정할 수 있습니다.

use Illuminate\Support\Facades\App;
 
Route::get('/greeting/{locale}', function (string $locale) {
if (! in_array($locale, ['en', 'es', 'fr'])) {
abort(400);
}
 
App::setLocale($locale);
 
// ...
});

현재 로케일 확인하기

App 파사드의 currentLocaleisLocale 메소드를 사용하여 현재 로케일을 확인하거나 로케일이 지정된 값인지 확인할 수 있습니다.

use Illuminate\Support\Facades\App;
 
$locale = App::currentLocale();
 
if (App::isLocale('en')) {
// ...
}

복수화 언어

Laravel의 "복수화기"(Eloquent 및 프레임워크의 다른 부분에서 단수 문자열을 복수 문자열로 변환하는 데 사용됨)에 영어 이외의 언어를 사용하도록 지시할 수 있습니다. 이는 애플리케이션 서비스 공급자의 boot 메소드 내에서 useLanguage 메소드를 호출하여 수행할 수 있습니다. 복수화기가 현재 지원하는 언어는 french, norwegian-bokmal, portuguese, spanishturkish입니다.

use Illuminate\Support\Pluralizer;
 
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Pluralizer::useLanguage('spanish');
 
// ...
}
exclamation

복수화기의 언어를 사용자 정의하는 경우 Eloquent 모델의 테이블 이름을 명시적으로 정의해야 합니다.

번역 문자열 정의하기

짧은 키 사용하기

일반적으로 번역 문자열은 lang 디렉터리 내의 파일에 저장됩니다. 이 디렉터리 안에는 애플리케이션에서 지원하는 각 언어에 대한 하위 디렉터리가 있어야 합니다. 이는 Laravel이 유효성 검사 오류 메시지와 같은 내장 Laravel 기능에 대한 번역 문자열을 관리하는 데 사용하는 접근 방식입니다.

/lang
/en
messages.php
/es
messages.php

모든 언어 파일은 키가 지정된 문자열 배열을 반환합니다. 예를 들어 다음과 같습니다.

<?php
 
// lang/en/messages.php
 
return [
'welcome' => 'Welcome to our application!',
];
exclamation

지역별로 다른 언어의 경우 ISO 15897에 따라 언어 디렉터리 이름을 지정해야 합니다. 예를 들어 영국 영어의 경우 "en-gb" 대신 "en_GB"를 사용해야 합니다.

번역 문자열을 키로 사용하기

많은 수의 번역 가능한 문자열이 있는 애플리케이션의 경우, 모든 문자열을 "짧은 키"로 정의하면 뷰에서 키를 참조할 때 혼란스러워질 수 있으며 애플리케이션에서 지원하는 모든 번역 문자열에 대해 키를 계속해서 만들어야 하는 번거로움이 있습니다.

이러한 이유로 Laravel은 문자열의 "기본" 번역을 키로 사용하여 번역 문자열을 정의하는 기능도 지원합니다. 번역 문자열을 키로 사용하는 언어 파일은 lang 디렉터리에 JSON 파일로 저장됩니다. 예를 들어 애플리케이션에 스페인어 번역이 있는 경우 lang/es.json 파일을 만들어야 합니다.

{
"I love programming.": "나는 프로그래밍을 좋아합니다."
}

키 / 파일 충돌

다른 번역 파일 이름과 충돌하는 번역 문자열 키를 정의해서는 안 됩니다. 예를 들어, nl/action.php 파일이 존재하지만 nl.json 파일이 존재하지 않는 상태에서 "NL" 로케일에 대해 __('Action')을 번역하면 번역기가 nl/action.php의 전체 내용을 반환하게 됩니다.

번역 문자열 가져오기

__ 헬퍼 함수를 사용하여 언어 파일에서 번역 문자열을 가져올 수 있습니다. "짧은 키"를 사용하여 번역 문자열을 정의하는 경우, 키가 포함된 파일과 키 자체를 "점" 구문을 사용하여 __ 함수에 전달해야 합니다. 예를 들어, lang/en/messages.php 언어 파일에서 welcome 번역 문자열을 가져와 보겠습니다.

echo __('messages.welcome');

지정된 번역 문자열이 존재하지 않으면 __ 함수는 번역 문자열 키를 반환합니다. 따라서 위의 예에서 번역 문자열이 존재하지 않으면 __ 함수는 messages.welcome을 반환합니다.

기본 번역 문자열을 번역 키로 사용하는 경우, 문자열의 기본 번역을 __ 함수에 전달해야 합니다.

echo __('I love programming.');

마찬가지로, 번역 문자열이 존재하지 않으면 __ 함수는 주어진 번역 문자열 키를 반환합니다.

Blade 템플릿 엔진을 사용하는 경우, {{ }} 에코 구문을 사용하여 번역 문자열을 표시할 수 있습니다.

{{ __('messages.welcome') }}

번역 문자열에서 매개변수 대체

원하는 경우 번역 문자열에 자리 표시자를 정의할 수 있습니다. 모든 자리 표시자는 :로 시작합니다. 예를 들어, 자리 표시자 이름이 있는 환영 메시지를 정의할 수 있습니다.

'welcome' => 'Welcome, :name',

번역 문자열을 가져올 때 자리 표시자를 대체하려면 __ 함수의 두 번째 인수로 대체 배열을 전달할 수 있습니다.

echo __('messages.welcome', ['name' => 'dayle']);

자리 표시자에 모두 대문자 또는 첫 글자만 대문자로 되어 있으면 번역된 값도 그에 따라 대문자로 표시됩니다.

'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

객체 대체 형식 지정

객체를 번역 자리 표시자로 제공하려고 하면 객체의 __toString 메서드가 호출됩니다. __toString 메서드는 PHP에 내장된 "매직 메서드" 중 하나입니다. 그러나 때로는 상호 작용하는 클래스가 타사 라이브러리에 속하는 경우와 같이 주어진 클래스의 __toString 메서드를 제어할 수 없는 경우가 있습니다.

이러한 경우 Laravel에서는 특정 유형의 객체에 대한 사용자 정의 형식 지정 핸들러를 등록할 수 있습니다. 이를 위해 번역기의 stringable 메서드를 호출해야 합니다. stringable 메서드는 형식을 지정해야 하는 객체 유형을 타입 힌팅해야 하는 클로저를 허용합니다. 일반적으로 stringable 메서드는 애플리케이션의 AppServiceProvider 클래스의 boot 메서드 내에서 호출해야 합니다.

use Illuminate\Support\Facades\Lang;
use Money\Money;
 
/**
* 모든 애플리케이션 서비스를 부트스트랩합니다.
*/
public function boot(): void
{
Lang::stringable(function (Money $money) {
return $money->formatTo('en_GB');
});
}

복수화

복수화는 여러 언어에서 복수화에 대한 다양한 복잡한 규칙을 가지고 있기 때문에 복잡한 문제입니다. 그러나 Laravel은 사용자가 정의한 복수화 규칙에 따라 문자열을 다르게 번역하는 데 도움을 줄 수 있습니다. | 문자를 사용하여 문자열의 단수형과 복수형을 구별할 수 있습니다.

'apples' => 'There is one apple|There are many apples',

물론, 번역 문자열을 키로 사용할 때 복수화도 지원됩니다.

{
"There is one apple|There are many apples": "사과가 한 개 있습니다.|사과가 여러 개 있습니다."
}

복수형 규칙은 여러 값 범위에 대한 번역 문자열을 지정하여 더 복잡하게 만들 수도 있습니다.

'apples' => '{0} 아무것도 없습니다.|[1,19] 약간 있습니다.|[20,*] 많이 있습니다.',

복수화 옵션이 있는 번역 문자열을 정의한 후 trans_choice 함수를 사용하여 주어진 "개수"에 대한 줄을 검색할 수 있습니다. 이 예에서 개수가 1보다 크므로 번역 문자열의 복수형이 반환됩니다.

echo trans_choice('messages.apples', 10);

복수화 문자열에 자리 표시자 속성을 정의할 수도 있습니다. 이러한 자리 표시자는 trans_choice 함수에 배열을 세 번째 인수로 전달하여 대체할 수 있습니다.

'minutes_ago' => '{1} :value 분 전|[2,*] :value 분 전',
 
echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

trans_choice 함수에 전달된 정수 값을 표시하려면 내장 :count 자리 표시자를 사용할 수 있습니다.

'apples' => '{0} 아무것도 없습니다.|{1} 한 개 있습니다.|[2,*] :count개 있습니다.',

패키지 언어 파일 재정의

일부 패키지에는 자체 언어 파일이 함께 제공될 수 있습니다. 이러한 줄을 조정하기 위해 패키지의 핵심 파일을 변경하는 대신 lang/vendor/{package}/{locale} 디렉토리에 파일을 배치하여 재정의할 수 있습니다.

예를 들어 skyrim/hearthfire라는 패키지에 대한 messages.php의 영어 번역 문자열을 재정의해야 하는 경우 lang/vendor/hearthfire/en/messages.php에 언어 파일을 배치해야 합니다. 이 파일 내에서 재정의하려는 번역 문자열만 정의해야 합니다. 재정의하지 않은 번역 문자열은 패키지의 원본 언어 파일에서 계속 로드됩니다.