Пример #1
0
        /// <summary>
        ///  言語情報を取得します。
        /// </summary>
        /// <param name="cultureInfo">取得する言語情報のカルチャです。</param>
        /// <returns>言語情報を表すオブジェクトを含む非同期操作を返します。</returns>
        /// <exception cref="System.ArgumentNullException"/>
        /// <exception cref="System.IO.IOException"/>
        public static async ValueTask <LanguageData> GetAsync(CultureInfo cultureInfo)
        {
            cultureInfo.EnsureNotNull(nameof(cultureInfo));

            LanguageData?ld;
            string       name = cultureInfo.Name;

            lock (_langs) {
                _langs.TryGetValue(name, out ld);
            }
            if (ld is null)
            {
                ld = await JsonLanguageData.LoadFromDirectoryAsync(DefaultLanguageDataPath, cultureInfo);

                if (ld is null)
                {
                    return(DefaultLanguageData.Instance);
                }
                if (!string.IsNullOrEmpty(ld.ParentLanguage))
                {
                    await GetAsync(CultureInfo.GetCultureInfo(ld.ParentLanguage));
                }
                return(ld);
            }
            else
            {
                return(ld);
            }
        }
Пример #2
0
 public static string RequireStringResource(Type resourceSource, CultureInfo culture)
 {
     resourceSource.EnsureNotNull(nameof(resourceSource));
     culture.EnsureNotNull(nameof(culture));
     //
     return
         (__StringResourcesRepo
          .GetOrAdd(
              spinLock: __StringResourcesRepoSpinLock,
              key: new StringResourcesRepoKey(resourceSource, culture),
              factory: key => new DisposableLazy <string>(factory: () => P_RequireStringResource(key)))
          .Value);
 }
Пример #3
0
        /// <summary>
        ///  JSON形式の言語情報ファイルを指定されたディレクトリから非同期的に読み込みます。
        /// </summary>
        /// <remarks>
        ///  ディレクトリ内の「<c>カルチャ名.json</c>」を読み込みます。
        /// </remarks>
        /// <param name="path">JSON形式の言語情報ファイルを格納しているディレクトリへのパスです。</param>
        /// <param name="cultureInfo">JSON形式の言語情報ファイルのカルチャです。</param>
        /// <returns>
        ///  ファイルが存在する場合は言語情報ファイルを含む非同期操作オブジェクトを返します。
        ///  存在しない場合は<see langword="null"/>を含む非同期操作オブジェクトを返します。
        /// </returns>
        /// <exception cref="System.ArgumentNullException"/>
        /// <exception cref="System.IO.IOException"/>
        public static ValueTask <JsonLanguageData?> LoadFromDirectoryAsync(string path, CultureInfo cultureInfo)
        {
            path.EnsureNotNull(nameof(path));
            cultureInfo.EnsureNotNull(nameof(cultureInfo));

            if (Directory.Exists(path))
            {
                try {
                    return(LoadFileAsync(Path.Combine(path, $"{cultureInfo.Name}.json"), cultureInfo));
                } catch (IOException e) {
                    throw new IOException(Resources.JsonLanguageData_LoadFromDirectoryAsync_IOException, e.InnerException);
                } catch (Exception e) {
                    throw new IOException(Resources.JsonLanguageData_LoadFromDirectoryAsync_IOException, e);
                }
            }
            else
            {
                return(ValueTask.FromResult <JsonLanguageData?>(null));
            }
        }
Пример #4
0
        /// <summary>
        ///  JSON形式の言語情報ファイルを非同期的に読み込みます。
        /// </summary>
        /// <param name="path">JSON形式の言語情報ファイルへのパスです。</param>
        /// <param name="cultureInfo">JSON形式の言語情報ファイルのカルチャです。</param>
        /// <returns>
        ///  ファイルが存在する場合は言語情報ファイルを含む非同期操作オブジェクトを返します。
        ///  存在しない場合は<see langword="null"/>を含む非同期操作オブジェクトを返します。
        /// </returns>
        /// <exception cref="System.ArgumentNullException"/>
        /// <exception cref="System.IO.IOException"/>
        public static async ValueTask <JsonLanguageData?> LoadFileAsync(string path, CultureInfo cultureInfo)
        {
            path.EnsureNotNull(nameof(path));
            cultureInfo.EnsureNotNull(nameof(cultureInfo));

            if (File.Exists(path))
            {
                try {
                    var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    await using (fs.ConfigureAwait(false)) {
                        using (var sr = new StreamReader(fs, Encoding.UTF8, true)) {
                            return(new(await sr.ReadToEndAsync(), cultureInfo));
                        }
                    }
                } catch (Exception e) {
                    throw new IOException(Resources.JsonLanguageData_LoadFileAsync_IOException, e);
                }
            }
            else
            {
                return(null);
            }
        }