使WordPress成为核心

开的8个月前

关闭4个月前

上次修改时间4个月前

#59656 关闭 增强 (固定的)

合并演员翻译(Ginger MO)

报告人: 瑞士人简介 快蜘蛛的 所有者: 瑞士人简介 快蜘蛛的
里程碑: 6.5 优先: 高的
严重程度: 正常的 版本:
组件: I18N号 关键词: has-patch接口 has-unit-测试 has-dev-注释
重点: 性能 复写的副本:

描述(上次修改者快蜘蛛的)

在过去半年左右的时间里,核心性能团队花了大量时间广泛分析WordPress中的i18n性能并寻找改进方法性能转换特性插件,它使用PHP文件支持MO文件进行翻译,速度快得多,也得益于OPcache。

这张票证跟踪了将Performant Translations合并到WordPress核心中的建议,该翻译最初由@dd32开发,名为Ginger MO。

查看相关品牌/核心帖子: https://make.wordpress.org/core/2023/11/08/merging-performance-translations-into-core/

Performant Translations支持多种文件格式(.mo(毫米).php文件)以及同时加载的多个文本域和区域设置。

这意味着:

  • 加载.mo(毫米)像往常一样,文件会更快,占用更少的内存
  • 如果.mo(毫米)翻译文件具有相应的.php文件文件,则该文件将被加载,从而更快地完成任务并使用更少的内存
  • 在切换区域设置时,我们不再需要卸载以前的翻译,而是可以将它们保存在内存中,从而使区域设置切换更加便宜

快速比较:

区域设置脚本内存使用加载时间
en_US(_US)违约14.46 MB124.66毫秒
数据元素(_D)违约27.96 MB173.44毫秒
数据元素(_D)表演者翻译15.62 MB132.60毫秒

正如你所看到的,翻译过去会大大降低网站的速度,但有了这个新库,几乎没有额外的开销。

由于这使用了一种新的文件格式进行翻译,因此需要进行一些更改以在相关位置(如translate.wordpress.org)添加对它的支持。

相关配套票:

一切都是100%向后兼容的,如果没有PHP翻译文件,MO文件将照常加载。


相关:这是#17268

附件(2)

wordpress-6-5-翻译-发行(2).png(244.8 KB)-由添加奥格勒克勒 4个月前.
plugin-activate-message-in-english.png插件(64.2 KB)-由添加奥格勒克勒 4个月前.

将所有附件下载为:.zip文件

更改历史记录(65)

这张票是在松弛(Slack)在克拉克米利的《核心表现》中。查看日志.


8个月以前

#2 @快蜘蛛的
8个月以前

#3 @弗利克索斯90
8个月以前

  • 优先已从更改正常的高的

由于这将对本地化站点的性能产生重大影响,因此将其标记为6.5的高度优先事项。

这张票是在松弛(Slack)mukeshpanchal27的#core性能。查看日志.


8个月以前

#5 @快蜘蛛的
8个月以前

57083:

构建/测试工具:扩展性能测试场景。

为本地化网站和仪表板添加新测试。
还修改了Server-Timing输出,以测量所有场景中的内存使用情况。

道具swissspidy、joemcgill、flixos90、mukesh27、mamaduka。
请参见#59656.
修复#59815.

这张票是在松弛(Slack)mukeshpanchal27的#core性能。查看日志.


8个月以前

#7 @乔麦吉尔
8个月以前

GH->Trac连接没有检测到此的PR。它与机票描述相关联,但对于其他任何找不到它的人来说,公关是:https://github.com/WordPress/WordPress-develop/pull/5306

#8 随访: @快蜘蛛的
8个月以前

@乔麦吉尔,我想这是因为它还是一个选秀

#9 答复: 8 @乔麦吉尔
8个月以前

回复快蜘蛛的:

@乔麦吉尔,我想这是因为它还是一个选秀

我见过其他选秀公关在门票中被选中,比如这个#59600。我怀疑您的PR描述中有其他URL。

