netson / l4gettext
为Laravel 4应用程序添加Gettext支持的包
Requires
- php: >=5.3.0
- illuminate/config: >=4.0,<4.3
- illuminate/filesystem: >=4.0,<4.3
- illuminate/foundation: >=4.0,<4.3
- illuminate/session: >=4.0,<4.3
- illuminate/support: >=4.0,<4.3
- illuminate/view: >=4.0,<4.3
Requires (Dev)
- mockery/mockery: dev-master
- orchestra/testbench: >=2.0,<2.3
README
此包将gettext功能添加到Laravel 4框架中,允许您使用诸如PoEdit之类的工具轻松翻译您的应用程序。虽然Laravel 4自带内置的翻译引擎,但我更喜欢使用像PoEdit这样的工具,它消除了维护文本数组的需求。这是我第一次使用Laravel的经验/包,所以如果您遇到任何错误或对改进有建议,请告诉我。此包与Laravel 4.0、4.1和4.2兼容。
作者: Rinck Sonnenberg (Netson)
安装
使用composer安装
- 将netson/l4gettext添加为必需包
$ php composer.phar require "netson/l4gettext:1.5.*"
- 更新composer
$ php composer.phar update
- 将l4gettext服务提供者添加到laravel app/config/app.php文件中,在数组键'provider'下
<?php // app/config/app.php return array( .. 'providers' => array( .. 'Netson\L4gettext\L4gettextServiceProvider', ), .. ); ?>
接下来,通过执行以下命令自动检测已安装的区域设置和编码以及默认设置:
$ php artisan l4gettext:install
注意:由于此命令使用Windows系统上不可用的locale命令,因此仅在Linux/MacOS上可用。如果尚未发布配置文件,它将自动发布配置文件。
默认情况下,L4gettext带有默认的en_US.utf-8,但通过使用l4gettext:install命令,它将检查系统默认设置并使用这些设置。
现在,请确保在文件app/config/packages/netson/l4gettext/config.php中设置适当的版权所有者、包名、包版本和电子邮件地址。
或者,如果您在Windows上或希望采取手动方式,可以手动发布包配置并编辑配置文件:
$ php artisan config:publish netson/l4gettext
它是如何工作的?
此包简单地利用现有功能,允许您在Laravel Blade模板中使用gettext。
注意:_ Symfony包含一个.pof文件读取器;这与本实现不同,因为它使用系统上的实际gettext库。
您可以在模板中使用以下函数
- _() gettext的简写
- gettext()
- dgettext()
- dcgettext()
- ngettext()
- dngettext()
- dcngettext()
- _n() ngettext的自定义简写
如果您想使用任何自定义函数,请查看config.php文件以获取更多信息!您可以使用以下语法轻松在blade模板中使用这些函数和任何自定义函数: {{ _('翻译这个') }} 或 {{ _n("只有一个", "可以有多于一个", 5) }}
默认配置对于大多数系统来说应该很好,但您至少应该更改版权所有者、包名、包版本和电子邮件地址设置。
除了这些之外,您可以按照自己的意愿更改所有选项。 在更改选项之前,请使用以下命令发布此包的配置:
$ php artisan config:publish netson/l4gettext
请参阅config.php文件中的注释,以获取每个选项的详细文档。
当您准备好开始翻译时,请使用此包提供的命令编译您的模板并提取翻译字符串。有关更多信息,请参阅命令行选项部分。
入门指南
要开始使用此模块和gettext,您可以遵循以下基本步骤:
-
按照本文档中的安装说明(见上文)安装模块
-
要检查系统上检测到的区域设置和编码,请执行以下命令:
$ php artisan l4gettext:list -
接下来,创建您的Laravel blade模板,就像平常一样,但现在将所有可翻译文本放在正确的gettext函数中。例如:
{{ _("Hello World!") }}- 关于更多信息,请参阅本文档中的“如何工作?”部分 -
创建完模板后,您需要编译它们,以便提取可翻译的字符串。要编译模板,请执行以下命令:
$ php artisan l4gettext:compile -
接下来,您需要从编译后的模板和视图文件夹中提取所有可翻译字符串到一个.POT文件;通过执行以下命令完成此操作:
$ php artisan l4gettext:extract -
使用POEdit翻译.POT文件,并使用它创建您的.mo文件。POEdit的最新版本会在您保存翻译时自动编译.mo文件。- 在“命令行选项”部分下面有一个重要说明 如果正在更新现有翻译!
-
将此编译后的.mo文件(如果有多于1个翻译,则可能多个)放入适当的区域设置文件夹中(例如:app/locale/en_GB/LC_MESSAGES/messages.mo)- 注意,gettext在文件夹约定方面非常挑剔!
-
现在您应该可以开始使用了!通过使用内置路由尝试您的新翻译网站/应用程序:yoursite.ext/set-locale/en_GB(假设您已将应用程序翻译成英国英语)。
如果您遇到任何问题,请查看本文档中的故障排除部分,如果那也没有帮助,请向GitHub报告任何问题! :)
想要在源代码中使用翻译者注释吗?
Gettext支持使用翻译者注释,L4gettext也是如此。如果您想在源代码中为翻译者添加注释,可以使用以下语法,假设您已在配置文件中将变量"xgettext > comments"设置为TRANSLATORS
{{-- TRANSLATORS: the note --}}{{ _('My string.') }}
或者
{{ /* TRANSLATORS: the note */ _('My string.') }}
示例由loranger提供
依赖项
除了laravel 4的一些组件外,还有一些逻辑依赖项
- gettext库(如果未安装,请运行sudo apt-get install gettext)
- xgettext(在安装gettext库时自动安装)
- php-gettext
注意: 此包仅在Linux(Ubuntu Server 12.04 LTS)上进行了彻底测试。
命令行选项
本包有4个Artisan命令
- l4gettext:compile:将所有blade模板文件编译到特定文件夹中(不是默认的缓存文件夹)
- l4gettext:extract:从编译后的模板和视图文件夹中提取所有语言字符串;如果想要从额外的文件夹中提取字符串,可以使用可选的additional_input_folders - 请参阅config.php获取更多信息。
- l4gettext:install:自动生成locales.php和encodings.php配置文件,包含您的操作系统上安装的区域设置和编码,并在config.php中设置默认值;如果配置文件尚未发布,此命令将首先发布它们
- l4gettext:list:列出应用程序支持的区域设置/编码(不是系统区域设置)和打印默认设置
- l4gettext:fetch:自动生成locales.php和encodings.php配置文件,包含您的操作系统上安装的区域设置和编码
这些命令使用配置文件中设置的选项,但大多数可以在运行时通过在CLI上提供适当的参数来覆盖。查看这些命令的帮助以获取更多信息
$ php artisan l4gettext:compile -h
$ php artisan l4gettext:extract --help
注意:运行 l4gettext:extract 命令可以从编译模板和视图文件夹中的 php 文件中提取所有语言消息。
如果发现可翻译的字符串,提取命令会在输出目录中创建一个 .pot 文件。请使用 POEdit 工具(底部链接)打开此文件。一旦你在 poedit 中输入了翻译字符串,请点击保存按钮。这将自动生成编译/索引的翻译文件 .mo 版本。将此编译后的 .mo 文件放置在适当的区域文件夹中(例如:app/locale/en_GB/LC_MESSAGES/messages.mo)。请注意,gettext 对文件夹约定非常挑剔!
重要:每次运行提取命令时,都会在 storage/l4gettext 文件夹中生成一个新的 .pot 文件。所以,如果你已经为一些字符串输入了翻译,请不要再次运行提取命令,因为这将会创建一个新的 .pot 文件覆盖你的编辑。POEdit 使管理你的 .pot 文件变得非常简单。如果你在最后时刻对模板进行了添加/更改,需要在 POEdit 的“目录属性”/“源路径”对话框中输入“app/views”和“app/storage/gettext”文件夹的路径。然后,在 POEdit 工具栏上单击“更新”按钮以合并更新。
支持的区域设置
Gettext 要求您想使用的区域设置已安装在您的系统上。如果您尝试设置一个有效的但未安装的区域设置,将会抛出异常。您可以通过在 (linux) CLI 上执行以下命令来检查哪些区域设置已安装:
$ locale -a
或者,使用以下命令生成一个新的区域设置
$ sudo locale-gen nl_NL.UTF-8
有关 Windows 系统上的区域设置,请查看此链接。Windows 系统不支持 UTF-8。
Laravel 路由
该软件包注册了 2 个新的路由
- your-site-url/set-locale/{locale}
- your-site-url/set-encoding/{encoding}
这些路由允许您通过让用户点击链接来轻松地在区域设置/编码之间切换。这些路由将自动将用户返回到他们原来的地址(使用 HTTP_REFERER),如果不可用,则重定向到 '/'. 传入 {locale} 和 {encoding} 的输入将与有效区域设置/编码数组进行校验,这可以通过配置文件进行更改。设置的区域设置/编码将存储在会话中。
因此,即使您的系统安装了 10 个不同的区域设置,如果您的应用程序只支持 3 个,只需在区域设置数组中保留选定的 3 个即可。
- 有关区域设置的完整列表,请查看:vendor/netson/l4gettext/src/config/locales.php
- 有关编码的完整列表,请查看:vendor/netson/l4gettext/src/config/encodings.php
注意:如果您尝试设置一个未安装在您的系统上的区域设置或编码,将会抛出异常。
集成
如果您想将此软件包集成到自己的模块/软件包中,以下是最重要的方法列表:
- L4gettext::setLocale($locale) - 设置区域设置
- L4gettext::getLocale() - 返回 (string) 区域设置,如果区域设置未设置则抛出 LocaleNotSetException
- L4gettext::hasLocale() - 返回 (bool) 如果已设置区域设置则返回 true,否则返回 false
- L4gettext::setEncoding($encoding) - 设置编码
- L4gettext::getEncoding() - 返回 (string) 编码,如果编码未设置则抛出 EncodingNotSetException
- L4gettext::hasEncoding() - 返回 (bool) 如果已设置编码则返回 true,否则返回 false
- L4gettext::getLocaleAndEncoding() - 返回 (string) 区域设置编码
故障排除
Gettext 位置
此软件包假定 xgettext 库位于您的 web 服务器用户的路径中。如果情况不是这样,您可能会收到一个 "[127] 命令未找到" 错误消息。要修复此问题,您有两个选项
- 将您的 xgettext 二进制文件的路径添加到配置文件中(假设 /usr/bin 是您的 xgettext 二进制文件的位置)
<?php return array( // ... 'xgettext' => array( 'binary_path' => "/usr/bin", // ...
务必首先发布配置文件
$ php artisan config:publish netson/l4gettext
然后,编辑本地的配置文件 app/config/packages/netson/l4gettext/config.php
- 或者,在命令行界面(CLI)中执行以下命令(假设 www-data 是您的网站服务器用户)
$ su www-data
$ echo 'export PATH=$PATH:/path/to/your/xgettext/folder' >> ~/.bashrc
现在您可以开始使用了!
Gettext 缓存
按照设计,Gettext 会在首次使用时缓存翻译后的 .mo 文件。这有时会导致您对 .po/.mo 文件所做的更改在应用程序中不显示。最简单的修复方法是重新启动您的网站服务器(例如 Apache)。当然,还有其他解决方案(例如针对开发环境),如果您感兴趣,建议您在 Google 上搜索这些信息。
变更日志
版本 1.5.0
- 增加了对 Laravel 4.2 的支持
- 增加了额外的输入文件夹选项;有关详细信息,请参阅配置文件 - 由 akaroot 提出
版本 1.4.0
- 增加了安装命令/更新了获取命令
- 增加了有关翻译者注解的文档 - 感谢 loranger
版本 1.3.0
- 增加了对 Laravel 4.1 的支持
- 改进了 ExtractCommand:在提取消息之前,合并了编译文件夹中的 php 文件和视图文件夹中的 php 文件 - 感谢 mnshankar
- 改进了文档
版本 1.2.0
- 移除了对 L4shell 的依赖 - 用 Symfony Process 组件代替