/// <summary> /// Add resource /// </summary> /// <param name="resource"></param> public void AddResource(ITranslateResource resource) { if (resource == null) { return; } if (resource.IsAnonymous) { if (!IsAnonymous) { throw new InvalidOperationException("Anonymous translate resource cannot be added into non-anonymous package."); } AddAnonymousResource(resource); return; } if (IsAnonymous) { throw new InvalidOperationException("Anonymous translate package can only be added anonymous resource."); } if (_resources.ContainsKey(resource.Binding)) { return; } AddResourceCore(resource); }
internal bool HasResource(ITranslateResource resource) { if (resource == null) { return(false); } return(HasResource(resource.Binding)); }
private void AddResourceCore(ITranslateResource resource) { if (resource == null) { return; } lock (_resourceLockObj) { if (_resources.ContainsKey(resource.Binding)) { return; } if (TryRegisterLanguageTagOnceAgain(resource.Binding)) { _resources.Add(resource.Binding, resource); _usedLanguageTags.Add(resource.Binding); } } }
/// <summary> /// Add anonymous translation resource /// </summary> /// <param name="resource"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"></exception> public I18NOptions AddAnonymousResource(ITranslateResource resource) { if (resource == null) { throw new ArgumentNullException(nameof(resource)); } if (!resource.IsAnonymous) { throw new ArgumentException($"Non-anonymous translation resource should use method '{nameof(AddResource)}'."); } lock (__lock_resource) { if (TryRegisterLanguageTagOnce(resource.Binding)) { var anonymousPackage = __translationPackages[TranslationManager.HashOfAnonymousPackageKey]; anonymousPackage.AddResource(resource); } } return(this); }
/// <summary> /// Add translation resource /// </summary> /// <param name="packageKey"></param> /// <param name="resource"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> public I18NOptions AddResource(string packageKey, ITranslateResource resource) { if (resource == null) { throw new ArgumentNullException(nameof(resource)); } if (string.IsNullOrWhiteSpace(packageKey)) { throw new ArgumentNullException(nameof(packageKey)); } if (resource.IsAnonymous) { throw new ArgumentException($"Anonymous translation resource should use method '{nameof(AddAnonymousResource)}'."); } lock (__lock_resource) { var hashOfPackageKey = packageKey.GetHashCode(); if (TryRegisterLanguageTagOnce(resource.Binding)) { if (__translationPackages.TryGetValue(hashOfPackageKey, out var package)) { package.AddResource(resource); } else { var future = new TranslatePackage(packageKey, _fallbackExperimenter); future.AddResource(resource); AddPackageInternal(future); } } else { throw new InvalidOperationException($"Something broken when add new resource '{resource.Name}'."); } } return(this); }
private void AddAnonymousResource(ITranslateResource resource) { var ops = (ITranslatePackageMergeOps)this; ops.Merge(resource, TranslatePackageMerger.AnonymousMergeCoreFunc(resource)); }
/// <summary> /// Core Merge 1 /// 当 resource 为 null 时,表示 TranslatePackage 内不包含该 LanguageTag 的资源,此时直接返回 Other TranslateResource (1) /// 当 resource 不为 null,表示 TranslatePackage 内包含该 LanguageTag 的资源,此时直接跳过,并原样返回 resource (2) /// </summary> /// <param name="otherResource"></param> /// <returns></returns> private static Func <ITranslateResourceMergeOps, (bool, ITranslateResource)> MergeLevel1CoreFunc(ITranslateResource otherResource) => resource => {
/// <summary> /// Merge /// </summary> /// <param name="other"></param> /// <param name="sourceMergeFunc"></param> void ITranslatePackageMergeOps.Merge(ITranslateResource other, Func <ITranslateResourceMergeOps, (bool, ITranslateResource)> sourceMergeFunc)