#10 @快蜘蛛的
8个月以前

#11 @秋千
7个月以前

从那以后添加了包含在其他地方生成的PHP文件的功能,我担心这可能会创建一个向量,用于将恶意代码放入以前不存在的翻译文件中。

PHP文件的内容是可预测的,我们可以使用PHP的token_get_all()函数轻松解析它。我们可以引入一种“安全”模式,在该模式中,文件在被包含之前会被检查。

虽然,因为这是关于性能的,所以我们可能不想添加性能惩罚。因此,我们可以尝试使用校验和来确保文件在检查后没有更改。

你怎么认为?

#12 @快蜘蛛的
7个月以前

请注意,前面在相应的i18n性能分析岗.
主要的结论是,安装翻译与安装插件或主题没有什么不同,插件或主题也可以执行任意代码。WordPress一直认为翻译是可信的。
这篇帖子还提到了一个静态分析或校验和检查,以增加安全性,尽管是在运行时(与安装时间)将否定性能再次获胜。后者还需要额外的基础设施来存储和检索校验和。
现在,“安全”模式使用翻译文件格式过滤器以禁用PHP文件的使用。

这张票是在松弛(Slack)瑞士斯皮迪的core-i18n。查看日志.


7个月以前

这张票是在PR#5306WordPress/WordPress-develop开发通过@瑞士风格.


7个月以前
#14

Trac票:https://core.trac.wordpress.org/ticket/59656

它的作用

  • 如果MO文件有对应的PHP文件,则加载该文件。

它不能做什么(插件有显著变化)

  • 没有读取时自动将任何MO文件转换为PHP文件。
    • 这避免了对常规请求进行任何FS交互,避免了任何意外结果。
    • 使逻辑简单得多。
    • 这个附加功能可以保留在Performant Translations插件中,供希望使用它的用户使用。
  • 与集成语言包升级程序自动将MO文件转换为PHP文件。
    • 之所以需要这样做,是因为WordPress.org还没有在语言包中提供PHP文件。
    • 如果有人使用自定义翻译平台,如特拉杜托,由他们自己提供PHP文件(如果他们愿意的话)

相关的

这张票是在松弛(Slack)mukeshpanchal27的#core性能。查看日志.


7个月以前

@瑞士风格对发表了评论PR#5306:


5个月以前
#16

@对于返回类型,我实际上不确定它们是否允许进入核心,这就是为什么我曾经删除了它们。

但看起来它们是:https://developer.wordpress.org/coding-standards/wordpress-coding-sstandards/php/#type-声明-由于PHP7是最低要求,所以只需要对文档进行一些更新

#17 @快蜘蛛的
5个月以前

  • 分辨率设置为固定的
  • 状态已从更改分配关闭

57337:

I18N:引入一个性能更高的本地化库。

这引入了一个更轻量级的加载库.mo(毫米)翻译文件提供了更快的速度和更低的内存使用。
它还支持同时加载多个区域设置,这也使区域设置切换更快。

对于与交互的插件1100亿美元核心中的全局变量,添加了一个垫片以保持与现有的向后兼容性波莫库。

除此之外,此库支持PHP文件中包含的翻译,避免了二进制文件格式,并利用OPCache(如果可用)。
如果.mo(毫米)翻译文件具有相应的.l10n.php文件文件,后者将被加载。
可以使用新的翻译文件格式加载翻译文件过滤器。

PHP翻译文件通常通过下载语言包创建,也可以通过插件生成。
请参见https://make.wordpress.org/core/2023/11/08/merging-performance-translations-into-core/了解更多上下文。

道具dd32、瑞士斯皮迪、flixos90、乔麦吉尔、韦斯顿鲁特、阿基克、谢尔盖·比尤科夫。
修复#59656.

@瑞士风格对发表了评论PR#5306:


5个月以前
#18

#19 @快蜘蛛的
5个月以前

57338:

I18N:在字符串替换中添加缺少的变量。

确保用于查找的首选文件名具有正确的扩展名。

