I-Synergy.Framework.AspNetCore.Globalization 2025.11027.11947.55-preview

Prefix Reserved
This is a prerelease version of I-Synergy.Framework.AspNetCore.Globalization.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package I-Synergy.Framework.AspNetCore.Globalization --version 2025.11027.11947.55-preview
                    
NuGet\Install-Package I-Synergy.Framework.AspNetCore.Globalization -Version 2025.11027.11947.55-preview
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="I-Synergy.Framework.AspNetCore.Globalization" Version="2025.11027.11947.55-preview" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="I-Synergy.Framework.AspNetCore.Globalization" Version="2025.11027.11947.55-preview" />
                    
Directory.Packages.props
<PackageReference Include="I-Synergy.Framework.AspNetCore.Globalization" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add I-Synergy.Framework.AspNetCore.Globalization --version 2025.11027.11947.55-preview
                    
#r "nuget: I-Synergy.Framework.AspNetCore.Globalization, 2025.11027.11947.55-preview"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package I-Synergy.Framework.AspNetCore.Globalization@2025.11027.11947.55-preview
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=I-Synergy.Framework.AspNetCore.Globalization&version=2025.11027.11947.55-preview&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.AspNetCore.Globalization&version=2025.11027.11947.55-preview&prerelease
                    
Install as a Cake Tool

I-Synergy Framework AspNetCore Globalization

Comprehensive globalization and localization support for ASP.NET Core applications. This package provides request culture providers, route-based culture resolution, language services, and seamless integration with ASP.NET Core's localization middleware.

NuGet License .NET

Features

  • Route-based culture resolution with automatic URL pattern detection
  • Multiple culture providers (Route, QueryString, Cookie, Accept-Language header)
  • Culture route constraint for validating culture segments in URLs
  • Language service integration with resource management
  • Configurable globalization options with default and supported cultures
  • ASP.NET Core middleware integration with RequestLocalizationMiddleware
  • Culture fallback support for invalid or missing culture specifications
  • HttpContext accessor for culture management across application layers

Installation

Install the package via NuGet:

dotnet add package I-Synergy.Framework.AspNetCore.Globalization

Quick Start

1. Configure Globalization Services

In your Program.cs:

using ISynergy.Framework.AspNetCore.Globalization.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Add globalization services
builder.AddGlobalization();

builder.Services.AddControllers();

var app = builder.Build();

// Use request localization middleware
app.UseRequestLocalization();

app.MapControllers();
app.Run();

2. Configure Globalization Options

In your appsettings.json:

{
  "GlobalizationOptions": {
    "DefaultCulture": "en-US",
    "SupportedCultures": [
      "en-US",
      "nl-NL",
      "de-DE",
      "fr-FR",
      "es-ES"
    ],
    "ProviderType": "Route"
  }
}

3. Configure Route-Based Culture

For route-based culture resolution, update your routing:

using ISynergy.Framework.AspNetCore.Globalization.Constraints;

var builder = WebApplication.CreateBuilder(args);

builder.AddGlobalization();

builder.Services.AddControllers();

var app = builder.Build();

app.UseRequestLocalization();

