ASP.NET πολυγλωσσική εναλλαγή με ενσωματωμένα χαρακτηριστικά πυρήνα MVC

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον

Οπτικό Στούντιο
  • Οπτικό Στούντιο 2019
ASP.NET πυρήνας
  • 3.0
  • 3.1

Στην αρχή

ASP.NET χρησιμοποιήσετε βασικές δυνατότητες μετάφρασης MVC για εναλλαγή μεταξύ πολλών γλωσσών για την εμφάνισή τους.

Δημιουργία αρχείου πόρων για μεταφρασμένο κείμενο

Δημιουργήστε ένα φάκελο για να αποθηκεύσετε τα αρχεία πόρων (Resx) που διαχειρίζονται το κείμενο. Η τοποθεσία είναι οπουδήποτε, αλλά αφήστε το ακριβώς κάτω από τη διαδρομή. Αυτή η διαδρομή επηρεάζει επίσης τις μεταγενέστερες ρυθμίσεις.

Κάντε δεξί κλικ στο έργο και επιλέξτε Προσθήκη ή Νέος φάκελος.

image

Αφήστε τους πόρους ονόματος φακέλου. Μπορείτε επίσης να ορίσετε αυτό το όνομα φακέλου αυθαίρετα, αλλά μπορείτε να καθορίσετε αυτό το όνομα φακέλου σε μεταγενέστερες ρυθμίσεις.

image

Στη συνέχεια, δημιουργήστε ένα αρχείο πόρου για να εισαγάγετε κείμενο για κάθε γλώσσα.

Κάντε δεξί κλικ στο φάκελο "Πόροι" και επιλέξτε "Προσθήκη" ή "Νέο στοιχείο".

image

Επιλέξτε το αρχείο πόρων (.resx). Το όνομα αρχείου μπορεί να είναι αυθαίρετο, αλλά πρέπει να ταιριάζει με το όνομα που καθορίζετε αργότερα. Προς το παρόν, ας πούμε sharedresource.resx.

image

Αφού δημιουργήσετε το αρχείο .resx, κάντε διπλό κλικ για να το ανοίξετε και, στη συνέχεια, πληκτρολογήστε το όνομα που προσδιορίζει το κείμενο και το κείμενο που θέλετε να εμφανίσετε στην πραγματικότητα. Το αρχείο SharedResource.resx είναι το αρχείο που θα χρησιμοποιηθεί εάν η γλώσσα δεν υπάρχει. Το έβαλα στα Ιαπωνικά εδώ. Εάν θέλετε άλλες γλώσσες, όπως τα Αγγλικά, να είναι η προεπιλογή, εισαγάγετε τις σε αυτήν τη γλώσσα.

Εδώ μπαίνουμε Γεια σας και αντίο ως δείγματα. Σημειώστε ότι κάνει διάκριση πεζών-κεφαλαίων.

image

Συνεχίστε να δημιουργείτε αρχεία πόρων για άλλες γλώσσες. Για να προσδιορίσετε τη γλώσσα, καθορίστε το όνομα αρχείου, όπως SharedResource.<Κωδικός κουλτούρας>.resx. Μπορείτε να καθορίσετε έναν ή και τους δύο συνδυασμούς ISO 639 και ISO 3166 για τον κωδικό κουλτούρας. Ο κωδικός υποστήριξης ενδέχεται να αλλάζει κατά καιρούς, επομένως η κλάση CultureInfo στην τοποθεσία της Microsoft Ανατρέξτε στη σελίδα.

Αυτή τη φορά, en (Αγγλικά) και es (ισπανικά) προετοιμάζονται. Τα ιαπωνικά δεν είναι διαθέσιμα, επειδή είναι η προεπιλογή.

image

Πληκτρολογήστε το μεταφρασμένο κείμενο με τα πλήκτρα στην ίδια κατάσταση για κάθε αρχείο.

image

image

Στη συνέχεια, θα έχετε ένα αρχείο που καθορίζει μόνο τις. Μπορείτε να δημιουργήσετε αυτό με το ίδιο όνομα με το αρχείο πόρων που μόλις δημιουργήσατε.

Στην πραγματικότητα, δεν με νοιάζει ποιο είναι το όνομα του αρχείου κώδικα η ίδια είναι επειδή το μόνο που έχετε να ταιριάζει με το όνομα της κατηγορίας στο εσωτερικό, αλλά αφήστε το το ίδιο, έτσι ώστε να είναι εύκολο να καταλάβει. Δεν έχει σημασία πού θέλεις να γράψεις τον κώδικα.

