亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? readme.txt

?? 使用INI文件的讀取來完成多語言版本的實現
?? TXT
字號:
用 INI 文件實現多語言程序

一、優點

    比起使用資源 DLL 實現多語言程序,INI 方式的具有更多的擴展性,任何一個普通用戶都可以做出任何一種語言界面。

二、功能

    為了做到完美的多語言程序,我們設計一個 CLanguage 靜態類 (因為是靜態類,改為 C 代碼只要一點簡單的工作),應該實現如下功能:

    1. 每個語言一個 INI 文件 (特別地,把語言文件擴展名定為 .lng,符合 INI 格式)。
    2. 沒有外部語言情況下,使用程序內置的默認語言。
    3. 能動態切換到任何一種語言 (包括內置語言),而不是告訴用戶切換語言要重新啟動程序。
    4. 沒有選擇語言的狀態下 (比如程序剛安裝),自動根據當前用戶環境選擇語言文件 (如果有的話,沒有則使用默認語言)。
    5. 列出程序目錄下的 .lng 文件,并加入到菜單中。
    6. 不同的語言可能造成界面上不同的顯示效果,所以應該允許在語言文件中指定字體 (程序的資源中還應該考慮不同語言的情況,如 Static Text 控件是否夠寬,以容納其它語言的文本)。
    7. 使原有的程序做盡量少的改動,加入 CLanguage 后,作少量改動即可實現多語言。
    8. 可以定義 #define _MAKELANG 宏,這樣編譯后,使程序自動生成語言文件。
    9. 支持 UNICODE 方式編譯。

三、實現

    先想想,程序中與語言相關的文本有哪些……,嗯……,不過就如下四個嘛:

    1. 常量文本 (任何在代碼中的 UI 文本)。

    2. 資源文本。

    3. 菜單文本。

    4. 對話框文本。

    一個一個來,各個擊破:

    1. 常量文本: 放在語言文件的 [Text] 節中,每個文本對應一個 ID。程序中使用到常量文本的時候,如果語言文件中存在該 ID 的文本,則使用它,否則,使用內部的常量文本。

    2. 資源文件: 放在語言文件的 [String] 節中,這個最簡單了,就使用資源文本的 ID。原來所有使用 LoadString 的地方,改用 CLanguage::TraslateString,即現嘗試從語言文件中載入文本。

    3. 菜單文本: 放在語言文件的 [%菜單資源名%] 節中。當菜單被載入后,調用 CLanguage::TranslateMenu 翻譯菜單。菜單的處理有點麻煩。如果菜單是命令項,則使用命令 ID 作為標識,如果是彈出項,則使用位置作為標識 (因此彈出菜單的位置不能改變,不過這點很容易做到)。另外,切換到內置語言的時候,需要重新載入菜單資源中的菜單文本,這個實現起來挺麻煩的,還要考慮是 MENU 還是 MENUEX 資源。嘿嘿,不過我都實現就是了,只管直接使用 :) ……

    4. 對話框文本: 和菜單的實現方式差不多。對話框初始化后,調用 CLanguage::TranslateDialog 翻譯對話框上的文本。對話框上的控件必須具有 ID (在此對話框內唯一,因為 不能再使用 IDC_STATIC 這種 ID 了)。同菜單一樣,對話框也有切換到內置語言的問題,不過這里我忽略了它,因為我假設切換語言是在主窗口中進行,此時沒有任何對話框顯示的。如果是基于對話框的程序,可以仿造菜單的代碼寫一個從對話框資源中載入文本的代碼,不過挺煩、難的,還是算了吧,變通一下,想法子重新 DialogBox 一遍,嘿嘿,搞定……

   好了,開始寫代碼……

   .......