// Map controllers with culture route constraint
app.MapControllerRoute(
    name: "default",
    pattern: "{culture:culture}/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "fallback",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

4. Using the Language Service

Access localized resources in your code:

using ISynergy.Framework.Core.Abstractions.Services;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("{culture:culture}/api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly ILanguageService _languageService;

    public ProductsController(ILanguageService languageService)
    {
        _languageService = languageService;
    }

    [HttpGet]
    public IActionResult GetProducts()
    {
        var welcomeMessage = _languageService.GetString("WelcomeMessage");
        var productsTitle = _languageService.GetString("ProductsTitle");

        return Ok(new
        {
            Message = welcomeMessage,
            Title = productsTitle
        });
    }
}

Core Components

Options

ISynergy.Framework.AspNetCore.Globalization.Options/
└── GlobalizationOptions              # Configuration for cultures and providers

Providers

ISynergy.Framework.AspNetCore.Globalization.Providers/
└── RouteDataRequestCultureProvider   # Extract culture from route data

Constraints

ISynergy.Framework.AspNetCore.Globalization.Constraints/
└── CultureRouteConstraint            # Validate culture in route segments

Services

ISynergy.Framework.AspNetCore.Globalization.Services/
└── LanguageService                   # Access localized resources

Enumerations

ISynergy.Framework.AspNetCore.Globalization.Enumerations/
└── RequestCultureProviderTypes       # Available provider types

Advanced Features

Multiple Culture Provider Strategies

Configure different provider types based on your application needs:

{
  "GlobalizationOptions": {
    "DefaultCulture": "en-US",
    "SupportedCultures": ["en-US", "nl-NL", "de-DE"],
    "ProviderType": "Route"
  }
}

Available provider types:

  • Route: Extract culture from URL path (e.g., /nl-NL/products)
  • QueryString: Extract culture from query string (e.g., ?culture=nl-NL)
  • Cookie: Read culture from a cookie
  • AcceptLanguageHeader: Use Accept-Language HTTP header

Custom Route Patterns

Define culture-aware routes in your controllers:

using Microsoft.AspNetCore.Mvc;

[Route("{culture:culture}/[controller]")]
[ApiController]
public class LocalizedController : ControllerBase
{
    // URL: /nl-NL/localized/hello
    [HttpGet("hello")]
    public IActionResult Hello()
    {
        var culture = RouteData.Values["culture"]?.ToString();
        return Ok($"Hello in culture: {culture}");
    }
}

[Route("[controller]")]
[ApiController]
public class NonLocalizedController : ControllerBase
{
    // URL: /nonlocalized/hello (uses default culture)
    [HttpGet("hello")]
    public IActionResult Hello()
    {
        return Ok("Hello");
    }
}

Manual Culture Management

Set or override culture programmatically:

using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class CultureController : ControllerBase
{
    [HttpPost("set")]
    public IActionResult SetCulture([FromBody] string culture)
    {
        // Set culture cookie
        Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(
                new RequestCulture(culture)),
            new CookieOptions
            {
                Expires = DateTimeOffset.UtcNow.AddYears(1),
                IsEssential = true,
                SameSite = SameSiteMode.Lax
            });

        return Ok($"Culture set to: {culture}");
    }

    [HttpGet("current")]
    public IActionResult GetCulture()
    {
        var feature = HttpContext.Features.Get<IRequestCultureFeature>();
        var culture = feature?.RequestCulture.Culture.Name ?? "Unknown";
        var uiCulture = feature?.RequestCulture.UICulture.Name ?? "Unknown";

        return Ok(new
        {
            Culture = culture,
            UICulture = uiCulture
        });
    }
}

Resource Management

Configure localized resources for your application:

using ISynergy.Framework.Core.Abstractions.Services;

// In your Program.cs or startup configuration
var languageService = builder.Services
    .BuildServiceProvider()
    .GetRequiredService<ILanguageService>();

// Add resource managers for different assemblies
languageService.AddResourceManager(typeof(AppResources));
languageService.AddResourceManager(typeof(SharedResources));
languageService.AddResourceManager(typeof(ValidationResources));

Create resource files for each supported culture:

  • Resources/AppResources.resx (default/English)
  • Resources/AppResources.nl-NL.resx (Dutch)
  • Resources/AppResources.de-DE.resx (German)

Access resources:

using ISynergy.Framework.Core.Abstractions.Services;

public class LocalizedService
{
    private readonly ILanguageService _languageService;

    public LocalizedService(ILanguageService languageService)
    {
        _languageService = languageService;
    }

    public string GetLocalizedMessage(string key)
    {
        return _languageService.GetString(key);
    }

    public string GetLocalizedMessageWithFormat(string key, params object[] args)
    {
        var format = _languageService.GetString(key);
        return string.Format(format, args);
    }
}

Usage Examples

E-commerce Application with Multiple Languages

Complete example of a multi-language e-commerce API:

using ISynergy.Framework.AspNetCore.Globalization.Extensions;
using ISynergy.Framework.Core.Abstractions.Services;
using Microsoft.AspNetCore.Localization;

var builder = WebApplication.CreateBuilder(args);

// Add globalization
builder.AddGlobalization();

builder.Services.AddControllers();

var app = builder.Build();

// Configure request localization
var localizationOptions = app.Services
    .GetRequiredService<IOptions<RequestLocalizationOptions>>()
    .Value;

app.UseRequestLocalization(localizationOptions);