后续行动[57337].
请参见#59656.

#20 @快蜘蛛的
5个月以前

57339:

I18N:改进中的边缘案例处理WP_翻译_控制器.

防止对可能未定义的数组键发出PHP警告。
还修复了不正确的@盖子注释。

后续行动[57337].
请参见#59656.

@瑞士风格对发表了评论PR#5306:


5个月以前
#21

@mukeshpanchal27感谢您的反馈。如果我很容易错过对已关闭个人关系的反馈,我几乎没有看到你的评论,因为我没有收到任何通知。最好单独ping。

#22 @快蜘蛛的
5个月以前

57344:

I18N:改进后的文档块[57337].

道具口香糖27。
请参见#59656.

@口香糖27对发表了评论PR#5306:


5个月以前
#23

是的,但反馈很挑剔,所以我错过了打电话给你。

#24 @快蜘蛛的
5个月以前

  • 关键词 需求-开发说明补充

#25 @快蜘蛛的
5个月以前

57350:

I18N:重命名WP_Translation_Controller::instance()方法到获取实例().

这提高了一致性,因为获取实例()更常用于核心。

请参见#59656.

#26 @快蜘蛛的
5个月以前

57381:

I18N:确保.l10n.php文件升级语言包时会删除文件。

阿米埃罗道具。
请参见#59656.

#27 @快蜘蛛的
5个月以前

57382:

I18N:删除.l10n.php文件删除主题时的文件。

后续行动[57337]插件中已经添加了此项。

请参见#59656.

#28 @快蜘蛛的
5个月以前

57386:

I18N:改进复数字符串的单数查找。

确保查找同时用作复数字符串的单数字符串按预期工作。
这提高了两种情况下的兼容性__(“产品”)_n('Product','Products',num)在一个项目中使用,在该项目中,两者将对单数版本使用相同的翻译。

虽然这种用法并没有得到真正的推荐或记录,但它必须在新的i18n库中继续工作,以保持向后兼容性并保持预期的行为。

请参见#59656.

#29 @快蜘蛛的
5个月以前

57387:

I18N:在后面添加缺少的空格foreach公司关键字。

后续行动[57386].

请参见#59656.

#30 @快蜘蛛的
5个月以前

57504:

I18N:在中加载新翻译库wp_load_translations_early().

确保本地化继续按预期与新库一起工作
翻译需要在过程的早期加载。

请参见#59656.

#31 @快蜘蛛的
5个月以前

57505:

I18N:还原[57386]有待进一步调查。

恢复由于坏情况下的性能回归而对后备字符串查找所做的更改。

请参见#59656.

#32 @克莱斯特尔
5个月以前

  • 分辨率 固定的删除
  • 状态已从更改关闭重新打开的

@swissspidy通过WordPress 6.5-alpha-57505,我注意到只有当.mo文件存在时,.php文件才能工作。如果删除.mo文件,则不再加载.php文件。

重现问题的步骤:

  1. 将WordPress更新到夜间版本,特别是6.5-alpha-57505。
  2. 激活二十一世纪主题;没有插件被激活。
  3. 转到“设置”>“常规”>将“站点语言”设置为“法语”
  4. 访问你在前端的“Hello world”帖子,检查你是否如预期看到了“Laisser un commentaire”。
  5. https://translate.wordpress.org/projects/wp-themes/twentytwentyone/fr/default/并下载wp-themes-twentytyntyone-fr.l10n.php文件。
  6. 编辑文件,将“Laisser un commentaire”修改为“Laisse un commentiate-Test”,然后保存更改。
  7. 将文件重命名为twentythonyo-fr_fr.l10n.php,然后将其移动到wp-content/languages/themes。
  8. 访问你在前端的“Hello world”帖子,检查你现在是否如预期的那样看到了“Laisser un commentaire-Test”。

=>如果重命名twentythentyone-fr_fr.po文件,twentythyone-fr_fr.l10n.php文件仍会加载。
=>如果重命名twentythentyone fr_fr.mo文件,则不再加载twentythyone-fr_fr.l10n.php文件。

