Intl组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
Intl组件
2.3
Intl组件是在Symfony 2.3中引入的。ob娱乐下载在Symfony的早期版本中,您应该使用本地组ob娱乐下载件。
谨慎
更换层地区“en”是有限的。如果你想使用其他的地方,你应该安装intl扩展代替。
安装
你可以安装组件在两种不同的方式:
- 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Intl);
- 安装它通过作曲家(
ob娱乐下载symfony / intl
在Packagist)。
如果你安装组件通过作曲家,intl扩展的类和函数后将自动提供如果intl扩展没有加载:
- 排序器
- IntlDateFormatter
- 语言环境
- NumberFormatter
- intl_error_name
- intl_is_failure
- intl_get_error_code
- intl_get_error_message
当intl扩展不可用,下面的类用于取代intl类:
作曲家自动公开这些类在全局命名空间。
如果你不使用,但作曲家ob娱乐下载Symfony类加载器组件,你需要让他们通过添加以下行手动自动加载代码:
1 2 3 4 5
如果(! function_exists (“intl_is_failure”)){需要' /道路/ / Icu /资源/存根/”显然也;美元加载程序- >registerPrefixFallback (' /道路/ / Icu /资源/存根的);}
ICU和部署问题
intl扩展内部使用ICU库获取定位数据,如数字格式在不同的语言中,国家名称和更多。让用户数据访问PHP库,Symfony船只的一个副本ob娱乐下载Icu组件。
根据ICU版本编译intl扩展,一个匹配的版本需要安装的组件。听起来复杂,但通常这是作曲家为您自动:
- 1.0。*:当intl扩展是不可用的
- 1.1。*:当intl编译与ICU 3.8或更高版本
- 1.2。*:当intl编译与ICU 4.4或更高版本
这些版本很重要,当你部署你的应用程序服务器ICU较低版本比你的开发机器,因为部署将会失败如果:
- 开发机器编译与ICU 4.4或更高版本,但是服务器编译ICU版本低于4.4;
- intl扩展可以在开发机器上而不是在服务器上。
例如,考虑到您的开发机器船ICU 4.8和4.2服务器ICU。当您运行php的作曲家。phar更新
在开发机器上,1.2版本。* Icu的组件将被安装。但在部署应用程序之后,php的作曲家。phar安装
将失败有以下错误:
1 2 3 4 5 6 7 8 9
美元php作曲家。phar安装Loading composer repositories with package information Installing dependencies from lock file Your requirements could not be resolved to an installable集的包。问题1 - symfonob娱乐下载y / icu 1.2。x需要lib-icu > = 4.4 - >请求的链接库icu有错误或丢失您的系统上安装版本,确保扩展提供它。
错误告诉你请求的Icu组件的版本,1.2版本,与PHP的Icu 4.2版本不兼容。
对于这个问题,一个解决方案是运行php的作曲家。phar更新
而不是php的作曲家。phar安装
。强烈建议不来做到这一点。的更新
命令将安装最新版本的每个作曲家依赖到生产服务器和潜在破坏应用程序。
更好的解决方案是修复你的作曲家。json版本所需的生产服务器。首先,确定服务器上的ICU版本:
1 2
php -美元| grep ICU ICU version = > 4.2.1。准备
然后Icu组件固定在你的composer.json
文件来匹配的版本:
1 2 3
“要求:{”ob娱乐下载symfony / icu”:“1.1. *"}
设置版本
- “1.0。*”如果服务器没有intl扩展安装;
- “1.1。*”如果服务器编译与ICU 4.2或更低。
最后,运行php的作曲家。phar更新ob娱乐下载symfony / icu
广泛开发机器,测试和部署。现在安装的依赖关系将成功。
写作和阅读资源包
的ResourceBundle类是目前不支持此组件。相反,它包含一组阅读和写作的读者和作家数组(或数组类对象)/资源包文件。下面的类是支持:
- TextBundleWriter
- PhpBundleWriter
- BinaryBundleReader
- PhpBundleReader
- BufferedBundleReader
- StructuredBundleReader
继续阅读,如果你感兴趣如何使用这些类。否则跳过本节和跳转访问ICU数据。
TextBundleWriter
的TextBundleWriter写一个数组或类似数组的对象一个纯文本资源包。由此产生的. txt文件可以转换为二进制文件与rBundleCompiler类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\Intl\ResourceBundle\作家\TextBundleWriter;使用ob娱乐下载\组件\Intl\ResourceBundle\编译器\BundleCompiler;美元作家=新TextBundleWriter ();美元作家- >写(的路径/ /包,“en”,数组(“数据”= >数组(“entry1”,“entry2”,/ /……)));美元编译器=新BundleCompiler ();美元编译器- >编译(的路径/ /包,/道路/ /二进制/包的);
命令“genrb”必须是可用的BundleCompiler去工作。如果命令位于非标准的位置,你可以通过它的路径BundleCompiler构造函数。
PhpBundleWriter
的PhpBundleWriter写一个数组或类似数组的对象。php资源包:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\Intl\ResourceBundle\作家\PhpBundleWriter;美元作家=新PhpBundleWriter ();美元作家- >写(的路径/ /包,“en”,数组(“数据”= >数组(“entry1”,“entry2”,/ /……)));
BinaryBundleReader
的BinaryBundleReader读取二进制资源包文件并返回一个数组或类似数组的对象。目前仅适用于这类intl扩展安装:
1 2 3 4 5 6
使用ob娱乐下载\组件\Intl\ResourceBundle\读者\BinaryBundleReader;美元读者=新BinaryBundleReader ();美元数据=美元读者- >读(的路径/ /包,“en”);回声美元数据(“数据”][“entry1”];
PhpBundleReader
的PhpBundleReader读取资源包。php文件,并返回一个数组或类似数组的对象:
1 2 3 4 5 6
使用ob娱乐下载\组件\Intl\ResourceBundle\读者\PhpBundleReader;美元读者=新PhpBundleReader ();美元数据=美元读者- >读(的路径/ /包,“en”);回声美元数据(“数据”][“entry1”];
BufferedBundleReader
的BufferedBundleReader包装另一个读者,但保持过去N读入缓冲区,其中N是一个缓冲区大小传递到构造函数:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\Intl\ResourceBundle\读者\BinaryBundleReader;使用ob娱乐下载\组件\Intl\ResourceBundle\读者\BufferedBundleReader;美元读者=新BufferedBundleReader (新BinaryBundleReader (),10);/ /读取文件美元数据=美元读者- >读(的路径/ /包,“en”);/ /返回数据的缓冲区美元数据=美元读者- >读(的路径/ /包,“en”);/ /读取文件美元数据=美元读者- >读(的路径/ /包,“fr”);
StructuredBundleReader
的StructuredBundleReader包装另一个读者,提供了一个readEntry ()方法用于读取一个条目的资源包,而不必担心是否数组键设置。如果无法解决的路径,零
返回:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\Intl\ResourceBundle\读者\BinaryBundleReader;使用ob娱乐下载\组件\Intl\ResourceBundle\读者\StructuredBundleReader;美元读者=新StructuredBundleReader (新BinaryBundleReader ());美元数据=美元读者- >读(的路径/ /包,“en”);/ /产生一个错误如果键“数据”是不存在的回声美元数据(“数据”][“entry1”];/ /返回null如果键“数据”是不存在的回声美元读者- >readEntry (的路径/ /包,“en”,数组(“数据”,“entry1”));
此外,readEntry ()方法解决后备区域。例如,回退地区“en_GB”是“en”。为单值条目(字符串、数字等),入口会读回退场所如果不能更具体的语言环境中。对于多值条目(数组),更具体的值和回退场所将被合并。为了抑制这种行为,最后一个参数美元的回退
可以设置为假
:
1 2 3 4 5 6
回声美元读者- >readEntry (的路径/ /包,“en”,数组(“数据”,“entry1”),假);
访问ICU数据
加护病房数据位于几个“资源包”。你可以通过静态访问PHP包装这些包Intl类。目前,支持以下数据:
语言和脚本的名称
语言和脚本名称的翻译中可以找到语言包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\Intl\Intl;\地区::setDefault (“en”);美元语言= Intl::getLanguageBundle ()- >getLanguageNames ();/ / = >阵列(“ab”= >“阿布哈西亚语”,…)美元语言= Intl::getLanguageBundle ()- >getLanguageName (“德”);/ / = >“德国”美元语言= Intl::getLanguageBundle ()- >getLanguageName (“德”,“在”);/ / = >德国奥地利的美元脚本= Intl::getLanguageBundle ()- >getScriptNames ();/ / = >阵列(“阿拉伯”= >“阿拉伯语”,…)美元脚本= Intl::getLanguageBundle ()- >getScriptName (“汉斯”);/ / = >“简化”
所有方法接受翻译语言环境作为过去,可选参数,默认为当前默认语言环境:
1 2
美元语言= Intl::getLanguageBundle ()- >getLanguageNames (“德”);/ / = >阵列(“ab”= >“Abchasisch”,…)
国家的名字
国家名称的翻译中可以找到该地区包:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\Intl\Intl;\地区::setDefault (“en”);美元国家= Intl::getRegionBundle ()- >getCountryNames ();/ / = >阵列(“对焦”= >“阿富汗”,…)美元国家= Intl::getRegionBundle ()- >getCountryName (“GB”);/ / = >“联合王国”
所有方法接受翻译语言环境作为过去,可选参数,默认为当前默认语言环境:
1 2
美元国家= Intl::getRegionBundle ()- >getCountryNames (“德”);/ / = >阵列(“对焦”= >“阿富汗”,…)
地区
地区名称的翻译中可以找到语言包:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\Intl\Intl;\地区::setDefault (“en”);美元地区= Intl::getLocaleBundle ()- >getLocaleNames ();/ / = >阵列(“对焦”= >“南非荷兰语”,…)美元语言环境= Intl::getLocaleBundle ()- >getLocaleName (“zh_Hans_MO”);/ / = > '中文(简体,中国澳门特别行政区)”
所有方法接受翻译语言环境作为过去,可选参数,默认为当前默认语言环境:
1 2
美元地区= Intl::getLocaleBundle ()- >getLocaleNames (“德”);/ / = >阵列(“对焦”= >“南非荷兰语”,…)
货币
货币名称的翻译和其他货币汇率相关的信息可以发现包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\Intl\Intl;\地区::setDefault (“en”);美元货币= Intl::getCurrencyBundle ()- >getCurrencyNames ();/ / = >阵列(“AFN”= >“阿富汗阿富汗的”,…)美元货币= Intl::getCurrencyBundle ()- >getCurrencyName (印度卢比的);/ / = > '印度卢比美元象征= Intl::getCurrencyBundle ()- >getCurrencySymbol (印度卢比的);/ / = > '₹'美元fractionDigits= Intl::getCurrencyBundle ()- >getFractionDigits (印度卢比的);/ / = > 2美元roundingIncrement= Intl::getCurrencyBundle ()- >getRoundingIncrement (印度卢比的);/ / = > 0
(除了所有方法getFractionDigits ()和getRoundingIncrement ())接受翻译语言环境作为最后一个可选参数,默认为当前默认语言环境:
1 2
美元货币= Intl::getCurrencyBundle ()- >getCurrencyNames (“德”);/ / = >阵列(“AFN”= >“Afghanische阿富汗”,…)
这是所有你需要知道的。有有趣的编码!