image

Κάντε το χώρο ονομάτων τη ρίζα του έργου και δημιουργήστε μια κενή κλάση.

namespace LocalizationText
{
  // クラス名は作成した .resx のファイル名と同じにする必要がある
  public class SharedResource { }
}

Επιδιόρθωση κάθε προγράμματος

Startup.cs

Φτιάξε Startup.cs. Περιγράψτε τη μέθοδο ConfigureServices ως εξής:

Υπηρεσίες. AddMvc(). Εάν υπάρχει μέθοδος AddViewLocalization, το κείμενο που μεταφράζεται τόσο από την πλευρά της προβολής όσο και από την πλευρά του χειριστηρίου είναι Είμαι σίγουρος ότι μπορώ να το πάρω, αλλά. Όπως αναφέρεται και στις επίσημες υπηρεσίες της ιστοσελίδας. Δεν υπάρχει πρόβλημα με την κλήση της μεθόδου AddLocalization μαζί.

Επιλογές. Το ResourcesPath καθορίζει τη διαδρομή του φακέλου όπου βρίσκεται το αρχείο Resx. Εάν έχουν καθοριστεί και τα δύο, οι υπηρεσίες. AddMvc(). Η μέθοδος AddViewLocalization έχει προτεραιότητα.

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();

  // Resx ファイルのあるフォルダを指定する。
  // コントローラー側でしか使用しないならこちらでもよい。AddViewLocalization を使用するならこちらはなくても動作する。
  //services.AddLocalization(options => options.ResourcesPath = "Resources");

  services.AddMvc()
    // ローカライズに必要。Resx ファイルのフォルダパスを指定
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; });
}

Στη συνέχεια, τροποποιήστε τη μέθοδο Configure για Startup.cs. Εάν θέλετε απλώς να διαβάσετε το αρχείο πόρων, δεν το χρειάζεστε. Κώδικας που απαιτείται για να επιτρέψει στο χρήστη να καθορίσει αυθαίρετα μια γλώσσα.

Χρησιμοποιούμε τα χαρακτηριστικά που είναι ενσωματωμένα ASP.NET Core MVC ως στάνταρ. Ο ακόλουθος κώδικας περιγράφει τη "συμβολοσειρά ερωτήματος", "cookie" και "Αποδοχή γλώσσας HTTP κεφαλίδα" ανάλογα με το περιβάλλον του χρήστη. Μπορείτε να κάνετε εναλλαγή μεταξύ των γλωσσών εμφάνισης σε μία από αυτές. Θα σας δούμε αργότερα πώς να ελέγξετε την πραγματική λειτουργία.

Η εναλλάξιμη γλώσσα καθορίζεται εδώ στον πίνακα (υποστηριζόμενες Καλλιέργειες). Καθόρισα ja ως προεπιλεγμένη γλώσσα, αλλά δεν έχω δημιουργήσει το αρχείο ja αυτή τη φορά. Το SharedResource.resx χρησιμοποιείται εάν έχει καθοριστεί μια γλώσσα διαφορετική από en, es.

Μπορείτε να διαχωρίσετε το ui από τις γλώσσες που υποστηρίζετε, αλλά δεν υπάρχει μεγάλο όφελος για το διαχωρισμό του. Έχεις την ίδια γλώσσα.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    // 省略
  }

  // 標準の機能で切り替えたい言語を定義します。
  var supportedCultures = new[]
  {
    new CultureInfo("ja"),
    new CultureInfo("en"),
    new CultureInfo("es"),
  };

  // 標準の言語切り替え機能を有効にします。対応しているのは「クエリ文字列」「Cookie」「Accept-Language HTTP ヘッダー」です。
  app.UseRequestLocalization(new RequestLocalizationOptions
  {
    DefaultRequestCulture = new RequestCulture("ja"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
  });

  app.UseHttpsRedirection();
  app.UseStaticFiles();

  // 省略
}

Ελεγκτές\Οικιακός ελεγκτής.cs

