顯示具有 多國語言 標籤的文章。 顯示所有文章
顯示具有 多國語言 標籤的文章。 顯示所有文章

2015年7月15日 星期三

多國語言小數點符號處理

撰寫多國語系的軟體,必須注意到一些特殊處理事項
本篇所針對的數值呈現問題,將可能造成很嚴重的後果

首先,先明白數值表示法這件事情,在某些歐洲或美洲、東南亞地區數值的小數點符號,並不是「.」,而是「,」,所以當你的程式輸出檔案或者顯示在主控台的時候,會出現312.566被顯示成312,566 這種情形。如下圖的 fValue




這樣的狀況並不只是看起來怪怪的而已,更嚴重的是,如果你要下SQL指令,而且你的指令並不是透過SqlCommand物件的正規使用方式來進行,而是自己串出SQL指令的話,就會讓指令失敗,由於你的數值如果帶有小數點,會變成逗號,這會讓SQL指令被誤解析。

比方
sb.Append("INSERT INTO TB_RECORD_RAW VALUES (").Append(intIoId).Append(",").Append(douValue).Append(");”).
原本預期輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194.566 );
但結果會輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194,566 );
這會讓SQL誤判有三個參數要Insert,但是實際上只有兩個。結果要不就是填錯欄位,要不就會新增失敗(也許欄位不夠多)。


解決這個問題有兩種方式,要不就是透過SqlCommand物件的正規使用方式來進行。要不就是透過修改數值顯示方式(各國有各種特定的表示方式,可以在程式中強制統一),底下針對修改數值顯示方式來介紹。

CultureInfo TheCulture = new CultureInfo("en-US", false);
NumberFormatInfo NumFmtInf = TheCulture.NumberFormat;
NumFmtInf.NumberDecimalSeparator = ".";
NumFmtInf.NumberDecimalDigits = 10;

Double TestDot_ Double = 123.4567;
String Str_Result = String.Format(TheCulture, "{0:F}", TestDot_Double);

透過CultureInfo所建立的物件,會存放著作業系統的文化語言相關設定,指定為"en-US"是美國 “zh-TW“則是台灣所有語言列表於http://www.csharp-examples.net/culture-names/


也可以客制化的修改小數點符號,也可指定浮點數一律顯示到小數點後第幾位,這邊稍微要注意的是,當你在此指定了小數點後第幾位,則不足位數會補零,比方123.4567000000。如果不設定呢,則預設會顯示小數點兩位,進行四捨五入。

2014年11月2日 星期日

電腦用語之兩岸與英文對照表



參考來源:兩岸技術用語對照表

