CakePHP版本:3.6.6
我提前为这么长的帖子道歉,但我相信这是有人能够提供帮助所需要的所有信息。
==================================================== 第1节
//我想实现的目标
最终,我希望我的应用程序能够自动检测用户的语言,并相应地更改以下内容:
- 文本
- 日期格式
- 数字格式
- 货币
为了实现这一点,我首先简化了它,不尝试自动检测用户的语言,而是在config/app.php中手动更改区域设置。
==================================================== 第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个文件,详细信息如下:
- de.mo
- 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问题中的情况一样。