Beispiel #1
0
        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]
                };
            }
        }
Beispiel #2
0
 public bool UntranslatedEquals(LocalizedString other)
 {
     return
         Context == other.Context &&
         UntranslatedSingularValue == other.UntranslatedSingularValue &&
         UntranslatedPluralValue == other.UntranslatedPluralValue &&
         Gender == other.Gender;
 }
Beispiel #3
0
        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;
        }
Beispiel #4
0
 protected IEnumerable<ResourceString> GetResourceStrings(LocalizedString localizedString)
 {
     return ResourceString.Generate (ResourceIdType, localizedString);
 }
Beispiel #5
0
            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;
                    }
                }
            }