// Route configuration with culture
app.MapControllerRoute(
    name: "localized",
    pattern: "{culture:culture}/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

// Product Controller
[Route("{culture:culture}/api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly ILanguageService _languageService;
    private readonly IProductRepository _productRepository;

    public ProductsController(
        ILanguageService languageService,
        IProductRepository productRepository)
    {
        _languageService = languageService;
        _productRepository = productRepository;
    }

    [HttpGet]
    public IActionResult GetProducts()
    {
        var products = _productRepository.GetAll();

        return Ok(new
        {
            Title = _languageService.GetString("Products_Title"),
            Description = _languageService.GetString("Products_Description"),
            Items = products
        });
    }

    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
        var product = _productRepository.GetById(id);

        if (product == null)
        {
            return NotFound(new
            {
                Error = _languageService.GetString("Product_NotFound")
            });
        }

        return Ok(product);
    }

    [HttpPost]
    public IActionResult CreateProduct([FromBody] ProductDto productDto)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(new
            {
                Error = _languageService.GetString("Validation_Failed"),
                Errors = ModelState
            });
        }

        var product = _productRepository.Create(productDto);

        return CreatedAtAction(
            nameof(GetProduct),
            new { id = product.Id },
            product);
    }
}

Blazor Server with Route-Based Culture

// Program.cs
using ISynergy.Framework.AspNetCore.Globalization.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.AddGlobalization();

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

var app = builder.Build();

app.UseRequestLocalization();
app.UseStaticFiles();
app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/{culture:culture}/_Host");
app.MapFallbackToPage("/_Host");

app.Run();

@page "/{culture?}"
@using Microsoft.AspNetCore.Localization

@{
    var culture = RouteData.Values["culture"]?.ToString() ?? "en-US";
    var requestCulture = new RequestCulture(culture);

    Context.Features.Set<IRequestCultureFeature>(
        new RequestCultureFeature(requestCulture, null));
}

<!DOCTYPE html>
<html lang="@culture">
<head>
    <meta charset="utf-8" />
    <title>My App - @culture</title>
</head>
<body>
    <component type="typeof(App)" render-mode="ServerPrerendered" />
</body>
</html>

Culture Switcher Component

@inject ILanguageService LanguageService
@inject NavigationManager Navigation

<div class="culture-switcher">
    <label>@LanguageService.GetString("SelectLanguage")</label>
    <select @onchange="OnCultureChanged">
        <option value="en-US" selected="@(CurrentCulture == "en-US")">English</option>
        <option value="nl-NL" selected="@(CurrentCulture == "nl-NL")">Nederlands</option>
        <option value="de-DE" selected="@(CurrentCulture == "de-DE")">Deutsch</option>
        <option value="fr-FR" selected="@(CurrentCulture == "fr-FR")">Français</option>
        <option value="es-ES" selected="@(CurrentCulture == "es-ES")">Español</option>
    </select>
</div>

@code {
    private string CurrentCulture { get; set; } = "en-US";

    protected override void OnInitialized()
    {
        var uri = new Uri(Navigation.Uri);
        var segments = uri.AbsolutePath.Split('/', StringSplitOptions.RemoveEmptyEntries);

        if (segments.Length > 0)
        {
            CurrentCulture = segments[0];
        }
    }

    private void OnCultureChanged(ChangeEventArgs e)
    {
        var newCulture = e.Value?.ToString() ?? "en-US";
        var uri = new Uri(Navigation.Uri);
        var path = uri.AbsolutePath;

        // Remove current culture from path if present
        var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries);
        if (segments.Length > 0 && IsSupportedCulture(segments[0]))
        {
            path = "/" + string.Join("/", segments.Skip(1));
        }

        // Redirect to new culture
        var newUri = $"/{newCulture}{path}{uri.Query}";
        Navigation.NavigateTo(newUri, forceLoad: true);
    }

    private bool IsSupportedCulture(string culture)
    {
        var supported = new[] { "en-US", "nl-NL", "de-DE", "fr-FR", "es-ES" };
        return supported.Contains(culture);
    }
}

Best Practices

Use route-based culture for SEO-friendly URLs and better user experience with language-specific content.

Always configure a default culture to fall back to when the requested culture is not supported.

Test your application with right-to-left (RTL) languages if you plan to support them (e.g., Arabic, Hebrew).

Culture Configuration

  • Choose route-based culture for public websites (better SEO)
  • Use cookie-based culture for authenticated applications
  • Accept-Language header works well for APIs
  • Always provide a default culture fallback
  • Keep supported cultures list synchronized across configuration
  • Validate culture codes against CultureInfo

Resource Management

  • Organize resources by feature or module
  • Use meaningful resource keys (e.g., "Product_NotFound" not "Err001")
  • Keep resource files in sync across all cultures
  • Implement a translation workflow for new resources
  • Use placeholders for dynamic content
  • Consider using satellite assemblies for large resource files

