Skip to main content

Ítarlegur leiðarvísir um staðfæringu ASP.NET Core

Frá IStringLocalizer til rekstrarumhverfis: settu upp tilföng byggða staðfæringu í ASP.NET Core og gerðu síðan þýðingar sjálfvirkar með AI.

1

Virkja staðfæringarþjónustur

Skráðu staðfæringarþjónustur í Program.cs með AddLocalization(), stilltu studdar menningar og bættu við millihugbúnaði fyrir beiðnastaðfæringu. Þannig tengirðu alla staðfærsluvinnslurás ASP.NET Core-forritsins þíns.

AddLocalization() skráir IStringLocalizer og IStringLocalizerFactory í DI-gáminn. ResourcesPath segir umgjörðinni hvar .resx-skrárnar þínar eru. AddViewLocalization() virkjar IViewLocalizer í Razor-sýnum og AddDataAnnotationsLocalization() virkjar staðfærð villuboð við sannprófun.
Program.cs
using Microsoft.AspNetCore.Localization;
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);

// 1. Register localization services
builder.Services.AddLocalization(o => o.ResourcesPath = "Resources");

// 2. Add MVC with view/data-annotation localization
builder.Services.AddControllersWithViews()
    .AddViewLocalization()
    .AddDataAnnotationsLocalization();

var app = builder.Build();

// 3. Configure supported cultures
var supportedCultures = new[] { "en", "de", "ja", "es", "pt-BR" }
    .Select(c => new CultureInfo(c)).ToArray();

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures,
});

app.UseStaticFiles();
app.UseRouting();
app.MapControllers();
app.Run();
2

Búa til RESX-tilfangaskrár

ASP.NET Core notar RESX-skrár (XML-tilföng) fyrir þýðingar. Búðu til eina skrá fyrir hverja menningu og hvern klasa: HomeController.en.resx, HomeController.de.resx o.s.frv. Umgjörðin finnur réttu skrána út frá menningu fyrirliggjandi beiðni.

Resources/Controllers/HomeController.{culture}.resx
<!-- Resources/Controllers/HomeController.en.resx -->
<?xml version="1.0" encoding="utf-8"?>
<root>
  <data name="Welcome" xml:space="preserve">
    <value>Welcome to our application</value>
  </data>
  <data name="Greeting" xml:space="preserve">
    <value>Hello, {0}!</value>
  </data>
</root>

<!-- Resources/Controllers/HomeController.de.resx -->
<?xml version="1.0" encoding="utf-8"?>
<root>
  <data name="Welcome" xml:space="preserve">
    <value>Willkommen in unserer Anwendung</value>
  </data>
  <data name="Greeting" xml:space="preserve">
    <value>Hallo, {0}!</value>
  </data>
</root>
Notaðu SharedResource-klasa með eigin RESX-skrám fyrir strengi sem stýringar og sýn deila — hnappamerkingar, atriði í yfirlitsleiðsögn og algeng sannprófunarskilaboð. Þannig forðastu að tvítaka lykla í tugum RESX-skráa sem tilheyra einstökum stýringum.
Shared resources for cross-cutting strings
<!-- Resources/SharedResource.en.resx — shared across controllers -->
<?xml version="1.0" encoding="utf-8"?>
<root>
  <data name="AppName" xml:space="preserve">
    <value>My Application</value>
  </data>
  <data name="Save" xml:space="preserve"><value>Save</value></data>
  <data name="Cancel" xml:space="preserve"><value>Cancel</value></data>
</root>

// Marker class (empty — only used for type lookup)
namespace MyApp;
public class SharedResource { }
3

Nota IStringLocalizer í stýringum og þjónustum

Sprautaðu IStringLocalizer&lt;T&gt; inn í hvaða stýringu, þjónustu eða millihugbúnað sem er með tengslasprautun. Almenna tegundarviðfangið T ákvarðar hvaða RESX-skrá er hlaðið inn. Notaðu hornklofaritunina localizer["Key"] til að sækja þýdda strengi, með valkvæðum sniðbreytum.

Controllers/HomeController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

