经典 ASP 的多语言支持

3
我有一个客户今天早上打电话给我,要求为一个网站添加多语言支持。该网站是Classic ASP应用程序,客户没有重写为ASP.NET(或其他任何东西)的意愿/预算。
我们谈到了这个问题的困难之处,但很多文本恰好是从数据库中读取的短字符串,他只需要能够翻译这些文本就可以了。
如果不是Classic ASP,我会使用基于GNU gettext()的解决方案。然而,我没有找到适用于Classic ASP的等效方案。
我可以向他的数据库添加一个表来存储字符串翻译,然后只需查询这个表即可,但这也意味着必须制作一个管理界面,以便他可以编辑这些字符串(而不仅仅是编辑纯文本文件)。
我还可以创建自己的平面文件解决方案,通常基于Scripting.Dictionary,但我真的不想在这里自己开发。
这里有任何替代方案吗?谢谢。
2个回答

7
我们使用基于XML的解决方案,我们拥有以下结构的XML文件:
<?xml version="1.0" encoding="Windows-1252"?>
<resource>
    <language LCID="1043" name="nederlands">
        <label id="pageheader"><![CDATA[Over deze applicatie]]></label>
        <label id="warning"><![CDATA[]]></label>
    </language>
    <language LCID="2067" name="vlaams">
        <label id="pageheader">Over deze applicatie</label>
        <label id="warning"><![CDATA[]]></label>
    </language>
    <language LCID="2057" name="english (uk)">
        <label id="pageheader"><![CDATA[About this software]]></label>
        <label id="warning"><![CDATA[]]></label>
        <label id=""><![CDATA[]]></label>
    </language>
</resource>

我们选择让每个目录都拥有自己的XML文件,但是如果您的站点中没有很多翻译,您可以在根目录下有一个大的XML文件。但这会影响您的性能。
我们编写了一个WSC来处理翻译,因此我们只需在每个ASP页面的顶部打开一个翻译WSC,并使用以下方法进行翻译:
在每个页面的开头:
dim translate
set translate = GetObject("script:"&Server.MapPath("/~components/DLL/Translation.wsc"))
call translate.OpenWithLCID(session.LCID)

在HTML中:
<%= translate.label("systemerror") %>

页面末尾:

call translate.close()
set translate = nothing

对性能的影响很小;请确保在获取翻译的函数中,一旦找到相应的XML节点,就退出循环并返回值。我们在开始时犯了这个错误,导致当我们调用Translate.label()时,整个XML文件都被处理了。
我的解决方案可能意味着您需要了解如何在ASP中使用WSC,但一旦开始使用它们,您就永远不想回头了。它完全解决了ASp中的混乱代码,并实现了关注点分离和代码重用。
希望对你有所帮助, Erik

这种方法的优点是客户可以使用任何XML编辑器和FTP访问自己编辑翻译。 - Erik Oosterwaal

0

抱歉,但在这种情况下自动翻译可能不够准确。 - mpdonadio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接