Beispiel #1
0
        private static void Initialize()
        {
            /*
             * 在项目中,应该在"解决方案资源管理器"中设置文件的属性:
             *      "复制到生成目录" 设置为 "始终复制"
             *      "生成操作" 设置为 "无"
             */
            string xmlFilePath              = @"Localizations\Localization.xml";
            var    xmlDocument              = XDocument.Load(xmlFilePath);
            var    dictionaryFactory        = new XmlLocalizationDictionaryFactory(xmlDocument);
            ILocalizationDictionary chinese = dictionaryFactory.CreateLocalizationDictionary("zh-CN");
            ILocalizationDictionary english = dictionaryFactory.CreateLocalizationDictionary("en-US");

            var mngr = new LocalizationDictionaryManager();

            mngr.Add(chinese);
            mngr.Add(english);

            // 设置LocalizationUtility使用的字典管理器,此静态工具类通常在代码中使用
            LocalizationUtility.SetLocalizationDictionaryManager(mngr);

            // 设置本地化wpf扩展标记使用的字典管理器,此设置仅作用于wpf界面,通常和上面的保持一致。

            HelperLibrary.WPF.LocalizationExtension
            .LocalizationHelper.SetLocalizationDictionaryManager(mngr);
        }
Beispiel #2
0
        private void ReadProcessingInstruction(XmlReader reader, ILocalizationDictionary dictionary)
        {
            if (reader.Name != "mios-localization")
            {
                return;
            }
            var attributes = AttributesPattern.Matches(reader.Value).Cast <Match>()
                             .ToDictionary(t => t.Groups[1].Value, t => t.Groups[2].Value);
            string includePath;

            if (!attributes.TryGetValue("include", out includePath))
            {
                return;
            }

            string prefix;

            attributes.TryGetValue("prefix", out prefix);

            var typedDictionary = dictionary as LocalizationDictionary;

            if (typedDictionary != null)
            {
                typedDictionary.Includes.Add(
                    new LocalizationDictionary.Include {
                    Path = includePath, Prefix = prefix
                }
                    );
            }
            if (!Recursive)
            {
                return;
            }
            ReadNestedDictionary(includePath, prefix, dictionary);
        }
Beispiel #3
0
        /// <inheritdoc/>
        public virtual void Initialize(ILocalizationConfiguration configuration, IIocResolver iocResolver)
        {
            _configuration = configuration;

            if (_dictionaryProvider == null)
            {
                return;
            }

            var defaultProvided = false;

            foreach (var dictionaryInfo in _dictionaryProvider.GetDictionaries(Name))
            {
                _dictionaries[dictionaryInfo.Dictionary.CultureInfo.Name] = dictionaryInfo.Dictionary;
                if (dictionaryInfo.IsDefault)
                {
                    if (defaultProvided)
                    {
                        throw new AbpInitializationException("Only one default localization dictionary can be for source: " + Name);
                    }

                    _defaultDictionary = dictionaryInfo.Dictionary;
                    defaultProvided    = true;
                }
            }

            if (!defaultProvided)
            {
                throw new AbpInitializationException("There should be a default localization dictionary for source: " + Name);
            }
        }
Beispiel #4
0
 public void Write(ILocalizationDictionary dictionary, TextWriter writer)
 {
     using (var xmlWriter = new XmlTextWriter(writer)) {
         xmlWriter.Formatting = Formatting.Indented;
         WriteDictionary(dictionary, xmlWriter);
     }
 }
