我有一个字符串,需要使用 Yii 标签(如
Yii::t('app' , 'what_string')
)来包装,因为我需要它来翻译其他页面中的每个字符串。但是在这里,alphineJs 上有一个单词,我无法使用 PHP 来包装它 Yii::t('app' , ..
任何人都可以帮助我如何包装这样的东西?
我在 alphine 中的代码:
get articleCount() {
if (this.blog.articles.length === this.blogArticle.length) return `${this.blog.articles.length <?=Yii::t('app', 'Article(s)')?> `
return `${this.course.topics.length} Article(s), ${this.blogArticle.length} Filtered`
},
在这里,我想包装“文章”,所以我只是添加了但它在这里不起作用
您正在混合客户端(JavaScript/Alpine)和服务器端代码(PHP/Yii)。虽然当通过 PHP 从服务器发送回 JS 代码时,这在某种程度上是可能的,但相反的方向却不能这样说,因此,在 JS 中渲染 PHP 代码是“不可能”的。您需要以一种方式向客户端发送您的 i18n 消息。
解决方案A制定一条路线来获取所有翻译
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.5/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/alpinejs/3.13.3/cdn.js" defer></script>
<script>
document.addEventListener('alpine:init', () => {
Alpine.store('i18n', {
async init() {
this.messages = (await axios.get('data:application/json;charset=utf-8;base64,ew0KICAgICJsb3JlbSI6ICJpcHN1bSB7eyBhIH19IHt7IGIgfX0iLA0KICAgICJkb2xvciI6ICJzaXQiDQp9')).data
},
messages: {},
message(message, options) {
if (typeof this.messages[message] === 'undefined') {
return `translation for "${message}" not found. Try one of: ${Object.keys(this.messages).join(', ')}`;
}
return this.messages[message].replace(
new RegExp(`\{\{ (${Object.keys(options).join('|')}) \}\}`),
(match, p1) => options[p1] ?? null,
);
}
})
})
</script>
<span x-data x-text="$store.i18n.message('lorem', { a: 42, c: 'gibberish' })">Test</span>
<span x-data x-text="$store.i18n.message('ahmet', { d: 'sun' })">Test</span>
创建一个路由来获取单个翻译(或使用解决方案C
在服务器端创建整个 Alpine JS 脚本,并在将其作为响应返回之前将其与 Yii 已解析的翻译一起交付