[hexojs/hexo]关于i18n插件和deploy的问题

2024-07-23 978 views
1

目前我打算使用i18n插件,为我的网站做国际化支持。在某主题的header.ejs文件中,我需要为不同的语言定义不同的tab button,如下图: image 针对每一个tab button,我的做法如下:

<a href="<%- url_for(__('urll.'+ i.toLowerCase())) %>"><%= __(i.toLowerCase()) %></a></li>

其中,链接和显示的文字都是用函数__()在语言文件中寻找对应的字符串进行替换。 目前这种做法在本地跑hexo server是完全符合我的需求,确实生成了对应语言版本的页面,而且tab button的链接也是正常的。 但是,当我deploy到github page时,发现并没有对应语言的页面,所有页面的tab button都是默认语言,并没有生成对应语言的版本。 我不清楚为什么本地预览的页面与部署的页面会不一样?! 非常期待问题的解决方案!

回答

1

万分感谢! 我先试试看

3

@Xuanwo 问题尚未解决。 hexo官网是用swig做模板,我使用的是ejs模板,对比后发现没有太多可以参考的地方。而这个函数在我本地预览时确实工作正常,即使预览正常,查看public目录下生成的html文件,仍然生成错误。请问hexo server预览时对应文件目录是哪里呢? 最后实在没办法,用了一个很脏的办法,就是直接做了一个新的english版的layout模板,把手中的问题解决了。 目前唯一的猜测是__() 这个函数可能使用到了某些预定义的变量,这些变量在本地预览时和生成html时的值不一样,从而造成预览和发布的效果不一样。

8

@ay27 我最近也遇到hexo国际化的问题。我即使是在hexo server下也不正常,所有用到__()函数的地方都替换成了_config.yml中设置语言列表的第一个值zh-CN对应的显示。不知道是不是我浏览器的设置问题,尝试过切换为英文界面。

而我的个人理解是,在hexo generate或者hexo deploy之后,hexo已经将所有的模板页面都渲染为了静态的html页面,包括html中的文字内容,github page只是一个静态的服务器,既然html中的内容已经是固定的,当然不会更具你浏览器的语言变换显示。hexo官网的做法是创建了对应的翻译目录,通过人为切换到对应的语言目录。

还有,你添加的english版的layout是通过自动切换还是手动选择调取的?可否说明一下。

3

@zekeair 你说“既然html中的内容已经是固定的,当然不会更具你浏览器的语言变换显示”,我也是这么理解的,然而现实结果是:hexo server与deploy是不一样的。我都感觉很奇怪,想不清楚为什么。

我目前添加了english版的layout是手动选择的,因为layout.ejs是模板生成的入口,为了做出不同的语言页面,我修改了layout.ejs的内容,使其仅有一行include body的代码,而原来的layout.ejs内容同时放入了layout_cn和layout_en中,分别对应不同的语言。同时,在编辑网页内容的md文件时,必须在front-matter中显式申明是使用了layout_cn还是layout_en模板。另外,在存放md文件的source目录下,按照这样的结构放置文件:

.
├── cn
│   └── index.md
└── en
    └── index.md
9

@ay27 了解你的做法了。这样做你网站的index页面只能静态的显示为一种语言,导航的语言显示只能根据文章的front-matter的设置才会变换。

我能理解hexo server和deploy不一样。hexo server作为服务器版本,其中资源的表现形式并不是静态的,应该是遵循了RESTful的规范的,所以它可以动态的显示语言,因为__()和_p()是在你通过URL访问资源的时候才转换为具体的显示文本。这也是为什么你找不到hexo server生成的静态文件的原因了。

但是我的问题是即使在hexo server形式下,依然只显示一种语言。一直不知道为什么。我的_config.yml中language设置如下:

language:
- zh-CN
- en

但不管我如何切换浏览器的语言设置,我的页面永远只显示language下排在第一的语言。

4

@zekeair 我理解你的疑惑了。我最初只是把英文版面的md文件放入了source/en/目录,在请求该目录下的页面时,自动就替换成了对应的语言。。。

6

@ay27 @zekeair 2 我曾也遇到过类似的问题,后来我自己写了个hexo-generator-i18n插件,成功地解决了这个问题。