四、使用

   呵呵~~,搞定,Clanguage 部分聲明如下:

         // 初始化語言,返回確定要使用的語言
        static LANGID Initialize();

        // 列出語言到菜單中
        static UINT List(HMENU hMenu);

        // 設置語言
        static VOID Set(HMENU hMenu, UINT uLang);

        // 獲取語言描述,比如語言是誰翻譯制作什么的
        static PTSTR GetDescription(HMENU hMenu, UINT uLang);

        // 獲取常量文本
        static PTSTR TranslateText(PCTSTR ptzName, PCTSTR ptzDefault = NULL);

        // 獲取常量文本,并替換特殊字符 (替換換行和零字符,有時候要用到,比如多行文本,又比如 GetOpenFileName 使用到的 Filter 字符串列表,需要替換零字符)
        static PTSTR TranslateTextEx(PCTSTR ptzName, PCTSTR ptzDefault = NULL);

        // 獲取資源字符串
        static PTSTR TranslateString(UINT uResID);

        // 更新菜單
        static VOID TranslateMenu(HMENU hMenu, PCTSTR ptzResName);

        // 更新對話框
        static VOID TranslateDialog(HWND hWnd, PCTSTR ptzResName);

    常量文本因為需要指定關聯 ID,所以應該放在一起 (即使不是多語言,也應該養成習慣,把所有的字符串放在一起,用宏來引用這些字符串) 。在 Language.h 中,我定義了如下四個宏,下面是其中兩個:

        #define _Lang(n, a)      CLanguage::TranslateText(TEXT(#n), TEXT(a))
        #define _LangEx(n, a)    CLanguage::TranslateTextEx(TEXT(#n), TEXT(a))        // 多行文本或字符串組

    比如用到以下常量字符串,都放在 Define.h 中吧:

        #define LNG_Ready        _Lang(0, "Ready.")
        #define LNG_BmpFilter    _LangEx(1, "Bitmap Files(*.bmp)\0*.bmp\0")
        ... (等等,ID 不重復,為了美觀,連續遞增比較好看:)

    
    具體使用看代碼吧,三言兩句講不清楚,還有不少注意事項的,挺晚的了,我要看看電視睡覺了……

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人乱码一区二区三区| 99精品欧美一区二区三区综合在线| 亚洲男帅同性gay1069| 欧美国产精品一区二区| 久久久国产午夜精品| 久久精品亚洲麻豆av一区二区| 欧美电影免费观看完整版| 日韩视频一区在线观看| 日韩午夜三级在线| 国产午夜久久久久| 国产精品久久久久aaaa樱花| 国产精品女主播在线观看| √…a在线天堂一区| 亚洲男人的天堂在线观看| 亚洲午夜三级在线| 日韩国产精品久久| 国产一区二区视频在线| 国产成人综合网站| 一本到不卡精品视频在线观看| 色综合天天综合给合国产| bt欧美亚洲午夜电影天堂| 在线视频观看一区| 欧美精品国产精品| 国产午夜一区二区三区| 最新高清无码专区| 日韩精品每日更新| 国产美女精品人人做人人爽| av男人天堂一区| 欧美三级在线视频| 久久久久97国产精华液好用吗| 久久精品欧美一区二区三区麻豆 | 欧美日韩电影在线播放| 日韩午夜激情视频| 亚洲视频一区二区免费在线观看| 亚洲a一区二区| 国产精品1区二区.| 欧美日韩一二区| 久久久精品人体av艺术| 亚洲国产美国国产综合一区二区| 麻豆国产精品官网| 一道本成人在线| 欧美草草影院在线视频| 亚洲综合色噜噜狠狠| 国产一区二区视频在线| 欧美一a一片一级一片| 久久久综合视频| 亚洲亚洲人成综合网络| 成人国产精品免费观看| 制服.丝袜.亚洲.另类.中文| 国产精品视频第一区| 麻豆成人91精品二区三区| 91天堂素人约啪| 欧美精品一区二区精品网| 亚洲一级二级在线| 国产成人av一区二区| 欧美一区二区日韩| 亚洲一二三区在线观看| 成人av网址在线观看| 精品国产sm最大网站免费看| 一区二区三区四区激情| 99国产精品视频免费观看| 久久综合999| 麻豆精品视频在线| 在线电影一区二区三区| 亚洲国产日韩av| 91偷拍与自偷拍精品| 国产精品久久久久精k8| 国产精品18久久久久| 精品对白一区国产伦| 日本不卡一二三| 欧美精品 日韩| 午夜精品在线看| 欧美日韩精品专区| 五月激情丁香一区二区三区| 在线观看国产91| 亚洲大片精品永久免费| 欧美色电影在线| 亚洲va国产va欧美va观看| 欧美伊人久久久久久久久影院| 亚洲精品福利视频网站| 日本久久一区二区| 一个色综合网站| 欧美日韩亚洲综合一区| 视频在线观看91| 欧美人妇做爰xxxⅹ性高电影 | 久久成人羞羞网站| 欧美一区永久视频免费观看| 亚洲国产精品一区二区久久恐怖片 | 国产精品免费看片| 成人av午夜影院| 亚洲伦理在线精品| 91国产免费看| 亚洲成a人v欧美综合天堂 | 国产一区二区三区免费| 国产亚洲精品精华液| 不卡一区二区在线| 亚洲成人精品影院| 精品久久久久久最新网址| 高清在线不卡av| 艳妇臀荡乳欲伦亚洲一区| 欧美精品三级在线观看| 国产一区二区主播在线| 亚洲人成精品久久久久久| 欧美综合欧美视频| 日本午夜一区二区| 国产精品激情偷乱一区二区∴| 色婷婷精品大视频在线蜜桃视频| 欧美成人a视频| 2017欧美狠狠色| 色综合天天做天天爱| 免费看欧美女人艹b| 亚洲国产激情av| 欧美亚洲动漫精品| 国产成人亚洲综合a∨婷婷图片 | 亚洲人吸女人奶水| 91麻豆精品91久久久久久清纯| 国产在线看一区| 亚洲一区在线观看网站| 精品电影一区二区| 欧美亚洲综合色| 成人深夜福利app| 久久精品国产77777蜜臀| 中文字幕佐山爱一区二区免费| 日韩小视频在线观看专区| 99re在线精品| 国产成人综合亚洲91猫咪| 午夜电影网亚洲视频| 国产精品久久福利| 精品国产91洋老外米糕| 欧美三级电影一区| aaa亚洲精品| 精品亚洲porn| 亚洲福利一二三区| 亚洲视频一区在线观看| 国产日产欧产精品推荐色| 日韩欧美一二三| 欧美三级中文字幕在线观看| 99精品视频一区二区三区| 国产麻豆9l精品三级站| 日韩高清欧美激情| 天天综合色天天综合| 亚洲精品欧美专区| 中文字幕综合网| 亚洲视频一二区| 中文字幕精品一区二区精品绿巨人| 欧美成人伊人久久综合网| 欧美精三区欧美精三区| 在线观看视频一区二区 | 亚洲一区免费在线观看| 亚洲美女区一区| 亚洲私人影院在线观看| 国产精品美女视频| 国产精品天干天干在线综合| 亚洲精品一区二区三区香蕉| 日韩欧美视频一区| 91精品国产入口| 日韩一级视频免费观看在线| 91精品国产日韩91久久久久久| 欧美男同性恋视频网站| 欧美色区777第一页| 欧美午夜不卡视频| 制服丝袜亚洲网站| 日韩一区二区免费视频| 日韩一区二区三区四区 | www.亚洲免费av| 色综合色综合色综合色综合色综合| 一本到三区不卡视频| 欧美在线观看一区| 日韩欧美一区在线| 国产亚洲欧洲997久久综合| 国产精品丝袜一区| 亚洲欧美日韩系列| 亚洲你懂的在线视频| 亚洲成av人片在线观看无码| 日韩vs国产vs欧美| 国产盗摄一区二区| 一本久久a久久免费精品不卡| 欧美午夜影院一区| 精品对白一区国产伦| 亚洲欧洲精品天堂一级| 首页国产欧美久久| 丁香激情综合国产| 在线观看亚洲a| 2020国产精品自拍| 亚洲视频一区二区免费在线观看| 天天亚洲美女在线视频| 国产在线一区二区综合免费视频| 成人一区在线看| 欧美色涩在线第一页| 6080国产精品一区二区| 国产精品三级av| 亚洲尤物视频在线| 中文字幕成人网| 日本美女一区二区三区| 国产在线精品一区二区夜色| 国产一区二区三区观看| 懂色av一区二区三区免费看| 欧美亚一区二区| 欧美亚洲高清一区| 国产精品国模大尺度视频|