当前位置: 首页 > 知识库问答 >
问题:

静态数据的CakePHP本地化

魏威
2023-03-14

CakePHP版本:3.6。6

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

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

//我想实现什么

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

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

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

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

//我提到的信息

>

  • 国际化

    I18N外壳-此处

    ====================================================================================================================================第3节

    //开始之前我有什么

    配置/应用程序。php
    “defaultLocale”=

    配置/引导。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!
    

    =========================================================================== 第四节

    //我所做的

    1.在src中创建了一个名为Locale的文件夹
    2。在区域设置中创建了一个名为de_de的文件夹

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

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

    然后,我在后面添加以下内容

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

    当前路径:C: xampp\htdocs\app_name\src\Tem板\欢迎
    您要提取的路径是什么?
    [Q]uit[D]one
    [D]

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

    是否要从CakePHP核心提取消息?(是/否)
    [n]

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

    你想输出的路径是什么?
    [Q]uit
    [C: xampp\htdocs\app_name\src\模板\欢迎\区域设置]

    然后,我在后面添加以下内容

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

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

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

    提取...
    路径:C: xampp\htdocs\app_name\src\模板\欢迎
    输出目录:C: xampp\htdocs\app_name\src\Locale\
    ====================================================================

    11.在此之后,我有一个默认值。src/Locale文件夹中的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'=

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

    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节

    //我试图解决的问题

    我在中间件应用程序中添加了以下内容。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并打开了它。然后我点击“编辑翻译”并打开默认设置。从区域设置文件夹中删除pot文件。

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

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

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

    我突出显示“欢迎”,并选择德语对应的“威尔科曼”,然后在右侧窗口中填充。我对“你今天想做什么”也做了同样的事情。

    此时,右侧窗口填充了德语等价物,所以我转到另存为,并将文件保存在src/区域设置文件夹中的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/缓存/持久性)并刷新浏览器。

    为了确认我在config/app中有以下内容。php
    “defaultLocale”=

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

    不幸的是,文本还没有被翻译?

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

    再次感谢你Z

    //我试着解决的问题

    1.我已尝试在config/app中更改语言定义。php来源:

    “defaultLocale”=

    “defaultLocale”=

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

    2.我颠倒了上述步骤,然后尝试将de.po文件中的语言定义从:

    "语言: de\n"de_DE\n

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

  • 共有2个答案

    平光明
    2023-03-14

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

    检查src/Locale、src/Locale/de_DE和. po的权限

    我有一个类似的问题。阿宝和。web服务器用户无法读取我生成的mo文件,文本的翻译也以静默方式失败,就像OPs问题中的情况一样。

    应瀚
    2023-03-14

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

    您可以手动重命名和编辑文件,或者使用Poedit之类的工具为gettext工具提供GUI,帮助您创建/更新。采购订单/。mo文件。

    每当对翻译文件进行更改时,请记住随后清除缓存tmp/ache/持久性)!

     类似资料:
    • 我用动物代替了我真正的代码,所以这可能看起来有点傻,但这是一个真正的问题。 我的java程序得到一个不同动物的列表,一次遍历一个动物,对每个动物做以下事情:动物被创建,动物做一些随机运动,每个运动被计数,然后程序收集运动数据,做一些分析,并继续到列表中的下一个动物。 我有一个抽象的动物类,由不同的动物对象扩展,狗,猫等等。每个都有自己的动作。在基础动物类中,有一个散列表计算动物的随机运动。 upd

    • [命名空间: Serenity] - [程序集: Serenity.Core] 一个包含快捷访问注册 ILocalCache 提供者的静态类。 public static class LocalCache { public static void Add(string key, object value, TimeSpan expiration); public static TI

    • 验证静态库是.o文件的合集 相关工具介绍 clang命令部分参数描述 -x: 指定编译文件语言类型 -target: 指定指令集(-target arm64-apple-ios14.3 真机) -g: 生成调试信息 -c: 生成目标文件,只运行preprocess,compile,assemble,不链接 -o: 输出文件 -isysroot: 使用的SDK路径 1. -I<

    • 对于“何时”有很多很好的答案,比如在这个线程中——静态类初始化何时发生?现在我的问题是“如何”。这是斯蒂芬C.的回答中的一段话 类静态初始化通常在第一次发生以下事件之前立即发生: 将创建该类的一个实例, 调用该类的静态方法, 已分配类的静态字段, 使用非恒定静态场,或 对于顶级类,执行词汇嵌套在类中的assert语句 那么它是如何在内部完成的呢?每个可能触发初始化的指令都用包装?任何工作的细节:-

    • 加载图层        LSV可以实现本地图层的加载,可以通过选择所需加载的矢量或栅格数据即可在场景数据中加入所选图层。 加入的图层所需格式: 栅格类型:tif、lrp、img、dem、adf、idr、grd、hdr、lrc等; 矢量类型:kml、kmz、shp、dxf、dwg、lgd、ldb、tab、mif、vec等; 加载地形        LSV可以实现本地地形的加载,可以通过选择所需加载的

    • 创建图层        LSV中也可自己创建所需要的图层文件(KML(.kml)数据或LSV数据(.lgd)),并在其上进行自己的操作制作,创建图层选项中选择图层文件保存的地址以及为图层文件命名后即可创建成功。 加载图层        LSV可以实现本地图层的加载,可以通过选择所需加载的矢量或栅格数据即可在场景数据中加入所选图层。 加入的图层所需格式: 栅格类型:tif、lrp、img、dem、a