CakePHP静态数据本地化

时间:2018-09-05 11:40:46

标签: cakephp localization cakephp-3.0

CakePHP版本:3.6.6

我为这么长的帖子提前致歉,但我相信这是某人能够提供帮助所需的全部信息。

============================================= ============================== 第1部分

//我想要实现的目标

最终,我希望我的应用程序自动检测用户的语言并相应地更改以下内容:

  1. 文本。
  2. 日期格式。
  3. 数字格式。
  4. 货币。

为了实现这一点,我首先通过简化它,而不是尝试自动检测用户的语言,而是在config / app.php中手动更改语言环境。

============================================= ============================== 第二部分

//我已参考的信息

  1. 国际化和本地化-Here

  2. I18N外壳-Here

============================================= ============================== 第3部分

//开始之前我需要做什么

config / app.php
'defaultLocale'=> env('APP_DEFAULT_LOCALE','en_GB'),

config / bootstrap.php
ini_set('intl.default_locale',Configure :: read('App.defaultLocale'));

//欢迎控制器

?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Event\Event;

// For translation
use Cake\I18n\I18n;
use Cake\I18n\Time;
use Cake\I18n\Number;

class WelcomeController extends AppController
{   
    public function index()
    {
        // Get the default locale
        $defaultLocale = I18n::getDefaultLocale();
        echo $defaultLocale . '<br />';

        // Date
        $date = new Time('2017-12-05 23:00:00'); 
        echo $date . '<br />';

        // Number
        echo Number::format(123.50) . '<br />';

        // Currency
        echo Number::currency(1250.00) . '<br /><br />';        
    }     
}

// index.ctp

<?= __('Welcome') ?>
<br />
<?= __('What would you like to do today!') ?>

//这是浏览器显示的内容

en_GB
05/12/2017, 23:00
123.5
£1,250.00
Welcome
What would you like to do today!

============================================= ============================== 第4部分

//我做了什么

1。。在src中创建了一个名为Locale的文件夹
2。。在语言环境中创建了一个名为de_DE

的文件夹。

3。。使用cli导航到垃圾箱。
4。。键入蛋糕i18n提取物,然后单击Enter。
5。。单击回车后,cli将显示以下内容:

当前路径:无
您想提取的路径是什么?
[Q] uit [D] one
[C:xampp \ htdocs \ app_name \ src]>

然后我在>之后添加以下内容,然后单击Enter
C:xampp \ htdocs \ app_name \ src \ Template \ Welcome

6。。单击回车后,cli将显示以下内容:

当前路径:C:xampp \ htdocs \ app_name \ src \ Template \ Welcome
您想提取的路径是什么?
[Q] uit [D] one
[D]>

7。。然后单击Enter,cli显示以下内容:

您想从CakePHP核心中提取消息吗? (是/否)
[n]>

8。。然后单击Enter,cli显示以下内容:

您要输出的路径是什么?
[Q] uit
[C:xampp \ htdocs \ app_name \ src \ Template \ Welcome \ Locale]>

然后我在>之后添加以下内容,然后单击Enter
C:xampp \ htdocs \ app_name \ src \ Locale

9。。然后单击Enter,cli显示以下内容:

是否要将所有域字符串合并到default.pot文件中? (是/否)
[n]>

10。。然后单击Enter,cli显示以下内容:

正在提取...
路径:C:xampp \ htdocs \ app_name \ src \ Template \ Welcome
输出目录:C:xampp \ htdocs \ app_name \ src \ Locale \
================================================= ==================> 100%
完成。

11。。此后,我在src / Locale文件夹中有了一个default.pot文件。我将此文件复制并粘贴到de_DE文件夹中。

此文件夹的内容如下:

# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2018-09-05 09:20+0000\n"
"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr ""

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr ""

然后我将以下内容添加到2 msgstr中,使其看起来如下所示:

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr "abc"

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr "xyz"

然后我将config / app.php中的默认语言环境更改为:
'defaultLocale'=> env('APP_DEFAULT_LOCALE','de_DE'),

然后我刷新浏览器,并显示以下内容:

