>  기사  >  백엔드 개발  >  Laravel 현지화 모듈 학습

Laravel 현지화 모듈 학습

不言
不言원래의
2018-06-13 16:48:311104검색

이 글에서는 주로 라라벨 학습 튜토리얼의 현지화 모듈 관련 정보를 소개하고 있으며, 샘플 코드를 통해 아주 자세하게 소개하고 있어 공부나 업무에 필요한 모든 분들에게 도움이 될 것입니다. 우리와 함께 공부하고 공부할 수 있습니다.

머리말

이 글은 주로 라라벨 현지화 모듈 관련 내용을 소개하고 있으며, 참고 및 학습을 위해 공유합니다. 이제 자세한 소개를 살펴보겠습니다.

이 글은 Laravel 5.4 버전의 현지화 모듈 코드를 분석하고 작성한 내용을 바탕으로 작성되었습니다.

모듈 구성

다음 그림은 현지화 모듈의 다양한 파일 간의 관계를 보여주고 간략하게 설명합니다.


  • TranslationServiceProvider
    현지화 모듈의 서비스 제공자는 모듈의 입구일 뿐만 아니라 IOC 컨테이너와의 상호 작용의 중심이기도 합니다. 번역기 인스턴스 번역 로더를 등록하고 번역 관리 인스턴스 번역기를 등록하며 지연 로딩 서비스를 선언합니다.

  • 번역기

    번역 관리 카테고리

  • MessageSelector

    메시지 필터는 복잡한 값을 판단하여 적절한 메시지를 선택합니다. 예를 들어 메시지 내용은 다음과 같습니다. {0} no | 마지막으로 선택한 메시지는 "일부"입니다.

  • LoaderInterface

    번역기 인터페이스는 load, addNamespace, 네임스페이스

  • FileLoader

    라는 세 가지 메소드를 선언합니다. LoaderInterface를 상속하고 파일에서 현지화된 리소스 데이터를 얻습니다.

  • ArrayLoader

    LoaderInterface를 상속하고 배열을 사용하여 메모리에 지역화된 리소스 데이터를 유지합니다.

구성 지침

구성 구성 디렉터리에서 이 모듈과 관련된 유일한 매개 변수는 app.php 파일의 locale 및 fallback_locale입니다.

locale은 기본 현지화 언어가 무엇인지 나타내므로 번역(변환) 내용은 언어 리소스 디렉터리에서 먼저 가져옵니다.

locale로 표시되는 언어가 없으면 fallback_locale 백업 언어가 사용됩니다. locale은 zh_CN , fallback_locale은 en

기능 소개

전역 언어 리소스 디렉토리는 프로젝트의 resources/lang 아래에 있으며 각 하위 디렉토리는 en, zh_CN 등과 같이 언어 이름을 따서 명명됩니다. .;

일부 하위 디렉터리 네임스페이스 이름을 따서 명명되었으며 타사 로딩 라이브러리 리소스 파일을 보충적으로 대체합니다.

en.json 및 zh_CN과 같은 Json 파일도 있을 수 있습니다. Json 파일이며 이러한 데이터는 이 기존 Json 파일에서 가져온 것입니다.

Translate global Language resources

저자의 언어 리소스 루트 디렉토리 resources/lang에는 zh_CN/validation.php가 있으며 내용은 다음과 같습니다

<?php
return [
 &#39;accepted&#39;  => &#39;:attribute 必须接受。&#39;,
 &#39;active_url&#39;  => &#39;:attribute 不是一个有效的网址。&#39;,
 &#39;after&#39;  => &#39;:attribute 必须是一个在 :date 之后的日期。&#39;,
 ......
];

코드