#34 @快蜘蛛的
5个月以前

57513:

I18N:改进复数字符串的单数查找。

确保MO文件中的字符串查找仅使用单数字符串。

这与gettext文件的预期行为相匹配,并提高了两者的兼容性__(“产品”)_n(“产品”,“产品”,数量)在一个项目中使用,在该项目中,两者将对单数版本使用相同的翻译。保持与pomo库和PHP翻译文件格式的向后兼容性和功能奇偶性。

替换[57386],已在中还原[57505],具有更准确、更高效的解决方案。

请参见#59656.

#36 @快蜘蛛的
5个月以前

@Chrystl这是当前预期的行为.mo(毫米)文件仍然是真相的来源,因为在核心和插件中有很多地方.mo(毫米)文件存在。.l10n.php文件是一种性能更高的变体,若可用,则优先考虑。

我计划在未来的版本中对此进行迭代。这就是说,我明白这是多么令人困惑。鉴于我们已经在#58919无论如何,最好在6.5中解决这个问题。我再看看这个!

@瑞士风格对发表了评论采购订单#6004:


5个月以前
#38

供参考@Chrystll

#39 @乔比
5个月以前

@首先,感谢您为取得如此巨大的性能改进所付出的一切努力。

然而,我注意到复数的翻译可能存在一个问题
这项测试是用WordPress的斯洛文尼亚语翻译完成的,该翻译用于通过旧版本的WP,但不通过当前的alpha(57514):

