Diese Projektseite stellt Möglichkeiten dar, bei der Programmierung von Lua-Modulen andere Sprachen und Projekt-Konstellationen zu berücksichtigen.

Ein Nebeneffekt ist, dass durch bessere Strukturierung auch die Wartung und Pflege im eigenen Projekt einfacher und sicherer wird.

Einige grundsätzliche Möglichkeiten werden dargestellt und verglichen.

Grundsätzlich: Parametrisierung

[Bearbeiten | Quelltext bearbeiten]

Textteile (in menschlicher Sprache) und potentiell veränderliche Konfigurationen (etwa die Namen von Seiten) sollen nie im Inneren des Codes versteckt werden.

Systemvariablen nutzen

[Bearbeiten | Quelltext bearbeiten]

Die momentane Konfiguration und Umgebung kann ausgelesen werden. So sind die Namen und Nummern zu den Namensräumen bekannt.

ns = mw.site.namespaces.Module.id
sT = mw.site.namespaces.Template.name

Die vorstehende Anweisung liest die momentane Nummer des Modul-Namensraums (828) und den deutschsprachigen Bezeichner des Vorlagen-Namensraums aus.

Siehe dazu allgemein: Hilfe:Lua/Umgebung.

Auch alle dort nicht angebotenen Parserfunktionen sind nach diesem Prinzip verfügbar, dann über frame:preprocess{} (siehe LuaWiki.getVariable()).

Minimallösung

[Bearbeiten | Quelltext bearbeiten]

Alle möglicherweise anzupassenden Texte oder Zahlen werden in Variablen geschrieben. Die Wertzuweisung erfolgt in einem geschlossenen Block am Beginn des Moduls.

Vorteile

Nachteile

Automatische Anpassung

[Bearbeiten | Quelltext bearbeiten]

Für alle Sprachen, die unterstützt werden sollen, wird eine Tabelle angelegt. Es wird automatisch festgestellt, welche Sprache oder Projekt gerade aktiv ist, und das entsprechende Profil ausgewählt.

local l10nDef = { }
l10nDef[ "en" ] = {
    msgA = "Message 'A'",
    msgB = "Message 'B'"
}
l10nDef[ "de" ] = {
    msgA = "Nachricht 'A'",
    msgB = "Nachricht 'B'"
}
l10nDef[ "als" ] = l10nDef[ "de" ]
local l10n = l10nDef[ mw.language.getContentLanguage():getCode() ]
if not l10n then
    l10n = l10nDef.en
end
say = l10n.msgA

Die Sprache des Inhalts getContentLanguage() ist für die Darstellung in den Seiten passend; nicht die Spracheinstellung der momentanen Bearbeiter.

Analog zur Sprachkonfiguration kann auch auf die Projekt-URL Bezug genommen werden:

local l10nDef = { }
l10nDef[ "//de.wikipedia.org" ] = {
    nsDoc    = 4,    -- WPNR
    warnTalk = "Diskussionsseite fehlt"
}
local l10n = l10nDef[ mw.site.server ]
if not l10n then
    l10n = l10nDef[ "*" ]   -- defaults; fallback
end
ns = l10n.nsDoc

Vorteile

Nachteile

Globale Tabellen

[Bearbeiten | Quelltext bearbeiten]

Auf Commons sind mittlerweile Tabellen verfügbar bzw. können angelegt werden, die aus jedem Wiki ausgelesen werden können und Übersetzungslisten zu Schlüsselwörtern enthalten. tabData@Multilingual unterstützt dabei.

Systemnachrichten

[Bearbeiten | Quelltext bearbeiten]

Die Textstücke können im MediaWiki-Namensraum abgelegt werden.

c = mw.language.getContentLanguage():getCode()
m = mw.message.new( "lua-module-MeinModul-" .. stored )
m:inLanguage( c )
say = m:plain()

Vorteile

Nachteile

Umhüllende Vorlage

[Bearbeiten | Quelltext bearbeiten]

Nur sinnvoll, wenn das #invoke lediglich in genau einer Vorlage vorkommt; das Modul also zur Unterstützung einer einzelnen Vorlage dient. Dann können die Textbausteine in die Parameterliste des #invoke eingeschlossen werden. Die Vorlage bleibt unter einem lokalen Namen für die allgemeine Benutzung mit einfacher Syntax verfügbar; #invoke und die angepassten Textstücke werden vor den Benutzern verborgen.

Vorteile

Nachteile

Unter-Vorlage

[Bearbeiten | Quelltext bearbeiten]

Die Textbausteine können auf eine beliebige Seite geschrieben werden, die unter Angabe des Schlüsselworts als Parameter eingebunden wird. Das ist mit der Funktion frame:expandTemplate{} möglich.

Vorteile

Nachteile

Unter-Modul

[Bearbeiten | Quelltext bearbeiten]

Ein geeignetes Unter-Modul für jede Sprache kann die Anpassung übernehmen, indem die zurückgegebene Tabelle die spezifischen Zeichenketten usw. enthält. Sie ist mit require() verfügbar, und die Namensgebung ist in eigener Hand. Auch mw.loadData() käme zur Effizienzsteigerung in Frage, falls die Tabelle keine Funktionen enthält.

Vorteile

Nachteile

Rückfallposition

[Bearbeiten | Quelltext bearbeiten]

Es muss immer damit gerechnet werden, dass externe Vereinbarungen oder die lokale Sprache nicht verfügbar sind.

Weitere Informationen

[Bearbeiten | Quelltext bearbeiten]