app(&#39;translator&#39;)->trans(&#39;validation.accepted&#39;, [&#39;attribute&#39; => &#39;用户名&#39;])

또는 전역 도움말 기능 trans

trans(&#39;validation.accepted&#39;, [&#39;attribute&#39; => &#39;用户名&#39;])

를 호출하면 "사용자 이름을 허용해야 합니다."가 출력됩니다.

호출 프로세스는 다음과 같습니다.

키 이름 구문 분석: 키 이름을 배열로 구문 분석합니다($namespace = '*', $group = 'validation', $item = 'accepted'). 네임스페이스는 *입니다. 그룹은 실제로 파일 이름이고, 항목은 요소의 의미입니다.

    여기서는 $locale이 null이므로 반환되는 내용은 다음과 같습니다. 기본 언어와 백업 언어로 구성된 배열(즉, ['zh_CN', 'en']) for 루프를 수행하고 언어 리소스 디렉터리에 들어가서 필요한 요소 값을 찾습니다.
  • $namespace = '*', $group = 'validation', $item = 'accepted');namespace为*,表示在全局命名空间下;group,组,其实就是文件名,一个文件为一组;item是元素的意思;

  • 获取语言数组: 这里的$locale为null,所以返回的是默认与备用语言组成的数组,也就是['zh_CN', 'en'];并进行for循环,进入语言资源目录中寻找需要的元素值,如果找到,即 break;

  • 加载资源:因为命名空间为*,所以定位资源根目录为resources/lang;语言为zh_CN,所以子目录为zh_CN;group名为validation,这时就把resources/lang/zh_CN/validation.php文件中的所有内容都加载进内存中,并进行保存 $this->loaded[$namespace][$group][$locale] = $lines;

  • 获取资源,并替换参数:通过Arr::get方法从$this->loaded[$namespace][$group][$locale]
    리소스 로드: 네임스페이스가 *이므로 찾은 리소스의 루트 디렉터리는 resources/lang입니다. 언어는 zh_CN이므로 하위 디렉터리는 zh_CN입니다. 이때 그룹 이름은 유효성 검사입니다. resources/lang/zh_CN/validation.php 파일이 메모리에 로드되고 $this->loaded[$namespace][ $group][$locale] = $lines;

에 저장됩니다. 리소스 가져오기 및 매개변수 바꾸기: $this->loaded[에서 <code>Arr::get 메서드를 통해 $namespace][$group][$locale]에서 요소 값 가져오기 : 속성이 허용되어야 합니다. ;이때 매개변수 배열은 비어 있지 않고 루프 교체가 이루어지며 "사용자 이름이 허용되어야 합니다."라는 결과를 얻습니다.

네임스페이스가 있는 언어 리소스를 번역합니다. 언어 리소스 루트 디렉터리 리소스/lang, 다음 내용으로 Vendor/Faker/Provider/zh_CN/Internet.php 파일을 생성합니다.

<?php
return [
 &#39;message&#39; => &#39;hello, Faker/Provider&#39;,
 ......
];

동시에 세 번째 리소스 루트 디렉터리 위치를 수동으로 등록합니다. -번역기의 파티 플러그인(즉, 네임스페이스 포함)

app(&#39;translator&#39;)->addNamespace(&#39;Faker/Provider&#39;, base_path(&#39;vendor/xx/resource/lang&#39;))

이제 네임스페이스가 있는 리소스를 가져옵니다.

输出 'hello, Faker/Provider';

调用过程如下:

  • 解析键名:将键名进行解析成数组 ($namespace = 'Faker/Provider', $group = 'Internet', $item = 'message');

  • 获取语言数组: 这里的$locale为null,所以返回的是默认与备用语言组成的数组,也就是['zh_CN', 'en'];并进行for循环,进入语言资源目录中寻找需要的元素值,如果找到,即 break;

  • 加载资源:因为命名空间为Faker/Provider,此时会分两步;第一步读取第三方插件资源库下的信息,这时读取命名空间注册的根目录为base_path('vendor/xx/resource/lang'),就读取base_path('vendor/xx/resource/lang')/zh_CN/Internet.php内容,文件不存在,返回空数组;第二步读取全局语言资源,进行补充,也就是读取base_path('resource/lang/vendor/Faker/Provider')/zh_CN/Internet.php; 最后进行保存 $this->loaded[$namespace][$group][$locale] = $lines;

  • 获取资源,并替换参数:通过Arr::get方法从$this->loaded[$namespace][$group][$locale]中获取元素值" hello, Faker/Provider";此时,参数数组为空,直接返回结果 "hello, Faker/Provider";

翻译Json文件中的资源

笔者在语言资源根目录resource/lang下,创建zh_CN.json文件,内容如下:

{
 "name": "zh_CN.json",
 "place": "../resources/lang/zh_CN.json"
}

现在,获取Json文件中的name值;

trans(&#39;*.name&#39;)

输出 "zh_CN.json";

调用过程如下:

  • 解析键名:将键名进行解析成数组 ($namespace = '*', $group = '*', $item = 'name');

  • 获取语言数组: 这里的$locale为null,所以返回的是默认与备用语言组成的数组,也就是['zh_CN', 'en'];并进行for循环,进入语言资源目录中寻找需要的元素值,如果找到,即 break;

  • 加载资源:因为命名空间为*,且组也为*,这时会读取语言根目录下,名字为语言值的Json文件;此时会读取resource/lang/zh_CN.json,将读取的内容,进行保存 $this->loaded[$namespace][$group][$locale] = $lines;

  • 获取资源,并替换参数:通过Arr::get方法从$this->loaded[$namespace][$group][$locale]中获取元素值"zh_CN.json";此时,参数数组为空,直接返回结果 "zh_CN.json";

运行时绑定资源

资源的内容除了放在文件中,用到的时候在读取,也可以在项目运行时,存放;

以resources/lang/zh_CN/validation.php为例,现在想要在运行时,给这个组添加一个新的元素叫 extra,需要指定放在哪个语言下,可以这样写

app(&#39;translator&#39;)->addLines(array(&#39;validation.extra&#39; => &#39;测试添加额外数据&#39;), &#39;zh_CN&#39;);

现在可以获取这个新添加的元素值

trans(&#39;validation.extra&#39;)

复数资源过滤

笔者通过 运行时绑定资源 添加一条翻译内容:

app(&#39;translator&#39;)->addLines(array(&#39;validation.extra&#39; => &#39;{0}没有|[1,19]一些|[20,*]很多&#39;), &#39;zh_CN&#39;);

如果通过trans('validation.extra') ,获取的就是整条翻译内容,不是我们所期望的;用choice方法:

app('translator')->choice('validation.extra', 0) 得到 没有;

app('translator')->choice('validation.extra', 18) 得到 一些;

app('translator')->choice('validation.extra', 20) 得到 很多;

可以将app('translator')->choice(...)简写成全局帮助函数trans_choice(...);

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Laravel的View模块学习

위 내용은 Laravel 현지화 모듈 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.