Ελεγκτές\Αρχείο HomeController.cs. Για να λάβετε μια μεταφρασμένη γλώσσα στην πλευρά του ελεγκτή, το iStringLocalizer λαμβάνεται στην κατασκευή. Το SharedResource πρέπει να έχει το ίδιο όνομα με την κλάση που δημιουργήσατε νωρίτερα. Το κείμενο μεταβιβάζεται στον εισαγωγέα του ληφθέντος localizer, περνώντας τη συμβολοσειρά κλειδιού που εισάγεται στο αρχείο πόρων. μπορεί να ανακτηθεί. Η γλώσσα του κειμένου καθορίζεται με βάση την κουλτούρα που ζητείται.

Με την ευκαιρία, εκτός από iStringLocalizer, υπάρχει επίσης ένα IHtmlLocalizer που μπορεί να πάρει HTML όπως είναι.

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  private readonly IStringLocalizer<SharedResource> _localizer;

  // DI でローカライザーを取得します。
  public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
  {
    _logger = logger;
    _localizer = localizer;
  }

  public IActionResult Index()
  {
    // ローカライザーを使用して設定されている言語のリソースファイルからテキストを取得します。
    ViewData["Message"] = _localizer["Goodbye"];

    return View();
  }

  // 省略
}

Προβολές\_ViewImports.cshtml

Προβολές\αρχείο _ViewImports.cshtml. Για να χρησιμοποιήσετε έναν τοπικό ποιητή στην πλευρά της προβολής, πρέπει να κάνετε την ένεση του IHtmlLocalizer. Αν το περιγράψετε ως εξής προς το παρόν, είναι εντάξει. Επίσης, το SharedResource πρέπει να έχει το ίδιο όνομα με το αρχείο πόρων και την κλάση που δημιουργήσατε νωρίτερα.

IHtmlLocalizer είναι στο χώρο ονομάτων Microsoft.AspNetCore.Mvc.Localization, γι 'αυτό θα καθορίσει αυτό ως χρησιμοποιώντας.

Εάν θέλετε να χρησιμοποιήσετε μόνο τον τοπικιστή σε ένα συγκεκριμένο σημείο, μπορείτε να συμπεριλάβετε τον ακόλουθο κώδικα σε ξεχωριστό αρχείο προβολής. Εάν το γράψετε σε ένα αρχείο _ViewImports.cshtml, θα μπορείτε αυτόματα να το χρησιμοποιήσετε σε όλα τα αρχεία προβολής.

@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer

Προβολές\Αρχική\Ευρετήριο.cshtml

Προβολές\Κεντρική\Αρχείο Index.cshtml. Το κείμενο που λαμβάνεται από την πλευρά του ελεγκτή και το κείμενο που λαμβάνεται απευθείας από την πλευρά της προβολής εμφανίζονται αντίστοιχα. Ο τοπικός παράγοντας τοπικής διατήρησης από την πλευρά προβολής λαμβάνει επίσης το κείμενο καθορίζοντας μια συμβολοσειρά κλειδιού για το ευρετήριο.

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@* ローカライザーから取得したテキストを表示します。 *@
<p>@Localizer["Hello"]</p>
<p>@ViewData["Message"]</p>

Έλεγχος λειτουργίας

Συμβολοσειρά ερωτήματος

Μπορείτε να αλλάξετε τη γλώσσα εμφάνισης καθορίζοντας έναν κωδικό κουλτούρας στη συμβολοσειρά ερωτήματος της διεύθυνσης URL. Η μορφή είναι ?culture=<κωδικός κουλτούρας>. Εάν θέλετε να το διαχωρίσετε από το ui, θα είναι ?culture=<κώδικας κουλτούρας>&ui-culture=<κωδικός κουλτούρας>.

Εάν δεν καθορίσετε τίποτα: Εάν δεν καθοριστεί, χρησιμοποιείται το SharedResource.resx. (Στην πραγματικότητα, έχει εφαρμοστεί άλλη απόφαση...)

image

Το μοτίβο που καθορίζεται για το .culture=en. Η γλώσσα εμφάνισης είναι τα Αγγλικά.

image

Το μοτίβο που καθορίζεται για το .culture=es. Η γλώσσα εμφάνισης είναι τα Ισπανικά.

image

Το μοτίβο που καθορίζεται για το ?culture=ja. Αρχικά, χρησιμοποιείται το αρχείο SharedResource.ja.resx. Το SharedResource.resx χρησιμοποιείται επειδή δεν υπάρχει.

image

Προσπαθήστε να καθορίσετε μια γλώσσα που δεν υπάρχει. Το SharedResource.resx χρησιμοποιείται επειδή δεν υπάρχει αντίστοιχο αρχείο εδώ.

image

Cookies

