LanguageSelector
Descriere Generală
Componenta LanguageSelector
oferă o interfață dropdown pentru schimbarea limbii/culturii aplicației. Permite utilizatorilor să comute între limbile suportate (Română, Engleză, Rusă) cu actualizare automată a întregii aplicații. Componenta folosește JavaScript interop pentru persistarea selecției și reîncarcă pagina pentru a aplica noua cultură.
Ghid de Utilizare API
Exemplu de bază
<LanguageSelector />
În header-ul aplicației
<FodHeader>
<div class="header-actions">
<LanguageSelector />
<UserMenu />
</div>
</FodHeader>
În meniul de navigare
<nav class="navbar">
<div class="navbar-brand">
<img src="logo.png" alt="Logo" />
</div>
<div class="navbar-menu">
<NavLink href="/">Acasă</NavLink>
<NavLink href="/services">Servicii</NavLink>
</div>
<div class="navbar-tools">
<LanguageSelector />
</div>
</nav>
Cu stilizare personalizată
<div class="custom-language-selector">
<LanguageSelector />
</div>
<style>
.custom-language-selector .nav-link {
background-color: transparent;
border: 1px solid white;
border-radius: 4px;
padding: 0.5rem 1rem;
}
.custom-language-selector .dropdown-menu {
min-width: 200px;
}
</style>
Atribute disponibile
Componenta nu expune parametri publici. Limbile suportate sunt definite intern.
Limbi suportate
Cod cultură | Limba | DisplayName |
---|---|---|
ro-md | Română | Română (Republica Moldova) |
en-us | Engleză | English (United States) |
ru-ru | Rusă | Русский (Россия) |
Evenimente
Componenta nu expune evenimente publice. Schimbarea limbii declanșează o reîncărcare completă a paginii.
Metode publice
Componenta nu expune metode publice, dar conține metoda internă changeLanguage
pentru gestionarea schimbării.
Componente asociate
- Folosește JSInterop pentru persistarea culturii
- NavigationManager pentru reîncărcarea paginii
Stilizare
Structura HTML
<a class="nav-link dropdown-toggle text-white">
<i class="fas fa-globe mr-2"></i> Română (Republica Moldova)
<div class="dropdown-menu">
<button>Română (Republica Moldova)</button>
<button>English (United States)</button>
<button>Русский (Россия)</button>
</div>
</a>
Clase CSS utilizate
.nav-link
- Link-ul principal.dropdown-toggle
- Indicator dropdown.text-white
- Text alb.fas.fa-globe
- Iconița glob.dropdown-menu
- Meniul dropdown.mr-2
- Margin dreapta pentru iconiță
Personalizare
/* Container selector */
.language-selector-wrapper .nav-link {
color: #333 !important;
font-weight: 500;
}
/* Iconiță personalizată */
.language-selector-wrapper .fa-globe {
color: var(--primary-color);
}
/* Dropdown menu */
.language-selector-wrapper .dropdown-menu {
background-color: #fff;
border: 1px solid #ddd;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
/* Butoane în dropdown */
.language-selector-wrapper .dropdown-menu button {
display: block;
width: 100%;
padding: 0.5rem 1rem;
border: none;
background: none;
text-align: left;
cursor: pointer;
}
.language-selector-wrapper .dropdown-menu button:hover {
background-color: #f5f5f5;
}
Note și observații
- Page reload - Schimbarea limbii forțează reîncărcarea completă a paginii
- JS dependency - Necesită funcția JavaScript
blazorCulture.set
- IJSInProcessRuntime - Folosește runtime sincron pentru JS
- Culture persistence - Cultura este salvată și restaurată la reîncărcare
- Dropdown nefuncțional - Click handler pe butoane nu este conectat
Probleme cunoscute
- Event handler lipsă - Butoanele din dropdown nu au
@onclick
handler - Dropdown control - Nu există logică pentru afișare/ascundere dropdown
- Culture property - Proprietatea
Culture
setter nu este folosită
Implementare corectată
@using System.Globalization
@using Microsoft.JSInterop
@inject IJSRuntime JSRuntime
@inject NavigationManager Nav
<div class="language-selector">
<a href="javascript:void(0)"
class="nav-link dropdown-toggle text-white"
@onclick="ToggleDropdown">
<i class="fas fa-globe mr-2"></i> @CultureInfo.CurrentCulture.DisplayName
</a>
@if (isDropdownOpen)
{
<div class="dropdown-menu show">
@foreach (var culture in supportedCultures)
{
<button @onclick="() => ChangeLanguage(culture)">
@culture.DisplayName
</button>
}
</div>
}
</div>
@code {
private bool isDropdownOpen = false;
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("ro-MD"),
new CultureInfo("en-US"),
new CultureInfo("ru-RU"),
};
private void ToggleDropdown()
{
isDropdownOpen = !isDropdownOpen;
}
private async Task ChangeLanguage(CultureInfo culture)
{
if (CultureInfo.CurrentCulture != culture)
{
await JSRuntime.InvokeVoidAsync("blazorCulture.set", culture.Name);
Nav.NavigateTo(Nav.Uri, forceLoad: true);
}
}
}
Bune practici
- Loading state - Afișați un indicator în timpul schimbării limbii
- Confirmation - Pentru date nesalvate, cereți confirmare înainte de schimbare
- Accessibility - Adăugați atribute ARIA pentru screen readers
- Keyboard navigation - Suportați navigare cu tastatura
- Mobile friendly - Asigurați funcționare corectă pe dispozitive mobile
Concluzie
LanguageSelector oferă funcționalitate de bază pentru schimbarea limbii, dar implementarea actuală necesită îmbunătățiri pentru a fi complet funcțională. Cu ajustările sugerate, componenta poate oferi o experiență completă de selecție a limbii pentru aplicațiile multilingve.