2011-10-05 133 views
3

我有一位客戶今天早上打電話給我翻新網站以獲得多語言支持。該網站是一個經典的ASP應用程序,客戶沒有願意/預算重寫是ASP.NET(或其他...)。經典ASP的多語言支持

我們談到了這方面的困難,但大部分文本恰好是從數據庫中讀取的短字符串,他會對能夠翻譯這些文本感到滿意。

如果這不是傳統的ASP,我會使用基於GNU gettext()的解決方案。但是,我一直無法找到經典ASP的等價物。

我可以在他的數據庫中添加一個表來存儲字符串翻譯,然後查詢它,但這也意味着要創建一個管理界面,以便他可以編輯字符串(而不是僅僅編輯純文本文件)。

我也可以創建我自己的flatfile解決方案,可能基於Scripting.Dictionary,但我真的不想在這裏推出自己的。

這裏有沒有其他解決方案?謝謝。

回答

6

我們使用基於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文件。

我的解決方案很可能意味着你必須要了解使用WSC在ASP,但一旦你開始使用它們,你永遠也不想再回去。它完全解決了ASp中的意大利麪條代碼,並能夠分離顧慮和代碼重用。

HTH, 埃裏克 希望這有助於

+0

謝謝。我認爲這種方法很好。 – mpdonadio

+0

此方法的另一優點是客戶可以使用任何XML編輯器和FTP訪問自行編輯他的翻譯。 –