Beispiel #5
0
 public void Read(ILocalizationDictionary dictionary)
 {
     using (var stream = Resolver.Open(path)) {
         if (stream == null && ThrowWhenNotFound)
         {
             throw new FileNotFoundException(String.Format("Requested dictionary '{0}' could not be found", path), path);
         }
         if (stream == null)
         {
             return;
         }
         using (var reader = XmlReader.Create(stream)) {
             while (reader.Read())
             {
                 if (reader.NodeType == XmlNodeType.ProcessingInstruction)
                 {
                     ReadProcessingInstruction(reader, dictionary);
                 }
                 else if (reader.NodeType == XmlNodeType.Element && reader.Name == "dictionary")
                 {
                     ReadPageElement(reader, dictionary);
                 }
             }
         }
     }
 }
        /// <inheritdoc/>
        public virtual void Initialize()
        {
            if (_dictionaryProvider == null)
            {
                return;
            }

            var defaultProvided = false;
            foreach (var dictionaryInfo in _dictionaryProvider.GetDictionaries(Name))
            {
                _dictionaries[dictionaryInfo.Dictionary.CultureInfo.Name] = dictionaryInfo.Dictionary;
                if (dictionaryInfo.IsDefault)
                {
                    if (defaultProvided)
                    {
                        throw new AbpInitializationException("Only one default localization dictionary can be for source: " + Name);
                    }

                    _defaultDictionary = dictionaryInfo.Dictionary;
                    defaultProvided = true;
                }
            }

            if (!defaultProvided)
            {
                throw new AbpInitializationException("There should be a default localization dictionary for source: " + Name);
            }
        }
 /// <summary>
 /// Adds a new dictionary to the source.
 /// </summary>
 /// <param name="dictionary">Dictionary to add</param>
 /// <param name="isDefault">Is this dictionary the default one? Default directory is used when requested string can not found in specified culture</param>
 public void AddDictionary(ILocalizationDictionary dictionary, bool isDefault = false)
 {
     _dictionaries[dictionary.CultureInfo.Name] = dictionary;
     if (isDefault)
     {
         _defaultDictionary = dictionary;
     }
 }
 /// <summary>
 /// Adds a new dictionary to the source.
 /// </summary>
 /// <param name="dictionary">Dictionary to add</param>
 /// <param name="isDefault">Is this dictionary the default one? Default directory is used when requested string can not found in specified culture</param>
 public void AddDictionary(ILocalizationDictionary dictionary, bool isDefault = false)
 {
     _dictionaries[dictionary.CultureInfo.Name] = dictionary;
     if (isDefault)
     {
         _defaultDictionary = dictionary;
     }
 }
Beispiel #9
0
 public void Read(ILocalizationDictionary dictionary)
 {
     if (path == null || !File.Exists(path))
     {
         return;
     }
     Read(XDocument.Load(path), dictionary);
 }
        /// <summary>
        /// 添加新的本地化字典,若对应的语言文化字典已存在则抛出异常。
        /// </summary>
        /// <param name="dictionary">新的本地化字典</param>
        /// <exception cref="ArgumentNullException"></exception>
        public void Add(ILocalizationDictionary dictionary)
        {
            if (dictionary == null)
            {
                throw new ArgumentNullException("dictionary");
            }

            dictionaries.Add(dictionary.CultureName, dictionary);
        }
 private void ReadNestedDictionary(string path, string prefix, ILocalizationDictionary dictionary) {
   var combinedPath = Resolver.Combine(this.path, path);
   var nestedReader = new XmlLocalizationReader(combinedPath) {
     ThrowWhenNotFound = ThrowWhenNotFound,
     Resolver = Resolver,
     Prefix = Prefix + prefix
   };
   nestedReader.Read(dictionary);
 }
Beispiel #12
0
 public virtual ILocalizationDictionary Read(string sourceFile, ILocalizationDictionary dictionary)
 {
     if (!File.Exists(sourceFile))
     {
         return(null);
     }
     using (var reader = new StreamReader(sourceFile)) {
         return(Read(reader, dictionary));
     }
 }
Beispiel #13
0
        public DefaultModularLocalizer(CultureInfo culture, ILocalizationManager localizationManager,
                                       ITenantShellManager tenantShellManager, Type localizer)
        {
            _localizationManager = localizationManager;
            _tenantShellManager  = tenantShellManager;
            _localizer           = localizer;

            var feature = _tenantShellManager.GetCurrentTenantShellContext().Blueprint.Dependencies[localizer];

            _localizationDictionary = _localizationManager.GetDictionary(feature.FeatureInfo.Id, culture);
        }
Beispiel #14
0
 private void ReadPageElement(XmlReader reader, ILocalizationDictionary dictionary)
 {
     if (!reader.ReadToDescendant("key"))
     {
         return;
     }
     do
     {
         ReadKeyElement(reader, dictionary);
     } while(reader.ReadToNextSibling("key"));
 }
