我正在寻找解决方案或建议解决我遇到的问题。我有一堆ASPX页面将被本地化,并且有一堆文本需要以6种语言支持。
进行翻译的人无法访问Visual Studio,可能最简单的工具是Excel。如果我们使用Excel甚至导出到CSV,我们需要能够导入以移动到.resx文件。那么,最好的方法是什么?
我已经知道这个问题,Convert a Visual Studio resource file to a text file?已经使用Resx编辑器,但更容易使用解决方案。
答案 0 :(得分:2)
我不确定你要找的答案有多全面,但如果你真的只是使用[string,string]对进行本地化,那么你只是在寻找一种加载资源的快捷方式( .resx)带有翻译结果的文件,以下内容将作为一种相当快速,低技术的解决方案。
要记住的是.resx文件只是XML文档,因此应该可以从外部代码手动将数据加载到资源中。以下示例适用于VS2005和VS2008:
namespace SampleResourceImport
{
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
string filePath = @"[file path to your resx file]";
doc.Load(filePath);
XmlElement root = doc.DocumentElement;
XmlElement datum = null;
XmlElement value = null;
XmlAttribute datumName = null;
XmlAttribute datumSpace = doc.CreateAttribute("xml:space");
datumSpace.Value = "preserve";
// The following mocks the actual retrieval of your localized text
// from a CSV or ?? document...
// CSV parsers are common enough that it shouldn't be too difficult
// to find one if that's the direction you go.
Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("Label1", "First Name");
d.Add("Label2", "Last Name");
d.Add("Label3", "Date of Birth");
foreach (KeyValuePair<string, string> pair in d)
{
datum = doc.CreateElement("data");
datumName = doc.CreateAttribute("name");
datumName.Value = pair.Key;
value = doc.CreateElement("value");
value.InnerText = pair.Value;
datum.Attributes.Append(datumName);
datum.Attributes.Append(datumSpace);
datum.AppendChild(value);
root.AppendChild(datum);
}
doc.Save(filePath);
}
}
}
显然,前面的方法不会为您的资源生成代码隐藏,但是在Visual Studio中打开资源文件并切换资源的辅助功能修改器将(重新)为您生成静态属性。
如果您正在寻找完全基于XML的解决方案(与CSV或Excel互操作),您还可以指示您的翻译人员将他们翻译的内容存储在Excel中,保存为XML,然后使用XPath检索您的本地化信息。唯一需要注意的是文件大小会变得非常臃肿。
祝你好运。
答案 1 :(得分:1)
我遇到了类似的问题并意识到从excel文件创建.resx文件的最简单方法是使用excel的连接函数来生成“&lt;”数据“&gt;”..“&lt;”/ data“ &gt;”中.resx文件的节点,然后在任何文本编辑器中手动将生成的行复制到.resx文件。因此,假设您在Excel文档的A列中有“名称”,在Excel文档的B列中有“值”。在C栏中使用以下公式
=CONCATENATE("<data name=","""",A14,""" xml:space=""preserve"">","<value>", B14, "</value>", "</data>")
您将获得资源的数据节点。然后,您可以将此公式复制到所有行,然后在.resx文件中复制C列的内容。
答案 2 :(得分:0)
如果它在csv中,这是一个快速的Ruby脚本来生成数据元素。
require 'csv'
require 'builder'
file = ARGV[0]
builder = Builder::XmlMarkup.new(:indent => 2)
CSV.foreach(file) do |row|
builder.data(:name => row[0], "xml:space" => :preserve) {|d| d.value(row[1]) }
end
File.open(file + ".xml", 'w') { |f| f.write(builder.target!) }