public InternationalizationSummary Internationalize(XmlResource resource)
{
if (resource == null)
throw new ArgumentNullException("resource");
if (!Directory.Exists(resource.TargetDirectory))
{
Directory.CreateDirectory(resource.TargetDirectory);
File.SetAttributes(resource.TargetDirectory, FileAttributes.Hidden);
}
DictionaryFileCollection coll = Internationalizer.GetTranslationDictionaryCollection(context);
CategoryInfo categoryInfo = context.ProjectConfiguration.Categories[context.Category];
InternationalizationSummary summary = new InternationalizationSummary(resource, categoryInfo);
Stopwatch sw = new Stopwatch();
sw.Start();
foreach (string locale in coll.Locales)
{
if (coll.Dictionaries[locale].Document == null)
throw new InternationalizationError(string.Format(
"The locale '{0}' in category '{1}' doesn't have any dictionary files", locale, coll.Category));
CacheableXmlDocument input;
try
{
input = resource.LoadLocalizedSourceDocument(locale);
}
catch (FileNotFoundException ex)
{
log.ErrorFormat("Could not internationalize resource '{0}' to locale '{1}': {2}", resource.Name.Signature, locale, ex.Message);
continue;
}
XmlWriterSettings settings = new XmlWriterSettings { Indent = true };
string outputPath = resource.GetInternationalizedName(locale, true);
XmlWriter translateWriter = XmlWriter.Create(outputPath, settings);
StringBuilder builder = new StringBuilder();
XmlWriter diagnoseWriter = XmlWriter.Create(builder, settings);
try
{
this.Transform(input, coll, locale, translateWriter, InternationalizeType.Translate);
this.Transform(input, coll, locale, diagnoseWriter, InternationalizeType.Diagnose);
}
finally
{
translateWriter.Close();
diagnoseWriter.Close();
}
XmlDocument diagnostics = new XmlDocument();
diagnostics.LoadXml(builder.ToString());
summary.AddPhraseSummary(locale, diagnostics);
summary.AddDependencies(locale, input.Dependencies);
}
sw.Stop();
summary.Duration = sw.ElapsedMilliseconds;
log.InfoFormat("Internationalized xml resource '{0}' into {1} locales in {2}ms",
resource.Name.Signature, coll.Locales.Count, sw.ElapsedMilliseconds);
return summary;
}