英文台灣大陸
Advanced進階高級
Anti-Virus防毒軟體殺毒軟體
ARP CacheARP 快取記錄ARP 緩存表
ARP SpoofingARP 欺騙ARP 欺騙
Agent代理
Auto-summary自動歸納
Audit稽核審核
Active Directory活動目錄
Authentication Code驗證碼鑒別碼
Access Token存取權杖連接權杖
Add Hardware新增硬體添加硬件
Assignment指派賦值
Agility靈活敏捷
Buffer Overflow緩衝區溢位漏洞溢出
Bot殭屍電腦肉雞
Backspace倒退退格
Byte位元組字節
Bit位元位
Built-in內建集成
Blog部落格博客
Blogger部落客博主 / 博客主
Big Data巨量資料海量資料
Blackhat SEO搜尋引擎毒化黑帽 SEO
Breath First Search橫向優先搜尋寬度優先遍歷
Binary二進制二元
Configuration設定設置 / 配置
Component元件組件
Chip晶片芯片
Clock Speed時脈速度時鐘速度
Compatible相容兼容
Computer電腦計算機
Connect連線連接
Control Panel控制台控制面板
Client用戶端客戶端
Command指令命令
Capture擷取補獲
Cross VLAN跨越式 VLAN
Class BB 類網路
Class A B C子網路等級主類網路
Cache Region快取區域緩存區域
Code Red紅色代碼
Create建立創建 / 新建
CA CertificateCA 憑證CA 證書
Command Prompt命令提示字元命令提示符
Crash當機宕機
Community社群社區
Cluster Sampling叢集抽樣聚類抽樣
Coverage涵蓋覆蓋
Cluster叢集集群
CPU ThrottlingCPU 調節
Data Frame資料幀
Digital Camera數位相機數碼相機
Default預設默認
Desktop桌面壁紙
Desktop Computer桌上型電腦台式計算機
Display Card顯示卡顯卡
Delivery傳遞交付
Device裝置設備
Domain Name網域名稱功能變數名稱
Deep Inspection深層檢測深度檢測
Drive Letter磁碟機代號驅動器符號
Data資料數據
Default預設默認 / 缺省
Digital數位數碼
Demo示範 / 展示演示
Domain Name網域名稱功能變數名稱
DDW (Detecting near-Duplicate WebPages)重複網頁刪除偵測網頁去重
Dimension次元維度
Enter回車
EIGRP路由器鄰居發現協定
Echo Request回應要求回顯請求
Echo Replay回應答覆回顯應答
Floppy軟碟軟盤
Font字型字體
Feedback意見反應回饋 / 反饋
Framework架構框架
Founder創始者奠基人
Field欄位域
File Handle文件句柄
Group群組和組
Hard Disk硬碟硬盤
Hardware硬體硬件
Hostname主機名稱主機別名
Homepage首頁主頁
Header標頭包頭
Hash Algorithm雜湊演算法散列算法 / 哈希算法
Hijack劫持
[Hard Code]寫死硬編碼
Icon圖示圖標
Internet網際網路互聯網
IP AddressIP 位址IP 地址
Implementation實作實現
In-Band帶內管理
Inverted index反向索引倒排索引
Interpolation內插補點差值
Incoming/Inbound Link傳入連結入鏈
Instance執行個體實例
Intellisense智能感知
Joystick搖桿手柄
Kernel核心內核
LAN區域網路局域網
Link連結鏈接
Login/Logon登入登錄
Logout登出註銷
Loopback環回
Low-Latency低延遲時間低延時
Localhost本地主機
LM (Lan Manager)LAN 管理員LAN 管理器
Local Security Authority本機安全性授權安全子系統
Laser雷射激光
Linked list連結清單鏈表
Memory記憶體內存
Match比對匹配
Modeling模組化建模
[mì]n 的 m 次方n 的 m 次冪
Message Broker消息代理
Nimda妮姆達
New Technology File SystemNTFS 檔案系統NTFS 分區
Online線上在線
OSPF Cost路徑成本度量值
Out-Of-Band帶外管理
Outgoing/Outbound Link對外連結出鏈
Packet封包報文 / 包文
Password密碼口令
Permission權限許可權
Protocol協定協議
Packet Loss封包遺失數據包丟失
Promiscuous Mode混雜模式
Permission權限許可權
Patch更新檔補丁
PKI公開金鑰基礎建設公共金鑰結構
Process程序進程
Private Key私密金鑰私有金鑰
Printer印表機打印機
Programming程式設計編程
Posts文章帖子
Policy原則策略
[Poisson Process]卜瓦松過程泊松过程
[Paradigm]範式范式
Physical實體物理
[Probability]機率概率
Redundancy備援冗餘
Recovery Agent修復代理人恢復代理
Replay Attack重播攻擊重放攻擊
Registry機碼註冊表
Refresh重新整理刷新
Recycle Bin資源回收筒回收站
Robot Exclusion Protocol爬蟲禁抓協議
Rollback復原回滾
Return傳回返回
Scheduling排程調度
Submit送出提交
Three Way HandshakeTCP 三向交握TCP 三次握手
TCP SessionTCP 會話
TCP half-open Session_TCP 半開會話
TCP ConnectionTCP 連接
TCP InterceptTCP 攔截TCP 截取
Threshold門檻值閾值
Time Exceeded逾時超時
Traffic Shaping流量整形
Token Buket權仗桶
Training教育訓練培訓
Text Retrieval文字檢索文本檢索
Term-Document Matrix詞彙 - 文件矩陣單詞 - 文件矩陣
Traversal周遊遍歷
Unicast單點傳播單播
User使用者用戶
Uninstall解除安裝卸載
Unary一進制一元
Video視訊視頻
Weighted權重加權
Worm.Blaster疾風病毒衝擊波病毒
WordPad寫字板
Multicast多點傳播多播 / 組播
Market Shares市場佔有率市場份額
Media媒體介質
Messenger Service信差服務信使服務
Motherboard主機板主板 / 母板
Modem數據機調制解調器
Mouse滑鼠鼠標
My Document我的文件我的文檔
Master主要主控
[Metadata]中繼資料元數據
[microblog]微網誌微博
Native VLAN原生 VLAN本地 VLAN
Session State會話狀態
Subnet Mask子網路遮罩子網掩碼
Switchport mode accessAccess 模式接入模式
Support Tools支持工具資源包
Security Reference Monitor安全參考監督系統連接仲裁器
Simple Volume簡單磁碟區簡單卷
Spanned Volume跨距磁碟區跨區卷
Striped Volume等量磁碟區帶區卷
SAM (Security Account Manager)安全性帳戶管理員安全帳戶管理器
Submit送出提交
Screen螢幕屏幕
Support支援支持
SNMP Community StringSNMP 團體字符串
VLAN TrunkVLAN 幹道
VLAN TagVLAN 標記
VLAN Double TagVLAN 雙標記