公共函数test_translate_plurals(){load_textdomain('default',TEST_DATA_DIR.'wp-dev-sl.mo');$this->assertSame(“%s razpoložljiva posodobitev”,_n(“%s更新可用”,“%s更新可用”,101));//1, 101, 201$this->assertSame(“%s razpoloćljivi posodobitvi”,_n(“%s更新可用”,“%s更新有效”,102);//2, 102, 202$this->assertSame(“%s razpoložljive posodobitve”,_n(“%s更新可用”,“%s更新可用”,103));//3, 4, 103$this->assertSame(“%s razpoloćljivih posodobitev”,_n(“%s更新可用”,“%s更新有效”,5);//0, 5, 6}
上次编辑时间5个月前通过乔比(以前的)(差异)

#41 @快蜘蛛的
5个月以前

谢谢@Chouby!真不敢相信我错过了。事实证明,在分析复数形式时出现了一个愚蠢的错误。我现在正在修理https://github.com/WordPress/WordPress-develop/pull/6005并将很快提交。

如果你遇到任何其他奇怪的事情,请告诉我。测试越多越好。

#42 @快蜘蛛的
5个月以前

57516:

I18N:支架加载.l10n.php文件自己翻译文件。

调整中的翻译文件查找WP_文本域_注册以便实时加载翻译
即使只有.l10n.php文件翻译文件没有相应的.mo(毫米)文件。

虽然语言包继续包含这两种文件类型,但这使得在项目中使用翻译更容易
无需处理.mo(毫米).po型文件夹。

科里斯特尔道具。
请参见#59656.

#46 @快蜘蛛的
5个月以前

57518:

I18N:修复复数形式解析WP_翻译文件.

确保正确解析翻译文件头中的复数表达式。
防止创建复数形式函数时出现无提示失败。

添加其他测试。

道具乔比。
请参见#59656.

#48 @快蜘蛛的
5个月以前

57519:

I18N:将类型声明添加到中缺少的新方法[57518].

请参见#59656.

#49 @快蜘蛛的
4个月以前

  • 分辨率设置为固定的
  • 状态已从更改重新打开的关闭

#50 @快蜘蛛的
4个月以前

57639:

I18N:防止出现不正确的语言下拉项.l10n.php文件文件夹。

[57516],实时翻译加载逻辑得到了增强,以支持以下情况.l10n.php文件翻译存在但不存在.mo(毫米).po型文件夹。这导致了获取可用语言(),它使用文件列表填充设置页面上的语言下拉列表。

为了解决这个问题,现在正确地去掉了新的文件扩展名,并且生成的文件列表是重复的。添加新的测试文件以允许现有的测试覆盖这个新场景。

请参见#59656.
修复#60553.

这张票是在松弛(Slack)乔麦吉尔的核心表现。查看日志.


4个月以前

#52 @奥格勒克勒
4个月以前

您好,@swissspidy当用户语言与网站语言不一致时,我对翻译有问题:

环境

  • WordPress:6.5-beta2
  • 翻译已更新

复制步骤

  1. 选择网站语言:德语
  2. 选择用户语言:俄语
  3. 请注意,接口中的一些字符串没有翻译
  4. 选择网站语言:俄语
  5. 检查翻译是否到位。

我尝试过的其他语言也是如此。

这张票是在采购订单号6174WordPress/WordPress-develop开发通过@瑞士风格.


4个月以前
#53

修复了当站点和用户语言不同,然后加载的翻译与错误的区域设置关联,导致翻译丢失时出现的问题。

Trac票:https://core.trac.wordpress.org/ticket/59656

#54 @快蜘蛛的
4个月以前

@oglekler非常感谢你的报告!我能够重现这一点。你能检查一下https://github.com/WordPress/WordPress-develop/pull/6174帮你修好了吗?非常感谢您的帮助!

#55 @奥格勒克勒
4个月以前

@瑞士式是的,看起来好像修好了🙌 我没有找到任何不匹配的东西。由于更改,有些字符串应该翻译,但这没关系🙂

#56 @快蜘蛛的
4个月以前

57704:

I18N:不要在引导程序中设置翻译控制器区域设置。

删除WP_翻译_控制器::set_locale()呼叫来自wp-设置.php,发生在加载当前用户之前。
当站点区域设置和用户区域设置不同时,这会导致翻译丢失,因为翻译与错误的区域设置关联。

结果是根本不需要此调用,因为调用时将设置/更新区域设置load_textdomain()无论如何。

道具奥格勒。
请参见#59656.

#58 @奥格勒克勒
4个月以前

对不起,@swissspidy,
我不知道这是从哪里来的:我正在安装插件,安装完成后,我收到了英语消息“Activate”。重新加载是以正确的语言添加邮件。主题安装没有得到这样的结果;有正确的语言。6.4不要有这样的行为。

环境

  • WordPress:6.5-beta2
  • 选中的站点语言:俄语/德语,用户语言:站点默认。

#59 @快蜘蛛的
4个月以前

啊,很有趣!看起来JavaScript翻译有问题。谢谢你打旗子。我会尽快查出来。

#60 @快蜘蛛的
4个月以前

@oglekler快速更新:这看起来是由插件依赖工作引起的。

WordPress过去只使用字符串__(“激活”)用于插件和主题。但现在在安装插件后,它的依赖关系会被检查,现在它会使用一个新字符串_x(“激活”,“插件”)它以前从未在core中使用过。

所以这只是一个新的字符串,需要翻译成6.5。不是一个错误。

也就是说,我们两个都有是不理想的__(“激活”)_x(“激活”、“插件”)在核心中。不确定此字符串是否真的需要上下文。

相比之下,我们有_x('激活%s','插件')_x('激活%s','主题')在核心,但不是__('激活%s')所以我认为上下文很有用。

我会开一张新的罚单,把这件事弄清楚。

旁白:插件依赖项的工作也添加了不正确的函数调用,例如_x('网络激活')没有任何上下文,这也是错误的。

我也会解决这个问题。

/抄送@costdev仅供参考

#61 @奥格勒克勒
4个月以前

谢谢@swissspidy🙏❤️🔥

这张票是在松弛(Slack)spacedmonkey的核心性能。查看日志.


4个月以前

#63 @萨伯恩哈特
4个月以前

  • 关键词 has-dev-注释补充;需求-开发说明远离的
注:请参见TracTickets公司有关使用的帮助门票。