>  기사  >  백엔드 개발  >  Laravel 현지화 모듈 정보

Laravel 현지화 모듈 정보

小云云
小云云원래의
2018-01-26 10:04:291316검색

laravel 현지화 모듈에 대해 어떻게 더 잘 배울 수 있나요? 먼저 laravel의 모듈 구성을 알아야 하며, 그 다음에는 더 자세히 알아 보겠습니다.

이 글은 Laravel 5.4 버전의 현지화 모듈 코드를 분석하고 작성한 내용입니다.

모듈 구성

다음 그림은 현지화 모듈의 다양한 파일 간의 관계를 보여줍니다.


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

  • 번역기

    번역 관리 카테고리

  • MessageSelector

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

  • LoaderInterface

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

  • FileLoader

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

  • ArrayLoader

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

구성 지침


구성 구성 디렉터리에서 이 모듈과 관련된 유일한 매개 변수는 app.php 파일의 locale 및 fallback_locale입니다. 번역(변환) 내용을 언어 리소스 디렉터리에서 먼저 가져오도록 하는 기본 현지화 언어는 무엇입니까?

로케일로 표시되는 언어가 없으면 fallback_locale 대체 언어가 사용됩니다.

; locale은 zh_CN이고 fallback_locale은 en입니다.

기능 소개

전역 언어 리소스 디렉터리는 프로젝트의 resources/lang 아래에 있습니다. 각 하위 디렉터리는 en, zh_CN 등과 같이 언어 이름을 따서 명명됩니다. 다른 하위 디렉터리의 이름은 타사 로드 라이브러리 리소스 파일을 보충적으로 대체하는 네임스페이스의 이름을 따서 지정됩니다.

프로젝트는 때때로 Json 파일에서 데이터를 읽으며 이러한 데이터는 여기에서 가져옵니다. 기존 Json 파일

전역 언어 리소스 번역

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

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

코드

app('translator')->trans('validation.accepted', ['attribute' => '用户名'])
또는 전역 도움말 함수를 호출하여

trans('validation.accepted', ['attribute' => '用户名'])
output "Username must be accept . ";

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

키 이름 구문 분석: 키 이름을 배열로 구문 분석합니다($namespace = '*', $group = 'validation ', $item = 'accepted'); 네임스페이스는 전역 네임스페이스 아래에 있음을 나타냅니다. 그룹은 실제로 파일 이름이며, 하나의 파일은 그룹을 의미합니다. 언어 배열 가져오기: $ 여기서 locale은 null이므로 대체 언어로 구성된 배열, 즉 ['zh_CN', 'en']을 수행하고 for 루프를 수행하여 필요한 요소 값을 찾습니다. break;

  • 리소스 로드: 네임스페이스가 *이므로 찾은 리소스의 루트 디렉토리는 resources/lang입니다. 언어는 zh_CN이므로 그룹 이름은 유효성 검사입니다. resources/lang/zh_CN/validation.php 파일에서 메모리에 로드되고 $this->loaded[$namespace][$group][$locale] = $lines;

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

  • 네임스페이스로 언어 리소스를 번역합니다

  • 저자가 언어 리소스 아래에 생성했습니다. 루트 디렉터리 Resource/lang Vendor/Faker/Provider/zh_CN/Internet.php 파일의 내용은 다음과 같습니다.

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

    동시에 타사 플러그인의 리소스 루트 디렉터리 위치를 수동으로 등록합니다(즉, , 네임스페이스 포함)
    app('translator')->addNamespace('Faker/Provider', base_path('vendor/xx/resource/lang'))
  • 이제 네임스페이스 공간 리소스를 가져옵니다.
trans('Faker/Provider::Internet.message');

출력 'hello, Faker/Provider'

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

키 이름을 구문 분석합니다. 키 이름을 배열로 저장합니다($namespace = 'Faker/Provider', $group = 'Internet', $item = 'message')

언어 배열을 가져옵니다. 여기서 $locale은 null이므로 반환되는 내용은 다음과 같습니다. 기본 및 백업 언어의 배열, 즉 ['zh_CN', 'en'] 그리고 for 루프를 수행하여 언어 리소스 디렉터리에 들어가 필요한 요소 값을 찾습니다.
  • 加载资源:因为命名空间为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('*.name')

    输出 "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('translator')->addLines(array('validation.extra' => '测试添加额外数据'), 'zh_CN');

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

    trans('validation.extra')

    复数资源过滤

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

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

    如果通过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(...);

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

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