Τα cookies μπορούν να αλλάξουν τη γλώσσα εμφάνισης. Κανονικά δημοσιεύθηκε από την πλευρά του διακομιστή, αλλά αυτή τη φορά θα προσπαθήσω να καταχωρήσετε τα cookies απευθείας στη λειτουργία του προγράμματος περιήγησης.

Επειδή κάθε πρόγραμμα περιήγησης στο Web διαθέτει ένα εργαλείο προγραμματιστή, το χρησιμοποιείτε για την καταχώρηση cookies. Στην παρακάτω εικόνα, μπορείτε να πατήσετε το πλήκτρο F12 στο Edge για να εμφανίσετε τα εργαλεία προγραμματιστή.

Το όνομα του αντίστοιχου cookie είναι . AspNetCore.Πολιτισμός και η τιμή που καθορίζει τη γλώσσα είναι Πληκτρολογήστε με τη μορφή κωδικού c=<κουλτούρας>|uic=<κωδικός κουλτούρας>. Για τα cookies, πρέπει επίσης να εισαγάγετε τον κωδικό ui. Αφού καταχωρήσετε το cookie σας, ανανεώστε τη σελίδα του προγράμματος περιήγησης web για να το ανανεώσετε. Ένα cookie αποστέλλεται στο διακομιστή, ώστε ο διακομιστής να ανακτήσει την καθορισμένη γλώσσα.

Στην παρακάτω εικόνα, μπορείτε να εισαγάγετε c=en|uic=en για να εμφανίσετε τα Αγγλικά.

image

πληκτρολογήστε c=es|uic=es για να εμφανίσετε τα Ισπανικά.

image

Κεφαλίδα HTTP γλώσσας αποδοχής

Η κεφαλίδα HTTP αποδοχής γλώσσας ελέγχει τις πληροφορίες κεφαλίδας που ζητήθηκαν από το πρόγραμμα περιήγησης Web στο διακομιστή. Είναι η δυνατότητα να αλλάζετε γλώσσες αναλόγως.

Μπορείτε να στείλετε οποιαδήποτε γλώσσα αποδοχής στις ρυθμίσεις του προγράμματος περιήγησης web, αλλά από προεπιλογή μπορείτε να αντιστοιχίσετε τις ρυθμίσεις γλώσσας λειτουργικού συστήματος. Η γλώσσα αποδοχής αποστέλλεται τώρα. (Αν δεν είναι πράγματι αποστέλλεται εξαρτάται από το λειτουργικό σύστημα και web browser.) Η γλώσσα έχει προετοιμαστεί στο πρόγραμμα περιήγησης Στο Web για τη γλώσσα του λειτουργικού συστήματος, αλλά μπορεί να είναι σωστή.)

Έτσι, για παράδειγμα, όπως φαίνεται στην παρακάτω εικόνα, μπορείτε να ανοίξετε τη σελίδα στο πρόγραμμα περιήγησης στο Web του λειτουργικού συστήματος αγγλικής γλώσσας και να στείλετε πληροφορίες en, ώστε να μπορείτε αυτόματα να Το SharedResource.en.resx είναι επιλεγμένο για την εμφάνιση της αγγλικής.

image

Εάν προσπαθήσετε να καθορίσετε μια γλώσσα που δεν υπάρχει στη συμβολοσειρά ερωτήματος, θα πρέπει αρχικά να χρησιμοποιήσετε το SharedResource.resx. Η γλώσσα αποδοχής εμφανίζει αγγλικά, επειδή υπάρχει το en.

image

Εάν το ja καθορίζεται στη συμβολοσειρά ερωτήματος, η συμβολοσειρά ερωτήματος έχει προτεραιότητα και εμφανίζεται η ιαπωνική.

image

Περίληψη

Εδώ προσπάθησα να εφαρμόσει την πολύγλωσση μεταγωγήμεει με τον ευκολότερο τρόπο. Για να αλλάξετε γλώσσες ώστε να ταιριάζουν με το περιβάλλον του χρήστη, χρησιμοποιήστε την κεφαλίδα HTTP αποδοχής γλώσσας ως την προεπιλεγμένη γλώσσα εμφάνισης. Εάν ο χρήστης επιλέξει οποιαδήποτε γλώσσα, είναι καλή ιδέα να προσθέσετε cookies ή να προσθέσετε (ή να εισαγάγετε απευθείας) τη συμβολοσειρά ερωτήματος.