2011年9月8日 星期四

完整的C#多國語言解決方案(二)- 字串多國語言

首先,為專案加入一個資源檔,如圖所示,選新增項目,然後選擇資源檔,要建立兩個檔案,注意檔名要相同,而檔名跟副檔名(.resx)之間要多一個語言次檔名,這個副檔名是有規則有規定的,請參照文化語言表。比方取名為LanguagePack.en.resx 跟LanguagePack.zh-TW.resx 就可以根據系統是中文還是英文,來取出對應的文字。












檔案增加好了之後程式怎麼撰寫?請看:
假設此專案的Namespace名稱為MultiLanguageTest
假設把語言包取名為LanguagePack
假設LanguagePack.en.resx裡面有新增一個StringTest001的字串。內容是:"我是中文的字串"
假設LanguagePack.zh-TW.resx裡面有新增一個StringTest001的字串。內容是:"I am English"


利用ResourceManager來取得對應文化的resx檔案,然後利用GetString()告訴ResourceManager你要取得那個字串,如此,就會根據你的OS來抓取正確的語言檔.resx


ResourceManager Rm = new ResourceManager( "MultiLanguageTest.LanguagePack", Assembly.GetExecutingAssembly( ) );
MessageBox.Show( Rm.GetString( "StringTest001" ) );




「這樣測試過後,只能看到中文的字串,因為我用的是中文的作業系統啊,怎麼知道這樣寫對不對?」在你的Program.cs 的main()裡加上這個Thread.CurrentThread.CurrentUICulture = new CultureInfo( "en" ); ,執行之後,你就可以讓程式強制在英文的語言文化來呈現了。


加上這行之後,編譯可能看到「Thread不存在目前內容中」、「CultureInfo不存在目前內容中」的錯誤訊息,Using引用進來就好了。

完整的C#多國語言解決方案(一)- 畫面多國語言

新增一個C#專案,並選擇 [ Windows Form應用程式 ],將原本預設的 Form1更改設定為FormMain,可看到畫面如下

 







為了測試,我們在Form上面放上四個原件,一個Lable,名稱為Lbl_Test,一個ListBox,名稱為LstBx_Test,一個PictureBox,名稱為PBox_Test,一個按鈕,名稱為Btn_Test。

將Form的Localizable改為True,此Form就會具有多國語言的特質,然後若把Language改為中文,並且更改視窗內任何原件的位置或Text,之後存檔,就會看到多了一個檔案:FormMain.zh-TW.resx,位置跟文字的資訊就會被儲存在這個語系檔中。如下圖




接下來再把Language改為英文,並且更改視窗內任何原件的位置或Text,之後存檔,就會看到多了一個檔案:FormMain.en.resx,位置跟文字的資訊就會被儲存在這個語系檔中。如下圖




如何能控制系統現在要顯示哪一種語系的應用程式外觀呢?可以不用設定,OS就會自動決定出了你的語系,比方你安裝台灣中文版的Windows通常你的語系跟使用地區就會是台灣,安裝過程也有讓你設定使用地區,這些就會決定了語系,當然,為了測試或特殊需求,你也可以在Program.cs當中撰寫以下幾行程式:

CultureInfo CI = new CultureInfo( "zh-TW" );
System.Threading.Thread.CurrentThread.CurrentUICulture = CI;

CultureInfo就是設定文化語系的Class,用他設定zh-TW或en即可決定要使用的語系國家,之後將此設定到CurrentThread即可將此程式指定為該語系了。經過以上的設定過後,專案將會有中文與英文兩個版面,而根據被指定要顯示中文或英文語系來顯示不同的Text String與物件位置(各國語言文字所需要的長寬不同的關係)。

那圖片的部分能不能透過以上的步驟來設定兩種以上語系的圖片,然後讓應用程式根據語系,來呈現不同的圖片呢?答案是不行。圖片的控制要自己來。這是最麻煩的地方,多語系如果要有不同的圖,就是要多花很多功夫。






而如果你有訊息要顯示在...比方對話框中,或者是其他跟Form、Panel無關的地方能不能透過這種設定方式,來讓不同語系之下,顯示不同的Text String呢?答案是不行。難道就這麼束手無策了嗎?也不是的,跟圖片不同的是,有特別的解決方法,請看以下的作法介紹: