2011-11-08 48 views
4

在我的應用程序中,我使用WpfLocalization在應用程序運行時提供翻譯。該庫基本上將維護一系列屬性及其分配的本地化關鍵字,並使用DependencyObject.SetValue()在活動語言更改時更新它們的值。字符串被神祕切斷

我注意到我的問題的情況是這樣的:我有一個簡單的TextBlock併爲Text屬性分配了一個本地化關鍵字。現在,當我的應用程序啓動時,它會將初始值寫入其中,它將在屏幕上顯示得很好。現在我切換語言,新值被設置爲Text屬性,但只有一半的文本實際顯示在屏幕上。來回切換語言沒有任何效果。第一種語言總是顯示正常,第二種語言被切斷(在單詞中間,但總是全字符)。

兩種語言對彼此的相對長度似乎沒有任何關係。在我的測試案例中,工作語言字符串是498字節,被截斷的是439字節,並在257字節後被截斷)。

在我通過本地化代碼更改其值之前,我檢查了的Text屬性的當前值,它將始終具有兩種語言中的期望值(不會被截斷)。

在運行時通過WPF Inspector檢查TextBlock時,它將以第二種語言的Text屬性顯示截斷文本。

到目前爲止,這對我來說毫無意義。但現在它變得更好了。

原始WpfLocalization庫從標準資源文件讀取本地化字符串,但我們使用的修改版本也可以從Excel文件讀取這些字符串。它通過使用Microsoft OLE DB驅動程序打開OleDbConnection並通過它讀取字符串來實現。在調試器中,我可以看到所有的值都被讀取得很好。

現在,當一位同事發現修復「cut off text」問題時,我感到非常驚訝。他重新排列了Excel工作表中的行。我不明白這可能是相關的,但在該文件的兩個版本之間切換會對問題產生影響。

回答

5

這實際上是有道理的,這是因爲Excel的ole db驅動程序必須採取列中數據的樣本來爲其指定類型,並且在字符串中也是一個長度。如果它僅對255個字符的閾值以下的值進行採樣,您將得到一個字符串(255)類型和截斷的文本,如果它採樣了一個較長的字符串,它會將它分配爲備註列,並允許更長的字符串被檢索/存儲。通過重新排序,您正在更改採樣哪些行。

如果您使用oledb將SQL Server讀取到Excel,您會發現這是一個已知問題。 http://msdn.microsoft.com/en-us/library/ms141683.aspx - 因爲你使用的是相同的ole db驅動程序,所以我希望這種情況也適用於你。

從文檔:

截斷文本。 當驅動程序確定Excel列 包含文本數據時,驅動程序將根據它採樣的最長值選擇數據類型(字符串或備忘錄) 。如果驅動程序不在 所取樣的行中發現長度超過255個字符的任何值,則它將該列視爲備註列的255個字符的字符串列,而不是 。因此,長度超過255個字符的值可能會被截斷爲 。要從備註列中導入數據而不截斷, 必須確保至少一個採樣的 行中的備註列包含的值超過255個字符,或者必須將驅動程序採樣的行數增加到 包括這樣一行。您 可以通過增加 TypeGuessRows值 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel註冊表中 密鑰的值來增加採樣的行數。有關詳細信息,請參閱PRB:從Jet 4.0傳輸數據 OLEDB源失敗,帶有錯誤。

+0

現在它變得非常有意義。但爲什麼我在調試器中看到完整的字符串? –