/// <summary> /// Register translation package /// </summary> /// <param name="translatePackage"></param> void ITranslationManSetter.RegisterPackage(ITranslatePackage translatePackage) { if (translatePackage == null) { return; } if (translatePackage.IsAnonymous) { var left = _translatePackages[_hashOfAnonymousPackageKey]; var right = translatePackage; TranslatePackageMerger.Merge(left, right, MergeLevel.Level_2); return; } if (Contains(translatePackage.PackageKey)) { return; } lock (_translateLockObj) { if (Contains(translatePackage.PackageKey)) { return; } _translatePackages.Add(translatePackage.PackageKey.GetHashCode(), translatePackage); } }
/// <summary> /// Merge /// </summary> /// <param name="source">源 Translation Package,将合并到此包内</param> /// <param name="other">需要合并的素材 Translation Package,合并后此包将抛弃</param> /// <param name="level">合并级别</param> /// <param name="customMergeProvider">自定义合并方法提供者程序</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> public static ITranslatePackage Merge( ITranslatePackage source, ITranslatePackage other, MergeLevel level = MergeLevel.Level_1, Func <ITranslatePackageMergeOps, ITranslatePackageMergeOps, ITranslatePackage> customMergeProvider = null) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (other == null) { throw new ArgumentNullException(nameof(other)); } var left = source as ITranslatePackageMergeOps; var right = other as ITranslatePackageMergeOps; if (left == null) { throw new ArgumentException($"The source translate package should be an implementation of '{nameof(ITranslatePackageMergeOps)}'"); } if (right == null) { throw new ArgumentException($"The target translate package should be an implementation of '{nameof(ITranslatePackageMergeOps)}'"); } var ret = source; switch (level) { case MergeLevel.Level_1: MergeInLevel1(left, right); break; case MergeLevel.Level_2: MergeInLevel2(left, right); break; case MergeLevel.Custom: if (customMergeProvider == null) { throw new ArgumentNullException(nameof(customMergeProvider)); } ret = customMergeProvider(left, right); break; } return(ret); }
/// <summary> /// Add translation package /// </summary> /// <param name="package"></param> /// <param name="level"></param> /// <param name="customMergeProvider"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> public I18NOptions AddPackage(ITranslatePackage package, MergeLevel level = MergeLevel.Level_1, Func <ITranslatePackageMergeOps, ITranslatePackageMergeOps, ITranslatePackage> customMergeProvider = null) { if (package == null) { throw new ArgumentNullException(nameof(package)); } lock (__lock_package) { var hashOfPackageKey = package.PackageKey.GetHashCode(); if (__translationPackages.TryGetValue(hashOfPackageKey, out var packageInstance)) { var template = TranslatePackageMerger.Merge(packageInstance, package, level, customMergeProvider); __translationPackages[hashOfPackageKey] = template; } else { AddPackageInternal(package); } } return(this); }
private void AddPackageInternal(ITranslatePackage package) { __translationPackages.Add(package.PackageKey.GetHashCode(), package); }