CakePHP静态数据的本地化



CakePHP版本:3.6.6

我提前为这么长的帖子道歉,但我相信这是有人能够提供帮助所需要的所有信息。

==================================================== 第1节

//我想实现的目标

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

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

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

==================================================== 第2节

//我引用的信息

  1. 国际化&本地化-此处

  2. I18N外壳-此处为

==================================================== 第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 AppController;
use AppControllerAppController;
use CakeEventEvent;
// For translation
use CakeI18nI18n;
use CakeI18nTime;
use CakeI18nNumber;
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.在Locale中创建了名为de_de
的文件夹

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

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

然后,我在>之后添加以下内容,并单击输入
C:\examplep\htdocs\app_name\src\Template\Welcome

6.单击输入后,cli将显示以下内容:

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

7.然后单击enter,cli将显示以下内容:

你想从CakePHP核心提取消息吗?(y/n)
[n]>

8.然后单击回车,cli将显示以下内容:

您希望输出的路径是什么
[Q]uit
[C:examplep\htdocs\app_name\src\Template\Welcome\Locale]>

然后,我在>之后添加以下内容,并单击输入
C:\examplep\htdocs\app_name\src\Locale

9.然后单击enter,cli将显示以下内容:

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

10.然后单击enter,cli将显示以下内容:

正在提取
路径:C:\xamplep\htdocs\app_name\src\Template\Welcome
输出目录:C:\xamp\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 VERSIONn"
"POT-Creation-Date: 2018-09-05 09:20+0000n"
"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZn"
"Last-Translator: NAME <EMAIL@ADDRESS>n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=utf-8n"
"Content-Transfer-Encoding: 8bitn"
"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个消息字符串中,使其看起来如下所示:

#: 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

====================================================第6节

//我试图修复的东西

我在中间件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文件。

一切看起来都很好,下面显示:
欢迎
你今天想做什么!

然后我点击"创建新翻译"并从下拉列表中选择德语,窗口分为两半:

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

我突出显示"欢迎",然后选择德语对应的"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 VERSIONn"
"POT-Creation-Date: 2018-09-05 09:41+0000n"
"PO-Revision-Date: 2018-09-05 14:26+0100n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=2; plural=(n != 1);n"
"X-Generator: Poedit 2.1.1n"
"Last-Translator: n"
"Language: den"
#: 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

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

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

您可以手动重命名和编辑文件,也可以使用Poedit等工具为gettext工具提供GUI,这些工具可以帮助您创建/更新.po/.mo文件。

每当对翻译文件进行更改时,请记住在之后清除缓存(tmp/cache/persistent)!

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

检查src/Locale、src/Locale/de_de和.po&的权限;。mo文件。

我遇到了一个类似的问题,即我生成的.po和.mo文件对web服务器用户来说是不可读的,文本的翻译也会无声地失败,就像OP问题中的情况一样。

最新更新