从 CoSign 看开源软件本地化(3)
上文谈到 CoSign 虽然模板的本地化已经很方便了(有了 Include 宏),但是静态页面尚未本地化。那么又哪些静态文件呢?
CoSign 2.x 有两个静态页面:looping.html 和 post_error.html。CoSign 3.x 又增加了一个静态页面:validation_error.html。
- looping.html: 当发生循环重定向时,跳转到该页面
- post_error.html: 当由于单点登录退出导致应用提交过期导致可能的数据丢失,重定向到该说明页面
- validation_error.html: 当重定向的地址和预设地址不匹配跳转到该警告页面
Apache 的内容协商
Apache 内容协商是在一个目录下存在多个 index 文件,根据浏览器的语种优先级的不同,选择最符合用户语言的 index 页面。Apache 的部分页面,还有 Debian 官方网站 就是用这个方法实现的多语种支持。 首先,Apache 需要加载相应模组$ sudo a2enmod negotiation $ sudo a2enmod mime $ sudo a2enmod include 其中:
- negotiation 模组提供了根据浏览器语种自动内容协商功能
- mime 模组提供文件扩展名和语种匹配的指令
- include 模组提供服务器端包含,这样可以在 HTML 中实现页面嵌套,就像我们前面在模板页面中用 Include 宏实现的那样
<Directory /opt/cosign/lib/html-local/> # Multi-language support, and SSI enabled Options +FollowSymLinks +MultiViews +Includes AddLanguage zh-CN .zh AddLanguage zh-TW .zh AddLanguage zh .zh LanguagePriority zh en ForceLanguagePriority Prefer Fallback AddOutputFilter INCLUDES .html AllowOverride All order allow,denY allow from all </Directory>关于 SSI (服务器端包含) 服务器端包含能够在静态页面中包含其他文件,从而实现页面设计的模块化,减少页面的冗余。类似前面我们在模板中通过 Include 宏实现的功能。 SSI 的启用也要对相应的目录进行设置。包括增加 Include 的参数设置,以及用“AddOutputFilter INCLUDES” 指令设置对哪些扩展名的文件提供 SSI 扩展支持。参见上面的示例。 页面中使用特殊的注释语法实现 SSI。这样的好处是,对于错误配置的 SSI,包含指令当做注释,不会破坏页面结构。示例:
... <!--#include file="zh/inc/header.inc" --> ... <!--#include file="zh/inc/footer.inc" --> </body> </html>虽然,通过Apache内容协商,可以实现静态页面的本地化,但是副作用是冗余度再次提高了。本来只有两三个静态页面进行风格定制,本地化后页面的风格定制工作量成倍增加。 解决这个问题我们后来使用了一个静态页面模板化的方法。但是在这之前,先介绍一下我们是如何实现 CoSign 核心的本地化,进而实现了对认证因子的错误提示信息的本地化。