2011-07-10 87 views
6

可能重複:
C# localization , really confusing meC#本地化

可能有人請分享自己的定位步驟龐大C#應用程序?

我很確定在談論中小型項目時,基本的基於資源的策略可能會起作用。但是,如果我們談論大型產品,應該將這種方法與定製構建步驟以及語言專家特別使用的一些第三方應用程序配對使用。

所以,請你指教/股是在應用程序中使用的一些全球本土化策略(夠大,很明顯:)

謝謝。

+1

@Kon這不是重複的,b因爲我已經看到了所有與「C#本地化」有關的問題。人們談論使用定製構建步驟和用於使本地化更舒適的整潔操作。但是,他們只提及他們,我想看到一個完整的答案。 –

+0

當然,您需要的實際上是國際化(您需要先準備好您的應用程序)。正如你可以想象它[已被回答](http://stackoverflow.com/questions/5253614/effective-strategies-for-localization-in-net/5524981#55249810)... –

+0

對不起,我必須誤解一些東西...請忽略我以前的評論。 –

回答

2

即使在大型企業應用程序中,基於資源的基本策略也可以使用。這是內置且易於理解的解決方案,因此每個程序員都可以毫無問題地使用它。

唯一的問題是,您需要以某種方式將資源文件轉換爲翻譯記憶庫文件(即tmx)並返回 - 以便翻譯人員可以使用他們的標準工具。

所以你需要的實際上是一個本地化過程。對於大型應用程序是不同的?那麼,如果你設置正確的流程,它將會擴展。現在進入過程。從我的角度來看,這應該是這樣的:

  1. 複製資源文件到相應的文件夾結構(本地化工程師不應該直接與應用程序的代碼基礎工作)。適當的文件夾結構應該類似於:
    [Project Name]


    [中立] [德國] [日本] [法國]


    (每個文件夾包含給定語言的可翻譯資源,中性通常是英文)
    當然,您需要以某種方式將您的代碼庫轉換爲文件夾結構,但這可能是自動的。

  2. 處理您的可翻譯資源並創建transkits - 包含需要翻譯的文件的zip存檔(在這種情況下,它好像都是這些文件)。這些文件應該可能被轉換,所以你不會最終發送resx文件。轉換應用程序應讀取resx文件的內容,並將可轉換的字符串轉換爲與翻譯人員同意的格式文件(可能只是Excel,但我不會推薦此解決方案)。現在,我不能告訴你這些工具的名稱,但我知道有一些商業應用程序存在,因爲我只使用了自定義的應用程序。

  3. 將transkits發送給翻譯人員(很可能是翻譯供應商)。

  4. 在收到翻譯文件(transkit)後,您需要驗證它(這一步至關重要)。你需要確保transkit是完整的(即沒有可轉換字符串丟失)和技術上正確(即文件編碼是正確的,通常是UTF-8或UTF-16)。此外,至少看一眼文件以查看是否沒有奇怪的字符,如1/2,3/4或其他 - 這通常意味着編碼不對。

  5. 導入您transkit。這是2的相反步驟 - 您需要將翻譯的字符串放回適當的文件。

  6. 複製的翻譯文件回原來的代碼庫和運行「本土化」的構建。

  7. 測試你的本地化問題中的應用(即重疊控件,剪裁字符串,不正確的編碼,等等 - 這通常意味着,國際化是不對完成)。
  8. 修復本地化/國際化(Localizability)缺陷。
  9. 繼續到1,直到UI /字符串凍結期。這假設譯員會使用某種翻譯記憶庫,並且不會對您重新翻譯以前翻譯的字符串收取費用(或收取較少費用)。
  10. 自動完成所有可能的步驟。

除此之外,您可能不會建立您的常用術語詞彙表,並對翻譯的內容進行語言評論。

2

我認爲你可以在很大程度上依賴於通過.NET有一些修改所提供的資源框架,使之更適合於大型項目,即建設並獨立維護應用程序的資源,並消除引用生成的屬性每個資源的名稱。如果還有其他適合大型項目本地化的目標,請在下面描述,以便我也可以考慮。

  1. 創建一個獨立的項目來表示可以作爲單獨的DLL加載的資源。
  2. 通過選擇項目屬性的資源選項卡上的鏈接添加「資源」文件到您的項目:「該項目不包含默認資源文件,點擊此處創建一個。」
  3. 添加另一個具有相同根名稱的資源來表示另一種語言,例如德語爲「Resource.de.resx」。 (Visual Studio顯然使用文件名來確定資源文件所代表的語言)。將其移動到與默認資源文件相同的目錄/文件夾。 (重複每一種語言。)
  4. 在Resources.resx文件的屬性,從自定義工具屬性刪除「ResXFileCodeGenerator」,以防止在應用程序的「屬性」命名空間的默認代碼生成。 (重複每一種語言。)
  5. 明確/手動聲明與像行加載新創建的資源,自己的資源管理器:

    靜態System.Resources.ResourceManager resourceMan = 新在System.Resources。 ResourceManager( 「LocalizeDemo.Properties.Resources」,typeof(Resources).Assembly);

  6. 實現可以生成包含您可以參考的所有資源列表的文件(見圖1)

  7. 實現一個函數來檢索和格式字符串(見圖2)。

  8. 現在您已經足夠了,可以從任意數量的應用程序中引用翻譯後的字符串(參見圖3)。

  9. 使用System.Resources.ResXResourceWriter(來自System.Windows.Forms.dll)或System.Resources.ResourceWriter(System.dll)來生成資源,而不是將Resx文件作爲主要來源。在我們的項目中,我們有一個SQL數據庫,它定義了每種語言中的所有字符串,並且我們的構建過程的一部分在構建資源項目之前生成了所有的Resx文件。

  10. 既然您可以從任何格式生成您的Resx文件,那麼您可以使用您想要的任何格式(在我們的例子中是一個SQL數據庫,我們將其導出並從Excel電子表格導入)以提供文件發送給翻譯人員。

  11. 另請注意,已翻譯的資源正在構建爲附屬DLL。你可以想象使用正確的命令行工具獨立構建每種語言。如果這是你問題的一部分(怎麼做)讓我知道。但目前,我會假設你知道這個,因爲你已經提到了自定義構建步驟。

圖1 - 枚舉識別所有可用的資源:

namespace MyResources 
{ 
    public enum StrId 
    { 
     Street 
     .... 
    } 
} 

圖2 - 代碼來加載和返回格式資源字符串:

namespace MyResources 
{ 
    public class Resources 
    { 
     static System.Resources.ResourceManager resourceMan = 
     new System.Resources.ResourceManager("MyResources.Properties.Resources", 
     typeof(Resources).Assembly); 

     public static string GetString(StrId name, 
     System.Globalization.CultureInfo culture = null, params string[] substitutions) 
     { 
     if (culture == null) culture = System.Threading.Thread.CurrentThread.CurrentUICulture; 
     string format = resourceMan.GetString(name.ToString(), culture); 
     if (format != null) 
     { 
      return string.Format(format, substitutions); 
     } 
     return name.ToString(); 
     } 
    } 
} 

圖3 - 訪問資源:

using MyResources; 

namespace LocalizationDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     System.Threading.Thread.CurrentThread.CurrentUICulture = 
      new System.Globalization.CultureInfo("de-DE"); 
     Console.WriteLine(Resources.GetString(StrId.Street)); 
     } 
    } 
} 
+0

請注意,我們的項目並未本地化任何Windows窗體,因爲我們使用的是未與.NET本地化集成的第三方UI API。如果你想讓.NET自動本地化你的Windows窗體,而不是手動從資源文件中將字符串加載到控件中,那麼你需要在這裏進行一些我沒有做過的額外探索。 – BlueMonkMN

+0

我做了一個測試,它似乎有可能將各種Form.xx.resx文件中的所有已翻譯資源合併到主Resource.xx.resx文件中,但是如果您的表單不在資源中,則確實會涉及覆蓋一些生成的代碼DLL。 – BlueMonkMN