关于国际化

针对导航栏添加了一部分国际化的内容,针对后期可能添加的需要国际化的模块做一份记录

选择指定语言

在 icarus 中,语言默认是英语,在<root>/_config.yml中的 language 选项中可以看到 当前为 en。我们需要先将其修改为期望的语言,这里我修改的是 zh-CN 即简体中文。

修改完后,能看到大部分地方都变成了中文,但是导航栏仍是英文。这是因为该主题并为对导航栏做国际化处理,导航栏是交由我们在 <root>/_config.icarus.yml 中去配置的,可以直接以汉字作为key值

但总归是有点不舒服吧,所以想把这些东西也简单国际化一下,顺便看看是哪部分在起作用。

如果不想学jsx语法的可以直接以汉字为key值,因为涉及到部分源码的更改

在选中的语言中完善国际化配置

国际化相关的文件存放在 <root>/themes/icarus/languages 里面,在 zh-CN.yml 添加 menu 选项(名字自定,见名知意即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
menu:
Home:
one: '首页'
other: '首页'
Archives:
one: '归档'
other: '归档'
Categories:
one: '分类'
other: '分类'
Tags:
one: '标签'
other: '标签'
About:
one: '关于'
other: '关于'

有其他想放上去的需要国际化的部分直接写即可,但是要记得在控制 menu 显示的地方加上对应的选项,此处针对 menu 国际化,并不控制显示与否

对于 other 还不是很明白,参考了下面原有的 common

这样,针对导航栏国际化的配置文件就补充ok了。

源码更改

打开<root>/themes/icarus/layout/common/navbar.jsx

ctrl+f 找到 Object.keys(navbar.menu) 这部分,因为主题未针对其做国际化处理,所以我们完善menu对象。
对遍历做如下处理

1
2
3
4
5
6
7
8
Object.keys(navbar.menu).forEach(name => {
const url = url_for(navbar.menu[name]);
const active = isSameLink(url, pageUrl);
// __ 方法用于一般使用,_p 方法用于复数字符串使用
// 此处是通过辅助函数获取翻译后的字符串
const title = _p(`menu.${name}`)
menu[name] = { title, url, active };
});

在Dom处修改显示

1
2
3
4
5
6
 {Object.keys(menu).length ? <div class="navbar-start">
{Object.keys(menu).map(name => {
const item = menu[name];
return <a class={classname({ 'navbar-item': true, 'is-active': item.active })} href={item.url}>{item.title}</a>;
})}
</div> : null}

至此,nav国际化添加完毕。

作者

徐云飞

发布于

2023-02-05

更新于

2023-02-05

许可协议

评论