You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何日语被标记为无复数形式?PHP ngettext与Poedit问题咨询

日语gettext复数规则相关问题解答

一、为什么日语的Plural-Forms被设定为nplurals=1; plural=0;

  • gettext的复数规则核心是目标语言中名词本身的词形变化逻辑,而非句子里指示词这类其他成分的变化。日语里所有名词的单复数都没有词形差异,不管数量多少,名词本身始终是同一个形式(比如「鉛筆(えんぴつ)」单复数都是这个词),所以gettext将日语归类为“无复数形态区分”的语言,对应nplurals=1; plural=0;——即无论数量n是多少,都只使用1种翻译文本。

二、为什么PHP中无法用ngettext('This pencil','These pencils', $n);处理日语翻译

  • ngettext的工作逻辑是根据目标语言的Plural-Forms规则,选择对应数量的翻译条目。日语的规则只有1种形式,所以不管$n是1还是大于1,ngettext只会调用同一条翻译,无法区分「この鉛筆」和「これらの鉛筆」这种靠指示词区分单复数的场景。
  • 这种场景下,不能依赖ngettext的复数分支,而是要在代码里手动判断数量,分别调用对应的gettext条目,示例:
    if ($n === 1) {
        echo gettext('This pencil'); // 对应日语「この鉛筆」
    } else {
        echo gettext('These pencils'); // 对应日语「これらの鉛筆」
    }
    

三、手动修改.po文件后Poedit不识别复数的原因

  • Poedit内置了各语言的复数规则预设,对于日语,它默认强制使用nplurals=1; plural=0;的规则。即使你手动修改了.po文件头部的Plural-Forms字段,Poedit重新打开文件时会自动覆盖回预设规则,不会显示复数翻译条目。
  • 如果一定要在Poedit里处理这种“伪复数”场景,只能把日语当作“自定义复数规则”的语言配置,但操作繁琐且不符合gettext对日语的设计逻辑,更推荐用前面的代码分支处理方式。

内容的提问来源于stack exchange,提问作者Ramblin Wreck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:20:03