Ich muss die Kulturen zur Laufzeit nach Ressourcendateien für jede Kultur ändern. Br /> Benutzer klickt auf eine Schaltfläche, die von der aktuellen Sprache in die andere Sprache wechselt. Die Texte in der Seite werden für jede Kultur nach Ressourcendateien aktualisiert.
Benutzer klickt auf eine Schaltfläche, die von der aktuellen Sprache zur anderen Sprache wechselt. Die Texte auf der Seite werden nach Ressourcendateien für jede Kultur aktualisiert. Sobald der Benutzer eine Aktion in jeder Komponente ausübt (ich habe mehrere Optionsfelder, Schaltflächen und Kontrollkästchen), gehen die Texte zurück zu dem, was im ersten Mal geschrieben wurde. Es ist, als ob der CultureInfo überhaupt nicht verändert wurde. < /p>
Versuche < /em> < /p>
Erstellt eine AppState -Klasse, die den Komponenten injiziert wird < / p>
public class AppState
{
public CultureInfo currentCulture { get; private set; } = CultureInfo.CurrentCulture;
public event Action OnChange;
public void ChangeCulture(CultureInfo newCulture)
{
currentCulture = newCulture;
System.Threading.Thread.CurrentThread.CurrentCulture.ClearCachedData();
System.Threading.Thread.CurrentThread.CurrentUICulture.ClearCachedData();
System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture;
NotifyStateChanged();
}
public CultureInfo getCurrentCulture()
{
if (currentCulture == null)
{
ChangeCulture(CultureInfo.CurrentCulture);
}
return currentCulture;
}
private void NotifyStateChanged() => OnChange?.Invoke();
}
< /code>
Die Lokalisierung des Projekts in startup.cs < /em> und AppState Instante auch < /p>
hinzugefügt services.AddScoped();
services.AddMvc().AddMvcLocalization();
services.AddLocalization();
var supportedCultures = new List { new CultureInfo("en-US"), new CultureInfo("es-ES") };
services.Configure(options =>
{
options.DefaultRequestCulture = new RequestCulture("es-ES");
options.SupportedUICultures = supportedCultures;
options.SupportedCultures = supportedCultures;
});
< /code>
Komponente hat das AppState sowie das iStringLocalizer -Objekt injiziert, um die Zeichenfolgen aus der Ressourcendatei zu erhalten. < /p>
@inject AppState state
@inject IStringLocalizer _localizer
@implements IDisposable
Holadenuevo
< /code>
und hat dann die Ereignisse festgelegt < /p>
protected override void OnInitialized()
{
_lematizador = new LematizadorService();
state.OnChange += OnCultureChange;
}
public void Dispose()
{
state.OnChange -= OnCultureChange;
}
private void CambiarIdioma()
{
if (state.getCurrentCulture().Equals(new CultureInfo("es-ES")))
{
state.ChangeCulture(new CultureInfo("en-US"));
}
else
{
state.ChangeCulture(new CultureInfo("es-ES"));
}
}
private void OnCultureChange()
{
CultureInfo.CurrentCulture = state.currentCulture;
CultureInfo.CurrentUICulture = state.currentCulture;
StateHasChanged();
}
< /code>
Wenn Sie also auf die Schaltfläche klicken, die cambiaridioma () < /em> auslöst, funktioniert das Projekt einwandfrei. Sobald eine Aktion in der Komponente ausgeführt wird (sagen wir, ich überprüfe etwas in der tabareconocimientos -Komponente oder ich klicke auf ein Radiobutton), werden die Texte in ihre ursprünglichen Zeichenfolgen zurückgekehrt.
< BR />
Jede Komponente, in der ihre Texte lokalisiert werden müssen, hat das AppState injiziert und implementiert: < /p>
@inject AppState state
@inject IStringLocalizer _localizer
@implements IDisposable
@*Component stuff*@
@functions{
protected override void OnInitialized()
{
state.OnChange += OnCultureChange;
}
public void Dispose()
{
state.OnChange -= OnCultureChange;
}
private void OnCultureChange()
{
CultureInfo.CurrentCulture = state.currentCulture;
CultureInfo.CurrentUICulture = state.currentCulture;
StateHasChanged();
}
}
< /code>
Bild als Beispiel dafür, was im Moment passiert:
Blazor - ui CultureInfo zur Laufzeit ändern ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post