You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Yii2德语区域语言代码及敬称平称翻译差异技术咨询

在Yii2项目里处理德语不同区域(de-DE、de-CH、de-AT)的敬称(Sie)和平称(Du)翻译差异,我踩过不少坑,总结了几个实用的解决方案,分享给你:

方案1:按区域+称呼风格细分翻译文件

Yii2原生支持多区域翻译文件,你可以为德语各区域单独维护敬称版平称版两套翻译:

  • 敬称场景直接沿用标准区域文件,比如messages/de-DE/app.php
    return [
        'This is your message' => 'Das ist Ihre Nachricht',
        'Welcome back' => 'Willkommen zurück',
        // 其他敬称相关翻译项
    ];
    
  • 平称场景给区域代码加后缀区分,比如创建messages/de-DE-du/app.php
    return [
        'This is your message' => 'Das ist deine Nachricht',
        'Welcome back' => 'Willkommen zurück',
        // 其他平称相关翻译项
    ];
    

之后在代码里根据用户的称呼偏好动态切换语言:

// 假设$userPrefersDu是从用户设置中获取的布尔值
Yii::$app->language = $userPrefersDu ? 'de-DE-du' : 'de-DE';
方案2:用参数化翻译实现动态切换

如果不想维护多套翻译文件,可以在基础翻译里预留变量,通过传参替换敬称/平称词汇:
在通用德语翻译文件messages/de-DE/app.php里定义:

return [
    'This is {your} message' => 'Das ist {your} Nachricht',
    'your_sie' => 'Ihre',
    'your_du' => 'deine',
    'greeting_sie' => 'Hallo Sie',
    'greeting_du' => 'Hallo Du',
];

调用时根据场景传入对应参数:

// 敬称场景
echo Yii::t('app', 'This is {your} message', ['your' => Yii::t('app', 'your_sie')]);
// 平称场景
echo Yii::t('app', 'This is {your} message', ['your' => Yii::t('app', 'your_du')]);

这个方案适合差异点集中在少数词汇的场景,不用拆分大量文件。

方案3:自定义翻译组件自动适配

如果项目里这类敬称/平称差异非常多,推荐自定义翻译组件,自动根据用户偏好替换内容:

  1. 创建继承自yii\i18n\PhpMessageSource的自定义类:
namespace app\components;

use yii\i18n\PhpMessageSource;

class GermanMessageSource extends PhpMessageSource
{
    public $useDuForm = false;

    protected function loadMessages($category, $language)
    {
        $messages = parent::loadMessages($category, $language);
        // 仅对德语区域生效
        if ($this->useDuForm && str_starts_with($language, 'de-')) {
            // 定义敬称到平称的映射表
            $replaceMap = [
                'Ihre' => 'deine',
                'Ihr' => 'dein',
                'Sie' => 'Du',
                // 补充其他需要替换的词汇
            ];
            foreach ($messages as $key => $value) {
                $messages[$key] = strtr($value, $replaceMap);
            }
        }
        return $messages;
    }
}
  1. config/web.php里替换默认翻译组件:
'components' => [
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'app\components\GermanMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en-US',
            ],
        ],
    ],
],
  1. 代码中根据用户设置切换模式:
// 从用户配置中获取偏好
$userPrefersDu = Yii::$app->user->identity->prefer_du_form;
Yii::$app->i18n->translations['app']->useDuForm = $userPrefersDu;

另外提一句:Yii2的国际化逻辑完全兼容ICU的区域设置规范,所以你按照de-DE、de-CH、de-AT这类标准区域代码定义就没问题,不用额外做适配。

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

火山引擎 最新活动