public static IEnumerable<ResourceString> Generate (ResourceIdType resourceIdType, LocalizedString localizedString) { string [] translated; if (localizedString.HasValidTranslations) { translated = localizedString.TranslatedValues; } else { translated = new [] { localizedString.UntranslatedSingularValue, localizedString.UntranslatedPluralValue }; } for (int i = 0; i < translated.Length; i++) { if (translated [i] == null || (i == 0 && String.IsNullOrWhiteSpace (localizedString.UntranslatedSingularValue))) { continue; } yield return new ResourceString { Id = Catalog.GetResourceId (resourceIdType, localizedString.Context, localizedString.UntranslatedSingularValue, localizedString.Gender, i), Untranslated = localizedString.UntranslatedSingularValue, Translated = translated [i] }; } }
public bool UntranslatedEquals(LocalizedString other) { return Context == other.Context && UntranslatedSingularValue == other.UntranslatedSingularValue && UntranslatedPluralValue == other.UntranslatedPluralValue && Gender == other.Gender; }
public static LocalizedString Merge(LocalizedString a, LocalizedString b) { if (!a.UntranslatedEquals (b)) { throw new Exception ("Cannot merge two strings with different untranslated values"); } var merged = new LocalizedString { Context = a.Context, UntranslatedSingularValue = a.UntranslatedSingularValue, UntranslatedPluralValue = a.UntranslatedPluralValue, Gender = a.Gender, StringFormatHint = a.StringFormatHint ?? b.StringFormatHint, DeveloperComments = Join (a.DeveloperComments, b.DeveloperComments), TranslatorComments = Join (a.TranslatorComments, b.TranslatorComments) }; var a_translated = a.TranslatedValues != null ? a.TranslatedValues.Where (tr => !String.IsNullOrEmpty (tr)).ToList<string> () : new List<string> (); var b_translated = b.TranslatedValues != null ? b.TranslatedValues.Where (tr => !String.IsNullOrEmpty (tr)).ToList<string> () : new List<string> (); if (b_translated.Count >= a_translated.Count) { a_translated = b_translated; } if (a_translated.Count > 0) { merged.TranslatedValues = a_translated.ToArray (); } var a_references = new List<string> (a.References ?? new string [0]); var b_references = new List<string> (b.References ?? new string [0]); foreach (var reference in b_references) { if (!a_references.Contains (reference)) { a_references.Add (reference); } } if (a_references.Count > 0) { merged.References = a_references.ToArray (); } return merged; }
protected IEnumerable<ResourceString> GetResourceStrings(LocalizedString localizedString) { return ResourceString.Generate (ResourceIdType, localizedString); }
public IEnumerable<LocalizedString> Parse() { uint number_of_strings; uint original_strings_table_offset; uint translations_table_offset; uint hash_table_size; uint hash_table_offset; using (var reader = new BinaryReader (MoStream)) { if (reader.ReadUInt32 () != 0x950412de) throw new Exception ("Wrong magic"); if (reader.ReadUInt32 () != 0x0) throw new Exception ("unsupported file version"); number_of_strings = reader.ReadUInt32 (); original_strings_table_offset = reader.ReadUInt32 (); translations_table_offset = reader.ReadUInt32 (); hash_table_size = reader.ReadUInt32 (); hash_table_offset = reader.ReadUInt32 (); for (var i=0;i<number_of_strings;i++) { var localized_string = new LocalizedString(); reader.BaseStream.Seek (original_strings_table_offset + i*8, SeekOrigin.Begin); var original_string_length = reader.ReadUInt32 (); var original_string_offset = reader.ReadUInt32 (); reader.BaseStream.Seek (translations_table_offset + i*8, SeekOrigin.Begin); var translation_length = reader.ReadUInt32 (); var translation_offset = reader.ReadUInt32 (); reader.BaseStream.Seek (original_string_offset, SeekOrigin.Begin); var original_string_bytes = reader.ReadBytes((int)original_string_length); var original_string_and_context = Encoding.UTF8.GetString (original_string_bytes, 0, original_string_bytes.Length).Split ((char)4); string context = null; string[] original_string; if (original_string_and_context.Length > 1) { context = original_string_and_context[0]; original_string = original_string_and_context[1].Split('\0'); } else { original_string = original_string_and_context[0].Split ('\0'); } reader.BaseStream.Seek (translation_offset, SeekOrigin.Begin); var translation_bytes = reader.ReadBytes((int) translation_length); var translation = Encoding.UTF8.GetString (translation_bytes, 0, translation_bytes.Length).Split('\0'); localized_string.UntranslatedSingularValue = original_string[0]; if (original_string.Count () == 2) { localized_string.UntranslatedPluralValue = original_string[1]; } localized_string.TranslatedValues = translation; if (context != null) { var context_lower = context.ToLower (); foreach (var gender_context in GenderContexts) { if (context_lower == gender_context.Key) { localized_string.Gender = gender_context.Value; context = null; break; } else if (context.Contains (gender_context.Key)) { localized_string.Gender = gender_context.Value; break; } } } localized_string.Context = context; yield return localized_string; } } }