使用 Microsoft Visual Studio International Pack 创建支持多文化多语言的软件应用

本文发布于 16 年前,部分内容可能已经失去参考价值。

微软下载中心:Microsoft Visual Studio International Pack

Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。

概述

Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。 该软件包1.0版提供下面七个组件以增强.NET Framework对全球化软件应用开发的支持。

  • East Asia Numeric Formatting Library - 支持将小写的数字字符串格式化成简体中文,繁体中文,日文和韩文的大写数字字符串。
  • Japanese Kana Conversion Library - 支持将日文假名(Kana)转化为另一种日文字符。
  • Japanese Text Alignment Library - 支持日文特有的一种对齐格式。
  • Japanese Yomi Auto-Completion Library - 类库支持感知日文输入法的输入自动完成和一个文本框控制的示例。
  • Korean Auto Complete TextBox Control - 在文本框中支持韩文输入法的智能感知和输入自动完成。
  • Simplified Chinese Pin-Yin Conversion Library - 支持获取简体中文字符的常用属性比如拼音,多音字,同音字,笔画数。
  • Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool - 支持简繁体中文之间的转换. 该组件还包含一个Visual Studio集成开发环境中的插件(Add-in)支持简繁体中文资源文件之间的转换。

 

说明

1. 请下载Visual Studio International Pack 1.0压缩文件(zip), 解压后可以发现7个MSI安装文件。
2. 运行所需组件的MSI文件安装该组件。
下载后,对于只使用“拼音”功能的,只用安装CHSPinYinConv.msi。
文件安装在X:\Program Files\Microsoft Visual Studio International Pack(Beta)\Simplified Chinese Pin-Yin Conversion Library下。

使用时,需要引用目录下的两个dll文件:ChnCharInfo.dll,ChnCharInfoResource.dll。
其中ChnCharInfo.dll包含应用的类Microsoft.International.Converters.PinYinConverter >  ChineseChar
ChnCharInfoResource.dll只包含数据资源。
ChineseChar类的属性方法

 ChineseCharNew(Char) ChineseChar类的构造函数。
 ChineseCharacter 获取这个汉字字符。
 CompareStrokeNumber(Char) 将给出的字符和实例字符的笔画数进行比较。
 GetCharCount(Int16) 检索具有指定笔画数的字符个数。
 GetChars(String) 获取给定拼音的所有同音字。
 GetChars(Int16) 检索具有指定笔画数的所有字符串。
 GetHomophoneCount(String) 检索具有指定拼音的字符数。
 GetStrokeNumber(Char) 检索指定字符的笔画数。
 HasSound(String) 识别字符是否有指定的读音。
 IsHomophone(Char) 识别给出的字符是否是实例字符的同音字。
 IsHomophone(Char, Char) 识别给出的两个字符是否是同音字。
 IsPolyphone 获取这个字符是否是多音字。
 IsValidChar(Char) 识别给出的字符串是否是一个有效的汉字字符。
 IsValidPinyin(String) 识别给出的拼音是否是一个有效的拼音字符串。
 IsValidStrokeNumber(Int16) 识别给出的笔画数是否是一个有效的笔画数。
 PinyinCount 获取这个字符的拼音个数。
 Pinyins 获取这个字符的拼音。
 StrokeNumber 获取这个字符的笔画数。
示例
以下代码演示了返回给出字符的笔划数。

using Microsoft.International.Converters.PinYinConverter;

class Main
{
    publicvoid Main()
    {
        object chineseChar = new ChineseChar("微");
        Console.WriteLine("stroke number of 微 in Chinese is {0}.", chineseChar.StrokeNumber);
        Console.WriteLine("{0} characters' pinyin is \\'wei1\\'.", chineseChar.GetHomophoneCount("wei1"));
        if ((chineseChar.IsHomophone("微", "薇")))
        {
            Console.WriteLine("微 and 薇 have the same pinyin.");
        }
    }
}

// This code produces the following output.

// stroke number of 微 in Chinese is 13.
// 37 characters' pinyin is 'wei1'.
// 微 and 薇 have the same pinyin.
//
    
