| File: WorkloadManifestReader.Localization.cs | Web Access |
| Project: src\sdk\src\Resolvers\Microsoft.NET.Sdk.WorkloadManifestReader\Microsoft.NET.Sdk.WorkloadManifestReader.csproj (Microsoft.NET.Sdk.WorkloadManifestReader) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; using System.Runtime.CompilerServices; using System.Text.Json; namespace Microsoft.NET.Sdk.WorkloadManifestReader { partial class WorkloadManifestReader { private static LocalizationCatalog ReadLocalizationCatalog(ref Utf8JsonStreamReader reader) => new(ReadStringDictionary(ref reader)); public static string? GetLocalizationCatalogFilePath(string manifestFilePath, CultureInfo? culture = null) => GetLocalizationCatalogFilePath(manifestFilePath, culture ?? CultureInfo.CurrentUICulture, _fileExists); static readonly Func<string, bool> _fileExists = File.Exists; // fileExists param is for tests internal static string? GetLocalizationCatalogFilePath(string manifestFilePath, CultureInfo culture, Func<string, bool> fileExists) { string localizationDir = GetLocalizationDirectory(manifestFilePath); do { var catalog = Path.Combine(localizationDir, $"WorkloadManifest.{culture.Name}.json"); if (fileExists(catalog)) { return catalog; } culture = culture.Parent; } while (culture != CultureInfo.InvariantCulture); return null; } public static Stream? TryOpenLocalizationCatalogForManifest(string manifestFilePath, CultureInfo? culture = null) { var localizationPath = GetLocalizationCatalogFilePath(manifestFilePath, culture); if (localizationPath != null) { return File.OpenRead(localizationPath); } return null; } public static IEnumerable<(CultureInfo culture, string filePath)> EnumerateLocalizations(string manifestFilePath) { string localizationDir = GetLocalizationDirectory(manifestFilePath); if (Directory.Exists(localizationDir)) { foreach (var filePath in Directory.EnumerateFiles(localizationDir, "WorkloadManifest.*.json")) { var cultureName = Path.GetFileNameWithoutExtension(filePath).Substring("WorkloadManifest.".Length); var culture = CultureInfo.GetCultureInfo(cultureName); yield return (culture, filePath); } } } private static string GetLocalizationDirectory(string manifestFilePath) { string manifestDir = Path.GetDirectoryName(manifestFilePath) ?? throw new ArgumentException(nameof(manifestFilePath)); string localizationDir = Path.Combine(manifestDir, "localize"); return localizationDir; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static string? ReadStringLocalized(ref Utf8JsonStreamReader reader, LocalizationCatalog? localizationCatalog, string id) { ConsumeToken(ref reader, JsonTokenType.String); return localizationCatalog?.Localize(id) ?? reader.GetString(); } class LocalizationCatalog { readonly Dictionary<string, string> _catalog; public LocalizationCatalog(Dictionary<string, string> catalog) { _catalog = catalog; } public string Localize(string id) { if (_catalog.TryGetValue(id, out string? localizedMessage)) { return localizedMessage; } return id; } } } }