Yii2项目需求:在同一页面展示所有翻译后的页面标题
解决Yii2多语言页面展示所有语言翻译标题的问题
看起来你遇到的问题是,想用循环输出当前页面各语言的对应URL和标题,但现在只能拿到当前页面的URL对吧?这大概率是因为你配置的languageUrls只是静态的基础语言路径,没有结合当前页面的路由和参数动态生成,而且直接输出$url也没法获取对应语言的翻译标题。我给你梳理下解决步骤:
第一步:确认多语言配置
首先确保你的项目里已经配置了可用语言列表,比如在config/params.php里:
return [ // 可用语言,键是语言代码,值是语言名称(可选) 'availableLanguages' => [ 'en' => 'English', 'zh-CN' => '中文', 'fr' => 'Français', ], // 如果是基于路径的多语言,比如example.com/en/xxx,这里可以存基础路径 'languageUrls' => [ 'en' => '/en', 'zh-CN' => '/zh-CN', 'fr' => '/fr', ], ];
第二步:动态生成对应语言的URL和翻译标题
原代码的问题在于没有结合当前页面的路由参数,而且没法获取其他语言的标题。你可以用下面的代码来实现需求:
<?php // 获取当前页面的路由和查询参数 $currentRoute = Yii::$app->requestedRoute; $currentParams = Yii::$app->request->getQueryParams(); // 循环所有可用语言 foreach (\Yii::$app->params['availableLanguages'] as $code => $langLabel) { // 临时切换应用语言,获取对应翻译标题 $originalLang = Yii::$app->language; Yii::$app->language = $code; // 这里假设你的页面标题是用Yii的i18n翻译的,$this->title是翻译键 $translatedTitle = Yii::t('app', $this->title); // 恢复原来的应用语言,避免影响后续逻辑 Yii::$app->language = $originalLang; // 生成对应语言的URL $langBaseUrl = \Yii::$app->params['languageUrls'][$code]; // 拼接当前路由和参数到语言基础路径后 $pageUrl = $langBaseUrl . \yii\helpers\Url::toRoute([$currentRoute] + $currentParams); // 输出标题和链接,样式可以自己调整 echo "<div class='lang-title-item'> <a href='{$pageUrl}' hreflang='{$code}'>{$translatedTitle}</a> </div>"; } ?>
特殊情况处理:动态数据库标题
如果你的页面标题是从数据库读取的多语言字段(比如模型里有title_en、title_zh_cn这类字段),那不需要切换应用语言,直接读取对应字段即可:
// 假设$model是当前页面的模型实例 $translatedTitle = $model->{"title_" . str_replace('-', '_', strtolower($code))};
为什么原代码不行?
你的foreach (\Yii::$app->params['languageUrls'] as $code => $url) { echo $url; }只会输出配置里的静态语言路径,没有带上当前页面的路由(比如/article/123),所以当你在英文页面时,可能当前URL已经包含了/en,导致输出的都是当前页面的完整URL,而不是对应语言的页面地址。
内容的提问来源于stack exchange,提问作者user759235
相关产品推荐
相关产品推荐

