Lokalizacja aplikacji webowej

0

Jak oraz czy lokalizować aplikację webową?
Domyślnym językiem jest angielski, lecz zastanawiam się czy większa ilość obsługiwanych języków nie byłaby dobrym wyjściem. O ile lokalizacja podstawowych treści (newsy, menusy) nie jest problemem to rzeczy dodawane przez użytkowników już tak. Otóż użytkownik może dodać 'produkt' do bazy danych i w tym miejscu zastanawiam się jak rozwiązać problem lokalizacji - czy pozwalać trzymać w bazie duplikaty (np. samochód i car) czy w tabeli stworzyć osobne kolumny na nazwę/opis/co tam potrzeba w różnych językach czy też po prostu olać temat?

1

Ja widzę następujące wyjścia:

  1. Olać temat (to użytkownicy odpowiadają za dodawane treści i to im powinno zależeć na jakości tychże).
  2. Olać temat z zastrzeżeniem, że treści mogą być umieszczane wyłącznie po angielsku/klingońsku/esperanto, czy jaki tam chcecie.
  3. Dać użytkownikom możliwość dodawania nowych lokalizacji, czyli powielania pól nazw/opisów w tabeli i dodać odpowiedni filtr w przeszukiwarce bazy (co w sumie wiąże się też z p.1)
  4. Stworzyć dedykowane wersje językowe z oddzielnymi bazami, ale nie wiem, czy do tej tajemniczej Aplikacji Webowej ma to zastosowanie.
1
hcubyc napisał(a):

czy pozwalać trzymać w bazie duplikaty (np. samochód i car) czy w tabeli stworzyć osobne kolumny na nazwę/opis/co tam potrzeba w różnych językach czy też po prostu olać temat?

Ale skąd my mamy wiedzieć, czy chcesz olać temat, czy nie? :P

Ale jeśli nie chcesz olewać, to nie rób kolumn w tabelach, tylko zrób dodatkowe tabele. Zamiast np. kolumny Name w tabeli Products zrób tabelę ProductNames (Id, EntityId, LanguageId, Value), gdzie EntityId to klucz obcy na Products.Id. Dzięki temu lista dostępnych w aplikacji języków może być edytowana przez użytkownika, łatwiej to też zmapować taką konstrukcję do obiektów. Wszystkie tabele tego typu będą miały jednakową strukturę, więc mogą zostać zmapowane do jednej klasy, która zapewni wygodny dostęp do tłumaczeń po stronie aplikacji.

0

Dzięki za odpowiedzi, użytkownicy będą mieli dodawać produkty spożywcze, więc od ziemniaków po alkohole i los wie co jeszcze.

1

Lokalizacje fajnie zrobiono W NopCommerce:

    public partial class LocalizedProperty : BaseEntity
    {
        /// <summary>
        /// Gets or sets the entity identifier
        /// </summary>
        public virtual int EntityId { get; set; }

        /// <summary>
        /// Gets or sets the language identifier
        /// </summary>
        public virtual int LanguageId { get; set; }

        /// <summary>
        /// Gets or sets the locale key group
        /// </summary>
        public virtual string LocaleKeyGroup { get; set; }

        /// <summary>
        /// Gets or sets the locale key
        /// </summary>
        public virtual string LocaleKey { get; set; }

        /// <summary>
        /// Gets or sets the locale value
        /// </summary>
        public virtual string LocaleValue { get; set; }
        
        /// <summary>
        /// Gets the language
        /// </summary>
        public virtual Language Language { get; set; }
    }

Encje, których pola są lokalizowane dziedziczą po pustym mark interfejsie ILocalizedEntity.
Lokalizowane nazwy są zwracane przez extension method: (minus za wygode, to uzycie wewnatrz service locatora ale mozna do tego utworzyc odrebny serwis)

        public static string GetLocalized<T>(this T entity,
            Expression<Func<T, string>> keySelector)
            where T : BaseEntity, ILocalizedEntity
        {
            var workContext = EngineContext.Current.Resolve<IWorkContext>();
            return GetLocalized(entity, keySelector, workContext.WorkingLanguage.Id);
        }

uzycie:

Product product = productService.Get(1);
string ProductName = product.GetLocalized(x => x.Name)
1

Można zrobić coś na zasadzie:

class CurrentLanguageProvider
{
    public int GetCurrentLanguageId();
}

class MultiLanguageString
{
    private CurrentLanguageProvider _currentLanguageProvider;

    private Dictionary<int, string> values;

    CurrentLanguageProvider currentLanguageProvider
    {
        _currentLanguageProvider = currentLanguageProvider;
    }

    public string Value
    {
        return this.values[_currentLanguageProvider.GetCurrentLanguageId()];
    }
}

Wówczas użycie to po prostu:

string productName = product.Name;

1 użytkowników online, w tym zalogowanych: 0, gości: 1