序
本文主要介绍Laravel本地化模块的相关内容,并分享给大家参考学习。话不多说,我们来看看详细的介绍。
本文基于Laravel版本的本地化模块代码。
模块组成
下图显示了本地化模块的各个文件之间的关系,并给出了简要说明。
TranslationServiceProvider本地化模块的服务提供者不仅是一个模块的入口,也是与IOC容器交互的中心。注册翻译器实例translation.loader,注册翻译管理实例translator,声明延迟加载服务;译者翻译管理班;MessageSelector消息过滤器,通过判断复数值选择合适的消息;例如,消息内容如下:{0}没有|[1,19] some |[20,*]很多,我们传递的数字是18,所以最后选择的消息是‘some’;LoaderInterface转换器接口;声明了三个方法load、addNamespace、namespaces;文件加载器继承加载器接口,并从文件中获取本地化的资源数据。ArrayLoader继承LoaderInterface,并使用内存中的数组维护本地化的资源数据。配置描述
配置配置目录中与此模块相关的参数只有locale和fallback _ locale在app.php档案中;
Locale表示默认的本地化语言,因此首先从语言资源目录中获取翻译(转换)内容;如果区域设置所表示的语言不存在,则fallback_locale将用作替代语言;
作者的语言环境是zh_CN,fallback_locale是en。
功能介绍
全局语言资源目录在项目的resources/lang下,每个子目录按语言命名,如en、zh _ CN
其他子目录以命名空间命名,是对第三方加载库资源文件的补充替换;
可能还有像en.json和zh_CN这样的json文件,项目有时会从Json文件中读取数据,这些数据都来自这个现有的Json文件;
翻译全球语言资源
作者语言资源/lang的根目录下有zh_CN/validation.php,内容如下
?必须接受phprreturn[' accepted '=' : attribute,',“active _ URL”=“: attribute”不是有效的网址。' after'=':attribute必须是:date之后的日期。];通过调用代码
App('翻译')-trans('验证。接受',['属性'='用户名'])或全局帮助函数trans
Trans('验证。accepted ',['attribute'=' user name'])输出“用户名必须被接受。”;
调用过程如下:
解析键名:将键名解析为数组($ namespace=' * ',$ group=' validation ',$ item=' accepted ');命名空间为*,表示在全局命名空间下;组,组,其实就是一个文件名,一个文件就是一个组;项是一个元素的意义;Get language array: $locale在这里为null,所以返回一个由默认语言和备用语言组成的数组,即['zh _ cn ',' en '];而对于loop,进入语言资源目录查找需要的元素值,如果找到了,就break;加载资源:因为命名空间是*,所以将资源根目录定位为resources/lang;语言为zh_CN,所以子目录为zh _ CN;Group被命名为validation,然后将resources/lang/zh _ cn/validation . PHP文件中的所有内容加载到内存中,并保存$ this-loaded[$ namespace][$ group][$ locale]=$ line;获取资源和替换参数:通过Arr:get方法从$ this加载的[$ namespace] [$ group] [$ locale]获取元素值。必须接受:属性。此时,参数数组不是空的,结果是“用户名必须被接受。”;使用名称空间翻译语言资源
在语言资源根目录resource/lang下,作者创建了文件vendor/faker/provider/zh _ cn/internet . PHP,内容如下:
?phpreturn [ 'message'='您好,Faker/Provider ',];同时,在Translator中手动注册第三方插件的资源根目录位置(即带命名空间);
app(' translator ')-add namespace(' faker/provider ',base _ path(' vendor/xx/resource/lang '))现在,获取带有namespace的资源;
trans(' Faker/provider : internet . message ');输出“你好,Faker/Provider”;
调用过程如下:
解析键名:将键名解析为数组($ namespace=' faker/provider ',$ group=' internet ',$ item=' message ');Get language array: $locale在这里为null,所以返回一个由默认语言和备用语言组成的数组,即['zh _ cn ',' en '];而对于loop,进入语言资源目录查找需要的元素值,如果找到了,就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]=$ line;获取资源和替换参数:获取元素值‘你好,Faker/Provider’;Arr:get方法从$ this加载的[$ namespace][$ group][$ locale];这时;参数数组为空;以及结果“你好,Faker/Provider”;直接返回。翻译Json文件中的资源
作者在语言资源根目录resource/lang下创建了zh_CN.json文件,内容如下:
{“name”:“zh _ cn . JSON”,“place”:/resources/lang/zh _ cn.json'}现在,获取json文件中的名称值;
Trans('*。name’)输出“zh _ cn . JSON”;
调用过程如下:
解析键名:将键名解析为数组($ namespace=' * ',$ group=' * ',$ item=' name ');Get language array: $locale在这里为null,所以返回一个由默认语言和备用语言组成的数组,即['zh _ cn ',' en '];而对于loop,进入语言资源目录查找需要的元素值,如果找到了,就break;Load resource:因为命名空间是*并且组也是*,所以将读取语言根目录下名为language value的Json文件;此时,将读取resource/lang/zh_CN.json,读取的内容将保存$ this-loaded[$ namespace][$ group][$ locale]=$ line;获取资源和替换参数:通过Arr:get方法从$ this加载的[$ namespace] [$ group] [$ locale]中获取元素值' zh _ cn . JSON ';这时;参数数组为空;并且直接返回结果“zh _ cn.json”。运行时绑定资源
资源的内容不仅放在文件中,而且在使用时读取,在项目运行时可以存储;
拿资源/lang/zh _ cn/validation来说。以PHP为例。现在我想在运行时向这个组添加一个名为extra的新元素。我需要指定用哪种语言。我可以这样写。
APP('翻译器')-添加行(数组('验证。extra'='测试添加额外数据'),' zh _ CN ');现在,您可以获得这个新添加的元素的值
Trans('validation.extra ')复杂的资源筛选
作者通过在运行时绑定资源来添加翻译:
App('翻译器')-add line(数组('验证。extra'=' {0} no |[1,19] some |[20,*] many '),' zh _ CN ');如果您通过trans('validation.extra '),您将获得整个翻译内容,这不是我们所期望的。使用选择方法:
有app('翻译')-choice('验证。获取了额外的' ^ 0 '?
从app('翻译')-choice('验证)中获取一些。' extra ',18);
App('翻译')-选择('验证。额外得到很多;
您可以缩写app('translator')-choice(.)作为全局帮助函数trans _ choice(.);
摘要
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。