public class HomeController(
    IStringLocalizer<HomeController> localizer,
    IStringLocalizer<SharedResource> shared) : Controller
{
    public IActionResult Index()
    {
        ViewData["Welcome"] = localizer["Welcome"];
        ViewData["AppName"] = shared["AppName"];

        // String interpolation with format parameters
        var greeting = localizer["Greeting", User.Identity?.Name ?? "Guest"];
        return View(new HomeViewModel { Greeting = greeting });
    }
}
Ef IStringLocalizer skilar lykilheitinu í stað þýdda gildisins skaltu athuga þrennt: (1) að heiti RESX-skrárinnar samsvari nafnrými klasans, (2) að ResourcesPath í AddLocalization() vísi á rétta möppu og (3) að Build Action fyrir RESX-skrána sé stillt á Embedded Resource í Visual Studio.
4

Stilla millihugbúnað fyrir beiðnamenningu

ASP.NET Core ákvarðar menningu beiðninnar með röð veitna: fyrirspurnarstreng, vafraköku og Accept-Language-haus (í þessari röð). Þú getur bætt við sérsniðnum veitum — til dæmis veitu sem les menninguna úr leiðarhluta vefslóðar á borð við /de/home.

Custom RouteDataRequestCultureProvider
// Culture resolved in order: QueryString, Cookie, Accept-Language
// Custom provider: read culture from URL route segment /de/home
public class RouteDataRequestCultureProvider : RequestCultureProvider
{
    public override Task<ProviderCultureResult?> DetermineProviderCultureResult(
        HttpContext httpContext)
    {
        var culture = httpContext.GetRouteValue("culture")?.ToString();
        if (string.IsNullOrEmpty(culture))
            return NullProviderCultureResult;
        return Task.FromResult<ProviderCultureResult?>(
            new ProviderCultureResult(culture));
    }
}

// Register in Program.cs (route provider first = highest priority):
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures,
    RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new RouteDataRequestCultureProvider(),
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider(),
        new AcceptLanguageHeaderRequestCultureProvider(),
    }
});
Language Switcher Action
// Language switcher: persist choice in cookie
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
    Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
        new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) });
    return LocalRedirect(returnUrl);
}
Röð millihugbúnaðarins skiptir máli. Kalla verður á UseRequestLocalization() á eftir UseRouting() en á undan UseEndpoints() eða MapControllers(). Ef kallið kemur of seint hefur menningin ekki verið stillt þegar stýringarnar þínar eru keyrðar.
5

Staðfæra gagnaskýringar

Hægt er að staðfæra sannprófunareigindi á borð við [Required], [StringLength] og [Display] með því að stilla eiginleika þeirra ErrorMessage eða Name á heiti RESX-lykla. Kallaðu á AddDataAnnotationsLocalization() í Program.cs til að virkja þetta.

ViewModels/RegisterViewModel.cs
using System.ComponentModel.DataAnnotations;

public class RegisterViewModel
{
    [Required(ErrorMessage = "NameRequired")]
    [Display(Name = "FullName")]
    [StringLength(100, ErrorMessage = "NameLength", MinimumLength = 2)]
    public string Name { get; set; } = string.Empty;

    [Required(ErrorMessage = "EmailRequired")]
    [EmailAddress(ErrorMessage = "EmailInvalid")]
    [Display(Name = "EmailAddress")]
    public string Email { get; set; } = string.Empty;

    [Required(ErrorMessage = "PasswordRequired")]
    [StringLength(100, ErrorMessage = "PasswordLength", MinimumLength = 8)]
    [Display(Name = "Password")]
    public string Password { get; set; } = string.Empty;
}
// RESX keys map to ErrorMessage/Name values:
// RegisterViewModel.de.resx: NameRequired = "Name ist erforderlich"
// RegisterViewModel.de.resx: FullName = "Vollständiger Name"
Staðfærsla gagnaskýringa notar heiti ViewModel-klasans til að finna RESX-skrár, ekki heiti Controller. Fyrir RegisterViewModel leitar umgjörðin að Resources/ViewModels/RegisterViewModel.de.resx. Ef RESX-skrárnar þínar eru nefndar eftir stýringunni verða sannprófunarskilaboðin ekki staðfærð.
6

Meðhöndla fleirtölur og ICU-skilaboð

.NET hefur ekki innbyggðan stuðning við fleirtölureglur eins og ICU. Í einföldum tilvikum skaltu nota aðskilda RESX-lykla (ItemCount_One, ItemCount_Other) og valgreiningu í kóða. Notaðu MessageFormat.NET-safnið fyrir fullan stuðning við ICU MessageFormat í öllum fleirtöluflokkum CLDR.

Plural handling strategies
// Option 1: Separate RESX keys with code switch
// HomeController.en.resx: ItemCount_One = "You have {0} item"
// HomeController.en.resx: ItemCount_Other = "You have {0} items"
public string GetItemCount(int count)
{
    var key = count == 1 ? "ItemCount_One" : "ItemCount_Other";
    return _localizer[key, count];
}