Beispiel #15
0
        private void ReadNestedDictionary(string path, string prefix, ILocalizationDictionary dictionary)
        {
            var combinedPath = Resolver.Combine(this.path, path);
            var nestedReader = new XmlLocalizationReader(combinedPath)
            {
                ThrowWhenNotFound = ThrowWhenNotFound,
                Resolver          = Resolver,
                Prefix            = Prefix + prefix
            };

            nestedReader.Read(dictionary);
        }
        public bool SetParentDictionary(ILocalizationDictionary parentDictionary)
        {
            if (parentDictionary == null)
            {
                return(false);
            }

            m_parentDictionary = parentDictionary;
            parentDictionary.SetChildDictionary(this);

            return(true);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="MultiTenantLocalizationDictionary"/> class.
 /// </summary>
 public MultiTenantLocalizationDictionary(
     string sourceName,
     ILocalizationDictionary internalDictionary,
     IRepository<ApplicationLanguageText, long> customLocalizationRepository,
     ICacheManager cacheManager,
     IAbpSession session)
 {
     _sourceName = sourceName;
     _internalDictionary = internalDictionary;
     _customLocalizationRepository = customLocalizationRepository;
     _cacheManager = cacheManager;
     _session = session;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="MultiTenantLocalizationDictionary"/> class.
 /// </summary>
 public MultiTenantLocalizationDictionary(
     string sourceName,
     ILocalizationDictionary internalDictionary,
     IRepository <ApplicationLanguageText, long> customLocalizationRepository,
     ICacheManager cacheManager,
     IAbpSession session)
 {
     _sourceName                   = sourceName;
     _internalDictionary           = internalDictionary;
     _customLocalizationRepository = customLocalizationRepository;
     _cacheManager                 = cacheManager;
     _session = session;
 }
 private static void WriteKey(string key, ILocalizationDictionary dictionary, XmlWriter writer) {
   writer.WriteStartElement("key");
   writer.WriteAttributeString("id", key);
   foreach(var locale in dictionary.Locales) {
     var value = dictionary[locale, key];
     if(value==null) continue;
     writer.WriteStartElement("val");
     writer.WriteAttributeString("for", locale);
     writer.WriteCData(value);
     writer.WriteEndElement();
   }
   writer.WriteEndElement();
 }
 private static void Read(XDocument document, ILocalizationDictionary dictionary) {
   var root = document.Root;
   if(root == null) throw new ArgumentException("Document does not contain required root element");
   foreach(var keyElement in root.Elements("key")) {
     var attribute = keyElement.Attribute("id");
     if(attribute==null) throw new ArgumentException("Element does not contain required 'id' attribute");
     var id = attribute.Value;
     foreach(var entryElement in keyElement.Elements()) {
       var locale = entryElement.Name.LocalName;
       dictionary[FromCompressedLocale(locale), id] = entryElement.Value;
     }
   }
 }
 private static void WriteDictionary(ILocalizationDictionary dictionary, XmlWriter writer) {
   writer.WriteStartDocument();
   var typedDictionary = dictionary as LocalizationDictionary;
   if(typedDictionary!=null) {
     WriteIncludes(typedDictionary, writer);
   }
   writer.WriteStartElement("dictionary");
   foreach(var key in dictionary.Keys) {
     WriteKey(key, dictionary, writer);
   }
   writer.WriteEndElement();
   writer.WriteEndDocument();
 }
Beispiel #22
0
        protected virtual void Extend(ILocalizationDictionary dictionary)
        {
            var existingDictionary = Dictionaries.GetOrDefault(dictionary.CultureName);

            if (existingDictionary == null)
            {
                Dictionaries[dictionary.CultureName] = dictionary;
            }
            else
            {
                existingDictionary.Extend(dictionary);
            }
        }
		public void Write(ILocalizationDictionary dictionary, TextWriter writer) {
			var document = new XDocument();
			var root = new XElement("page");
			document.Add(root);
			root.Add(dictionary.Keys
				.Select(key => {
					var e = new XElement("key");
					e.Add(dictionary.Locales.Select(locale => 
						new XElement(ToCompressedLocale(locale), dictionary[locale, key])));
					e.SetAttributeValue("id", key);
					return e;
				}));
			document.Save(writer);
		}
 private void ReadKeyElement(XmlReader reader, ILocalizationDictionary dictionary) {
   var id = reader.GetAttribute("id");
   if(!reader.ReadToDescendant("val")) return;
   do {
     var locale = reader.GetAttribute("for");
     if(locale==null) {
       throw new XmlLocalizationReaderException("Missing required attribute 'for' on element 'val'");
     }
     if(reader.IsEmptyElement) continue;
     reader.MoveToContent();
     var val = reader.ReadString();
     dictionary[locale, Prefix+id] = val;
   } while(reader.ReadToNextSibling("val"));
 }
Beispiel #25
0
        private void BuildDictionaryHierarchyTrees(IDictionary <string, ILocalizationDictionary> dictionaries,
                                                   ILocalizationDictionary dictionary)
        {
            if (dictionary.Scope() == GlobalScope)
            {
                return;
            }

            var parentScope = string.IsNullOrEmpty(dictionary.GetParentScopeName())
                ? dictionaries[GlobalScope]
                : dictionaries[dictionary.GetParentScopeName()];

            dictionary.SetParentDictionary(parentScope);
        }
Beispiel #26
0
        protected ILocalizationDictionary Read(IEnumerable <string> lines, ILocalizationDictionary dictionary)
        {
            string key = null, locale = null, value = null, whitespace = null;

            foreach (var line in lines)
            {
                if (line.TrimStart().StartsWith("#"))
                {
                    // Comment
                }
                else if (line.TrimStart().StartsWith("@include"))
                {
                    // Include command
                }
                else if (line.Trim() == String.Empty)
                {
                    // Skip blank lines
                }
                else if (ParseMultilineValue(line, whitespace, ref value))
                {
                    if (key == null)
                    {
                        throw new Exception("Expected key before entry");
                    }
                    if (locale == null)
                    {
                        throw new Exception("Expected entry before continuation");
                    }
                    dictionary[locale, key] += Environment.NewLine + value;
                }
                else if (ParseValue(line, ref whitespace, ref locale, ref value))
                {
                    if (key == null)
                    {
                        throw new Exception("Expected key before entry");
                    }
                    dictionary[locale, key] = value;
                }
                else if (ParseKey(line, ref key))
                {
                    // Key
                }
                else
                {
                    throw new Exception("Unexpected line '" + line + "'");
                }
            }
            return(dictionary);
        }
Beispiel #27
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MultiTenantLocalizationDictionary"/> class.
 /// </summary>
 public MultiTenantLocalizationDictionary(
     string sourceName,
     ILocalizationDictionary internalDictionary,
     IRepository <ApplicationLanguageText, long> customLocalizationRepository,
     ICacheManager cacheManager,
     IStudioXSession session,
     IUnitOfWorkManager unitOfWorkManager)
 {
     this.sourceName                   = sourceName;
     this.internalDictionary           = internalDictionary;
     this.customLocalizationRepository = customLocalizationRepository;
     this.cacheManager                 = cacheManager;
     this.session           = session;
     this.unitOfWorkManager = unitOfWorkManager;
 }
        /// <summary>
        /// 获取指定语言文化的本地化词典。
        /// </summary>
        /// <param name="cultureName">语言文化名称</param>
        /// <returns>如果对应的语言文化字典存在则返回该字典,否则返回null</returns>
        public ILocalizationDictionary Get(string cultureName)
        {
            if (cultureName == null)
            {
                throw new ArgumentNullException(nameof(cultureName));
            }

            ILocalizationDictionary result = null;

            if (dictionaries.TryGetValue(cultureName, out result))
            {
                return(result);
            }
            return(null);
        }
Beispiel #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MultiTenantLocalizationDictionary"/> class.
 /// </summary>
 public MultiTenantLocalizationDictionary(
     string sourceName,
     ILocalizationDictionary internalDictionary,
     IRepository <ApplicationLanguageText, long> customLocalizationRepository,
     ICacheManager cacheManager,
     IInfrastructureSession session,
     IUnitOfWorkManager unitOfWorkManager)
 {
     _sourceName                   = sourceName;
     _internalDictionary           = internalDictionary;
     _customLocalizationRepository = customLocalizationRepository;
     _cacheManager                 = cacheManager;
     _session           = session;
     _unitOfWorkManager = unitOfWorkManager;
 }
        public void Write(ILocalizationDictionary dictionary, TextWriter writer)
        {
            var document = new XDocument();
            var root     = new XElement("page");

            document.Add(root);
            root.Add(dictionary.Keys
                     .Select(key => {
                var e = new XElement("key");
                e.Add(dictionary.Locales.Select(locale =>
                                                new XElement(ToCompressedLocale(locale), dictionary[locale, key])));
                e.SetAttributeValue("id", key);
                return(e);
            }));
            document.Save(writer);
        }
        public void Extend(ILocalizationDictionary dictionary)
        {
            //Add
            if (!Dictionaries.TryGetValue(dictionary.CultureInfo.Name, out ILocalizationDictionary existingDictionary))
            {
                Dictionaries[dictionary.CultureInfo.Name] = dictionary;
                return;
            }

            //Override
            IReadOnlyList <LocalizedString> localizedStrings = dictionary.GetAllStrings();

            foreach (LocalizedString localizedString in localizedStrings)
            {
                existingDictionary[localizedString.Name] = localizedString.Value;
            }
        }
        /// <summary>
        /// Extends the source with given dictionary.
        /// </summary>
        /// <param name="dictionary">Dictionary to extend the source</param>
        public void Extend(ILocalizationDictionary dictionary)
        {
            //Add
            ILocalizationDictionary existingDictionary;
            if (!_dictionaries.TryGetValue(dictionary.CultureInfo.Name, out existingDictionary))
            {
                _dictionaries[dictionary.CultureInfo.Name] = dictionary;
                return;
            }

            //Override
            var localizedStrings = dictionary.GetAllStrings();
            foreach (var localizedString in localizedStrings)
            {
                existingDictionary[localizedString.Name] = localizedString.Value;
            }
        }
Beispiel #33
0
        private static void WriteDictionary(ILocalizationDictionary dictionary, XmlWriter writer)
        {
            writer.WriteStartDocument();
            var typedDictionary = dictionary as LocalizationDictionary;

            if (typedDictionary != null)
            {
                WriteIncludes(typedDictionary, writer);
            }
            writer.WriteStartElement("dictionary");
            foreach (var key in dictionary.Keys)
            {
                WriteKey(key, dictionary, writer);
            }
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        /// <inheritdoc/>
        public IReadOnlyList <LocalizedString> GetAllStrings(CultureInfo culture, bool includeDefaults = true)
        {
            // TODO: Can be optimized (example: if it's already default dictionary, skip overriding)

            IDictionary <string, ILocalizationDictionary> dictionaries = DictionaryProvider.Dictionaries;

            //Create a temp dictionary to build
            var allStrings = new Dictionary <string, LocalizedString>();

            if (includeDefaults)
            {
                //Fill all strings from default dictionary
                ILocalizationDictionary defaultDictionary = DictionaryProvider.DefaultDictionary;
                if (defaultDictionary != null)
                {
                    foreach (LocalizedString defaultDictString in defaultDictionary.GetAllStrings())
                    {
                        allStrings[defaultDictString.Name] = defaultDictString;
                    }
                }

                //Overwrite all strings from the language based on country culture
                if (culture.Name.Contains("-"))
                {
                    if (dictionaries.TryGetValue(GetBaseCultureName(culture.Name), out ILocalizationDictionary langDictionary))
                    {
                        foreach (var langString in langDictionary.GetAllStrings())
                        {
                            allStrings[langString.Name] = langString;
                        }
                    }
                }
            }

            //Overwrite all strings from the original dictionary
            if (!dictionaries.TryGetValue(culture.Name, out ILocalizationDictionary originalDictionary))
            {
                return(allStrings.Values.ToImmutableList());
            }
            foreach (LocalizedString originalLangString in originalDictionary.GetAllStrings())
            {
                allStrings[originalLangString.Name] = originalLangString;
            }

            return(allStrings.Values.ToImmutableList());
        }
Beispiel #35
0
        private void AddDictionaryToHierarchyTreesWithoutBuildTree(ILocalizationDictionary dictionary)
        {
            m_dictionaries.Add(dictionary);

            if (!m_dictionariesPerCultureAndScope.Keys.Contains(dictionary.CultureInfo()))
            {
                throw new DictionaryLoadException(string.Format(UnknownCultureException, dictionary.CultureInfo(), dictionary.Scope()));
            }

            var dictionariesPerCulture = m_dictionariesPerCultureAndScope[dictionary.CultureInfo()];

            dictionariesPerCulture.Add(dictionary.Scope(), dictionary);

            foreach (var scopeAlias in dictionary.ScopeAlias())
            {
                dictionariesPerCulture.Add(scopeAlias, dictionary);
            }
        }
Beispiel #36
0
 private static void WriteKey(string key, ILocalizationDictionary dictionary, XmlWriter writer)
 {
     writer.WriteStartElement("key");
     writer.WriteAttributeString("id", key);
     foreach (var locale in dictionary.Locales)
     {
         var value = dictionary[locale, key];
         if (value == null)
         {
             continue;
         }
         writer.WriteStartElement("val");
         writer.WriteAttributeString("for", locale);
         writer.WriteCData(value);
         writer.WriteEndElement();
     }
     writer.WriteEndElement();
 }
Beispiel #37
0
        public virtual void Extend(ILocalizationDictionary dictionary)
        {
            //Add
            ILocalizationDictionary existingDictionary;

            if (!_internalProvider.Dictionaries.TryGetValue(dictionary.CultureInfo.Name, out existingDictionary))
            {
                _internalProvider.Dictionaries[dictionary.CultureInfo.Name] = dictionary;
                return;
            }

            //Override
            var localizedStrings = dictionary.GetAllStrings();

            foreach (var localizedString in localizedStrings)
            {
                existingDictionary[localizedString.Name] = localizedString.Value;
            }
        }
        private LocalizedString TranslateInParent(ILocalizationDictionary localizationDictionary, string text)
        {
            while (true)
            {
                if (localizationDictionary.ParentDictionary() == null)
                {
                    return(null);
                }

                localizationDictionary = localizationDictionary.ParentDictionary();

                localizationDictionary.List().TryGetValue(text, out var result);

                if (result != null)
                {
                    return(result);
                }
            }
        }
    private void ReadProcessingInstruction(XmlReader reader, ILocalizationDictionary dictionary) {
      if(reader.Name != "mios-localization") return;
      var attributes = AttributesPattern.Matches(reader.Value).Cast<Match>()
        .ToDictionary(t => t.Groups[1].Value, t => t.Groups[2].Value);
      string includePath;
      if(!attributes.TryGetValue("include", out includePath)) return;

      string prefix;
      attributes.TryGetValue("prefix", out prefix);

      var typedDictionary = dictionary as LocalizationDictionary;
      if(typedDictionary!=null) {
        typedDictionary.Includes.Add(
          new LocalizationDictionary.Include { Path = includePath, Prefix = prefix }
        );
      }
      if(!Recursive) return;
      ReadNestedDictionary(includePath, prefix, dictionary);
    }
 public void Read(ILocalizationDictionary dictionary) {
   using(var stream = Resolver.Open(path)) {
     if(stream==null && ThrowWhenNotFound) {
       throw new FileNotFoundException(String.Format("Requested dictionary '{0}' could not be found", path), path);
     }
     if(stream==null) {
       return;
     }
     using(var reader = XmlReader.Create(stream)) {
       while(reader.Read()) {
         if(reader.NodeType == XmlNodeType.ProcessingInstruction) {
           ReadProcessingInstruction(reader, dictionary);
         } else if(reader.NodeType == XmlNodeType.Element && reader.Name == "dictionary") {
           ReadPageElement(reader, dictionary);
         }
       }
     }
   }
 }
Beispiel #41
0
        private static void Initialize()
        {
            /*
             * 在项目中,应该在"解决方案资源管理器"中设置文件的属性:
             *      "复制到生成目录" 设置为 "始终复制"
             *      "生成操作" 设置为 "无"
             */
            string xmlFilePath              = @"Localizations\Localization.xml";
            var    xmlDocument              = XDocument.Load(xmlFilePath);
            var    dictionaryFactory        = new XmlLocalizationDictionaryFactory(xmlDocument);
            ILocalizationDictionary chinese = dictionaryFactory.CreateLocalizationDictionary("zh-CN");
            ILocalizationDictionary english = dictionaryFactory.CreateLocalizationDictionary("en-US");

            var mngr = new LocalizationDictionaryManager();

            mngr.Add(chinese);
            mngr.Add(english);

            LocalizationUtility.SetLocalizationDictionaryManager(mngr);
        }
        public string GetStringOrNull(string name, CultureInfo culture, bool tryDefaults = true)
        {
            string cultureName = culture.Name;
            IDictionary <string, ILocalizationDictionary> dictionaries = DictionaryProvider.Dictionaries;

            //Try to get from original dictionary (with country code)
            if (dictionaries.TryGetValue(cultureName, out ILocalizationDictionary originalDictionary))
            {
                LocalizedString strOriginal = originalDictionary.GetOrNull(name);
                if (strOriginal != null)
                {
                    return(strOriginal.Value);
                }
            }

            if (!tryDefaults)
            {
                return(null);
            }

            //Try to get from same language dictionary (without country code)
            if (cultureName.Contains("-")) //Example: "tr-TR" (length=5)
            {
                if (dictionaries.TryGetValue(GetBaseCultureName(cultureName), out ILocalizationDictionary langDictionary))
                {
                    LocalizedString strLang = langDictionary.GetOrNull(name);
                    if (strLang != null)
                    {
                        return(strLang.Value);
                    }
                }
            }

            //Try to get from default language
            ILocalizationDictionary defaultDictionary = DictionaryProvider.DefaultDictionary;

            LocalizedString strDefault = defaultDictionary?.GetOrNull(name);

            return(strDefault?.Value);
        }
		protected ILocalizationDictionary Read(IEnumerable<string> lines, ILocalizationDictionary dictionary) {
			string key = null, locale = null, value = null, whitespace = null;
			foreach(var line in lines) {
				if(line.TrimStart().StartsWith("#")) {
					// Comment
				} else if(line.TrimStart().StartsWith("@include")) {
					// Include command
				} else if(line.Trim()==String.Empty) {
					// Skip blank lines
				} else if(ParseMultilineValue(line, whitespace, ref value)) {
					if(key == null) throw new Exception("Expected key before entry");
					if(locale == null) throw new Exception("Expected entry before continuation");
					dictionary[locale,key] += Environment.NewLine+value;
				} else if(ParseValue(line, ref whitespace, ref locale, ref value)) {
					if(key == null) throw new Exception("Expected key before entry");
					dictionary[locale,key] = value;
				} else if(ParseKey(line, ref key)) {
					// Key
				} else {
					throw new Exception("Unexpected line '"+line+"'");
				}
			}
			return dictionary;
		}
 private void ReadPageElement(XmlReader reader, ILocalizationDictionary dictionary) {
   if(!reader.ReadToDescendant("key")) return;
   do {
     ReadKeyElement(reader,dictionary);
   } while(reader.ReadToNextSibling("key"));
 }
 /// <summary>
 /// Creates a new instance of <see cref="LocalizationDictionaryInfo"/>.
 /// </summary>
 /// <param name="dictionary">Reference to the dictionary</param>
 /// <param name="isDefault">Is this dictionary the default language</param>
 public LocalizationDictionaryInfo(ILocalizationDictionary dictionary, bool isDefault = false)
 {
     Dictionary = dictionary;
     IsDefault = isDefault;
 }
 public override void Extend(ILocalizationDictionary dictionary)
 {
     DictionaryProvider.Extend(dictionary);
 }
 public void Write(ILocalizationDictionary dictionary, string path) {
   using(var writer = new StreamWriter(path)) {
     Write(dictionary, writer);
   }
 }
 /// <summary>
 /// Extends the source with given dictionary.
 /// </summary>
 /// <param name="dictionary">Dictionary to extend the source</param>
 public virtual void Extend(ILocalizationDictionary dictionary)
 {
     DictionaryProvider.Extend(dictionary);
 }
		public virtual ILocalizationDictionary Read(TextReader reader, ILocalizationDictionary dictionary) {
			return Read(ReadLines(reader),dictionary);
		}
 public void Write(ILocalizationDictionary dictionary, TextWriter writer) {
   using(var xmlWriter = new XmlTextWriter(writer)) {
     xmlWriter.Formatting = Formatting.Indented;
     WriteDictionary(dictionary, xmlWriter);
   }
 }
 public void Read(ILocalizationDictionary dictionary) {
   if(path==null || !File.Exists(path)) return;
   Read(XDocument.Load(path), dictionary);
 }
 public void Read(TextReader reader, ILocalizationDictionary dictionary) {
   Read(XDocument.Load(reader), dictionary);
 }
		public virtual ILocalizationDictionary Read(string sourceFile, ILocalizationDictionary dictionary) {
			if(!File.Exists(sourceFile)) return null;
			using(var reader = new StreamReader(sourceFile)) {
				return Read(reader,dictionary);
			}
		}