de_DE
05.12.15, 23:00
123,5
1.250,00 €
Welcome
What would you like to do today!

============================================= ============================== 第5部分

//结果

语言环境,日期,数字和货币已更改,但文本未更改。它仍然显示:

Welcome
What would you like to do today!

我希望它能够显示:

abc
xyz

============================================= ============================== 第六部分

//我试图解决的问题

我将以下内容添加到中间件-Application.php:

// Add middleware and set the valid locales
$middlewareQueue->add(new LocaleSelectorMiddleware(['en_GB', 'de_DE']));

这是浏览器显示的内容:

de_DE
05/12/2015, 23:00
123.5
£1,250.00
Welcome
What would you like to do today!  

语言环境仍为de_DE,但日期,数字和货币已恢复为英语?

============================================= ============================== 第7节

//摘要

我真的很感谢任何帮助,因为如果我可以将我的应用程序本地化并具有允许用户以其母语使用我的应用程序的功能,那将是非常出色的。如果无法正常工作,我真的会限制我的市场。

如果我还有其他未写但您需要的内容,请不要犹豫让我知道。

在此先感谢您的帮助。 Z

============================================= ==============================

@ndm -感谢您的回复,已经学到了很多东西,但还没有雪茄。

我下载了Poedit并打开了它。然后,我单击“编辑翻译”,并从Locale文件夹中打开default.pot文件。

一切看起来不错,并显示以下内容:
欢迎
您今天想做什么!

然后我点击“创建新翻译”,然后从下拉菜单中选择德语,该窗口分为两半:

在左侧-源文本-英文。
在右侧-翻译-德语。

我突出显示“ Welcome”,然后选择等效的德语“ Willkommen”,然后将其填充在右侧窗口中。对于“您今天想做什么”,我也是如此。

这时,右边的窗口中填充了等效的德语,所以我转到“另存为”并将文件保存在src / Locale文件夹的de_DE文件夹中。

我的de_DE文件夹现在装有2个文件,如下所述:

  1. de.mo
  2. de.po

我打开de.po文件,其内容如下:

# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2018-09-05 09:41+0000\n"
"PO-Revision-Date: 2018-09-05 14:26+0100\n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.1.1\n"
"Last-Translator: \n"
"Language: de\n"

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr "Willkommen"

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr "Was würden Sie heute gerne machen!"

然后我清除缓存(tmp / cache / persistent)并刷新浏览器。

为确认我在config / app.php中具有以下内容
'defaultLocale'=> env('APP_DEFAULT_LOCALE','de_DE'),

我已经注释掉了中间件参考。

不幸的是,该文本仍未翻译?

这似乎是一个相对简单的过程,所以令我惊讶的是它没有奏效。希望您能看到我在上面记录的过程中做错的事情。

再次感谢Z。

//我尝试修复的问题

1。。我尝试从以下位置更改config / app.php中的语言定义:

'defaultLocale'=> env('APP_DEFAULT_LOCALE','de_DE'),

'defaultLocale'=> env('APP_DEFAULT_LOCALE','de'),

然后清除缓存并刷新,但没有运气。

2。。我颠倒了上述内容,然后尝试从以下位置更改de.po文件中的语言定义:

“语言:de \ n”到de_DE \ n

然后清除缓存并刷新,但仍然没有运气。

2 个答案:

答案 0 :(得分:0)

.pot文件是模板(PO格式),您可以使用它们从其中创建.po(普通)或.mo(二进制)格式的最终​​翻译文件( CakePHP正在查找的文件),或使用更改后的消息更新后者。

您可以手动重命名和编辑文件,也可以使用Poedit之类的工具为gettext tools提供GUI,这可以帮助您创建/更新.po / {{1} }文件。

每当对翻译文件进行更改时,请记住之后要清除缓存(.mo)!

答案 1 :(得分:0)

我知道这有点晚了,但是对于任何偶然发现这一步的人来说。

检查src / Locale,src / Locale / de_DE和.po&.mo文件的权限。

我有一个类似的问题,即我生成的.po和.mo文件不能被Web服务器用户读取,并且文本的翻译无声地失败了,就像在OPs问题中那样。