2010-12-01 20 views
3

我正在使用德爾福2010年。國際化時,Delphi 2010 IDE的默認控制字體如何工作?

我寫了一個英文的應用程序。我提供了一個TStringGrid,用戶可以創建從英語到其自己的語言的組件標題的交叉引用。

在每個TForm的Create中,我遍歷所有窗體的控件(具有唯一標籤),將它們的標題(或提示)屬性更改爲用戶提供的翻譯。

這是實施和工作,至少在少數常用的西方語言,如法語,意大利語等小的屏幕布局問題(更廣泛的按鈕等)我手動處理,因爲它們發生。我不會使用第三方國際化工具或德爾福的,除非我在這個問題的答案中得到非常非常壞的消息! :-)下一次,也許我會使用像TsiLang(但不是D2010的,這對我來說太重了...)

當我在IDE中添加組件時,我保留IDE分配的默認字體原樣。 (我的現場是MS Sans Serif。)例如,當我的程序在日本運行時會發生什麼? Delphi RTL會將所有標準組件的字體更改爲本地字體嗎?那些字體在組件上顯示我默認的ASCII文本是否允許在他們自定義的情況下以他們的本地字體顯示字符?如果我有解釋爲Sans Serif設置字體的代碼,會發生什麼?

RTL是否也將TStringGrid更改爲語言環境語言?

如果在某些情況下用Arial覆蓋默認的MS Sans Serif(所以希臘數學符號工作)會干擾日本系統上發生的任何事情嗎?

我保存TStringList.SaveToFile(「文件名」,編碼),使用這種緩慢而充分地快速的代碼的所有用戶的交叉引用條目:

if (AllStringsList.Text <> UnicodeString(AnsiString(AllStringsList.Text))) then 
    Encoding := TEncoding.UTF8 
else 
    Encoding.Default 

這種的所有語言的工作?

我將其他用戶數據保存在TIniFile中。它如何處理國際人物?

任何鏈接討論這個?

+0

德爾福提供的國際化工具有什麼問題? – 2010-12-01 00:47:46

+0

#user205376:IMO,他們對我來說太重了。我不想管理DLL,我希望用戶能夠輕鬆地進行自定義,而無需與我進行交互或者不必運行花哨的工具。誠然,我放棄了相當多的功能(希望不會太多),滾動我自己的... – RobertFrank 2010-12-01 03:13:18

回答

0

AFAIK MS Sans Serif不是TrueType/OpenType字體,不支持Unicode。如果使用的字體不可用,Windows本身會將字體映射到更近的字體。 Anway,如果你的應用程序必須支持多種語言,最好使用支持Unicode的字體,特別是當使用完全支持Unicode的編譯器/庫,如Delphi 2010時。

另外我不明白你爲什麼不'用UTF(8或16)保存所有內容,這將支持任何語言,並消除語言環境問題。 Delphi 2010和Windows本身都是UTF-16,從ANSI到UTF的往返只會減慢你的代碼,大量的轉換髮生。

請注意,正確定位應用程序遠遠超出了翻譯字符串。你可能不得不改變控制尺寸以容納更長(或更短)的琴絃,你可能不得不調整圖像和色彩到目標文化中(西方人可能不會接受其他人可接受的東西),你必須考慮到不同的標準(即從右向左閱讀和輸入)。這就是爲什麼大多數本地化工具都可以使用資源(包括Delphi中的資源)來完成本地化應用程序。

您實施的內容與dxGetText類似。您可以查看該圖書館,並使用它或從中獲取有關字體支持的靈感。

+0

@Idsandon感謝您的答案。一個問題:爲了讓我的用戶能夠在其他非西方語言組的語言組中定製,我應該允許他們從當前可用的Windows字體列表中選擇一種字體,並將結果放在所有組件的Font.Name中。我的想法是否正確? – RobertFrank 2010-12-01 19:03:29

0

爲組件寬度的問題(次要屏幕布局問題(較寬按鈕等))

w := form1.canvas.TextWidth(yourcomponet.caption) //get the width of your text 
yourcomponet.width := w + 30 // use 30 to make enough space 

使用它,如果所有的表單中的組件使用相同的字體(如果不更換form1中與組件使用您的字體)

爲你向左向右的問題使用

SysLocale.MiddleEast := true ; 

我認爲所有的問題(再次Windows將自動管理一些字體問題,但仍然最好使用Unicode支持的字體作爲默認)

給你的用戶分配語言是否從左到右(true或false)在你的TStringGrid中。所以如果它是假的 使用SysLocale.MiddleEast := true ;