URL Design

  • Place culture code at the start of the URL (/{culture}/products)
  • Use culture route constraint to validate culture codes
  • Provide culture-neutral routes as fallback
  • Implement culture switcher without losing context
  • Handle culture redirects with 302 (temporary) not 301 (permanent)
  • Preserve query strings when switching cultures

Performance Considerations

  • Cache localized resources to avoid repeated lookups
  • Use compiled resource files (.resources.dll)
  • Consider CDN for static localized content
  • Minimize culture switches during user session
  • Pre-load common resources at startup
  • Use lazy loading for large resource sets

Testing

Example unit tests for globalization:

using ISynergy.Framework.AspNetCore.Globalization.Providers;
using ISynergy.Framework.AspNetCore.Globalization.Options;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using Xunit;

public class RouteDataRequestCultureProviderTests
{
    [Fact]
    public async Task DetermineProviderCultureResult_WithValidCulture_ReturnsCulture()
    {
        // Arrange
        var options = Options.Create(new GlobalizationOptions
        {
            DefaultCulture = "en-US",
            SupportedCultures = new[] { "en-US", "nl-NL" }
        });

        var provider = new RouteDataRequestCultureProvider(options);
        var context = new DefaultHttpContext();
        context.Request.Path = "/nl-NL/products";

        // Act
        var result = await provider.DetermineProviderCultureResult(context);

        // Assert
        Assert.NotNull(result);
        Assert.Equal("nl-NL", result.Cultures.First().Value);
    }

    [Fact]
    public async Task DetermineProviderCultureResult_WithInvalidCulture_ReturnsDefault()
    {
        // Arrange
        var options = Options.Create(new GlobalizationOptions
        {
            DefaultCulture = "en-US",
            SupportedCultures = new[] { "en-US", "nl-NL" }
        });

        var provider = new RouteDataRequestCultureProvider(options);
        var context = new DefaultHttpContext();
        context.Request.Path = "/invalid/products";

        // Act
        var result = await provider.DetermineProviderCultureResult(context);

        // Assert
        Assert.NotNull(result);
        Assert.Equal("en-US", result.Cultures.First().Value);
    }
}

Dependencies

  • Microsoft.AspNetCore.Localization - ASP.NET Core localization middleware
  • Microsoft.AspNetCore.Routing - Routing infrastructure
  • Microsoft.Extensions.Localization - Localization abstractions
  • ISynergy.Framework.Core - Core framework utilities

Documentation

For more information about the I-Synergy Framework:

  • I-Synergy.Framework.Core - Core framework components
  • I-Synergy.Framework.AspNetCore - Base ASP.NET Core integration
  • I-Synergy.Framework.AspNetCore.Blazor - Blazor integration
  • I-Synergy.Framework.UI - UI localization support

Support