它的字集是“简体中文扩展字符集”,象“乫”字就不存在。
它也没有提供注音功能。象“乪”字,它提供了拼音:NANG2,可没提供注音:náng。这我觉得很奇怪了。
现在给它加上注音功能。本想按它的风格写的,不过没验证自己的写法是否正确,还是照自己的代码写算了。
PinyinConverter.Vowels.cs,声母
namespace LzmTW.Converters.PinYinConverter
{
partial class ChineseChar
{
private class Vowels
{
private static ReadOnlyCollection<string> gArray;
static Vowels()
{
string[] mArray = new string[] {"b", "p", "m", "f", "d", "t", "n", "l", "g", "k",
"h", "j", "q", "x", "zh", "ch", "sh", "r", "z", "c",
"s", "y", "w"};
gArray =new ReadOnlyCollection<string>(mArray);
}

public static string Item {
get{
if (pinyin.Length ==1) {
return string.Empty;
}

string mVowel = pinyin.Substring(0, 2).ToLower;

if (gArray.Contains(mVowel))
return mVowel;

mVowel = mVowel.Substring(0, 1);

if (gArray.Contains(mVowel))
return mVowel;

return string.Empty;
}
}
}
}
}
PinyinConverter.Consonants.cs,韵母。不好意思,我不知道用什么英文表示韵母好。
namespace LzmTW.Converters.PinYinConverter
{
partial class ChineseChar
{
private class Consonants
{
private static ConsonantCollection gArray;

public static string Item {
get{
string mLastChar = yunmu.Substring(yunmu.Length -1, 1);
int mTone =-1;
string mConsonant = yunmu;

if (char.IsNumber((char)mLastChar)) {
mTone =int.Parse(mLastChar);
}

if (mTone >0) {
mConsonant = yunmu.Substring(0, yunmu.Length -1);
}


if (gArray.Contains(mConsonant)) {

switch (mTone) {

case0:
return gArray(mConsonant).tone1;

case1:
return gArray(mConsonant).tone2;

case2:
return gArray(mConsonant).tone3;

case3:
return gArray(mConsonant).tone4;

case4:
return gArray(mConsonant).tone5;

default:
return gArray(mConsonant).tone1;

}
}
return string.Empty;
}
}

static Consonants()
{
gArray =new ConsonantCollection();
//i,u,ü,iu 
gArray.Add(ConsonantItem.Create(new string[] {"i", "i", "ī", "í", "ǐ", "ì"}));
gArray.Add(ConsonantItem.Create(new string[] {"u", "u", "ū", "ú", "ǔ", "ù"}));
gArray.Add(ConsonantItem.Create(new string[] {"v", "ü", "ǖ", "ǘ", "ǚ", "ǜ"}));
gArray.Add(ConsonantItem.Create(new string[] {"iu", "iu", "iū", "iú", "iǔ", "iù"}));
//ɑ,iɑ,uɑ 
gArray.Add(ConsonantItem.Create(new string[] {"a", "a", "ā", "á", "ǎ", "à"}));
gArray.Add(ConsonantItem.Create(new string[] {"ia", "ia", "iā", "iá", "iǎ", "ià"}));
gArray.Add(ConsonantItem.Create(new string[] {"ua", "ua", "uā", "uá", "uǎ", "uà"}));
//o,uo 
gArray.Add(ConsonantItem.Create(new string[] {"o", "o", "ō", "ó", "ǒ", "ò"}));
gArray.Add(ConsonantItem.Create(new string[] {"uo", "uo", "uō", "uó", "uǒ", "uò"}));
//e,ie,eü,er,ue,üe 
gArray.Add(ConsonantItem.Create(new string[] {"e", "e", "ē", "é", "ě", "è"}));
gArray.Add(ConsonantItem.Create(new string[] {"ie", "ie", "iē", "ié", "iě", "iè"}));
gArray.Add(ConsonantItem.Create(new string[] {"er", "er", "ēr", "ér", "ěr", "èr"}));
gArray.Add(ConsonantItem.Create(new string[] {"ve", "üe", "ǖe", "ǘe", "ǚe", "ǜe"}));
gArray.Add(ConsonantItem.Create(new string[] {"ue", "üe", "ǖe", "ǘe", "ǚe", "ǜe"}));
//ɑi,uɑi 
gArray.Add(ConsonantItem.Create(new string[] {"ai", "ai", "āi", "ái", "ǎi", "ài"}));
gArray.Add(ConsonantItem.Create(new string[] {"uai", "uai", "uāi", "uái", "uǎi", "uài"}));
//ei,uei(ui) 
gArray.Add(ConsonantItem.Create(new string[] {"ei", "ei", "ēi", "éi", "ěi", "èi"}));
gArray.Add(ConsonantItem.Create(new string[] {"ui", "ui", "uī", "uí", "uǐ", "uì"}));
//ɑo,iɑo 
gArray.Add(ConsonantItem.Create(new string[] {"ao", "ao", "āo", "áo", "ǎo", "ào"}));
gArray.Add(ConsonantItem.Create(new string[] {"iao", "iao", "iāo", "iáo", "iǎo", "iào"}));
//ou,iou 
gArray.Add(ConsonantItem.Create(new string[] {"ou", "ou", "ōu", "óu", "ǒu", "òu"}));

//ɑn,iɑn 
gArray.Add(ConsonantItem.Create(new string[] {"an", "an", "ān", "án", "ǎn", "àn"}));
gArray.Add(ConsonantItem.Create(new string[] {"ian", "ian", "iān", "ián", "iǎn", "iàn"}));
//uɑn,üɑn 
gArray.Add(ConsonantItem.Create(new string[] {"uan", "uan", "uān", "uán", "uǎn", "uàn"}));
//en, uen(un) 
gArray.Add(ConsonantItem.Create(new string[] {"en", "en", "ēn", "én", "ěn", "èn"}));
gArray.Add(ConsonantItem.Create(new string[] {"un", "un", "ūn", "ún", "ǔn", "ùn"}));
//in,ün 
gArray.Add(ConsonantItem.Create(new string[] {"in", "in", "īn", "ín", "ǐn", "ìn"}));
gArray.Add(ConsonantItem.Create(new string[] {"vn", "ün", "ǖn", "ǘn", "ǚn", "ǜn"}));
//ɑnɡ,iɑnɡ,uɑnɡ 
gArray.Add(ConsonantItem.Create(new string[] {"ang", "ang", "āng", "áng", "ǎng", "àng"}));
gArray.Add(ConsonantItem.Create(new string[] {"iang", "iang", "iāng", "iáng", "iǎng", "iàng"}));
gArray.Add(ConsonantItem.Create(new string[] {"uang", "uang", "uāng", "uáng", "uǎng", "uàng"}));
//enɡ,uenɡ 
gArray.Add(ConsonantItem.Create(new string[] {"eng", "eng", "ēng", "éng", "ěng", "èng"}));
//inɡ 
gArray.Add(ConsonantItem.Create(new string[] {"ing", "ing", "īng", "íng", "ǐng", "ìng"}));
//onɡ,ionɡ 
gArray.Add(ConsonantItem.Create(new string[] {"ong", "ong", "ōng", "óng", "ǒng", "òng"}));
gArray.Add(ConsonantItem.Create(new string[] {"iong", "iong", "iōng", "ióng", "iǒng", "iòng"}));

}

private class ConsonantItem
{
public string tone0;
public string tone1;
public string tone2;
public string tone3;
public string tone4;
public string tone5;

public static ConsonantItem Create(string[] array)
{
ConsonantItem tmp =new ConsonantItem();
{
tmp.tone0 = array(0);
tmp.tone1 = array(1);
tmp.tone2 = array(2);
tmp.tone3 = array(3);
tmp.tone4 = array(4);
tmp.tone5 = array(5);
}

return tmp;
}
}

private class ConsonantCollection : KeyedCollection<string, ConsonantItem>
{

protected override string GetKeyForItem(ConsonantItem item)
{
return item.tone0;
}
}
}
}
}
重载它的ChineseChar,加上注音属性。
PinyinConverter.cs
namespace LzmTW.Converters.PinYinConverter
{
public class ChineseChar : Microsoft.International.Converters.PinYinConverter.ChineseChar
{

private Collections.ObjectModel.ReadOnlyCollection<string> gZhuyins;

public ChineseChar(char ch) : base(ch)
{

string[] mZhuyinList =new string[8];
string mPinyin;

for (int i =0; i <= mZhuyinList.Length -1; i++)  {
mPinyin =this.Pinyins(i);

if (!string.IsNullOrEmpty(mPinyin))  {
mZhuyinList(i) = ChineseChar.Zhuyin(mPinyin);
}
}

gZhuyins =new Collections.ObjectModel.ReadOnlyCollection<string>(mZhuyinList);
}

public Collections.ObjectModel.ReadOnlyCollection<string> Zhuyins  {
get { return gZhuyins; }
}

private static string Zhuyin  {
get {
pinyin = pinyin.Trim.ToLower;
string mVowel = Vowels.Item(pinyin);
string mYummu = pinyin;

if (!mVowel.Equals(string.Empty))  {
mYummu = mYummu.Substring(mVowel.Length);
}

string mConsonant = Consonants.Item(mYummu);
return string.Concat(mVowel, mConsonant);
}
}

/**////' <param name="pinyins">如 XIAN1 JIN4</param>
//Private Shared Function GetZhuyins(ByVal pinyins As String) As String
// Dim mList As New List(Of String)

// Dim mPinyin As String
// For Each pinyin As String In pinyins.Split(" "c)
// mPinyin = ChineseChar.Zhuyin(pinyin)

// If mPinyin.Equals(String.Empty) Then Continue For

// mList.Add(mPinyin)
// Next

// Return String.Join(" ", mList.ToArray)
//End Function 

}
}
也示例一下:
private void Button5_Click(object sender, System.EventArgs e)
{
LzmTW.Converters.PinYinConverter.ChineseChar t =new LzmTW.Converters.PinYinConverter.ChineseChar('和');

Console.WriteLine("\"和\"为多音字:");
for (int i =0; i <= t.PinyinCount -1; i++) {
Console.WriteLine("拼音:{0,-5},注音:{1}", t.Pinyins(i), t.Zhuyins(i));
}
}
结果:
"和"为多音字:
拼音:HE2 ,注音:hé
拼音:HE4 ,注音:hè
拼音:HE5 ,注音:he
拼音:HU2 ,注音:hú
拼音:HUO2 ,注音:huó
拼音:HUO4 ,注音:huò
拼音:HUO5 ,注音:huo
参考:http://topic.csdn.net/u/20071201/17/290fe247-7021-429b-905b-17e9a8d1fa52.html
转自 网络(如侵权请联系删除) 17 年前
可能相关的内容