Die numeric for-Schleife in Lua ist ein zentrales Konstrukt zur wiederholten Ausführung eines Codeblocks über einen festgelegten Zahlenbereich. Sie benötigt drei Parameter: einen Anfangswert, ein Limit und einen Schrittwert. Dabei beginnt die Schleife beim Anfangswert und erhöht (oder verringert) die Zählvariable bei jedem Durchlauf um den Schrittwert, bis der Grenzwert erreicht oder überschritten wird. Ein wichtiges Detail ist, dass das Vorzeichen des Schrittwerts stets zur Bewegungsrichtung von Anfangswert zum Limit passen muss. Andernfalls wird der Schleifenkörper niemals ausgeführt, da die Abbruchbedingung sofort erfüllt ist. So wird eine Schleife mit start=1, limit=5 und step=-1 nicht durchlaufen, ebenso wenig eine mit start=5, limit=1 und step=1. Der Variablenbereich der Zählvariable ist auf die Schleife lokal beschränkt, was verhindert, dass sie außerhalb der Schleife sichtbar ist und unbeabsichtigte Seiteneffekte entstehen.
Die Werte für Anfang, Limit und Schritt sind beliebige numerische Ausdrücke, wodurch die Schleife flexibel auf Programmzustände oder Eingaben reagieren kann. Ein typisches Beispiel ist die Iteration über die Länge eines Arrays oder einer Tabelle, um alle Elemente sequentiell zu verarbeiten.
Demgegenüber steht die generic for-Schleife, die nicht auf eine einfache numerische Progression angewiesen ist, sondern eine Iterator-Funktion nutzt, die in jeder Iteration den nächsten Wert aus einer Sequenz liefert. Diese Schleife eignet sich hervorragend zum Durchlaufen von Tabellen, Datenstrukturen oder dynamisch erzeugten Reihen. Dabei ruft die Laufzeitumgebung die Iterator-Funktion mit einem Zustandswert und einem Anfangswert auf, bis nil zurückgegeben wird und die Iteration endet.
Lua stellt mit pairs und ipairs zwei gebräuchliche Iteratoren bereit: pairs liefert alle Schlüssel-Wert-Paare einer Tabelle, unabhängig vom Typ der Schlüssel und ohne garantierte Reihenfolge. ipairs dagegen iteriert über die numerischen Schlüssel ab 1 aufsteigend, bis eine Lücke im Index erkannt wird, und garantiert so eine vorhersehbare, sequenzielle Reihenfolge. pairs ist besonders nützlich für assoziative Arrays oder Tabellen mit gemischten Schlüsseln, während ipairs für klassische Arrays verwendet wird.
Die Unterscheidung und das korrekte Verständnis dieser Schleifenarten ist essentiell, um Fehler wie etwa das Übersehen von Iterationsgrenzen oder das unerwartete Auslassen von Schleifendurchläufen zu vermeiden. Es ist ebenso entscheidend, die lokale Sichtbarkeit der Schleifenvariablen zu berücksichtigen, da deren falscher Gebrauch außerhalb des Gültigkeitsbereichs zu Laufzeitfehlern führt.
Darüber hinaus sollte man verstehen, dass der Einsatz von Iteratoren wie pairs keine geordnete Sequenz garantiert. Das bedeutet, dass bei mehrfachen Durchläufen oder unterschiedlichen Lua-Implementierungen die Reihenfolge der ausgegebenen Elemente variieren kann. Für Anwendungen, bei denen eine definierte Reihenfolge erforderlich ist, muss man alternative Strategien einsetzen, etwa die Schlüssel vorab zu sortieren oder auf ipairs zurückzugreifen, wenn nur die numerisch-indizierten Elemente relevant sind.
Wichtig ist auch, dass der Schrittwert in numeric for-Schleifen keine Null sein darf, da dies zu einer Endlosschleife führen würde. Ebenso sollte bei der Verwendung von iterativen Konstrukten stets geprüft werden, ob die Ausgangs- und Abbruchbedingungen sinnvoll gewählt sind, um unbeabsichtigtes Überschreiten oder das Nichtstarten der Schleife zu verhindern.
Insgesamt bieten numeric und generic for-Schleifen zusammen mit den Iteratorfunktionen eine flexible und mächtige Grundlage zur Steuerung von Wiederholungen in Lua, wobei das Verständnis ihrer semantischen Feinheiten maßgeblich für effizienten und fehlerfreien Code ist.
Wie Lua mit mehreren Rückgabewerten umgeht und was dabei zu beachten ist
In Lua ist die Fähigkeit, mehrere Rückgabewerte aus einer Funktion zu erhalten, ein wesentliches Merkmal, das die Flexibilität und Eleganz der Sprache unterstreicht. Diese Eigenschaft erleichtert die Handhabung von Funktionen, die mehr als einen Wert zurückgeben müssen, und fördert eine klare und prägnante Code-Architektur. Besonders bemerkenswert ist die Art und Weise, wie Lua mit mehreren Rückgabewerten umgeht, wenn sie als Argumente an andere Funktionen übergeben werden.
Ein anschauliches Beispiel für diese Mechanik ist die Verwendung von string.format in Verbindung mit einer Funktion, die mehrere Rückgabewerte liefert. Angenommen, eine Funktion calculate_stats gibt mehrere Werte zurück, wie zum Beispiel eine Summe, einen Durchschnitt und eine Anzahl. Wird diese Funktion als letztes Argument in einem Funktionsaufruf, wie etwa in print(string.format("Sum: %d, Average: %.1f, Count: %d", calculate_stats(my_numbers))), übergeben, so dehnt Lua automatisch die Rückgabewerte der Funktion aus und übergibt sie als einzelne Argumente an die print-Funktion. Diese Art der Argumentübergabe macht den Code besonders prägnant und reduziert den Bedarf, Zwischenspeicher zu verwenden.
Ein weiteres häufiges Szenario für die Verwendung von mehreren Rückgabewerten ist der Umgang mit Fehlern. Es ist in Lua üblich, Funktionen so zu gestalten, dass sie ein Ergebnis zusammen mit einem Fehlerindikator zurückgeben. Ein Beispiel dafür ist die safe_divide-Funktion, die eine Division durch null behandelt. Wenn der Divisor null ist, gibt die Funktion eine Fehlermeldung zurück; andernfalls wird das Ergebnis der Division und nil als Fehlerindikator zurückgegeben. Dieses Muster fördert eine klare Fehlerbehandlung und erlaubt es dem Programmierer, das Ergebnis und den Fehlerstatus gleichzeitig zu verarbeiten, ohne auf komplexe Datenstrukturen oder zusätzliche Prüfungen zurückgreifen zu müssen.
Ein praktisches Beispiel für diese Methode zeigt sich im Umgang mit der string.find-Funktion, die in Lua verwendet wird, um den Index des ersten Auftretens eines Substrings in einer Zeichenkette zu finden. Die Funktion gibt zwei Werte zurück: den Start- und den Endindex des Substrings, oder nil, wenn kein Treffer vorliegt. Durch die Verwendung der Rückgabewerte als separate Variablen kann der Programmierer elegant überprüfen, ob ein Treffer gefunden wurde, und gleichzeitig beide Indizes verwenden, um weiterführende Operationen durchzuführen.
Die Handhabung von mehreren Rückgabewerten in Lua ermöglicht eine Reihe von fortgeschrittenen Programmiertechniken, die den Code nicht nur kompakter, sondern auch lesbarer und robuster machen. Dies ist besonders bei der Kombination von Funktionen oder bei der Fehlerbehandlung von Bedeutung. Ein tiefes Verständnis darüber, wie diese Rückgabewerte ausgeweitet und übergeben werden, ist unerlässlich für das Schreiben effektiven Lua-Codes.
Zusätzlich zur Behandlung mehrerer Rückgabewerte ist es entscheidend, die Unterschiede zwischen lokalen und globalen Variablen zu verstehen, um effizient und vor allem wartbar zu programmieren. Lokale Variablen sind auf den Block beschränkt, in dem sie deklariert wurden, sei es innerhalb einer Funktion, eines Loops oder eines do...end Blocks. Diese Einschränkung der Sichtbarkeit hat den Vorteil, dass der Code übersichtlicher und weniger fehleranfällig wird. Wenn Variablen nur lokal verfügbar sind, gibt es weniger Gefahr, dass sie versehentlich in anderen Teilen des Programms verändert werden, was bei globalen Variablen eine häufige Fehlerquelle darstellt.
Globale Variablen hingegen sind im gesamten Lua-Skript oder in allen geladenen Skripten zugänglich. Sie werden in der globalen Umgebungs-Tabelle gespeichert, und jede Änderung an einer globalen Variablen hat unmittelbare Auswirkungen auf den gesamten Code. Dies kann zu Namenskonflikten oder unerwünschten Seiteneffekten führen, vor allem in größeren Programmen, die auf vielen globalen Variablen basieren. Es ist daher ratsam, globale Variablen mit Bedacht zu verwenden und möglichst lokale Variablen zu bevorzugen, um die Wartbarkeit und die Performance des Codes zu optimieren.
Das Erlernen der korrekten Handhabung von lokalen und globalen Variablen sowie das Verständnis der Mechanismen der erweiterten Rückgabewerte ist von grundlegender Bedeutung, um in Lua sauber und effizient zu programmieren. Der bewusste Einsatz dieser Konzepte hilft dabei, den Code nicht nur funktional, sondern auch übersichtlich und zukunftssicher zu gestalten.
Wie funktioniert die Formatierung von Strings in Lua mit string.format()?
Die Funktion string.format() in Lua ermöglicht eine flexible und präzise Steuerung der Darstellung von Daten als Text. Sie kombiniert verschiedene Formatierungsspezifikatoren, um Zahlen, Strings, Zeichen und andere Werte in formatierten Ausgaben abzubilden, was insbesondere bei Protokollierung, Benutzeranzeige oder Berichtserstellung unverzichtbar ist.
Einer der wichtigen Spezifizierer ist %g bzw. %G, die eine automatische Wahl zwischen der Festpunktnotation (%f) und der wissenschaftlichen Notation (%e/%E) treffen. Dabei wird die jeweils kürzeste Darstellung gewählt, wobei %g für die Kleinbuchstaben-Variante (e) steht, während %G die Großbuchstaben-Variante (E) verwendet. So kann beispielsweise die Zahl 12345.6789 als 12345.7 dargestellt werden, während sehr kleine Zahlen wie 0.0000123456789 in der wissenschaftlichen Notation erscheinen (1.23457e-05 oder 1.23457E-05).
Für Ganzzahlen bieten %x und %X die Umwandlung in Hexadezimaldarstellung, wobei %x die Kleinbuchstaben a-f nutzt und %X die Großbuchstaben A-F. Diese Schreibweise ist vor allem in Programmierkontexten für Farbwerte, Speicheradressen oder binäre Daten hilfreich.
Strings werden mit %s formatiert, wobei Lua automatisch eine Umwandlung in String vornimmt, falls der übergebene Wert kein String ist. So kann man problemlos Zahlen, Booleans oder andere Werte in eine Textausgabe einfügen, ohne manuell konvertieren zu müssen.
Die Mindestbreite eines Feldes lässt sich durch Angabe einer Zahl direkt nach dem Prozentzeichen einstellen. Ist der darzustellende Wert kürzer als diese Breite, erfolgt eine Auffüllung mit Leerzeichen. Standardmäßig werden Werte rechtsbündig ausgerichtet, mit dem Flag - lässt sich jedoch eine linksbündige Darstellung erzwingen. Dieses Prinzip gilt sowohl für Zahlen als auch für Strings. Zusätzlich kann für numerische Werte eine Auffüllung mit Nullen erfolgen, indem vor der Breite eine 0 eingefügt wird – beispielsweise führt %05d dazu, dass eine Zahl auf fünf Stellen mit führenden Nullen aufgefüllt wird.
Weitere nützliche Flags ermöglichen zusätzliche Feinsteuerungen: Das Pluszeichen + sorgt dafür, dass immer ein Vorzeichen angezeigt wird, auch bei positiven Zahlen. Das Leerzeichen-Flag fügt bei positiven Zahlen einen führenden Leerraum ein, der bei negativen Zahlen durch ein Minus ersetzt wird. Das Rautezeichen # aktiviert für hexadezimale Werte die Vorsilbe 0x bzw. 0X und bei Gleitkommazahlen sorgt es für die Anzeige eines Dezimalpunkts auch ohne Nachkommastellen. Außerdem verhindert es beim %g/%G-Format das Abschneiden der nachfolgenden Nullen.
Der Spezifizierer %c gibt das Zeichen zurück, das einem übergebenen ASCII- oder Unicode-Wert entspricht. So kann man beispielsweise einen Zahlenwert 65 in den Buchstaben 'A' umwandeln.
Mit %p kann man auf die interne Speicheradresse eines Wertes zugreifen, wobei die Ausgabe stark von der Lua-Implementierung abhängt und meist eher für Debugging oder C-Interoperabilität relevant ist.
Ein literal Prozentzeichen % innerhalb der Formatierung wird durch Verdopplung %% erreicht.
Die wahre Stärke von string.format() entfaltet sich, wenn verschiedene Spezifizierer, Breitenangaben, Genauigkeiten und Flags kombiniert werden, um komplexe und übersichtliche Ausgaben zu erzeugen – etwa Berichte mit identifizierenden Zahlen, Noten oder Koordinaten. So kann man beispielsweise ein Format erzeugen, das eine Zahl mit führenden Nullen darstellt, eine Fließkommazahl auf eine bestimmte Nachkommastellenanzahl rundet oder Text elegant in einem Feld ausrichtet.
Neben der reinen Funktionalität ist es für den Leser essenziell, das Zusammenspiel von Spezifizierern und Flags zu verstehen, da dies den Unterschied zwischen einer unleserlichen, chaotischen und einer klar strukturierten Ausgabe ausmacht. Außerdem sollte man beachten, dass Formatierungen keine inhaltliche Umwandlung vornehmen, sondern nur die Darstellung beeinflussen. Für echte Datenmanipulationen sind andere Lua-Funktionen erforderlich.
Das Verständnis dieser Mechanismen erleichtert nicht nur die Programmierung von sauberen Interfaces und Debugging-Ausgaben, sondern ist auch fundamental für die Verarbeitung und Ausgabe großer Datenmengen in strukturierter Form, ohne auf externe Bibliotheken zurückgreifen zu müssen.
Welche grundlegenden Zeichenklassen verwendet Lua für Mustererkennung und wie beeinflussen sie die Musterbildung?
Lua verwendet im Gegensatz zu vielen anderen Programmiersprachen eine vereinfachte, aber dennoch äußerst effiziente Methode zur Mustererkennung, die auf einer Reihe vorgefertigter Zeichenklassen beruht. Diese Klassen sind die Basis für die Konstruktion von Mustern und ermöglichen es, Zeichen präzise und kompakt zu spezifizieren, ohne jeden einzelnen Buchstaben oder jedes einzelne Zeichen explizit aufführen zu müssen. So wird die Lesbarkeit der Muster verbessert und Fehler werden vermieden.
Die wichtigsten Zeichenklassen sind dabei wie folgt definiert: %a steht für alphabetische Zeichen und umfasst Groß- sowie Kleinbuchstaben entsprechend der aktuellen Gebietsschemaeinstellungen. Diese Klasse ist besonders nützlich, wenn beispielsweise aus einem Text die erste Folge von Buchstaben extrahiert werden soll. Das Muster %a+ sucht eine Folge aus einem oder mehreren alphabetischen Zeichen, während %a alleine nur das erste alphabetische Zeichen findet.
Die Klasse %c erfasst Steuerzeichen, also nicht druckbare Zeichen wie Zeilenumbrüche, Tabulatoren oder Wagenrückläufe. Solche Zeichen finden sich häufig in Texten mit komplexer Formatierung oder Steuersequenzen. Beispielsweise kann %c genutzt werden, um Zeilenumbrüche zu identifizieren oder zu ersetzen.
Mit %d werden alle Ziffern von 0 bis 9 abgedeckt. Diese Klasse ist essenziell, wenn Zahlenfolgen extrahiert oder manipuliert werden sollen, etwa um Telefonnummern, IDs oder andere numerische Daten aus Strings herauszufiltern.
Die Klasse %g entspricht allen druckbaren Zeichen mit Ausnahme von Leerzeichen. Sie umfasst Buchstaben, Ziffern, Satzzeichen und Symbole, nicht jedoch Leerzeichen, Tabs oder Zeilenumbrüche. Dadurch lassen sich beispielsweise Zeichenketten ohne Leerraum effektiv erfassen.
Für die Unterscheidung nach Groß- und Kleinbuchstaben bietet Lua die Klassen %l für Kleinbuchstaben und %u für Großbuchstaben. Damit lassen sich Fälle unterscheiden, in denen etwa nur Groß- oder Kleinbuchstaben relevant sind.
Die Klasse %p enthält alle Satzzeichen und Symbole, die typischerweise zur Strukturierung von Texten verwendet werden, wie Punkte, Kommas, Ausrufezeichen oder Fragezeichen.
Whitespace-Zeichen, also Leerzeichen, Tabs und Zeilenumbrüche, werden durch %s erfasst. Dies ist wichtig, um etwa Leerraum in Texten zu erkennen, zu zählen oder zu entfernen.
Hexadezimale Ziffern, also die Ziffern 0 bis 9 sowie die Buchstaben a bis f (in beiden Groß- und Kleinbuchstaben), lassen sich mit %x erfassen. Dies ist besonders relevant für die Verarbeitung von Farb- oder Speicheradressen.
Die alphanumerischen Zeichen, also die Kombination aus Buchstaben und Ziffern, werden durch %w abgedeckt. Dies schließt sowohl %a als auch %d ein und ist eine praktische Klasse für Variablennamen oder Identifikatoren.
Die Komplementklasse %W steht für alle Zeichen, die nicht alphanumerisch sind, also Leerzeichen, Satzzeichen, Steuerzeichen und andere Symbole. Sie ist nützlich, um diese Zeichen gezielt zu erkennen oder zu ersetzen.
Diese Klassen funktionieren im Allgemeinen unabhängig vom jeweiligen Gebietsschema, obwohl gerade bei Klassen wie %a, %g oder %w die Lokalisierung Einfluss auf die genaue Definition der enthaltenen Zeichen haben kann. Für die meisten Anwendungen sind sie jedoch zuverlässig und konsistent.
Das Verständnis dieser grundlegenden Zeichenklassen bildet die Voraussetzung dafür, komplexere Muster in Lua zu entwickeln. Erst durch die sichere Handhabung dieser Bausteine lassen sich präzise Such- und Ersetzungsvorgänge in Strings realisieren.
Neben den reinen Zeichenklassen ist es wichtig, die Funktionsweise von Quantifizierern wie + zu verstehen, die angeben, wie oft ein Zeichen oder eine Klasse hintereinander auftreten soll. So ermöglicht %a+ die Suche nach einem oder mehreren alphabetischen Zeichen in Folge.
Es ist ebenso bedeutsam, den Unterschied zwischen einfachen Zeichenklassen und komplexeren Konstrukten wie Zeichengruppen und Bereichsangaben zu kennen, um Muster flexibel an verschiedenste Anforderungen anzupassen.
Darüber hinaus sollte bedacht werden, dass Lua keine vollständige reguläre Ausdruckssyntax implementiert, sondern eine abgespeckte, eigenständige Version verwendet. Dies erfordert vom Nutzer ein Umdenken und eine Anpassung der Musterbildung.
Die praktische Anwendung dieser Zeichenklassen zeigt sich in alltäglichen Aufgaben der Textverarbeitung: von der Validierung von Eingaben über das Parsen von Protokolldateien bis hin zur Datenextraktion aus heterogenen Textquellen. Dabei bieten die Klassen eine klare und prägnante Möglichkeit, Muster zu definieren, die sowohl lesbar als auch wartbar sind.
Die Kenntnis der zugrundeliegenden Funktionsweise dieser Zeichenklassen und ihrer Interaktion mit anderen Elementen von Lua-Patterns erlaubt eine effiziente und zielgerichtete Manipulation von Textdaten. Nur wer diese Grundlagen beherrscht, kann das volle Potenzial von Lua’s Mustererkennung ausschöpfen.
Wie funktionieren Zeichensätze und Wiederholungen in Lua-Patterns?
Das Verständnis von Zeichensätzen ist grundlegend, um die String-Manipulationsmöglichkeiten von Lua zu meistern. Ein Zeichensatz wird durch eckige Klammern [] definiert und gibt eine Gruppe von einzelnen Zeichen an, die an einer bestimmten Stelle im String passen können. Lua prüft bei einem Muster mit einem Zeichensatz, ob das Zeichen an der aktuellen Position im String in der Gruppe enthalten ist. So passt beispielsweise der Zeichensatz [abc] auf ein 'a', 'b' oder 'c'. Kommt an der Position im String ein anderes Zeichen vor, schlägt die Übereinstimmung fehl und das Pattern-Engine versucht es gegebenenfalls an der nächsten Stelle erneut.
Dabei ist es wichtig zu wissen, dass in einem Zeichensatz die meisten Sonderzeichen ihre spezielle Bedeutung verlieren. Ein Punkt '.' innerhalb von [] steht beispielsweise für einen tatsächlichen Punkt und nicht für ein beliebiges Zeichen. Ausnahmen bilden hier der Zirkumflex '^' am Anfang des Sets und der Bindestrich '-', wenn er zwischen zwei Zeichen steht. Letzterer wird verwendet, um Zeichenbereiche zu definieren, die aufeinanderfolgende Zeichen nach ihrem Zeichensatz-Code abdecken, meist ASCII oder UTF-8. So steht [a-z] für alle Kleinbuchstaben von 'a' bis 'z', [A-Z] für Großbuchstaben und [0-9] für Ziffern.
Zeichenbereiche lassen sich in einem Set kombinieren, beispielsweise [a-zA-Z0-9], um ein beliebiges alphanumerisches Zeichen zu erfassen. Dies ist besonders nützlich, wenn man Benutzereingaben validieren oder aus Strings Wörter extrahieren möchte. Ein weiteres wichtiges Zeichen ist der Zirkumflex '^' am Anfang eines Sets, der die Menge negiert. Das bedeutet, dass [^0-9] für jedes Zeichen steht, das keine Ziffer ist. Diese Negation ist sehr praktisch, um etwa Nicht-Zahlen aus einem Text herauszufiltern.
Die Behandlung des Bindestrichs '-' innerhalb von Zeichensätzen verlangt besondere Aufmerksamkeit. Wird er am Anfang oder Ende des Sets platziert oder mit einem vorangestellten Prozentzeichen '%' maskiert, verliert er seine Funktion als Bereichsoperator und wird zum literal Zeichen. So steht [-abc] für die Zeichen '-', 'a', 'b' oder 'c', während [a%-c] die Zeichen 'a', '%' und 'c' meint. Für klare Lesbarkeit und Fehlervermeidung empfiehlt es sich, den Bindestrich am Rand zu positionieren oder zu escapen, wenn man ihn als Literal verwenden möchte.
Zusätzlich zur Definition von Zeichensätzen ermöglicht Lua die Kontrolle über die Wiederholung von Zeichen oder Zeichenklassen durch Quantifizierer. Der Asterisk '' steht für "null oder mehr" Vorkommen des vorangehenden Elements. Ein Muster wie ab trifft also auf 'b' ebenso wie auf 'ab', 'aab' oder auch auf nur 'b', wenn kein 'a' vorangestellt ist. Dies ist besonders hilfreich, um optionale Elemente im Text zu erfassen, wie beispielsweise bei colou*r, das sowohl 'color' als auch 'colour' erkennt.
Der Plus '+' ist ein engerer Quantifizierer, der mindestens ein Vorkommen verlangt. So stellt [0-9]+ sicher, dass eine oder mehrere Ziffern erkannt werden – etwa um Zahlen im Text zu finden. Weitere Quantifizierer wie das Fragezeichen '?' für null oder ein Vorkommen runden die Möglichkeiten ab, komplexe Suchmuster präzise zu definieren.
Die Kombination von Zeichensätzen, Bereichen, Negationen und Wiederholungen eröffnet ein mächtiges Werkzeug, um Strings effektiv zu durchsuchen, zu filtern oder umzuwandeln. Die Fähigkeit, Muster mit diesen Konstrukten zu bauen, bildet das Fundament für anspruchsvollere Textverarbeitungsaufgaben in Lua.
Neben der Syntax und den Zeichen selbst ist es für den Leser wichtig zu verstehen, dass Lua-Patterns keine regulären Ausdrücke im klassischen Sinne sind. Sie sind einfacher, aber für viele praktische Zwecke ausreichend. Das Verständnis der Grenzen und Stärken von Lua-Patterns erlaubt es, effizient und präzise zu programmieren. Besonders bei der Verarbeitung von Benutzereingaben oder beim Parsen strukturierter Texte spielen diese Konzepte eine zentrale Rolle.
Endtext

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский