Erstens, seien Sie sich der Einschränkungen sehr bewusst. Für von Benutzern erstellte Inhalte betrachten Sie Community-Übersetzungen (unberechenbar), maschinelle Übersetzungen (unzuverlässig) oder bezahlte menschliche Übersetzer (teuer!), Wenn Sie Dinge lokalisieren möchten, die Ihre Benutzer in Ihre Anwendung eingeben. Sie können Ihre Benutzer bitten, zwei Versionen anzugeben - eine für Ihre Standardkultur (Englisch?) Und eine für ihre lokalisierte Kultur, sodass Sie eine Fallback-Übersetzung für andere Benutzer bereitstellen können.
Zweitens, seien Sie bereit für einige extrem lange Datenbankmigrationen ... Wenn Sie vier Spalten Text in einer Excel-Tabelle haben, haben Sie plötzlich mit dem Einfügen jedes Wertes in Ihr Übersetzungssystem, Abrufen der lokalisierten ID, und speichert dann , dass in der Tabelle, die Sie tatsächlich importieren - und SELECT *
geben Sie nur Phrasen-IDs, die Sie zurück in Strings auflösen müssen, indem Sie sie gegen Ihre Übersetzungstabellen lokalisieren.
Das heißt - Sie können viele der Lookup-Tabellen, Dropdown-Listen usw., die von der Datenbank in einem typischen Projekt gesteuert werden, lokalisieren. Andere Kommentare haben bereits das Speichern von StringId-Werten in der Datenbank erwähnt, die auf externe Ressourcendateien oder Tabellenkalkulationen verweisen. Wenn Sie jedoch ALLE lokalisierten Texte in der Datenbank neben den Daten selbst speichern möchten, ist dieser Ansatz möglicherweise hilfreich.
Wir haben eine Tabelle namens Phrase verwendet, die die ID und den Standardinhalt (Englisch) für jeden Text in Ihrer Anwendung enthält.
Ihre anderen Tabellen am Ende wie folgt aussehen:
CREATE TABLE ProductType (
Id int primary key,
NamePhraseId int, -- link to the Phrase containing the name of this product type.
DescriptionPhraseId int
)
Erstellen Sie eine zweite Tabelle Kultur, die die spezifischen und neutrale Kulturen enthält unterstützen Sie. Für Bonuspunkte implementieren Sie diese Tabelle als selbstreferenziellen Baum (jeder Culture-Datensatz enthält eine nullbare ParentCultureCode-Referenz), sodass Sie von bestimmten Kulturen ("fr-CA" für kanadisches Französisch) auf neutrale Kulturen ("fr") zurückgreifen können wenn keine regionale Lokalisierung vorhanden), auf Ihre invariant/Standardkultur (in der Regel ‚en‘, weil es so weit gesprochen)
Ihre aktuellen Übersetzungen in einer LocalizedPhrase Tabelle, die wie folgt aussieht:
CREATE TABLE LocalizedPhrase (
PhraseId int primary key,
CultureCode varchar(8) primary key,
Content nvarchar(255) -- the actual localized content
)
können Sie Erweitern Sie dieses Modell, wenn Sie männlich/weiblich-spezifische Lokalisierungen angeben möchten:
CREATE TABLE GenderedLocalizedPhrase (
PhraseId int primary key,
CultureCode varchar(8) primary key,
GenderCode char(1) primary key, -- 'm', 'f' or '?' - links to Gender table
Content nvarchar(255)
)
Sie sollten dieses gesamte Tabellendiagramm im Speicher zwischenspeichern und Ihre Abfrage-/Join-Strategien entsprechend ändern. Das Zwischenspeichern der Lokalisierungen innerhalb von Phrasenklassen und das Überschreiben der ToString() - Methode für das Phrase-Objekt zur Überprüfung der aktuellen Thread-Kultur ist ein Ansatz. Wenn Sie das Zeug in Ihre Fragen versuchen und tun, werden Sie eine erhebliche Leistungskosten entstehen und jede Abfrage wird am Ende wie folgt suchen:
-- assume @MyCulture contains the culture code ('ca-FR') that we are looking for:
SELECT
Product.Id,
Product.Name,
COALESCE(ProductStatusLocalizedPhrase.Content, ProductStatusPhrase.Content) as ProductStatus,
COALESCE(ProductTypeLocalizedPhrase.Content, ProductTypePhrase.Content) as ProductType,
FROM Product
INNER JOIN ProductStatus ON Product.StatusId = ProductStatus.Id
INNER JOIN Phrase as ProductStatusPhrase ON ProductStatus.NamePhraseId = Phrase.Id
LEFT JOIN LocalizedPhrase as ProductStatusLocalizedPhrase
ON ProductStatus.NamePhraseId = ProductStatusLocalizedPhrase.Id and CultureCode = @MyCulture
INNER JOIN ProductType ON Product.TypeId = ProductType.Id
INNER JOIN Phrase as ProductTypePhrase ON ProductType.NamePhraseId = Phrase.Id
LEFT JOIN LocalizedPhrase as ProductTypeLocalizedPhrase
ON ProductType.NamePhraseId = ProductTypeLocalizedPhrase.Id and CultureCode = @MyCulture