For issues, questions, or contributions, please visit the GitHub repository.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2025.11102.10309.42-preview 0 11/2/2025
2025.11029.11433.38-preview 110 10/29/2025
2025.11029.10201.38-preview 110 10/29/2025
2025.11027.11947.55-preview 156 10/27/2025
2025.11022.12207.12-preview 154 10/22/2025
2025.11019.12053.37-preview 153 10/19/2025
2025.11016.11750.24-preview 151 10/16/2025
2025.11015.10219.44-preview 157 10/15/2025
2025.11014.10245.12-preview 161 10/14/2025
2025.11012.10130.11-preview 97 10/12/2025
2025.11010.10052.52-preview 154 10/9/2025
2025.11001.12118.13-preview 167 10/1/2025
2025.10925.10144.25-preview 171 9/25/2025
2025.10921.11353.29-preview 196 9/21/2025
2025.10913.11841.29-preview 142 9/13/2025
2025.10912.12351.59-preview 96 9/12/2025
2025.10912.10210.52-preview 161 9/12/2025
2025.10911.10131.43-preview 166 9/10/2025
2025.10910.12340.34-preview 170 9/10/2025
2025.10910.11327.15-preview 160 9/10/2025
2025.10910.11206.45-preview 165 9/10/2025
2025.10910.10230.58-preview 174 9/10/2025
2025.10908.12343.47-preview 166 9/8/2025
2025.10904.12337.35-preview 176 9/4/2025
2025.10904.12245.51-preview 175 9/4/2025
2025.10904.11425.5-preview 177 9/4/2025
2025.10904.10323.39-preview 187 9/4/2025
2025.10826.11425.3-preview 240 8/26/2025
2025.10825.12350.9-preview 174 8/25/2025
2025.10810.10248-preview 125 8/10/2025
2025.10809.10146.35-preview 165 8/9/2025
2025.10806.12031.49-preview 243 8/6/2025
2025.10806.11955.54-preview 242 8/6/2025
2025.10806.11433.24-preview 256 8/6/2025
2025.10709.10105.39-preview 174 7/8/2025
2025.10707.12320.3-preview 173 7/7/2025
2025.10706.11957.9-preview 168 7/6/2025
2025.10702.11752.47-preview 165 7/2/2025
2025.10702.11256.17-preview 164 7/2/2025
2025.10702.11119.10-preview 164 7/2/2025
2025.10702.10000.31-preview 167 7/1/2025
2025.10701.11524.1-preview 164 7/1/2025
2025.10701.11310.13-preview 163 7/1/2025
2025.10630.12022.58-preview 168 6/30/2025
2025.10612.12134.8-preview 338 6/12/2025
2025.10611.12313.53-preview 312 6/11/2025
2025.10603.10159.54-preview 175 6/3/2025
2025.10602.11908.9-preview 173 6/2/2025
2025.10601.10124.29-preview 129 5/31/2025
2025.10531.12235.29-preview 124 5/31/2025
2025.10530.10121.50-preview 176 5/29/2025
2025.10527.12202.4-preview 171 5/27/2025
2025.10526.12034.25-preview 169 5/26/2025
2025.10521.11828.30-preview 173 5/21/2025
2025.10520.11715.6-preview 175 5/20/2025
2025.10520.11515.16-preview 164 5/20/2025
2025.10518.12303.43-preview 188 5/18/2025
2025.10518.11257.36-preview 183 5/18/2025
2025.10517.12347.27-preview 126 5/17/2025
2025.10517.12003.6-preview 138 5/17/2025
2025.10516.11720.13-preview 205 5/16/2025
2025.10514.12334.2-preview 267 5/14/2025
2025.10514.10015.27-preview 260 5/13/2025
2025.10511.11032.32-preview 182 5/11/2025
2025.10413.11530 299 4/13/2025
2025.10413.11434.33-preview 221 4/13/2025
2025.10413.10205.50-preview 163 4/13/2025
2025.10412.11526.4-preview 132 4/12/2025
2025.10412.10141 195 4/12/2025
2025.10411.11811.23-preview 160 4/11/2025
2025.10411.11645.1-preview 155 4/11/2025
2025.10410.11458.35-preview 201 4/10/2025
2025.10405.10143.28-preview 126 4/5/2025
2025.10403.12208.1-preview 198 4/3/2025
2025.10403.11954.16-preview 195 4/3/2025
2025.10401.11908.24-preview 191 4/1/2025
2025.10401.11559.45-preview 191 4/1/2025
2025.10331.12215.59-preview 175 3/31/2025
2025.10331.12130.34-preview 181 3/31/2025
2025.10331.10056.40-preview 195 3/30/2025
2025.10328.10150.21-preview 167 3/28/2025
2025.10323.11359-preview 309 3/23/2025
2025.10320.11800 244 3/20/2025
2025.10320.11616.45-preview 180 3/20/2025
2025.10320.10000 224 3/19/2025
2025.10319.12311.26-preview 181 3/19/2025
2025.10319.12238.6-preview 181 3/19/2025
2025.10319.12057.59-preview 167 3/19/2025
2025.10318.10055 237 3/18/2025
2025.10317.11728.13-preview 179 3/17/2025
2025.10317.11201.3-preview 185 3/17/2025
2025.10315.11523.14-preview 117 3/15/2025
2025.10305.12342 305 3/5/2025
2025.10305.12321.9-preview 225 3/5/2025
2025.10301.12313 192 3/1/2025
2025.10301.12129.38-preview 130 3/1/2025
2025.10221.10043.29-preview 156 2/21/2025
2025.1051.1246 195 2/20/2025
2025.1051.44.54-preview 126 2/20/2025
2025.1044.1 198 2/13/2025
2025.1044.0.2-preview 133 2/13/2025
2025.1043.0.2-preview 142 2/12/2025
2025.1041.0.1-preview 140 2/10/2025
2025.1038.1 205 2/7/2025
2025.1038.0.1-preview 121 2/7/2025
2025.1035.1 191 2/4/2025
2025.1035.0.1-preview 138 2/4/2025
2025.1034.1 190 2/3/2025
2025.1034.0.1-preview 126 2/3/2025
2025.1033.0.5-preview 131 2/2/2025
2025.1033.0.3-preview 127 2/2/2025
2025.1033.0.2-preview 134 2/2/2025
2025.1033.0.1-preview 135 2/2/2025
2025.1025.1 205 1/25/2025
2025.1025.0.1-preview 129 1/25/2025
2025.1021.1 194 1/21/2025
2025.1021.0.1-preview 126 1/21/2025
2025.1020.1 179 1/20/2025
2025.1020.0.3-preview 124 1/20/2025
2025.1020.0.1-preview 127 1/20/2025
2025.1018.0.7-preview 117 1/18/2025
2025.1018.0.5-preview 127 1/18/2025
2025.1018.0.4-preview 119 1/18/2025
2025.1017.0.2-preview 117 1/17/2025
2025.1017.0.1-preview 122 1/17/2025
2025.1016.0.1-preview 113 1/16/2025
2025.1010.1 190 1/10/2025
2025.1010.0.1-preview 118 1/9/2025
2025.1009.0.3-preview 113 1/9/2025
2025.1007.1 194 1/7/2025
2025.1007.0.5-preview 126 1/7/2025
2025.1007.0.3-preview 125 1/7/2025
2025.1006.1 193 1/7/2025
2025.1005.1 209 1/5/2025
2025.1005.0.2-preview 125 1/5/2025
2025.1004.1 202 1/4/2025
2024.1366.1 199 12/31/2024
2024.1366.0.2-preview 143 12/31/2024
2024.1366.0.1-preview 150 12/31/2024
2024.1365.0.2-preview 129 12/30/2024
2024.1365.0.1-preview 120 12/30/2024
2024.1361.0.2-preview 132 12/26/2024
2024.1353.0.1-preview 132 12/18/2024
2024.1352.0.3-preview 130 12/17/2024
2024.1352.0.2-preview 127 12/17/2024
2024.1352.0.1-preview 124 12/17/2024
2024.1351.1 195 12/16/2024
2024.1351.0.3-preview 118 12/16/2024
2024.1350.1 189 12/15/2024
2024.1343.1 189 12/8/2024
2024.1339.1 196 12/4/2024
2024.1336.1 192 12/1/2024
2024.1332.1 190 11/27/2024
2024.1330.1 188 11/25/2024
2024.1328.1 185 11/23/2024
2024.1325.1 191 11/20/2024
2024.1323.1 191 11/18/2024
2024.1316.1 146 11/11/2024
2024.1307.1 139 11/2/2024
2024.1300.1 139 10/26/2024
2024.1294.1 165 10/20/2024
2024.1290.1 184 10/16/2024
2024.1283.1 196 10/8/2024
2024.1282.1 183 10/8/2024
2024.1278.1 191 10/4/2024
2024.1277.1 171 10/3/2024
2024.1275.2 188 10/1/2024
2024.1275.1 184 10/1/2024
2024.1274.1 188 9/30/2024
2024.1263.1 195 9/19/2024
2024.1261.1 218 9/17/2024
2024.1258.1 209 9/13/2024
2024.1257.1 198 9/13/2024
2024.1256.1 203 9/12/2024
2024.1254.1 194 9/10/2024
2024.1250.1 203 9/6/2024
2024.1249.1 214 9/5/2024
2024.1246.1 204 9/2/2024
2024.1245.1 204 9/1/2024
2024.1237.1 234 8/24/2024
2024.1235.0.1-preview 146 8/23/2024
2024.1230.1 205 8/18/2024
2024.1229.1 228 8/16/2024
2024.1228.1 210 8/15/2024
2024.1222.1 222 8/8/2024
2024.1221.1 188 8/7/2024
2024.1221.0.2-preview 148 8/8/2024
2024.1221.0.1-preview 135 8/8/2024
2024.1220.1 186 8/7/2024
2024.1219.0.2-preview 134 8/6/2024
2024.1219.0.1-preview 127 8/6/2024
2024.1217.0.2-preview 119 8/4/2024
2024.1217.0.1-preview 125 8/4/2024
2024.1216.0.2-preview 114 8/3/2024
2024.1216.0.1-preview 106 8/3/2024
2024.1208.0.1-preview 120 7/26/2024
2024.1207.0.7-preview 122 7/25/2024
2024.1207.0.5-preview 116 7/25/2024
2024.1166.1 215 6/14/2024
2024.1165.1 193 6/13/2024
2024.1164.1 189 6/12/2024
2024.1162.1 199 6/10/2024
2024.1158.1 210 6/6/2024
2024.1156.1 195 6/4/2024
2024.1152.1 227 5/31/2024
2024.1151.1 213 5/29/2024
2024.1150.2 198 5/29/2024
2024.1150.1 195 5/29/2024
2024.1149.1 199 5/28/2024
2024.1147.1 203 5/26/2024
2024.1146.2 196 5/25/2024
2024.1146.1 201 5/25/2024
2024.1145.1 200 5/24/2024
2024.1135.2 214 5/14/2024
2024.1135.1 193 5/14/2024
2024.1134.1 199 5/13/2024
2024.1130.1 231 5/9/2024
2024.1123.1 206 5/2/2024
2024.1121.1 201 4/30/2024
2024.1114.1 218 4/22/2024
2024.1113.0.5-preview 152 4/22/2024
2024.1113.0.3-preview 151 4/22/2024
2024.1113.0.2-preview 141 4/22/2024
2024.1113.0.1-preview 131 4/22/2024
2024.1108.0.1-preview 141 4/17/2024
2024.1107.0.1-preview 155 4/16/2024
2024.1094.2 221 4/3/2024
2024.1094.1 183 4/3/2024
2024.1092.1 208 4/1/2024
2024.1088.1 218 3/28/2024
2024.1085.1 206 3/25/2024
2024.1080.2 204 3/20/2024
2024.1080.1 244 3/20/2024
2024.1078.1 213 3/18/2024
2024.1077.1 203 3/17/2024
2024.1073.1 224 3/13/2024
2024.1070.1 219 3/10/2024
2024.1069.1 209 3/9/2024
2024.1068.1 212 3/8/2024
2024.1066.2 202 3/6/2024
2024.1066.1 204 3/6/2024
2024.1065.1 223 3/5/2024
2024.1065.0.1-preview 129 3/5/2024
2024.1063.2 221 3/3/2024
2024.1063.1 217 3/3/2024
2024.1062.1 217 3/2/2024
2024.1061.2 228 3/1/2024
2024.1061.1 248 3/1/2024
2024.1060.2 200 2/29/2024
2024.1060.1 199 2/29/2024
2024.1060.0.5-preview 161 2/29/2024
2024.1060.0.3-preview 141 2/29/2024
2024.1059.0.1-preview 133 2/28/2024
2024.1058.1 212 2/27/2024
2024.1056.1 220 2/25/2024
2024.1055.1 197 2/24/2024
2024.1052.1 225 2/21/2024
2024.1050.2 217 2/20/2024
2024.1050.1 211 2/19/2024
2024.1049.1 201 2/18/2024
2024.1048.1 212 2/17/2024
2024.1047.1 215 2/16/2024
2024.1035.1 230 2/4/2024
2024.1034.2 200 2/3/2024
2024.1029.1 214 1/29/2024
2024.1023.1 231 1/23/2024
2024.1022.1 201 1/22/2024
2024.1020.1 206 1/20/2024
2024.1019.1 204 1/19/2024
2024.1017.1 223 1/17/2024
2024.1012.1 222 1/12/2024
2024.1010.1 209 1/10/2024
2024.1008.1 225 1/8/2024
2024.1007.1 224 1/7/2024
2024.1005.1 226 1/5/2024
2024.1004.1 240 1/4/2024
2023.1365.1 232 12/31/2023
2023.1362.1 227 12/28/2023
2023.1361.1 229 12/27/2023
2023.1359.1 251 12/25/2023
2023.1358.1 220 12/24/2023
2023.1357.1 251 12/23/2023
2023.1342.1 246 12/8/2023
2023.1336.1 205 12/2/2023
2023.1332.1 203 11/28/2023
2023.1330.1 166 11/26/2023
2023.1325.1 202 11/21/2023
2023.1323.1 190 11/19/2023
2023.1320.1 184 11/17/2023
2023.1318.1 180 11/15/2023
2023.1317.1 177 11/13/2023
2023.1307.1 197 11/3/2023
2023.1305.1 205 11/1/2023
2023.1304.1 194 10/31/2023
2023.1294.1 218 10/21/2023
2023.1290.1 205 10/16/2023
2023.1289.1 184 10/16/2023
2023.1284.1 218 10/11/2023
2023.1276.1 215 10/3/2023
2023.1275.1 208 10/2/2023
2023.1272.1 210 9/29/2023
2023.1269.1 198 9/26/2023
2023.1242.1 264 8/30/2023
2023.1231.1 268 8/19/2023
2023.1229.1 254 8/17/2023
2023.1228.1 236 8/16/2023
2023.1227.1 257 8/15/2023
2023.1224.2 258 8/12/2023
2023.1224.1 266 8/12/2023
2023.1213.2 274 8/1/2023
2023.1213.1 265 8/1/2023
2023.1209.1 224 7/27/2023
2023.1201.1 253 7/20/2023
2023.1197.1 266 7/16/2023
2023.1178.1 248 6/27/2023
2023.1175.1 255 6/24/2023
2023.1174.1 263 6/22/2023
2023.1169.1 263 6/18/2023
2023.1165.1 289 6/14/2023
2023.1161.1 298 6/11/2023
2023.1159.1 305 6/7/2023
2023.1157.1 305 6/6/2023
2023.1146.1 287 5/27/2023
2023.1139.1 300 5/19/2023
2023.1137.1 295 5/17/2023
2023.1136.1 292 5/16/2023
2023.1118.1 311 4/28/2023
2023.1111.1 359 4/21/2023
2023.1110.1 344 4/20/2023
2023.1105.1 328 4/15/2023
2023.1103.1 314 4/13/2023
2023.1102.1 322 4/12/2023
2023.1101.1 307 4/11/2023
2023.1090.1 355 3/31/2023
2023.1089.1 349 3/30/2023
2023.1088.1 343 3/29/2023
2023.1082.1 378 3/23/2023
2023.1078.1 365 3/19/2023
2023.1075.1 388 3/16/2023
2023.1070.1 366 3/11/2023
2023.1069.1 352 3/10/2023
2023.1064.1 378 3/5/2023
2023.1060.1 410 3/1/2023
2023.1057.1 405 2/26/2023
2023.1046.1 380 2/15/2023
2023.1043.2 403 2/12/2023
2023.1043.1 407 2/12/2023
2023.1042.1 403 2/11/2023
2023.1041.1 413 2/10/2023
2023.1039.1 386 2/8/2023
2023.1036.1 424 2/5/2023
2023.1035.1 416 2/4/2023
2023.1033.1 435 2/2/2023
2023.1030.1 430 1/30/2023
2023.1028.1 440 1/28/2023
2023.1026.1 437 1/26/2023
2023.1025.1 447 1/25/2023
2023.1024.1 438 1/24/2023
2023.1023.1 437 1/23/2023
2022.1319.1 491 11/15/2022
2022.1309.1 523 11/5/2022
2022.1307.1 493 11/3/2022
2022.1295.1 542 10/22/2022
2022.1290.1 539 10/17/2022
2022.1289.2 546 10/16/2022
2022.1289.1 551 10/16/2022
2022.1283.1 565 10/10/2022
2022.1282.1 544 10/9/2022
2022.1278.1 539 10/5/2022
2022.1272.2 576 9/29/2022
2022.1272.1 555 9/29/2022
2022.1271.1 577 9/28/2022
2022.1266.1 578 9/23/2022
2022.1259.1 594 9/16/2022
2022.1257.1 629 9/14/2022
2022.1250.1 557 9/7/2022
2022.1250.0.2-preview 289 9/7/2022
2022.1249.0.2-preview 283 9/6/2022
2022.1249.0.1-preview 275 9/6/2022
2022.1197.1 615 7/16/2022
2022.1196.1 604 7/15/2022
2022.1194.1 612 7/13/2022
2022.1182.1 610 7/1/2022
2022.1178.1 610 6/27/2022
2022.1166.1 612 6/15/2022
2022.1157.1 620 6/6/2022
2022.1150.1 612 5/30/2022
2022.1149.1 612 5/29/2022
2022.1144.1 630 5/24/2022
0.6.2 604 5/23/2022
0.6.1 606 5/23/2022
0.6.0 602 5/14/2022
0.5.3 590 5/8/2022
0.5.2 593 5/1/2022
0.5.1 595 5/1/2022
0.5.0 619 4/23/2022
0.4.1 625 4/15/2022
0.4.0 621 4/9/2022
0.3.3 623 4/8/2022
0.3.2 638 4/1/2022
0.3.1 646 3/29/2022
0.3.0 640 3/28/2022
0.2.3 652 3/28/2022
0.2.2 650 3/25/2022
0.2.1 623 3/21/2022
0.2.0 631 3/18/2022