您的位置:首页 > 编程语言 > Go语言

不需要了解任何底层知识,就可以汉化!Let`s go!!!

2013-10-16 21:53 357 查看
汉化?莫要被这两个字吓到。

其实你也可以汉化,跟着我的步骤来,你也可以进行汉化,Let`s go!!!(大鸟飘过)

这里汉化的是微软企业类库的配置管理工具EntLibConfig.exe。当然,这里的企业类库是3.0版本的。

准备工作:

你需要下载Entprise Library,然后找到配置管理工具EntLibConfig.exe。

将EntLibConfig.exe及其依赖的文件放置在D:\el目录下

如果不想下载微软企业类库,也没有关系,这里的方法还是适用的。

首先看一下,要汉化的软件界面:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Wbs;

namespace rsc
{
class Program
{
static void Main(string[] args)
{
if(args.Length ==0)
{
Console.WriteLine("假设要汉化a.resource资源文件,请参考如下步骤实现(注:只能汉化字符串资源,如果想要汉化字体颜色等资源请....自己弄去。)");
Console.WriteLine("第一步:从a.resource中提取资源到r.txt中,请输入如下命令行:rsc a.resource r r.txt");
Console.WriteLine("第二步:修改r.txt中需要汉化的资源");
Console.WriteLine("第三步:从r.txt中将资源写会到a.resource中,请输入如下命令行:rsc a.resource w r.txt");
return;
}
string fileName = args[0];
string readOrWrite = args[1];
string outputFile = fileName;
if (args.Length == 3)
{
outputFile = args[2];
}

if (readOrWrite == "r")
{
Dictionary<int,Resource> resources = ResourceHelper.GetResources(fileName);
WriteTextTo(outputFile, resources);
Console.WriteLine("已将资源以文本形式写入到{0}中",outputFile);
return;
}

if (readOrWrite == "w")
{
Dictionary<int ,Resource>originalResources= ResourceHelper.GetResources(fileName);
IEnumerable<Resource> resourceNew = ReadFrom(outputFile);
ChangeResource(originalResources, resourceNew);
ResourceHelper.WriteResources(fileName,originalResources.Values);
Console.WriteLine("已经资源写入到{0}中",fileName);
return;
}
}
/// <summary>
/// 将资源以文本形式写入到指定的文件
/// </summary>
/// <param name="fileName">要将资源写入到的文件</param>
/// <param name="resources">资源</param>
private static void WriteTextTo(string fileName,Dictionary<int,Resource> resources)
{

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(fs,Encoding.UTF8);
StringBuilder resourceTextBuilder = new StringBuilder();

foreach (var eachResource in resources)
{
resourceTextBuilder.AppendFormat("{0},{1},{2}\r\n", eachResource.Key,eachResource.Value.Key, eachResource.Value.Value);
}
sw.WriteLine(resourceTextBuilder.ToString());
sw.Close();
}

/// <summary>
/// 从指定的资源文本文件中读取资源。
/// </summary
/// <param name="fileNameForText">资源文本文件名</param>
/// <returns>返回一个资源集合</returns>
private static IEnumerable<Resource> ReadFrom(string fileNameForText)
{
FileStream fs = new FileStream(fileNameForText, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fs,Encoding.Default);
string line;
List<Resource> resources = new List<Resource>();
while ((line = reader.ReadLine()) !="")
{
int resourceID =Convert.ToInt32( line.Substring(0, line.IndexOf(',')));
string keyvValuePair = line.Substring(line.IndexOf(',') + 1);
string key=keyvValuePair.Substring(0,keyvValuePair.IndexOf(','));
string value=keyvValuePair.Substring(keyvValuePair.IndexOf(',')+1);
Resource newResource = new Resource(resourceID,key,value,null);
resources.Add(newResource);
}

return resources;
}

/// <summary>
/// 将资源修改为指定的资源
/// </summary>
/// <param name="originalResource">要修改的资源</param>
/// <param name="resourceNew">要将资源修改成的新资源</param>
private static void ChangeResource(Dictionary<int, Resource> originalResource, IEnumerable<Resource> resourceNew)
{
foreach (Resource eachResource in resourceNew)
{
if(originalResource[eachResource.ID].ResourceType.FullName=="System.String")
originalResource[eachResource.ID].Value = eachResource.Value;
}
}
}
}


View Code

总结:

可以先将要汉化的程序集,通过ildasm反汇编器将其反汇编,此时会生成一堆.il文件和.resource文件。你可以在.resource文件中找到要替换的英文。

由于.resource文件的内部结构时不公开的,但是可以通过System.Resources.ResourceReader和System.Resources.ReousrceWriter来读取和写入.resource文件(通过研究这两个类的源码,也可以知道.resoruce文件的内部布局),当然,你可以使用我封装好的rsc工具来读取和写入.resource文件。

使用rsc文件将.resoruce文件中的资源提取到一个文本文件中,然后搜索要汉化的字符差,将其替换成中文,最后在使用rsc将其保存到源文件中。

到此为止,汉化以基本完成。此时使用ilasm汇编器将生成的il文件重新编译,汉化完成!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