Hilfe:TemplateData/JSON

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Dieses Hilfeseite vertieft die Realisierung und Syntax von TemplateData. Insbesondere wird die JSON-Struktur dokumentiert, die im Quelltext der Dokumentationsseiten sichtbar wird.

Struktur des TemplateData-Objekts

[Bearbeiten | Quelltext bearbeiten]

Das in <templatedata>…</templatedata> eingebettete JSON-Objekt (root) muss mindestens eine Komponente params haben. Zusätzlich sollte eine kurze Vorlagenbeschreibung mitgeliefert sein.

description
Optional
Kurzbeschreibung der Vorlage
Muss als Überschrift geeignet sein; also nur ultrakurz in wenigen Stichworten den Zweck nennen. Es sollte nur der eigentliche Zweck benannt werden, Einleitungsformalitäten wie „Vorlage zur“ sind redundant und sollten wegen beschränkten Platzes im Interface unterbleiben.
params
Objekt, das für jeden Vorlagenparameter ein Parameter-Objekt enthält.
Pflichtangabe; aber {} ausreichend für eine parameterlose Vorlage.
  • Typ: Objekt
format
Optional
Soll die Vorlage blockartig, d.h. ein Parameter je Zeile, oder alles auf einer Zeile ausgegeben werden?
  • Typ: block oder inline (Standard)
  • Freie Vereinbarung von Leerzeichen und Zeilenumbruch:[1] "{{_\n| _=_\n}}"
    • "{{_|_=_}}" entspricht inline
    • "{{_\n| _ = _\n}}" entspricht block
    • "{{_ |_=_}}" – vor jeder Pipe ein Leerzeichen, sonst kompakt
    • "\n{{_\n |_=_\n}}" – Einbindung auf neuer Zeile beginnend, bei jeder Parameterzeile auf neuer Zeile Pipe ein Leerzeichen eingerückt, Zuweisung kompakt
sets
Optional
Array mit Set-Objekten, auf die für Parametergruppen Bezug genommen wird.
  • Typ: Array
maps
Optional
Komponenten, die die Übertragung der Angaben in andere Strukturen ermöglichen.
Einziger bisher bekannter Fall: Komponente citoid (siehe Vorlage:Internetquelle), die Citoid-Parameter in Vorlagenparameter transferiert.
  • Typ: Objekt

Andere als diese fünf Komponenten sind in diesem Objekt auf der Dokumentationsseite nicht erlaubt.

Bei Abfragen über die API wird allerdings eine weitere Komponente zurückgeliefert:

paramOrder
Automatisch generiert
Array mit den Komponenten-Bezeichnern im Parameter-Objekt, und zwar in der Reihenfolge, in der die Parameter in einer Benutzeroberfläche präsentiert werden sollen.
Es wird automatisch anhand der physischen Abfolge in <templatedata> gebildet.
Das Array ist erforderlich, weil die Reihenfolge von Komponenten in einem Objekt beliebig und nicht vorhersagbar ist.

Der InterfaceText ist ein für Menschen lesbarer Text, der in der Vorlagendokumentation angezeigt wird.

Er kann in zwei Varianten auftreten:

  • Zeichenkette mit dem Text selbst.
  • Objekt mit Komponenten, wobei jeweils einem Sprachcode (wie de oder de-ch oder en) der entsprechende Text zugeordnet wird.
    • In der Darstellung auf der Dokumentationsseite der Vorlage wird die Projektsprache genutzt, da eine konstante Aufbereitung im Cache hinterlegt wird. uselang= ist hier also wirkungslos.
    • Dynamische Auswertungen des JSON-Objektes sehen alle Sprachvarianten und können bei intelligenter Programmierung die bevorzugte Sprache des Benutzers berücksichtigen.

Wie im gesamten JSON-Objekt ist kein Wikitext möglich; auch HTML-Formatierungen werden nicht umgesetzt.

Parameter-Objekt

[Bearbeiten | Quelltext bearbeiten]

Das Parameter-Objekt ist das Kernstück der Definition.

  • Weil es zum Auffinden ungültiger Parameterzuweisungen benutzt werden kann, müssen alle zulässigen Parameter einbezogen werden.
  • Zukünftig nicht mehr erwünschte Parameternamen können als deprecated (veraltet) gekennzeichnet werden.