// Option 2: ICU MessageFormat (dotnet add package MessageFormat.NET)
using Jeffijoe.MessageFormat;
var formatter = new MessageFormatter();

var pattern = "{count, plural, one {# item} other {# items}} in your cart";
var result = formatter.FormatMessage(pattern,
    new Dictionary<string, object> { { "count", 5 } });
// => "5 items in your cart"

// Arabic: 6 plural forms (zero, one, two, few, many, other)
var arPattern = @"{count, plural,
    zero {لا عناصر} one {عنصر واحد} two {عنصران}
    few {# عناصر} many {# عنصرًا} other {# عنصر}}";
Notaðu aldrei count == 1 til að greina eintölu. Í frönsku telst 0 eintala. Rússneska hefur aðskilin form fyrir 'few' og 'many'. Arabíska hefur sex fleirtöluflokka. Notaðu fleirtölureglur sem styðja CLDR eða safn á borð við MessageFormat.NET sem annast þetta rétt.
7

Staðfæra Razor-sýn

Notaðu IViewLocalizer í Razor-sýnum með @inject. Hann finnur RESX-skrár út frá skráarslóð sýnarinnar. Notaðu IHtmlLocalizer fyrir strengi með merkingum sem óhætt er að birta sem HTML. Tag Helpers á borð við asp-for og asp-validation-for nota sjálfkrafa staðfærð Display- og ErrorMessage-eigindi.

Views/Home/Index.cshtml
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<SharedResource> SharedHtml

<h1>@Localizer["Welcome"]</h1>
<p>@Localizer["Greeting", User.Identity?.Name]</p>

@* IHtmlLocalizer: does NOT escape — use for RESX values with HTML *@
<p>@SharedHtml["TermsNotice"]</p>

@* Tag Helpers auto-localize Display/ErrorMessage attributes *@
<form asp-action="Register">
    <label asp-for="Name"></label>
    <input asp-for="Name" />
    <span asp-validation-for="Name"></span>
    <button type="submit">@Localizer["Submit"]</button>
</form>
IViewLocalizer finnur RESX-skrár út frá slóð sýnarinnar: Views/Home/Index.cshtml leitar að Resources/Views/Home/Index.de.resx. Ef þú vilt deila strengjum milli sýna skaltu sprauta IStringLocalizer&lt;SharedResource&gt; inn sérstaklega.
8

Gera RESX-þýðingar sjálfvirkar

Þegar staðfæringaruppsetningunni er lokið geturðu þýtt RESX-skrárnar þínar með AI. Biddu AI-aðstoðarforritið í þróunarumhverfinu þínu að þýða upprunalegu RESX-skrána eða notaðu i18n Agent CLI í CI/CD-vinnslurásinni til að halda þýðingum samstilltum.

Terminal
# In your IDE, ask your AI assistant:
> Translate Resources/Controllers/HomeController.en.resx to German, Japanese, Spanish

# HomeController.de.resx created (1.2s)
# HomeController.ja.resx created (1.5s)
# HomeController.es.resx created (1.1s)

# Or use the CLI in CI/CD:
npx i18n-agent translate Resources/Controllers/HomeController.en.resx --lang de,ja,es
Þýddu í áföngum — þegar þú bætir nýjum lyklum við upprunalegu RESX-skrána skaltu aðeins þýða mismuninn í stað þess að endurgera allar skrár. Þannig varðveitirðu þýðingar sem hafa verið yfirfarnar af fólki og lágmarkar óþarfa breytingar.

Gera þýðingargæði sjálfvirk

Finndu lykla sem vantar og skemmd frátökutákn áður en þau fara í útgáfu með i18n-validate. Prófaðu notandaviðmótið með gerviþýðingum í i18n-pseudo áður en raunverulegar þýðingar berast.

Laga staðgengilsstaðfærslur með LocaleChain.NET

Innbyggða CultureInfo.Parent-stigveldið í .NET notar aðeins styttingu samkvæmt BCP 47: pt-BR fer til vara í pt og síðan InvariantCulture en sleppir pt-PT. LocaleChain.NET býður stillanlegar staðgengilskeðjur fyrir hvert staðbrigði í öllu .NET-vistkerfinu.

Án LocaleChain.NET sér notandi með pt-BR ensku þegar portúgalskan streng vantar — jafnvel þótt fullbúin pt-PT-þýðing sé til. Sama vandamál hefur áhrif á es-MX (sleppir es-419), zh-Hant (sleppir zh-Hans) og tugi annarra svæðisbundinna afbrigða.
Terminal
dotnet add package I18nAgent.LocaleChain
Program.cs
using I18nAgent.LocaleChain;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLocalization(o => o.ResourcesPath = "Resources");

// Zero-config: built-in chains (pt-BR -> pt-PT -> pt -> en, etc.)
LocaleChain.Configure();

// Or customize specific chains:
LocaleChain.Configure(new Dictionary<string, string[]>
{
    ["pt-BR"] = new[] { "pt-PT", "pt", "en" },
    ["es-MX"] = new[] { "es-419", "es", "en" },
});

// Register the chain-aware string localizer
builder.Services.AddSingleton(
    typeof(IStringLocalizer<>),
    typeof(LocaleChainStringLocalizer<>));

Algengar gryfjur

Menning ekki stillt fyrir beiðni

Þýðingar birtast alltaf á sjálfgefna tungumálinu. Athugaðu að kallað sé á UseRequestLocalization() í vinnslurás millihugbúnaðarins og að menningarveiturnar séu stilltar. Gakktu úr skugga um að vafrinn sendi Accept-Language-hausa. Prófaðu með ?culture=de í fyrirspurnarstrengnum til að staðfesta að millihugbúnaðurinn virki.

RESX-skrá fannst ekki

IStringLocalizer skilar lykilheitinu í stað þýdda gildisins. Algengasta orsökin er heiti RESX-skrár sem samsvarar ekki fullri nafnrýmislóð klasans miðað við ResourcesPath. Virkjaðu aflúsunarskráningu fyrir Microsoft.Extensions.Localization til að sjá í hvaða slóðum umgjörðin leitar.

Röng röð millihugbúnaðar

UseRequestLocalization() verður að koma á undan UseEndpoints() og MapControllers(). Ef það kemur á eftir er beiðnamenningin ekki stillt þegar stýringar eru keyrðar. Í lágmarks hýsingu .NET 6+ skaltu kalla á það á undan app.MapControllers().

Bakgrunnsþráður notar ranga menningu

CultureInfo.CurrentCulture og CurrentUICulture eru sértæk fyrir hvern þráð. Bakgrunnsverk (Task.Run, hýstar þjónustur) erfa menningu þráðasafnsins en ekki menningu beiðninnar. Varðveittu menninguna sérstaklega og stilltu hana þegar bakgrunnsvinnu er úthlutað.

Ráðlögð verkefnaskipan

Project Structure
MyAspNetApp/
├── Controllers/
│   └── HomeController.cs
├── ViewModels/
│   └── RegisterViewModel.cs
├── Views/
│   └── Home/
│       └── Index.cshtml
├── Resources/
│   ├── Controllers/
│   │   ├── HomeController.en.resx     # English (source)
│   │   ├── HomeController.de.resx     # German
│   │   └── HomeController.ja.resx     # Japanese
│   ├── ViewModels/
│   │   ├── RegisterViewModel.en.resx
│   │   └── RegisterViewModel.de.resx
│   ├── Views/Home/
│   │   ├── Index.en.resx
│   │   └── Index.de.resx
│   └── SharedResource.en.resx
├── SharedResource.cs                  # Marker class
├── Program.cs
└── MyAspNetApp.csproj

Prófaðu i18n Agent núna

Slepptu þýðingarskránni þinni hér

JSON, YAML, PO, XML, CSV, Markdown, Properties

eða smelltu til að fletta

Markmál

Engin skráning nauðsynlegKostnaðaráætlun samstundis

Staðgengilsstaðfærsla með I18nAgent.LocaleChain

Þegar þýðingarlykil vantar í svæðisbundið staðbrigði á borð við pt-BR fer .NET beint í óbreytanlegu menninguna í stað þess að athuga fyrst foreldrisstaðbrigðið pt.

Terminal
dotnet add package I18nAgent.LocaleChain
Configuration
using I18nAgent.LocaleChain;

LocaleChain.Configure(new Dictionary<string, string[]>
{
    ["pt-BR"] = new[] {"pt", "en"},
    ["zh-Hant-HK"] = new[] {"zh-Hant", "zh", "en"},
});

Sjá leiðarvísi okkar um staðgengilsstaðfærslu fyrir allan listann yfir studdar umgjarðir og 75 innbyggðar keðjur. Learn more →

Algengar spurningar