Finished translating formspec.md.
This commit is contained in:
parent
498669e55a
commit
06b5765234
@ -8,10 +8,10 @@ redirect_from: /de/chapters/formspecs.html
|
||||
submit_vuln:
|
||||
level: warning
|
||||
title: Malicious clients can submit anything at anytime
|
||||
message: You should never trust a formspec submission. A malicious client
|
||||
can submit anything they like at any time - even if you never showed
|
||||
them the formspec. This means that you should check privileges
|
||||
and make sure that they should be allowed to perform the action.
|
||||
message: Sie sollten niemals einer formspec-Übermittlung vertrauen. Ein böswilliger Client
|
||||
kann jederzeit alles übermitteln, was er will - auch wenn Sie ihm nie die
|
||||
den formspec gezeigt haben. Das bedeutet, dass Sie die Berechtigungen prüfen sollten
|
||||
und sicherstellen, dass sie die Aktion durchführen dürfen.
|
||||
---
|
||||
|
||||
## Einleitung <!-- omit in toc -->
|
||||
@ -37,14 +37,14 @@ unerwartete Fenster das Spielgeschehen stören können.
|
||||
- [Anatomie eines formspecs](#anatomie-eines-a-formspecs)
|
||||
- [Elemente](#elemente)
|
||||
- [Header](#header)
|
||||
- [Guessing Game](#guessing-game)
|
||||
- [Padding and Spacing](#padding-and-spacing)
|
||||
- [Receiving Formspec Submissions](#receiving-formspec-submissions)
|
||||
- [Ratespiel](#ratespiel)
|
||||
- [Padding und Abstände](#padding-und-abstände)
|
||||
- [Empfang von Formspec-Übermittlungen](#empfang-von-formspec-übermittlungen)
|
||||
- [Contexts](#contexts)
|
||||
- [Formspec Sources](#formspec-sources)
|
||||
- [Formspec-Quellen](#formspec-quellen)
|
||||
- [Node Meta Formspecs](#node-meta-formspecs)
|
||||
- [Player Inventory Formspecs](#player-inventory-formspecs)
|
||||
- [Your Turn](#your-turn)
|
||||
- [Spieler Inventar Formspecs](#spieler-inventar-formspecs)
|
||||
- [Sie sind dran](#sie-sind-dran)
|
||||
|
||||
|
||||
## Reale oder Legacy-Koordinaten
|
||||
@ -117,22 +117,22 @@ Dadurch wird der Anker an den linken mittleren Rand des formspec-Feldes gesetzt,
|
||||
Position dieses Ankers auf der linken Seite des Bildschirms.
|
||||
|
||||
|
||||
## Guessing Game
|
||||
## Ratespiel
|
||||
|
||||
<figure class="right_image">
|
||||
<img src="{{ page.root }}/static/formspec_guessing.png" alt="Guessing Formspec">
|
||||
<img src="{{ page.root }}/static/formspec_guessing.png" alt="Rate-Formspec">
|
||||
<figcaption>
|
||||
The guessing game formspec.
|
||||
Das Ratespiel formspec.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
The best way to learn is to make something, so let's make a guessing game.
|
||||
The principle is simple: the mod decides on a number, then the player makes
|
||||
guesses on the number. The mod then says if the guess is higher or lower then
|
||||
the actual number.
|
||||
Der beste Weg, etwas zu lernen, ist, etwas zu machen, also lasst uns ein Ratespiel machen.
|
||||
Das Prinzip ist einfach: Der Mod entscheidet sich für eine Zahl, und die Spieler
|
||||
errät die Zahl. Der Mod sagt dann, ob die erratene Zahl höher oder niedriger ist als
|
||||
die tatsächliche Zahl.
|
||||
|
||||
First, let's make a function to create the formspec code. It's good practice to
|
||||
do this, as it makes it easier to reuse elsewhere.
|
||||
Zunächst erstellen wir eine Funktion, die den formspec-Code erzeugt. Es ist gute Praxis, dies
|
||||
zu tun, da es die Wiederverwendung an anderer Stelle erleichtert.
|
||||
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
@ -140,29 +140,29 @@ do this, as it makes it easier to reuse elsewhere.
|
||||
guessing = {}
|
||||
|
||||
function guessing.get_formspec(name)
|
||||
-- TODO: display whether the last guess was higher or lower
|
||||
local text = "I'm thinking of a number... Make a guess!"
|
||||
-- TODO: Anzeige, ob die letzte Schätzung höher oder niedriger war
|
||||
local text = "Ich denke an eine Zahl... Raten Sie mal!"
|
||||
|
||||
local formspec = {
|
||||
"formspec_version[4]",
|
||||
"size[6,3.476]",
|
||||
"label[0.375,0.5;", minetest.formspec_escape(text), "]",
|
||||
"field[0.375,1.25;5.25,0.8;number;Number;]",
|
||||
"button[1.5,2.3;3,0.8;guess;Guess]"
|
||||
"field[0.375,1.25;5.25,0.8;nummer;Nummer;]",
|
||||
"button[1.5,2.3;3,0.8;raten;Raten]"
|
||||
}
|
||||
|
||||
-- table.concat is faster than string concatenation - `..`
|
||||
-- table.concat ist schneller als String-Verkettung - `..`
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
```
|
||||
|
||||
In the above code, we place a field, a label, and a button. A field allows text
|
||||
entry, and a button is used to submit the form. You'll notice that the elements
|
||||
are positioned carefully in order to add padding and spacing, this will be explained
|
||||
later.
|
||||
Im obigen Code platzieren wir ein Feld, eine Beschriftung und eine Schaltfläche.
|
||||
Ein Feld erlaubt die Eingabe von Text Texteingabe, und eine Schaltfläche dient zum
|
||||
Absenden des Forms. Sie werden feststellen, dass die Elemente
|
||||
sorgfältig positioniert sind, um Padding und Abstände hinzuzufügen, was später erklärt wird.
|
||||
|
||||
Next, we want to allow the player to show the formspec. The main way to do this
|
||||
is using `show_formspec`:
|
||||
Als Nächstes wollen wir dem Spieler erlauben, den formspec anzuzeigen. Der beste Weg, dies zu tun
|
||||
ist die Verwendung von `show_formspec`:
|
||||
|
||||
```lua
|
||||
function guessing.show_to(name)
|
||||
@ -176,34 +176,35 @@ minetest.register_chatcommand("game", {
|
||||
})
|
||||
```
|
||||
|
||||
The `show_formspec` function accepts a player name, the formspec name, and the
|
||||
formspec itself. The formspec name should be a valid itemname, ie: in the format
|
||||
`modname:itemname`.
|
||||
Die Funktion `show_formspec` akzeptiert einen Spielernamen, den Namen der formspec und die
|
||||
formspec selbst. Der formspec-Name sollte ein gültiger Itemname sein, d.h. im Format
|
||||
`Modname:Gegenstandsname`.
|
||||
|
||||
|
||||
### Padding and Spacing
|
||||
### Padding und Abstände
|
||||
|
||||
<figure class="right_image">
|
||||
<img src="{{ page.root }}/static/formspec_padding_spacing.png" alt="Padding and spacing">
|
||||
<img src="{{ page.root }}/static/formspec_padding_spacing.png" alt="Padding und Abstände">
|
||||
<figcaption>
|
||||
The guessing game formspec.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
Padding is the gap between the edge of the formspec and its contents, or between unrelated
|
||||
elements, shown in red. Spacing is the gap between related elements, shown in blue.
|
||||
Padding ist der Abstand zwischen dem Rand des formspec und seinem Inhalt oder zwischen nicht verwandten Elementen,
|
||||
dargestellt in Rot. Abstand ist der Abstand zwischen zusammenhängenden Elementen, der blau dargestellt wird.
|
||||
|
||||
It is fairly standard to have a padding of `0.375` and a spacing of `0.25`.
|
||||
|
||||
Ein Padding von `0,375` und ein Abstand von `0,25` sind üblich.
|
||||
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
|
||||
### Receiving Formspec Submissions
|
||||
### Empfang von Formspec-Übermittlungen
|
||||
|
||||
When `show_formspec` is called, the formspec is sent to the client to be displayed.
|
||||
For formspecs to be useful, information needs to be returned from the client to server.
|
||||
The method for this is called formspec field submission, and for `show_formspec`, that
|
||||
submission is received using a global callback:
|
||||
Wenn `show_formspec` aufgerufen wird, wird der formspec an den Client gesendet, um angezeigt zu werden.
|
||||
Damit formspecs nützlich sind, müssen Informationen vom Client zum Server zurückgeschickt werden.
|
||||
Die Methode dafür heißt formspec field submission, und für `show_formspec` wird diese
|
||||
Übermittlung über einen globalen Callback empfangen:
|
||||
|
||||
```lua
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
@ -213,39 +214,39 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
|
||||
if fields.guess then
|
||||
local pname = player:get_player_name()
|
||||
minetest.chat_send_all(pname .. " guessed " .. fields.number)
|
||||
minetest.chat_send_all(pname .. " riet " .. fields.number)
|
||||
end
|
||||
end)
|
||||
```
|
||||
|
||||
The function given in `minetest.register_on_player_receive_fields` is called
|
||||
every time a user submits a form. Most callbacks will need to check the formname given
|
||||
to the function, and exit if it is not the right form; however, some callbacks
|
||||
may need to work on multiple forms, or on all forms.
|
||||
Die in `minetest.register_on_player_receive_fields` angegebene Funktion wird
|
||||
jedes Mal aufgerufen, wenn ein Benutzer ein Formular absendet. Die meisten Callbacks müssen den der Funktion übergebenen Formularnamen prüfen
|
||||
an die Funktion übergebenen Formularnamen überprüfen und beenden, wenn es sich nicht um das richtige Form handelt; einige
|
||||
müssen jedoch möglicherweise für mehrere Formulare oder für alle Formulare funktionieren.
|
||||
|
||||
The `fields` parameter to the function is a table of the values submitted by the
|
||||
user, indexed by strings. Named elements will appear in the field under their own
|
||||
name, but only if they are relevent for the event that caused the submission.
|
||||
For example, a button element will only appear in fields if that particular button
|
||||
was pressed.
|
||||
Der Parameter `fields` der Funktion ist eine Tabelle mit den vom Benutzer übermittelten Werten
|
||||
Benutzer übermittelten Werte, die durch Zeichenketten indiziert sind. Benannte Elemente erscheinen in dem Feld unter ihrem eigenen
|
||||
Namen, aber nur, wenn sie für das Ereignis, das die Übermittlung verursacht hat, relevant sind.
|
||||
Ein Schaltflächenelement erscheint beispielsweise nur dann in Feldern, wenn die betreffende Schaltfläche
|
||||
gedrückt wurde.
|
||||
|
||||
{% include notice.html notice=page.submit_vuln %}
|
||||
|
||||
So, now the formspec is sent to the client and the client sends information back.
|
||||
The next step is to somehow generate and remember the target value, and to update
|
||||
the formspec based on guesses. The way to do this is using a concept called
|
||||
Der formspec wird also an den Client gesendet, und der Client sendet Informationen zurück.
|
||||
Der nächste Schritt besteht darin, den Zielwert irgendwie zu generieren und zu speichern, und die
|
||||
die formspec auf der Grundlage von Schätzungen zu aktualisieren. Dies geschieht mit Hilfe eines Konzepts namens
|
||||
"contexts".
|
||||
|
||||
|
||||
### Contexts
|
||||
|
||||
In many cases you want minetest.show_formspec to give information
|
||||
to the callback which you don't want to send to the client. This might include
|
||||
what a chat command was called with, or what the dialog is about. In this case,
|
||||
the target value that needs to be remembered.
|
||||
In vielen Fällen möchten Sie, dass minetest.show_formspec Informationen
|
||||
an den Callback weitergeben, die nicht an den Client gesendet werden sollen.
|
||||
Dies könnte beinhalten dass ein Chat-Befehl aufgerufen wurde, oder worum es
|
||||
in dem Dialog geht. In diesem Fall, der Zielwert, der gespeichert werden muss.
|
||||
|
||||
A context is a per-player table to store information, and the contexts for all
|
||||
online players are stored in a file-local variable:
|
||||
Ein Context ist eine pro-Spieler-Tabelle zum Speichern von Informationen, und die Contexts für alle
|
||||
Online-Spieler werden in einer dateilokalen Variablen gespeichert:
|
||||
|
||||
```lua
|
||||
local _contexts = {}
|
||||
@ -255,13 +256,13 @@ local function get_context(name)
|
||||
return context
|
||||
end
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
_contexts[player:get_player_name()] = nil
|
||||
minetest.register_on_leaveplayer(function(spieler)
|
||||
_contexts[spieler:get_player_name()] = nil
|
||||
end)
|
||||
```
|
||||
|
||||
Next, we need to modify the show code to update the context
|
||||
before showing the formspec:
|
||||
Als nächstes müssen wir den Show-Code ändern, um den Context zu aktualisieren
|
||||
zu aktualisieren, bevor der Formspec angezeigt wird:
|
||||
|
||||
```lua
|
||||
function guessing.show_to(name)
|
||||
@ -273,7 +274,7 @@ function guessing.show_to(name)
|
||||
end
|
||||
```
|
||||
|
||||
We also need to modify the formspec generation code to use the context:
|
||||
Wir müssen auch den Code für die Generierung von Formularen ändern, um den Context zu verwenden:
|
||||
|
||||
```lua
|
||||
function guessing.get_formspec(name, context)
|
||||
@ -289,14 +290,14 @@ function guessing.get_formspec(name, context)
|
||||
end
|
||||
```
|
||||
|
||||
Note that it's good practice for `get_formspec` to only read the context, and not
|
||||
update it at all. This can make the function simpler, and also easier to test.
|
||||
Beachten Sie, dass es gute Praxis ist, wenn `get_formspec` den Context nur liest und nicht
|
||||
überhaupt nicht zu aktualisieren. Dies kann die Funktion einfacher machen, und auch leichter zu testen.
|
||||
|
||||
And finally, we need to update the handler to update the context with the guess:
|
||||
Und schließlich müssen wir den Handler aktualisieren, um den Context mit der Vermutung zu aktualisieren:
|
||||
|
||||
```lua
|
||||
if fields.guess then
|
||||
local name = player:get_player_name()
|
||||
local name = spieler:get_player_name()
|
||||
local context = get_context(name)
|
||||
context.guess = tonumber(fields.number)
|
||||
guessing.show_to(name)
|
||||
@ -304,43 +305,44 @@ end
|
||||
```
|
||||
|
||||
|
||||
## Formspec Sources
|
||||
## Formspec-Quellen
|
||||
|
||||
There are three different ways that a formspec can be delivered to the client:
|
||||
Es gibt drei verschiedene Möglichkeiten, wie ein Formspec an den client übermittelt werden kann:
|
||||
|
||||
* [show_formspec](#guessing-game): the method used above, fields are received by `register_on_player_receive_fields`.
|
||||
* [Node Meta Formspecs](#node-meta-formspecs): the node contains a formspec in its meta data, and the client
|
||||
shows it *immediately* when the player rightclicks. Fields are received by a
|
||||
method in the node definition called `on_receive_fields`.
|
||||
* [Player Inventory Formspecs](#player-inventory-formspecs): the formspec is sent to the client at some point, and then
|
||||
shown immediately when the player presses `i`. Fields are received by
|
||||
`register_on_player_receive_fields`.
|
||||
* [show_formspec](#ratespiel): Bei der oben beschriebenen Methode werden die Felder durch
|
||||
`register_on_player_receive_fields` empfangen.
|
||||
* [Node Meta Formspecs](#node-meta-formspecs): der Node enthält in seinen Metadaten eine Formularvorgabe,
|
||||
und der Client zeigt es *sofort* an, wenn der Spieler mit der rechten Maustaste klickt. Felder werden
|
||||
durch eine Methode in der Node-Definition namens `on_receive_fields` empfangen.
|
||||
* [Player Inventory Formspecs](#spieler-inventar-formspecs): der formspec wird irgendwann an den Client gesendet und dann
|
||||
sofort angezeigt, wenn der Spieler auf "i" drückt. Felder werden empfangen durch
|
||||
`register_on_player_receive_fields` empfangen.
|
||||
|
||||
### Node Meta Formspecs
|
||||
|
||||
`minetest.show_formspec` is not the only way to show a formspec; you can also
|
||||
add formspecs to a [node's metadata](node_metadata.html). For example,
|
||||
this is used with chests to allow for faster opening times -
|
||||
you don't need to wait for the server to send the player the chest formspec.
|
||||
`minetest.show_formspec` ist nicht die einzige Möglichkeit, einen formspec anzuzeigen; Sie können auch
|
||||
formspecs zu den Metadaten eines [Nodes](node_metadata.html) hinzufügen. Zum Beispiel,
|
||||
wird dieses bei Truhen verwendet, um ein schnelleres Öffnen zu ermöglichen -
|
||||
man muss nicht darauf warten, dass der Server dem Spieler den formspec für die Truhe schickt.
|
||||
|
||||
```lua
|
||||
minetest.register_node("mymod:rightclick", {
|
||||
description = "Rightclick me!",
|
||||
tiles = {"mymod_rightclick.png"},
|
||||
minetest.register_node("meinemod:rechtsclick", {
|
||||
description = "Rechtsclicke me!",
|
||||
tiles = {"mymod_rechtsclick.png"},
|
||||
groups = {cracky = 1},
|
||||
after_place_node = function(pos, placer)
|
||||
-- This function is run when the chest node is placed.
|
||||
-- The following code sets the formspec for chest.
|
||||
-- Meta is a way of storing data onto a node.
|
||||
-- Diese Funktion wird ausgeführt, wenn das Kisten-Node platziert wird.
|
||||
-- Der folgende Code setzt den formspec für Kiste.
|
||||
-- Meta ist eine Möglichkeit, Daten in einem Node zu speichern.
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec",
|
||||
"formspec_version[4]" ..
|
||||
"size[5,5]" ..
|
||||
"label[1,1;This is shown on right click]" ..
|
||||
"label[1,1;Dies wird beim Rechtsklick angezeigt]" ..
|
||||
"field[1,2;2,1;x;x;]")
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
on_receive_fields = function(pos, formname, fields, spieler)
|
||||
if fields.quit then
|
||||
return
|
||||
end
|
||||
@ -350,30 +352,32 @@ minetest.register_node("mymod:rightclick", {
|
||||
})
|
||||
```
|
||||
|
||||
Formspecs set this way do not trigger the same callback. In order to
|
||||
receive form input for meta formspecs, you must include an
|
||||
`on_receive_fields` entry when registering the node.
|
||||
Auf diese Weise eingestellte formspecs lösen nicht denselben Callback aus. Um
|
||||
Formulareingaben für meta formspecs zu erhalten, müssen Sie einen
|
||||
`on_receive_fields`-Eintrag bei der Registrierung des Nodes enthalten.
|
||||
|
||||
This style of callback triggers when you press enter
|
||||
in a field, which is impossible with `minetest.show_formspec`;
|
||||
however, this kind of form can only be shown by right-clicking on a
|
||||
node. It cannot be triggered programmatically.
|
||||
Diese Art von Callback wird ausgelöst, wenn Sie die Eingabetaste
|
||||
in einem Feld drücken, was mit `minetest.show_formspec` unmöglich ist;
|
||||
allerdings kann diese Art von Formular nur durch Rechtsklick auf einen
|
||||
Node. Sie kann nicht programmatisch ausgelöst werden.
|
||||
|
||||
### Player Inventory Formspecs
|
||||
### Spieler Inventar Formspecs
|
||||
|
||||
The player inventory formspec is the one shown when the player presses i.
|
||||
The global callback is used to receive events from this formspec, and the
|
||||
formname is `""`.
|
||||
Der formspec für das Spielerinventar wird angezeigt, wenn der Spieler auf i drückt.
|
||||
Der globale Callback wird verwendet, um Ereignisse von diesem formspec zu empfangen, und der
|
||||
formname ist `""`.
|
||||
|
||||
There are a number of different mods which allow multiple mods to customise
|
||||
the player inventory. The officially recommended mod is
|
||||
[Simple Fast Inventory (sfinv)](sfinv.html), and is included in Minetest Game.
|
||||
Es gibt eine Reihe von verschiedenen Mods, die es ermöglichen, das
|
||||
das Spielerinventar anzupassen. Die offiziell empfohlene Mod ist
|
||||
[Simple Fast Inventory (sfinv)](https://github.com/rubenwardy/sfinv/blob/master/Tutorial.md),
|
||||
und ist in Minetest Game enthalten. Ich als Übersetzer emphele jedoch
|
||||
eher [i3](https://github.com/minetest-mods/i3) oder [unified inventory](https://github.com/minetest-mods/unified_inventory)
|
||||
|
||||
|
||||
### Your Turn
|
||||
### Sie sind dran
|
||||
|
||||
* Extend the Guessing Game to keep track of each player's top score, where the
|
||||
top score is how many guesses it took.
|
||||
* Make a node called "Inbox" where users can open up a formspec and leave messages.
|
||||
This node should store the placers' name as `owner` in the meta, and should use
|
||||
`show_formspec` to show different formspecs to different players.
|
||||
* Erweitern Sie das Ratespiel, um die höchste Punktzahl jedes Spielers zu ermitteln, wobei
|
||||
die höchste Punktzahl angibt, wie viele Ratschläge nötig waren.
|
||||
* Erstellen Sie einen Node namens "Inbox", in dem Benutzer ein formspec öffnen und Nachrichten hinterlassen können.
|
||||
Dieser Node sollte den Namen des Placers als `owner` in der Meta speichern, und sollte
|
||||
`show_formspec` verwenden, um verschiedene formspecs für verschiedene Spieler anzuzeigen.
|
||||
|
@ -12,6 +12,7 @@ chat message = Chat-Nachricht
|
||||
child = Kind
|
||||
client = Client
|
||||
Command = Befehl
|
||||
Context = Context
|
||||
Cubic Nodes = Würfelförmiger Block
|
||||
craft slots = Handwerksplätze
|
||||
Damage = Schaden
|
||||
@ -80,6 +81,7 @@ Object properties = Objekt-Eigenschaften
|
||||
Overrides = Overrides
|
||||
path = Verzeichnis
|
||||
parent = Elternteil
|
||||
per-player = pro-Spieler
|
||||
pixel art = Pixel-Art
|
||||
physics overrides = Physik-Overrides
|
||||
placer = plazierer
|
||||
|
Loading…
x
Reference in New Issue
Block a user