Die Komponente params des TemplateData-Objekts ist ein Objekt, bei dem jedem Namen eines Vorlagenparameters eine Einzelspezifikation zugewiesen wird:

 { "description": "Zweck der Vorlage",
   "params": { "ParameterA": { ... Einzelspezifikation A ... },
               "ParameterB": { ... Einzelspezifikation B ... },
               usw. usw.
             }
 }
Einzelspezifikation; alle Komponenten optional
Bezeichnung Komponente JS-Datentyp Beschreibung
Bezeichnung label InterfaceText
null
Eine kurze Beschreibung für den Parameter.
Der eigentliche Parametername kann stark abgekürzt oder lediglich eine Nummer sein.
Es sollte versucht werden, sich auf zwei Dutzend Zeichen zu beschränken.
Beschreibung description InterfaceText
null
Eine kurze Erläuterung zum Parameter.
Typ type string

Der „Datentyp“ des Parameterwertes (alle Vorlagenparameter sind Zeichenketten) für Gültigkeitsprüfungen. Einer von:

  • "unknown" (Nicht definiert) – (Vorgabe)
  • "boolean" (Boolesch) – Wahrheitswert, d. h. 0 für nein und 1 für ja
  • "content" (Inhalt) – Wikitext, d. h. formatierter Text, Links, Bilder, usw.
  • "date" (Datum) – Datum/Zeit nach ISO 8601
  • "line" (Zeile) – kurzer Text, wie er in einzeiligem <input> vorkommen kann (Name, Label)
  • "number" (Zahl) – lässt sich als Zahl interpretieren
  • "string" (Zeichenfolge) – beliebige Zeichenkette
  • "url" (Zeichenfolge) – soll als URL geeignet sein
  • "wiki-file-name" (Datei) – geeignet als Dateiname ohne Präfix wie Datei:, File: usw.; muss noch nicht existieren
  • "wiki-page-name" (Seite) – geeignet als Seitenname; muss noch nicht existieren
  • "wiki-template-name" (Seite) – geeignet als Vorlagenname; muss noch nicht existieren.
    • Der Unterschied zu wiki-page-name bleibt im Dunkeln; jede reguläre Seite lässt sich einbinden.
  • "wiki-user-name" (Benutzer) – geeignet als Benutzername; muss noch nicht existieren
  • "unbalanced-wikitext" (Unausgeglichener Wikitext) – Wikitext-Fragment, das nicht wohlgeformte Einzelbestandteile enthält, z. B. {{echo|before=<u>|after=</u>}}

Veraltet aber weiterhin funktionsfähig sind die folgenden Codes, die baldmöglichst ersetzt werden sollten:

  • "string/line" – jetzt nur "line"
  • "string/wiki-page-name" – jetzt nur "wiki-page-name"
  • "string/wiki-user-name" – jetzt nur "wiki-user-name"
Erforderlich required boolean Status-Parameter
  • true, falls es sich bei diesem Vorlagenparameter um einen Pflichtparameter handelt.
    Wenn ein Parameter als notwendig markiert ist, kann man dieses Feld nicht löschen, wenn man eine neue Vorlage hinzufügt, oder eine bestehende Vorlage bearbeitet.
Vorgeschlagen suggested boolean Status-Parameter
  • true, falls dieser Vorlagenparameter in den meisten Fällen erwartet wird bzw. standardmäßig angezeigt werden soll. (Der VE ergänzt diesen Parameter bei der Nachbearbeitung)
Veraltet deprecated boolean
string
Status-Parameter
  • true, falls veraltet
  • Zeichenkette, mit kurzer Begründung für den Anlass; etwa als Tooltip
Beispiel example InterfaceText
null
Mögliche Beispielwerte für den Parameter.
Standard default InterfaceText
null
Standardwert, den die Vorlage annimmt, wenn der entsprechende Parameter nicht ausgefüllt wird. Dies ist lediglich eine visuelle Hilfe, d. h. wenn der entsprechende Parameter nicht vom Benutzer ausgefüllt wird und ein default-Wert angegeben ist, wird dieser beim Speichern nicht als Standardwert übernommen, sondern der Parameter bleibt leer.
Werteliste suggestedvalues Array als [ , ] Das Array enthält eine Aufzählung von Zahlen oder Zeichenketten, welche die erwarteten und meist allein zulässigen Werte angeben. In Formularen kann daraus ein Auswahlmenü generiert werden.
Autowert autovalue string Standardwert, mit dem der bislang leere Vorlagenparameterwert ausgefüllt werden soll, z. B. {{subst:#time:Y-m-d}} wenn ein Parameter mit dem aktuellen Datum (im Format JJJJ-MM-TT) ausgefüllt werden soll.
inherits string Name eines anderen Parameters, dessen Spezifikation als Basis für diesen Parameter geerbt werden soll. Zusätzlich angegebene Komponenten überschreiben diese Ausgangswerte.
Aliasse aliases Array of strings

Aufzählung von Aliasnamen. Ein Aliasname ist ein in der Vorlagenprogrammierung verwendeter Alternativname, der genauso wirksam ist wie die Standardform.[2] Für einen reinen Aliasnamen wird keine gesonderte Einzelspezifikation angelegt.
Wenn zusätzliche Informationen erforderlich sind, ist eine gesonderte Einzelspezifikation zu benutzen und ggf. als "deprecated" zu markieren.

Die Spalte „Bezeichnung“ in der obigen Tabelle gibt den Namen dieses Parameter im eingebauten Vorlagendokumentations-Editor wieder. Falls dort ein „–“ steht, kann dieser Parameter über den Editor nicht angegeben werden.

Das Array sets kann Objekte mit der folgenden Struktur enthalten:

Komponente Datentyp Beschreibung
label InterfaceText Eine kurze Bezeichnung für den Parametersatz.
Es sollte versucht werden, sich auf zwei Dutzend Zeichen zu beschränken.
params Array Ein Array mit Namen von Parametern in diesem Set.
Es muss sich um Bezeichner handeln, die im Parameter-Objekt definiert sind.

Zurzeit (Sommer 2015) ist noch keine Realisierung in der Benutzeroberfläche des VisualEditor ersichtlich.[3]

  • Eine Zuweisung besteht aus dem Namen der Komponente, einem Doppelpunkt : und dem zugewiesenen Wert.
  • Während dies bei allgemeinen JavaScript-Objekten nicht erforderlich ist, muss in JSON der Name in Anführungszeichen " eingeschlossen werden.
  • Jedes Objekt ist in geschweifte Klammern {} einzuschließen.
  • Als Wert kann ebenfalls ein neues Objekt auftreten.
  • Zeichenketten sind in " einzuschließen.
  • In einem Objekt aufeinanderfolgende Zuweisungen (=Komponenten) werden durch Kommata getrennt. Nach der letzten Komponente darf kein Komma stehen.
  • Leerzeichen und Zeilenumbrüche außerhalb von Zeichenketten sind beliebig.
  • Soll im Text " vorkommen, muss es durch \" escaped werden; ein einzelner \ ist als \\ anzugeben.
  • Das allereinfachste zulässige TemplateData-Element wäre damit:
    <templatedata>{"params":{}}</templatedata>

Ein geeigneter Einrückungsstil sollte die Lesbarkeit für Menschen sichern.

Die syntaktische Gültigkeit wird bei der Seitenvorschau überprüft; bei Syntaxfehlern das Feld rot ausgefüllt. Die Technik-Werkstatt hilft weiter.

Zwei einfachere und zwei komplexere Beispiele für die Definition und die Darstellung auf der Dokumentationsseite (Präsentation gegenüber MediaWiki verbessert).

Erläuterung des Status anhand eines Minimalbeispiels

[Bearbeiten | Quelltext bearbeiten]

Es gibt vier verschiedene Status-Niveaus eines Parameters:

  1. erforderlich,
  2. vorgeschlagen (hiermit ist eher „empfohlen“ gemeint),
  3. optional
  4. veraltet

Diese werden durch folgende drei Boolean-Parameter beeinflusst:

  1. required (erforderlich)
  2. suggested (vorgeschlagen)
  3. deprecated (veraltet).

Dabei schließen sich required = TRUE und deprecated = TRUE („empfohlen“ und „veraltet“) zusammen aus und erzeugen in dieser Kombination eine Fehlermeldung.

Standardwert für Status: Ist keiner der Parameter angegeben, so ist der Status standardmäßig optional.

Das folgende Beispiel soll den Zusammenhang zwischen den Parametern so reduziert wie möglich verdeutlichen:

{{TemplateData|lazy=1|JSON=
{ "description": "Darstellung von Pflicht-, vorgeschlagenen, optionalen und veralteten Parametern",
  "params": { "1": { "description": "<code>required</code> = '''TRUE'''",
                     "required":    true
                   },
              "2": { "description": "<code>required</code> = ''FALSE''<br /> könnte auch weggelassen werden, siehe Parameter&nbsp;3",
                     "required":    false
                   },
              "3": { "description": "ohne Angabe eines der drei Status-Parameter"
                   },
              "4": { "description": "<code>suggested</code> = '''TRUE'''",
                     "suggested":   true
                   },
              "5": { "description": "<code>deprecated</code> = '''TRUE'''",
                     "deprecated":  true
                   },
              "6": { "description": "<code>deprecated</code> = '''TRUE''' überschreibt<br /> <s><code>suggested</code> = '''TRUE'''</s>",
                     "suggested":   true,
                     "deprecated":  true
                   }
            }
}
}}
Darstellung von Pflicht-, vorgeschlagenen, optionalen und veralteten Parametern
11
required = TRUE
22
required = FALSE
könnte auch weggelassen werden, siehe Parameter 3
33
ohne Angabe eines der drei Status-Parameter
44
suggested = TRUE
55
deprecated = TRUE
66
deprecated = TRUE überschreibt
suggested = TRUE
Suggesting deprecated 6

Vorlage:Commonscat

[Bearbeiten | Quelltext bearbeiten]

Der nachstehende Code bewirkt die darunter wiedergegebene Tabelle, wie sie für {{Commonscat}} benutzt wird. Daraus wird diese für Werkzeuge abrufbare Struktur erzeugt.

{{TemplateData|JSON=
{ "description": "Verlinken einer Kategorie auf Wikimedia Commons",
  "params": { "1": { "label":       "Commons-Kategorie",
                     "description": "Die zu verlinkende Commons-Kategorie",
                     "default":     "(Name der aktuellen Seite)",
                     "type":        "wiki-page-name",
                     "required":    false
                   },
              "2": { "label":       "Deutscher Name",
                     "description": "Angezeigter Name der Kategorie auf Deutsch, wenn abweichend",
                     "type":        "string",
                     "required":    false
                   },
              "3": { "label":       "Sammlung von …",
                     "description": "s = „Sammlung von Bildern“",
                     "default":     "Sammlung von Bildern, Videos und Audiodateien",
                     "type":        "string",
                     "required":    false
                   }
            }
}
}}


Verlinken einer Kategorie auf Wikimedia Commons
Commons-Kategorie1
Die zu verlinkende Commons-Kategorie
Standard
(Name der aktuellen Seite)
Deutscher Name2
Angezeigter Name der Kategorie auf Deutsch, wenn abweichend
Sammlung von …3
s = „Sammlung von Bildern“
Standard
Sammlung von Bildern, Videos und Audiodateien

"inherits" – Vorlage:Anker

[Bearbeiten | Quelltext bearbeiten]

Der nachstehende Code bewirkt die darunter wiedergegebene Tabelle (Vorlage:Anker). Hier wird für die wiederholten optionalen Parameter die Komponente "inherits" genutzt. Daraus wird diese für Werkzeuge abrufbare Struktur erzeugt.

{{TemplateData|JSON=
{ "description": "Linkziel(e) zu einem Abschnitt oder einem Element in dieser Wiki-Seite vereinbaren",
  "params": { "1": { "label":       "Anker-1",
                     "description": "Fragmentbezeichner",
                     "type":        "string",
                     "required":    true },
              "2": { "label":       "Anker-2",
                     "inherits":    "1",
                     "description": "Weiterer Fragmentbezeichner",
                     "required":    false },
              "3": { "label":    "Anker-3",
                     "inherits": "2" },
              "4": { "label":    "Anker-4",
                     "inherits": "2" },
              "5": { "label":    "Anker-5",
                     "inherits": "2" },
              "6": { "label":    "Anker-6",
                     "inherits": "2" }
            }
}
}}


Linkziel(e) zu einem Abschnitt oder einem Element in dieser Wiki-Seite vereinbaren
Anker-11
Fragmentbezeichner
Anker-22
Weiterer Fragmentbezeichner
Anker-33
Weiterer Fragmentbezeichner
Anker-44
Weiterer Fragmentbezeichner
Anker-55
Weiterer Fragmentbezeichner
Anker-66
Weiterer Fragmentbezeichner

"aliases" – Vorlage:TemplateDataGenerator

[Bearbeiten | Quelltext bearbeiten]

Der nachstehende Code bewirkt die darunter wiedergegebene Tabelle (Vorlage:TemplateDataGenerator). Hier wird für die alternative Variante des Sortierungs-Parameters die Komponente "aliases" genutzt. Daraus wird diese für Werkzeuge abrufbare Struktur erzeugt.

{{TemplateData|JSON=
{ "description": "Erstellt aus der Vorlagenprogrammierung ein Grundgerüst für die Dokumentation der vorkommenden Parameter mittels TemplateData",
  "params": { "sort":
              { "label":       "Sortierung",
                "description": "Alphabetische Sortierung, wenn Ziffer 1 angegeben",
                "type":        "string",
                "required":    false,
                "default":     "0",
                "aliases":     [ "1" ]
              }
            }
}
}}


Erstellt aus der Vorlagenprogrammierung ein Grundgerüst für die Dokumentation der vorkommenden Parameter mittels TemplateData
Sortierungsort
1
Alphabetische Sortierung, wenn Ziffer 1 angegeben
Standard
0

"sets" – unsigned

[Bearbeiten | Quelltext bearbeiten]

Der nachstehende Code bewirkt die darunter wiedergegebene Tabelle, in der die Komponente "sets" verwendet wird. (vorläufig bis deutschsprachiger Ersatz):

{
	"description": "Label unsigned comments in a conversation.",
	"params": {
		"user": {
			"label": "Username",
			"type": "wiki-user-name",
			"required": true,
			"description": "User name of person who forgot to sign their comment.",
			"aliases": ["1"]
		},
		"date": {
			"label": "Date",
			"description": {
				"en": "Timestamp of when the comment was posted, in YYYY-MM-DD format.",
				"de": "Zeitpunkt, zu dem der Kommentar geschrieben wurde; im Datumsformat JJJJ-MM-TT."
			},
			"aliases": ["2"],
			"suggested": true
		},
		"year": {
			"label": "Year",
			"type": "number"
		},
		"month": {
			"label": "Month",
			"inherits": "year"
		},
		"day": {
			"label": "Day",
			"inherits": "year"
		},
		"comment": {
			"required": false
		}
	},
	"sets": [
		{
			"label": "Date",
			"params": ["year", "month", "day"]
		}
	]
}


Label unsigned comments in a conversation.
Usernameuser
1
User name of person who forgot to sign their comment.
Datedate
2
Zeitpunkt, zu dem der Kommentar geschrieben wurde; im Datumsformat JJJJ-MM-TT.
Yearyear
Monthmonth
Dayday
commentcomment

Hilfsmittel und Hilfen

[Bearbeiten | Quelltext bearbeiten]

Die Verwendung von TemplateData in dieser Wikipedia wird protokolliert unter:

  • Special:PagesWithProp/templatedata
  • Kategorie:Vorlage:mit TemplateData – Besser lesbar und würde keine Weiterleitungen aufzählen; dafür sind momentan zwangsläufig Vorlagenprogrammierung und Dokumentationsseite aufgeführt.
    • Die Kategorisierung zählt nur Verwendungen auf, die in {{TemplateData}} eingeschlossen sind. Die Aufzählung der Seiten mit der templatedata-Eigenschaft auf der Spezialseite muss identisch sein mit den Doku-Seiten in der Kategorie.

Debugger / Validierer

[Bearbeiten | Quelltext bearbeiten]

Die syntaktische Gültigkeit des Codes kann vor dem Speichern überprüft werden; in der Seitenvorschau wird entweder die erwartete Tabelle gezeigt, oder im Fehlerfall das Feld rot ausgefüllt.

  • Wenn bei Vorschau der Dokumentationsseite die Fehlermeldung Syntaxfehler in JSON erscheint, aber mit den Werkzeugen kein Fehler im JSON-Code gefunden wurde, dann stimmt etwas mit dem abschließenden Tag nicht (etwa vergessener Schrägstrich).

Speziell für JSON-Code eignet sich:

  • jsonlint.com – der Code kann auf diese Seite kopiert werden und zeigt die fehlerhaften Zeilen.

Jeder andere JavaScript-Validierer kann ebenso zur ersten Fehlersuche verwendet werden.

  • jshint.com – Gleiches Prinzip; Analyse mittels JSHint.
  • jsonformatting.com – Hier können Sie das Format überprüfen und eine Reihe von Vorgängen ausführen, z. B. die Formatierung.

Alternativ zum eingebauten Vorlagendokumentations-Editor:

  • liefert das Benutzerskript jsonXMLutils aus der Vorlagenprogrammierung oder aber der Kopiervorlage einer älteren Dokumentation oder dem Quelltext einer beliebigen Einbindung ein Grundgerüst.
    • Nebenbei formatiert es auch den JSON-Code und analysiert ihn auf bestimmte mutmaßliche inhaltliche Fehler.
    • Eine XML-Struktur für den Vorlagenmeister kann aus jeder mit TemplateData ausgestatteten Vorlagendokumentation generiert werden.
  • kann mit dem vorübergehendem Einfügen von {{subst:TemplateDataGenerator}} in die Dokumentationsseite ebenfalls ein Grundgerüst generiert werden.
  • gibt es ein Benutzerskript in der französisch- und englischsprachigen Wikipedia mit einem alternativen Dialogmenü: fr:User:Ltrlg/scripts/TemplateDataEditor.js bzw. en:User:NicoV/TemplateDataEditor. Dieses befindet sich jedoch auf einem älteren Stand und unterstützt daher nicht alle Datentypen oder den „Vorgeschlagen“-Parameter (suggested), dafür aber den deprecated- und den inherited-Parameter.

Bei anhaltenden Problemen hilft die Technik-Werkstatt weiter.

Die TemplateData-Verwendung wurde im Frühsommer 2013 weltweit gestartet.

Abfrage über die API

[Bearbeiten | Quelltext bearbeiten]

Mittels der API kann zu einer Vorlage die gültige Definition zu einer Vorlage abgefragt werden. Damit stehen sie anderen Software-Werkzeugen zur Verfügung.

Die spezifische API-Syntax ist automatisch generiert abrufbar, aber nicht sehr aussagekräftig.

Ein Aufruf für die durch Software unmittelbar nutzbare Form wäre action=templatedata&titles=Template:Commonscat – in einer menschenfreundlicher formatierten Darstellung siehe oben.

Anpassung der Darstellung der Parametertabelle

[Bearbeiten | Quelltext bearbeiten]

Für das Tag <TemplateData> sind zurzeit keine eigenen Attribute vorgesehen.

Die Standard-Attribute id= class= style= werden nicht beanstandet; sind jedoch zurzeit wirkungslos.

Die optische Darstellung der auf der Dokumentationsseite angezeigten Tabelle kann angepasst werden.

Selektor Element
.mw-templatedata-doc-wrap Gesamte Beschreibung
.mw-templatedata-doc-desc Aufgabenbeschreibung
.mw-templatedata-doc-params Tabelle
.mw-templatedata-doc-param-name Parametername
.mw-templatedata-doc-param-type Parametertyp
.mw-templatedata-doc-muted Standardwert

Weitere Informationen

[Bearbeiten | Quelltext bearbeiten]
MediaWiki: Technische Dokumentation (englisch) – Freie Wikisoftware (englisch)
  1. Wie bei jeder anderen Vorlagensyntax gilt, falls der JSON-Code als Vorlagenparameter übergeben wird: Pipe-Symbole sind geeignet zu maskieren, etwa durch {{!}} oder &#124; – und unbalancierte }} desgleichen.
  2. Beispiele in der Vorlage:
    • {{{Stadt|{{{city|}}}}}}
    oder
    • {{{5|{{{Sonderfall|}}}}}}
    Dann ist city ein Alias für Stadt und Sonderfall ein Alias für den fünften unbenannten Parameter.
  3. Sinnvolle Anwendungen wären:
    • Datum (Tag, Monat, Jahr)
    • Uhrzeit (Stunde, Minuten, Sekunden, Millisekunden, Zeitzone)
    • Koordinate (Grad, Minuten, Sekunden, Himmelsrichtung)