Merge branch 'develop'

This commit is contained in:
Enno Rehling 2018-05-18 15:34:50 +02:00
commit 6608f1b1ab
53 changed files with 18487 additions and 13075 deletions

View File

@ -1,14 +1,9 @@
{
"include": [
"config://res/core/messages.xml",
"config://res/core/de/strings.xml",
"config://res/core/en/strings.xml",
"config://res/eressea/strings.xml",
"config://res/eressea/spellinfo.xml",
"config://res/names-undead.xml",
"config://res/names-skeletons.xml",
"config://res/names-zombies.xml",
"config://res/names-ghouls.xml",
"config://res/names-dragons.xml"
"config://res/translations/strings.de.po",
"config://res/translations/strings.en.po",
"config://res/translations/messages.de.po",
"config://res/translations/messages.en.po",
"config://res/core/messages.xml"
]
}

View File

@ -1,14 +1,11 @@
{
"include": [
"config://res/core/messages.xml",
"config://res/core/de/strings.xml",
"config://res/core/en/strings.xml",
"config://res/e3a/strings.xml",
"config://res/e3a/shipnames.xml",
"config://res/names-undead.xml",
"config://res/names-skeletons.xml",
"config://res/names-zombies.xml",
"config://res/names-ghouls.xml",
"config://res/names-dragons.xml"
"config://res/translations/strings.de.po",
"config://res/translations/strings-e3.de.po",
"config://res/translations/messages.de.po",
"config://res/translations/strings.en.po",
"config://res/translations/strings-e3.en.po",
"config://res/translations/messages.en.po",
"config://res/core/messages.xml"
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -750,38 +750,6 @@
<text locale="de">"$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount)."</text>
<text locale="en">"$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount)."</text>
</message>
<message name="birthday_firework_noname_local" section="events">
<type>
<arg name="unit" type="unit"/>
</type>
<text locale="de">"$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel."</text>
<text locale="en">"A large firework is visible all over the sky."</text>
</message>
<message name="birthday_firework_noname" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
</type>
<text locale="de">"In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel."</text>
<text locale="en">"A large firework, visible all over the sky, has been started in $region($region)."</text>
</message>
<message name="birthday_firework_local" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="name" type="string"/>
</type>
<text locale="de">"Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel."</text>
<text locale="en">"A large firework in honor of ${name} is visible all over the sky."</text>
</message>
<message name="birthday_firework" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="name" type="string"/>
</type>
<text locale="de">"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel."</text>
<text locale="en">"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region)."</text>
</message>
<message name="battle_critical" section="battle">
<type>
<arg name="unit" type="unit"/>
@ -1682,7 +1650,7 @@
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="battle_army" section="battle">
<message name="para_army_index" section="battle">
<type>
<arg name="index" type="int"/>
<arg name="name" type="string"/>
@ -7211,20 +7179,13 @@
<text locale="en">"$unit($mage) casts $spell($spell), but nobody was in range."</text>
</message>
<message name="after_battle" section="battle">
<message name="para_after_battle" section="battle">
<type>
</type>
<text locale="de">"Einheiten nach dem Kampf:"</text>
<text locale="en">"Units after the battle:"</text>
</message>
<message name="section_battle" section="battle">
<type>
</type>
<text locale="de">""</text>
<text locale="en">""</text>
</message>
<message name="sp_wolfhowl_effect" section="battle">
<type>
<arg name="mage" type="unit"/>
@ -7284,7 +7245,7 @@
<text locale="en">"$unit($mage) causes the walls of $building($building) to glow in an eerie magic light."</text>
</message>
<message name="lineup_battle" section="battle">
<message name="para_lineup_battle" section="battle">
<type>
<arg name="turn" type="int"/>
</type>
@ -7628,7 +7589,7 @@
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster."</text>
</message>
<message name="aurapotion50" section="magic">
<message name="aurapotion50_effect" section="magic">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>

View File

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<eressea>
<strings>
<string name="canoe_a">
<text locale="de">ein Einbaum</text>
<text locale="en">a canoe</text>
</string>
<string name="raft_a">
<text locale="de">ein Floß</text>
<text locale="en">a raft</text>
</string>
<string name="cutter_a">
<text locale="de">ein Kutter</text>
<text locale="en">a cutter</text>
</string>
<string name="barge_a">
<text locale="de">eine Barke</text>
<text locale="en">a barge</text>
</string>
<string name="royalbarge_a">
<text locale="de">eine Königsbarke</text>
<text locale="en">a royal barge</text>
</string>
<string name="catamaran_a">
<text locale="de">ein Katamaran</text>
<text locale="en">a catamaran</text>
</string>
<string name="cog_a">
<text locale="de">eine Kogge</text>
<text locale="en">a cog</text>
</string>
<string name="caravel_a">
<text locale="de">eine Karavelle</text>
<text locale="en">a caravel</text>
</string>
<string name="frigate_a">
<text locale="de">eine Fregatte</text>
<text locale="en">a frigate</text>
</string>
<string name="galleon_a">
<text locale="de">eine Galeone</text>
<text locale="en">a galleon</text>
</string>
<string name="dragonship_a">
<text locale="de">ein Drachenschiff</text>
<text locale="en">a dragonship</text>
</string>
<string name="trireme_a">
<text locale="de">eine Trireme</text>
<text locale="en">a trireme</text>
</string>
<string name="canoe">
<text locale="de">Einbaum</text>
<text locale="en">canoe</text>
</string>
<string name="raft">
<text locale="de">Floß</text>
<text locale="en">raft</text>
</string>
<string name="cutter">
<text locale="de">Kutter</text>
<text locale="en">cutter</text>
</string>
<string name="barge">
<text locale="de">Barke</text>
<text locale="en">barge</text>
</string>
<string name="royalbarge">
<text locale="de">Königsbarke</text>
<text locale="en">royal barge</text>
</string>
<string name="catamaran">
<text locale="de">Katamaran</text>
<text locale="en">catamaran</text>
</string>
<string name="cog">
<text locale="de">Kogge</text>
<text locale="en">cog</text>
</string>
<string name="caravel">
<text locale="de">Karavelle</text>
<text locale="en">caravel</text>
</string>
<string name="frigate">
<text locale="de">Fregatte</text>
<text locale="en">frigate</text>
</string>
<string name="galleon">
<text locale="de">Galeone</text>
<text locale="en">galleon</text>
</string>
<string name="dragonship">
<text locale="de">Drachenschiff</text>
<text locale="en">dragonship</text>
</string>
<string name="trireme">
<text locale="de">Trireme</text>
<text locale="en">trireme</text>
</string>
</strings>
</eressea>

View File

@ -1,294 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<eressea>
<strings>
<!--
_d: dativ (wir erklären allen /Trollen/ den Krieg)
_p: plural (13 /Trolle/)
_x: preposition (15 /Troll/schwerter)
_a: including article (ein Troll, a troll)
-->
<string name="rm_adamantium">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantium">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantium_p">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantiumaxe">
<text locale="de">Adamantiumaxt</text>
<text locale="en">adamantium axe</text>
</string>
<string name="adamantiumaxe_p">
<text locale="de">Adamantiumäxte</text>
<text locale="en">adamantium axes</text>
</string>
<string name="adamantiumplate">
<text locale="de">Adamantiumrüstung</text>
<text locale="en">adamantium plate</text>
</string>
<string name="adamantiumplate_p">
<text locale="de">Adamantiumrüstungen</text>
<text locale="en">adamantium plates</text>
</string>
<string name="packice">
<text locale="de">Packeis</text>
<text locale="en">fast ice</text>
</string>
<string name="packice_trail">
<text locale="de">%s</text>
<text locale="en">%s</text>
</string>
<string name="rpg_item_1_p">
<text locale="de">Urkunden</text>
<text locale="en">Certificates</text>
</string>
<string name="rpg_item_2_p">
<text locale="de">Nußhälften</text>
<text locale="en">nut halves</text>
</string>
<string name="rpg_item_3_p">
<text locale="de">Flaschengeister</text>
<text locale="en">bottle demons</text>
</string>
<string name="rpg_item_1">
<text locale="de">Pandoras Urkunde für Halbling ehrenhalber, weiblich</text>
<text locale="en">Pandora's Certificate</text>
</string>
<string name="rpg_item_2">
<text locale="de">Heilige Nußhälfte</text>
<text locale="en">piece of a holy nut</text>
</string>
<string name="rpg_item_3">
<text locale="de">Flaschengeist Zhardamon</text>
<text locale="en">bottle demon Zhardamon</text>
</string>
<string name="rep_crossbow">
<text locale="de">Repetierarmbrust</text>
<text locale="en">repeating crossbow</text>
</string>
<string name="rep_crossbow_p">
<text locale="de">Repetierarmbrüste</text>
<text locale="en">repeating crossbows</text>
</string>
<!--Fort-Ausbaustufen -->
<string name="scaffolding">
<text locale="de">Gerüst</text>
<text locale="en">scaffolding</text>
</string>
<string name="guardhouse">
<text locale="de">Wachstube</text>
<text locale="en">guard house</text>
</string>
<string name="guardtower">
<text locale="de">Wachturm</text>
<text locale="en">guard tower</text>
</string>
<string name="watch">
<text locale="de">Wache</text>
<text locale="en">watch</text>
</string>
<string name="market">
<text locale="de">Marktplatz</text>
<text locale="en">marketplace</text>
</string>
<namespace name="morale">
<string name="0">
<text locale="de">aufständische</text>
<text locale="en">rebellious</text>
</string>
<string name="1">
<text locale="de">wütende</text>
<text locale="en">mad</text>
</string>
<string name="2">
<text locale="de">zornige</text>
<text locale="en">angry</text>
</string>
<string name="3">
<text locale="de">unruhige</text>
<text locale="en">agitated</text>
</string>
<string name="4">
<text locale="de">gleichgültige</text>
<text locale="en">indifferent</text>
</string>
<string name="5">
<text locale="de">entspannte</text>
<text locale="en">relaxed</text>
</string>
<string name="6">
<text locale="de">zufriedene</text>
<text locale="en">content</text>
</string>
<string name="7">
<text locale="de">glückliche</text>
<text locale="en">happy</text>
</string>
<string name="8">
<text locale="de">treue</text>
<text locale="en">loyal</text>
</string>
<string name="9">
<text locale="de">ergebene</text>
<text locale="en">devoted</text>
</string>
<string name="10">
<text locale="de">unterwürfige</text>
<text locale="en">subservient</text>
</string>
</namespace>
<string name="charger">
<text locale="de">Streitross</text>
<text locale="en">charger</text>
</string>
<string name="charger_p">
<text locale="de">Streitrösser</text>
<text locale="en">chargers</text>
</string>
<string name="towershield">
<text locale="de">Turmschild</text>
<text locale="en">tower shield</text>
</string>
<string name="towershield_p">
<text locale="de">Turmschilde</text>
<text locale="en">tower shields</text>
</string>
<namespace name="spell">
<string name="create_potion_p0">
<text locale="de">Braue Siebenmeilentee</text>
<text locale="en">brew seven mile tea</text>
</string>
<string name="create_potion_p2">
<text locale="de">Braue Wasser des Lebens</text>
<text locale="en">brew water of life</text>
</string>
<string name="create_potion_p3">
<text locale="de">Braue Schaffenstrunk</text>
<text locale="en">brew busy beer</text>
</string>
<string name="create_potion_ointment">
<text locale="de">Braue Wundsalbe</text>
<text locale="en">brew ointment</text>
</string>
<string name="create_potion_peasantblood">
<text locale="de">Braue Bauernblut</text>
<text locale="en">brew peasant blood</text>
</string>
<string name="create_potion_p9">
<text locale="de">Braue Pferdeglück</text>
<text locale="en">brew horsepower potion</text>
</string>
<string name="create_potion_p13">
<text locale="de">Braue Elixier der Macht</text>
<text locale="en">brew elixir of power</text>
</string>
<string name="create_potion_healing">
<text locale="de">Braue Heiltrank</text>
<text locale="en">brew healing potion</text>
</string>
</namespace>
<namespace name="spellinfo">
<string name="concealing_aura">
<text locale="de">Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Zeit vor den Blicken anderer verschleiern. Der Zauber schützt nicht vor Dieben und Spionen.</text>
<text locale="en">This spell will hide the whole equipment of a target unit from the looks of others. It will not protect against thieves or spies.</text>
</string>
<string name="raindance">
<text locale="de">Durch dieses uralte Tanzritual ruft der Zauberkundige die Kräfte des Lebens und der Fruchtbarkeit an. Die darauf folgenden Regenfälle begünstigen das Wachstum und erhöhen die Ernteerträge einiger Bauern der Region bis der Regen wieder nachlässt.</text>
<text locale="en">This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasants' harvest will be extraordinary good.</text>
</string>
<string name="blessedharvest">
<text locale="de">Für dieses Ernteritual sendet der Druide seine arkane Energie entlang der astralen Kraftlinien der gesamten Umgebung, um selbst weit entfernte Naturgeister zu erreichen. Die Beschwörung dieser Naturgeister ist eine hohe Kunst, die höchste Konzentration und vor allem viel Erfahrung erfordert. Die Bauern werden nach und nach von den besseren Ernten profitieren und ihre Ersparnisse steigern können.</text>
<text locale="en">This ritual not only increases the output of the local farms. Activating the astral ley lines, the druid is capable of activating even the nature spirits far away. Peasants' harvest in the affected regions will be extraordinarily good for a few weeks. </text>
</string>
<string name="earn_silver#draig">
<text locale="de">In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll: niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 25 Silber pro Stufe ein.</text>
<text locale="en">In the dark alleys you can find those who sell curses and hexes on demand -- but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 25 silver pieces per level.</text>
</string>
<string name="earn_silver#illaun">
<text locale="de">Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 25 Silber pro Stufe.</text>
<text locale="en">No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 25 silver pieces per level and week for offering these services to peasants.</text>
</string>
<string name="earn_silver#tybied">
<text locale="de">Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat -- nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 25 Silber pro Stufe lassen sich so in einer Woche verdienen.</text>
<text locale="en">If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - Well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 25 silver per level that way.</text>
</string>
<string name="earn_silver#cerddor">
<text locale="de">Cerddormagier sind _die_ Gaukler unter den Magiern; sie lieben es, das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 25 Silber pro Stufe verdient haben.</text>
<text locale="en">The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 25 silver per level. </text>
</string>
<string name="earn_silver#gwyrrd">
<text locale="de">Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 25 Silber verdienen.</text>
<text locale="en">The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 25 silver pieces per level in this way.</text>
</string>
<string name="create_potion_p0">
<text locale="en">Time is one of the first mysteries every magician tries to solve. If they succeed, they can focus all their energies on their magical studies as the ways between dormatory, library and magician tower now pass much faster. To keep their heart in tune the magicians use a special self-made tea. Some mages even share it with up to 10 people</text>
<text locale="de">Die Zeit ist eines der ersten Geheimnisse, die jeder Magier zu erkunden versucht. Gelingt ihm dies, kann er alle seine Energie auf das Studium der Magie verwenden; die Wege zwischen Dormitorium, Bibliothek und Magierturm schafft er nun viel schneller. Um sein Herz im Takt zu halten, verwendet er einen speziellen selbstgemachten Tee. Manche Magier teilen diesen Tee mit bis zu 10 Personen. </text>
</string>
<string name="create_potion_p2">
<text locale="en">One of the most strange spells enables the magician to withdraw a little life energy from their surroundings to produce the so called water of life. The juice of some selected herbs is used to conserve the energies of life. As the magician is protected by his magical abilities, he is the only one who can touch the juice without taking damage. This is necessary because the juice must be carried around from place to place to avoid damaging one region by taking too much energy at once.</text>
<text locale="de">In einem der seltsamsten Zauber kann der Magier seiner Umgebung ein klein wenig der Lebensenergie entziehen um das sogenannte Wasser des Lebens herstellen. Als Basis dient ihm hierbei der Saft aus einigen ausgesuchten Kräutern, welcher die Lebensenergie speichern kann. Da der Magier aufgrund seiner magischen Fähigkeiten immun ist, ist er der einzige, der den Saft berühren kann, ohne Schaden zu nehmen. Sodann muss er diesen eine Woche lang von Ort zu Ort tragen, damit er sich mit Lebensenergie vollsaugt, ohne einem einzelnen Ort soviel zu entfernen, dass er Schaden nimmt. </text>
</string>
<string name="create_potion_p3">
<text locale="en">Busybeer is another application for the knowledge about time a magician accumulates. Even though manual labour is only seldom done by mages, they still show interest in increasing the efficiency of their minions that do this work for them. Mornac the Wise was the first to discover how to produce a potion that would enable 10 minions to do the work of 20, thus freeing the other 10 for different experiments.</text>
<text locale="de">Ein weiteres Anwendungsgebiet des Wissens über die Zeit, welches ein Magier ansammelt, stellt der Schaffenstrunk dar. Auch wenn körperliche Arbeiten eher selten von Magiern ausgeführt werden, so haben diese doch ein Interesse daran, die Effizienz ihrer Untergebenen bei solchen Arbeiten zu steigern. Mornac der Weise war der erste, der entdeckte, dass man einen Trunk herstellen kann, durch den 10 Untergebene die Arbeit von 20 erledigen, wodurch der Rest für andere Experimente eingesetzt werden kann. </text>
</string>
<string name="create_potion_ointment">
<text locale="en">In the aftermath of battle it is vital to heal your own troops. This can be done by a healer as well as by a magician. In contrast to a healer, the magician can fullfill this treatment already before the battle by binding magical powers into a potent salve. This salve can be stored and only needs to be applied to the wounds after the battle. </text>
<text locale="de">Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkeit bietet der Magier ebenso wie der Heiler. Im Gegensatz zum Heiler ist der Magier jedoch in der Lage, seine Behandlung bereits vor dem Kampf durchzuführen, indem er seine Heilkräfte in eine magische Salbe bindet, welche gelagert werden kann und nach dem Kampf nur aufgetragen werden muss.</text>
</string>
<string name="create_potion_peasantblood">
<text locale="en">One of the most dangerous and best guarded secrets of all mages is the knowledge about the power of death. Even though most of them would not openly admit it, and it is at least partially forbidden in most countries, each of them studies death sooner or later. When they do, they quickly find out that there is another plane of existance: the home of the demons. Only blood can quelch the thirst of those, when they switch from their home to our world. But experienced mages will find out that the demons bloodwine can be deluted when appropiate herbs are included, making it enough for 100 instead of 10 demons. As the demons may not know about that, the magician has to secretly sacrifice one of his freed minions.</text>
<text locale="de">Zu dem gefährlichsten und geheimsten Wissen der Magier zählt das Wissen über die Macht des Todes. Auch wenn die meisten es nicht zugeben, so fasziniert dieses Thema jeden Magier. Früher oder später beschäftigen sich alle mit diesem teilweise verbotenen Gebiet. Sodann werden sie feststellen, dass es noch eine weitere Ebene der Existenz gibt, in der die Dämonen beheimatet sind. Nur Blut allein vermag den Hunger dieser Wesen zu befriedigen, wenn sie ihre Ebene verlassen und unsere betreten. Erfahrene Magier werden jedoch feststellen, dass man den Blutwein, den die Dämonen zu sich nehmen, strecken kann, so dass davon 100 anstatt nur 10 Dämonen satt werden. Da die Dämonen davon jedoch nichts wissen dürfen, muss der Magier selbst klammheimlich einen seiner urplötzlich verfügbar gewordenen Untergebenen opfern. </text>
</string>
<string name="create_potion_p9">
<text locale="en">Even though mages live in strict celibacy, they know a lot about creating certain longings. Peasants keep asking them for this love potion or that. But the penality for bewitching a peasant is death, so the mages offer their services only to farmers for their breeding stock. In an elaborate ritual, which only serves to hide the simplicity of the procedure, the magician draws the fluids from certains plants. While doing so he calls upon the spirits of fertility, which of course only listen when he talkes to them. Now the farmer knows that any attempt to draw the fluids himself will only result in a useless waste of resources. Finally, the magician hands the vial with the fluids to the farmer, who pours it into his horses' drinking water.</text>
<text locale="de">Obwohl für Magier das Gebiet der Liebe tabu ist und sie im strengen Zölibat leben, haben sie ein großes Wissen darüber, wie man gewisse Bedürfnisse weckt, weshalb sie immer wieder von Dorfbewohnerinnen und Dorfbewohnern nach entsprechenden Zaubern gefragt werden. Da die Verzauberung eines Bewohners jedoch streng verboten ist, bieten sie ihre Dienste nur für die Züchter an. In einem aufwendigen Ritual, welches jedoch nur dazu dient zu verschleiern, wie einfach dies eigentlich ist, vermischt der Magier vor den Augen des Züchters einige Pflanzensäfte. Dabei ruft er die Geister an, die dem Pferdezüchter das Glück bescheren sollen, um klarzumachen, das diese nur mit ihm sprechen und jeglicher Versuch des Züchters, selbst die Kräuter zu mischen, nur eine unbrauchbare Pampe produzieren würde. Anschließend überreicht der Magier dem Züchter eine Phiole, die dieser in die Tränke seiner Pferde entleeren muss.</text>
</string>
<string name="create_potion_p13">
<text locale="en">Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. </text>
<text locale="de">Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde.</text>
</string>
<string name="create_potion_healing">
<text locale="en">Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom.</text>
<text locale="de">Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt.</text>
</string>
</namespace>
<namespace name="spell">
<string name="commonfamiliar">
<text locale="de">Vertrauten binden</text>
<text locale="en">Bind Familiar</text>
</string>
</namespace>
<namespace name="spellinfo">
<string name="commonfamiliar">
<text locale="de">Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird.</text>
<text locale="en">During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them.</text>
</string>
</namespace>
<namespace name="describe">
<string name="lifepotion">
<text locale="de">Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen.</text>
<text locale="en">The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs.</text>
</string>
</namespace>
</strings>
</eressea>

View File

@ -1,121 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<namespace name="spellinfo">
<string name="concealing_aura">
<text locale="de">Dieser Zauber wird die gesamte Ausrüstung der
Zieleinheit für einige Zeit vor den Blicken anderer verschleiern.</text>
<text locale="en">This spell will hide the whole equipment of a target
unit from the looks of others.</text>
</string>
<string name="raindance">
<text locale="de">Dieses uralte Tanzritual ruft die
Kräfte des Lebens und der Fruchtbarkeit. Die Erträge der
Bauern werden für einige Wochen deutlich besser
ausfallen.</text>
<text locale="en">This ancient rite calls upon the
forces of life and fertility. For the next few weeks,
the peasant's harvest will be extraordinary good.</text>
</string>
<string name="blessedharvest">
<text locale="de">Dieses Ernteritual verbessert die Erträge der
arbeitenden Bauern in der Region um ein Silberstück. Je mehr Kraft der
Druide investiert, desto länger wirkt der Zauber.</text>
<text locale="en">This ritual increases the output of the local farms.
Peasants in the region produce an extra silverpiece. The stronger the
druid's spell is, the longer the effect will last.</text>
</string>
<string name="earn_silver#tybied">
<text locale="de">Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem
gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen
alles, was man sonst nicht bekommen kann. Ob nun die kryptische
Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen
hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen.
Dem Magier hilft es auf jeden Fall... beim Füllen seines
Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche
verdienen.</text>
<text locale="en">If the local alchemist could not help you, you should visit a
scholar of Tybied. His potions and tinctures may help when nothing
else does. If the cryptic formula under the wooden shoes of the
unfaithful husband really helped? - well, the peasant, who isn't
capable of reading, will never know. At least it helped the magician...
to fill his purse. In one week he can earn 50 silver per level that
way.</text>
</string>
<string name="earn_silver#cerddor">
<text locale="de">Cerddormagier sind _die_ Gaukler unter
den Magiern, sie lieben es das Volk zu unterhalten und
im Mittelpunkt zu stehen. Schon Anfänger lernen die
kleinen Kunststücke und magischen Tricks, mit denen man
das Volk locken und verführen kann, den Geldbeutel ganz
weit zu öffnen, und am Ende der Woche wird der Gaukler
50 Silber pro Stufe verdient haben.</text>
<text locale="en">The mages of Cerddor truly are the
bards of the wizards; they love to use their sorcery to
entertain the crowds and to be the center of attention.
Even the apprentices study those little magic tricks,
which attract and fascinate the people and thus ensnare
them into leaving a few coins or more for the artist. By
the end of the week, the bard will have earned 50 silver
per level. </text>
</string>
<string name="earn_silver#gwyrrd">
<text locale="de">Die Fähigkeiten der Gwyrrd-Magier in
der Viehzucht und Heilung sind bei den Bauern sehr
begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr
gefragt. Manch einer mag auch sein Talent dazu nutzen,
ein Tier für einen besseren Preis zu verkaufen. Pro
Stufe kann der Magier so 50 Silber verdienen.</text>
<text locale="en">The abilities of the mages of Gwyrrd
concerning the breeding and healing of cattle are highly
appreciated among the peasants. Especially at the
markets, their services are demanded frequently. Some of
them also use their talents to sell an animal at a
higher price. A magician can earn 50 silver pieces per level
in this way.</text>
</string>
<string name="earn_silver#draig">
<text locale="de">In den dunkleren Gassen gibt es sie,
die Flüche und Verhexungen auf Bestellung. Aber
auch Gegenzauber hat der Jünger des Draigs
natürlich im Angebot. Ob nun der Sohn des
Nachbarn in einen Liebesbann gezogen werden soll
oder die Nebenbuhlerin Pickel und Warzen
bekommen soll, niemand gibt gerne zu, zu solchen
Mitteln gegriffen zu haben. Für diese
Dienstleistung streicht der Magier 50 Silber pro
Stufe ein.</text>
<text locale="en">In the dark alleys you can find those
who sell curses and hexes on demand - but you
can buy the apropriate counterspells from the
followers of Draig as well. May it be a love
spell for the son of a neighbour or a wart in
the face of a rival. For offering these
services, the sorcerer charges 50 silver pieces
per level.</text>
</string>
<string name="earn_silver#illaun">
<text locale="fr">Personne n'interprète aussi bien les
rêves que les mages d'Illaun. Ils sont également
versés dans l'utilisation des objets utilisés
pour prédire le futur comme les boules de
cristal, les cartes de tarot ou les lignes de la
main. Un mentaliste peut gagner 50 écus par
niveau et par semaine en proposant ses services
aux paysans.</text>
<text locale="de">Niemand kann so gut die Träume deuten
wie ein Magier des Illaun. Auch die Kunst der
Wahrsagerei, des Kartenlegens und des Handlesens
sind ihm geläufig. Dafür zahlen ihm die Bauern
50 Silber pro Stufe.</text>
<text locale="en">No one can read dreams as well as the
mages of Illaun. Furthermore, they are also
familiar with all other common means of
foretelling the future like crystal balls, tarot
cards or palms. A mentalist can earn 50 silver
pieces per level and week for offering these
services to peasants.</text>
</string>
</namespace>
</strings>
</eressea>

View File

@ -1,413 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<namespace name="describe">
<string name="lifepotion">
<text locale="en">The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood.</text>
<text locale="de">Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme.</text>
</string>
</namespace>
<namespace name="spellinfo">
<string name="headache">
<text locale="de">
Aufzeichung des Vortrags von Selen Ard'Ragorn in Bar'Glingal:
'Es heisst, dieser Spruch wäre wohl in den Spelunken der Westgassen
entstanden, doch es kann genausogut in jedem andern verrufenen
Viertel gewesen sein. Seine wichtigste Zutat ist etwa ein Fass
schlechtesten Weines, je billiger und ungesunder, desto
wirkungsvoller wird die Essenz. Die Kunst, diesen Wein in pure
Essenz zu destillieren, die weitaus anspruchsvoller als das einfache
Rezeptmischen eines Alchemisten ist, und diese dergestalt zu binden
und konservieren, das sie sich nicht gleich wieder verflüchtigt, wie
es ihre Natur wäre, ja, dies ist etwas, das nur ein Meister des
Cerddor vollbringen kann. Nun besitzt Ihr eine kleine Phiola mit
einer rubinrotschimmernden - nun, nicht flüssig, doch auch nicht
ganz Dunst - nennen wir es einfach nur Elixier. Doch nicht dies ist
die wahre Herausforderung, sodann muss, da sich ihre Wirkung leicht
verflüchtigt, diese innerhalb weniger Tage unbemerkt in das Getränk
des Opfers geträufelt werden. Ihr Meister der Betöhrung und
Verführung, hier nun könnt Ihr Eure ganze Kunst unter Beweis
stellen. Doch gebt Acht, nicht unbedacht selbst von dem Elixier zu
kosten, denn wer einmal gekostet hat, der kann vom Weine nicht mehr
lassen, und er säuft sicherlich eine volle Woche lang. Jedoch nicht
die Verführung zum Trunke ist die wahre Gefahr, die dem Elixier
innewohnt, sondern das der Trunkenheit so sicher ein gar
fürchterliches Leid des Kopfes folgen wird, wie der Tag auf die
Nacht folgt. Und er wird gar sicherlich von seiner besten Fähigkeit
einige Tage bis hin zu den Studien zweier Wochen vergessen haben.
Noch ein Wort der Warnung: dieses ist sehr aufwendig, und so Ihr
noch weitere Zauber in der selben Woche wirken wollt, so werden sie Euch
schwerer fallen.'
</text>
<text locale="en">
Transcript to the lecture of Selen Ard'Ragorn in Bar'Glingal:
'It is said, this spell had its beginnings in the drinking holes of the
Westgassen, but every other disreputable quarter is just as likely. Its
most important ingredient is about a cask of terrible wine, the cheaper
and more unbecoming, the more effective will be the essence. The art to
distill this wine into pure essence is far more demanding than the simple
brewery of an alchemist. Even more so to bind and conserve it, preventing
its natural tendency to evaporate. This can only be accomplished by a
master of Cerddor. Say, you manage to produce a vial of this ruby red,
shimmering - well, not fluid, but also not exactly vapor - let's call it
elixir. More challenges still lie ahead. The effective properties of the
elixir are quick to dissipate. Therefore it has to be dribbled into the
drink of the chosen victim within days. That is when you masters of
infatuation and seduction can truly proof your worth. But take care not
to drink of the concoction yourselves, for one taste will ensnare you to
the tastes of wine and you will spend a full week on a bender. And as
sure as day follows night, a dreadful agony will claim your head
afterwards. You will lose knowledge of your best skill, two weeks worth
of study just gone.
Another word of warning: this spell is very complex. Should you try
further spells during the same week, they will be far more difficult to
perform.'
</text>
</string>
<string name="analysedream">
<text locale="de">Mit diesem Spruch kann der Traumweber
versuchen, die Verzauberungen einer einzelnen
Einheit zu erkennen. Von allen Sprüchen, die
seine eigenen Fähigkeiten nicht überschreiten,
wird er einen Eindruck ihres Wirkens erhalten
können. Bei stärkeren Sprüchen benötigt er ein
wenig Glück für eine gelungene Analyse.</text>
<text locale="en">With this spell the mentalist can
attempt to detect enchantments on a target unit.
He will get an idea of the effect of all spells
that don't exceed his own abilities. If a spell
is stronger, it takes a little luck for a
successful analysis.</text>
</string>
</namespace>
<namespace name="spell">
<string name="analysedream">
<text locale="de">Traumbilder analysieren</text>
<text locale="en">Analyse Dreams</text>
</string>
<string name="headache">
<text locale="de">Schaler Wein</text>
<text locale="en">Hangover</text>
</string>
</namespace>
<namespace name="race">
<string name="snowman">
<text locale="de">Schneemann</text>
<text locale="en">snowman</text>
</string>
<string name="snowman_p">
<text locale="de">Schneemänner</text>
<text locale="en">snowmen</text>
</string>
</namespace>
<namespace name="shipinfo">
<!-- ship info is not implemented! -->
<string name="balloon">
<text locale="de">Der Sumpfgasballon besteht aus einem großen
Weidenkorb, welcher Platz
für maximal 5 Personen oder 500 Gewichtseinheiten bietet, und einer
großen, mit Sumpfgas gefüllten Wyrmblase. Bei guten Winden kann sich
der Ballon zwei Regionen pro Woche fortbewegen. Das Führen eines
Ballons ist nicht einfach, und der Kapitän muss mindestens ein
Segeltalent von 6 besitzen. Diese neue Entwicklung auf Eressea wird
ausschließlich für den Xontormia-Expreß hergestellt und die Baupläne
sind streng geheim. So ist es auch bisher noch niemandem gelungen, ein
Exemplar nachzubauen.</text>
</string>
</namespace>
<namespace name="iteminfo">
<string name="ring_of_levitation">
<text locale="de">Benutzt der Kapitän des Schiffes diesen Talisman, so wird allen an Bord befindlichen Mallornsamen ihre magisch Energie entzogen, und das Schiff kann mit dieser Energie bis zu zwei Wochen lang fliegen.</text>
</string>
<string name="birthdaycake">
<text locale="de">Eine Geburtstagstorte mit 10 Kerzen. Herzlichen Glückwunsch, Eressea!</text>
<text locale="en">A birthday cake with 10 candles. Happy Birthday, Eressea!</text>
</string>
<string name="cookie">
<text locale="de">Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e</text>
</string>
<string name="eyeofdragon">
<text locale="de">So wisse denn, dass das Auge des Drachen den Weg zur Herausforderung
aufzeigt. Doch die Überlieferung sagt, das nur der Unschuldige und
Ungewappnete es benutzen kann. Sie sagt auch, daß er einen Beutel mit
einem Betrag von bis zu zweitausend Silber mit sich führen soll,
jedoch nicht mehr als einem Fünftel der Stärke seines Volkes
entsprechend - dem Torwächter zum Geschenke als Beweis seiner
asketischen Gesinnung. Die 5 scheidet ganz aus.</text>
</string>
<string name="almond">
<text locale="de">(Prunus dulcis) [...] Die Nüsse existieren in zwei Varianten, süß und
bitter. Süße Mandeln sind der bekannte eßbare Typ, der in Form von
Nüssen gegessen, beim Kochen verwandt oder zu Mandelöl und Mandelmehl
verarbeitet wird.</text>
</string>
<string name="apple">
<text locale="en">A tasty fruit.</text>
<text locale="de">Frucht aus der Gattung Malus (ca. 25 Arten), gehört
zur Familie der
Rosengewächse. Die am häufigsten kultivierte Baumfrucht. Der Apfel
gehört zu den fleischigen Früchten, in dem der gereifte Fruchtknoten
und
das umgebende Gewebe fleischig und eßbar werden. Die Apfelblüte der
meisten Varianten erfordert Kreuzbestäubung zur Befruchtung. Form und
Größe des Apfels bei der Ernte variieren abhängig von kulturellen und
umweltbedingten Einflüssen in Größe, Form, Farbe und Geschmack, sind
jedoch nichtsdestotrotz üblicherweise rund, zwischen 50 und 100mm im
Durchmesser und weisen röt- oder gelbliche Farbtöne auf.</text>
</string>
<string name="nut">
<text locale="de">Nuß, im umgangssprachlichen Sinne alle trockenen,
hartschaligen
Früchte oder Samen, die eine Schale besitzen, die sich leicht
vom inneren, eßbaren Kern entfernen läßt. In der botanischen
Terminologie beschränkt sich die Bezeichnung Nuß auf eine
einsamige Frucht, die aus einem Fruchtknoten (Ovarium)
entstanden ist, dessen äußere Wände sich verholzt haben und der
sich nicht öffnet, um seinen Samen zu entlassen. Solche echten
Nüsse können eßbar, aber auch ungenießbar sein. Bekannte
Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse.
Beispiele für Früchte oder Samen, die vom Volksmund fälschlich
als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im
botanischen Sinne sind dies Steinfrüchte, denen die fleischige
äußere Schale entfernt wurde. Andere Beispiele für unechte
Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie
Roßkastanien und Paranüsse, bei denen es sich um von Kapseln
umhüllte Samen handelt.</text>
</string>
<string name="jadee_ring">
<text locale="de">Zwerge schufen diesen wunderschönen Ring aus Weissgold und Platin. Die
Oberfläche ist so glatt, dass man nur bei genauem Hinsehen entdeckt,
dass hier eigentlich zwei Metalle ineinander verarbeitet worden sind.
In der Innenseite des Rings ist eine Gravur zu lesen: "Wildente, 3.
Woche Eiswind Jahr 8".</text>
</string>
<string name="jadee_dress">
<text locale="de">Dieses Brautkleid ist mit Abstand das schönste, was je jemand
irgendwie irgendwo gesehen hat. Auch wenn nur Wildente und Jadee das
finden müssten, wird jeder Bewohner Eresseas dies neidlos bestätigen.
Das sehr stilvolle Kleid lässt die zarten Schultern seiner Trägerin
frei und liegt am Oberkörper eng an. Dies betont atemberaubend die
zarten Kurven der Braut. Der Rock fällt leicht ausgestellt den ganzen
langen Weg an den Beinen herunter Richtung Boden, wo er sich in einer
sehr stilvollen Schleppe ergiesst.</text>
</string>
<string name="wente_ring">
<text locale="de">Dieser Ring ist ein wahres Meisterwerk. Obwohl er sehr gross ist
(weil auch sein Träger sehr gross ist), wirkt er filigran. Weissgold
und Platin verschmelzen in diesem Ring zu einer Einheit, die die
Schönheit der einzelnen Elemente nur noch unterstreich. In der
Innenseite des Rings ist eine Gravur zu lesen: 'Jadee, 3. Woche
Eiswind Jahr 8'.</text>
</string>
<string name="wente_dress">
<text locale="de">Hach! Sieht der Mann beeindruckend aus in diesem Frack! Und so
ordentlich! Und so ernst! Und so beeindruckend! Es fällt ein
wenig schwer, sich auf den Bräutigam zu konzentrieren, weil das
Brautkleid noch daneben strahlt, aber der Anzug des Bräutigams ist
auf jeden Fall so, wie er sein soll und sieht toll aus und sehr
geschmackvoll.</text>
</string>
<string name="snowman">
<text locale="en">Orange nose, black hat, frosty character. A snowman.
He'll make a fine guard if you use him in a cold place. (USE 1
snowman)</text>
<text locale="de">Rübennase, schwarzer Hut, kaltes Herz. Ein Schneemann. Er gibt
einen prima Wachmann ab, wenn er in einem Gletscher belebt wird
(BENUTZE 1 Schneemann).</text>
</string>
<string name="snowball">
<text locale="en">These items stay frozen all year round. There seem to be bits of
ice in them - in the right hands, these might put an eye out!</text>
<text locale="de">Ein Schneeball. Es scheinen kleine Eissplitter darin zu sein. In
den richtigen Händen können sie sicher weh tun.</text>
</string>
<string name="seashell">
<text locale="en">This badge pronounces its wearer an official visitor to the
embassies of Muschelplateau.</text>
<text locale="de">Dieses Abzeichen identifiziert die Partei seines Trägers offiziell
als einen Besucher der Botschafterregion 'Muschelplateau'.</text>
</string>
<string name="xmastree">
<text locale="de">Dieser wunderschoen geschmueckte Baum entfaltet in den Wintermonaten eine magische Wirkung auf den ganzen Wald.</text>
<text locale="en">In the winter months, this beautifully decorated tree has a magical effect on the entire forest.</text>
</string>
<string name="stardust">
<text locale="de">Dieser magische Staub ist aus einem im Winter vom Himmel gefallenen
Stern gewonnen worden, und ihm werden aphrodisiakische Eigenschaften
nachgesagt.</text>
<text locale="en">This vial of dust, made from the remains of a star that fell from
the sky one cold winter night, is said to have aphrodisiacal powers.</text>
</string>
</namespace>
<string name="ring_of_levitation">
<text locale="de">Ring der Levitation</text>
<text locale="en">ring of levitation</text>
</string>
<string name="ring_of_levitation_p">
<text locale="de">Ringe der Levitation</text>
<text locale="en">rings of levitation</text>
</string>
<string name="birthdaycake">
<text locale="de">Geburtstagstorte</text>
<text locale="en">birthday cake</text>
</string>
<string name="birthdaycake_p">
<text locale="de">Geburtstagstorten</text>
<text locale="en">birthday cakes</text>
</string>
<string name="seashell">
<text locale="de">Muschel</text>
<text locale="en">seashell</text>
</string>
<string name="seashell_p">
<text locale="de">Muscheln</text>
<text locale="en">seashells</text>
</string>
<string name="newbie_info_cr">
<text locale="de">Mit der ersten Auswertung bekommst du einen
Computerreport, den du mit vielen Tools wie z.B. Magellan benutzen kannst. Wenn du ihn
weiterhin bekommen willst, gib einer deiner Einheiten den Befehl OPTION
COMPUTER.</text>
<text locale="en">With the first two turns, you will get a computer report
(CR). It can be used with some tools like Magellan. If you want to continue
getting it after the second turn, please make one of your units give the
order OPTION COMPUTER.</text>
</string>
<string name="temple">
<text locale="de">Tempel</text>
<text locale="en">temple</text>
</string>
<string name="seaserpenthead">
<text locale="de">Seeschlangenkopf</text>
</string>
<string name="seaserpenthead_p">
<text locale="de">Seeschlangenköpfe</text>
</string>
<!-- starting here: Wildente and Jadee's wedding -->
<string name="pavilion">
<text locale="de">Pavillion</text>
<text locale="en">pavilion</text>
</string>
<string name="portal">
<text locale="de">Portal</text>
<text locale="en">portal</text>
</string>
<string name="jadee_ring">
<text locale="de">Jadees Hochzeitsring</text>
<text locale="en">Jadee's wedding ring</text>
</string>
<string name="jadee_ring_p">
<text locale="de">Jadees Hochzeitsringe</text>
<text locale="en">Jadee's wedding rings</text>
</string>
<string name="wente_ring">
<text locale="de">Wildentes Hochzeitsring</text>
<text locale="en">Wildente's wedding ring</text>
</string>
<string name="wente_ring_p">
<text locale="de">Wildentes Hochzeitsringe</text>
<text locale="en">Wildente's wedding rings</text>
</string>
<string name="jadee_dress">
<text locale="de">Hochzeitskleid</text>
<text locale="en">wedding dress</text>
</string>
<string name="jadee_dress_p">
<text locale="de">Hochzeitskleider</text>
<text locale="en">wedding dresses</text>
</string>
<string name="wente_dress">
<text locale="de">Frack</text>
<text locale="en">tuxedo</text>
</string>
<string name="wente_dress_p">
<text locale="de">Fräcke</text>
<text locale="en">tuxedos</text>
</string>
<string name="ring">
<text locale="de">Ring</text>
<text locale="en">ring</text>
</string>
<string name="ring_p">
<text locale="de">Ringe</text>
<text locale="en">rings</text>
</string>
<!-- ending here: Wildente and Jadee's wedding -->
<!-- art rewards begin -->
<string name="artacademy">
<text locale="de">Akademie der Künste</text>
<text locale="en">academy of arts</text>
</string>
<string name="aurapotion50">
<text locale="de">Auratrank</text>
<text locale="en">aura potion</text>
</string>
<string name="aurapotion50_p">
<text locale="de">Auratränke</text>
<text locale="en">aura potions</text>
</string>
<string name="bagpipeoffear">
<text locale="de">Dudelsack der Furcht</text>
<text locale="en">bagpipe of fear</text>
</string>
<string name="bagpipeoffear_p">
<text locale="de">Dudelsäcke der Furcht</text>
<text locale="en">bagpipes of fear</text>
</string>
<!-- art rewards end -->
<string name="rm_adamantium">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantium">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantium_p">
<text locale="de">Adamantium</text>
<text locale="en">adamantium</text>
</string>
<string name="adamantiumaxe">
<text locale="de">Adamantiumaxt</text>
<text locale="en">adamantium axe</text>
</string>
<string name="adamantiumaxe_p">
<text locale="de">Adamantiumäxte</text>
<text locale="en">adamantium axes</text>
</string>
<string name="adamantiumplate">
<text locale="de">Adamantiumrüstung</text>
<text locale="en">adamantium plate</text>
</string>
<string name="adamantiumplate_p">
<text locale="de">Adamantiumrüstungen</text>
<text locale="en">adamantium plates</text>
</string>
<string name="aoc">
<text locale="de">Katzenamulett</text>
<text locale="en">amulet of the kitten</text>
<text locale="fr">amulette du chaton</text>
</string>
<string name="aoc_p">
<text locale="en">amulets of the kitten</text>
<text locale="de">Katzenamulette</text>
<text locale="fr">amulettes du chaton</text>
</string>
</strings>
</eressea>

View File

@ -1,95 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<string name="dragon_postfix_0">
<text locale="de">der Weise</text>
</string>
<string name="dragon_postfix_1">
<text locale="de">der Allwissende</text>
</string>
<string name="dragon_postfix_2">
<text locale="de">der Mächtige</text>
</string>
<string name="dragon_postfix_3">
<text locale="de">die Ehrwürdige</text>
</string>
<string name="dragon_postfix_4">
<text locale="de">die Listige</text>
</string>
<string name="dragon_postfix_5">
<text locale="de">der Grüne</text>
</string>
<string name="dragon_postfix_6">
<text locale="de">die Strafende</text>
</string>
<string name="dragon_postfix_7">
<text locale="de">der Sehende</text>
</string>
<string name="dragon_postfix_8">
<text locale="de">der Reisende</text>
</string>
<string name="dragon_postfix_9">
<text locale="de">die Wissende</text>
</string>
<string name="dragon_postfix_10">
<text locale="de">der Goldene</text>
</string>
<string name="dragon_postfix_11">
<text locale="de">der Graue</text>
</string>
<string name="dragon_postfix_12">
<text locale="de">der Steinerne</text>
</string>
<string name="dragon_postfix_13">
<text locale="de">die Alte</text>
</string>
<string name="dragon_postfix_14">
<text locale="de">die Mächtige</text>
</string>
<string name="dragon_postfix_15">
<text locale="de">die Goldene</text>
</string>
<string name="dragon_postfix_16">
<text locale="de">der Grausame</text>
</string>
<string name="dragon_postfix_17">
<text locale="de">der Sanddrache</text>
</string>
<string name="dragon_postfix_18">
<text locale="de">der Durstige</text>
</string>
<string name="dragon_postfix_19">
<text locale="de">die Verzehrende</text>
</string>
<string name="dragon_postfix_20">
<text locale="de">die Grüne</text>
</string>
<string name="dragon_postfix_21">
<text locale="de">die Rote</text>
</string>
<string name="dragon_postfix_22">
<text locale="de">der Furchtlose</text>
</string>
<string name="dragon_postfix_23">
<text locale="de">der Allmächtige</text>
</string>
<string name="dragon_postfix_24">
<text locale="de">der Weitblickende</text>
</string>
<string name="dragon_postfix_25">
<text locale="de">der Weiße</text>
</string>
<string name="dragon_postfix_26">
<text locale="de">die Glänzende</text>
</string>
<string name="dragon_postfix_27">
<text locale="de">der Wissende</text>
</string>
<string name="dragon_postfix_28">
<text locale="de">die Unbarmherzige</text>
</string>
<string name="dragon_postfix_29">
<text locale="de">die Schöne</text>
</string>
</strings>
</eressea>

View File

@ -1,116 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<string name="ghoul_prefix_0">
<text locale="de">Faulende</text>
</string>
<string name="ghoul_prefix_1">
<text locale="de">Angsteinflößende</text>
</string>
<string name="ghoul_prefix_2">
<text locale="de">Leise</text>
</string>
<string name="ghoul_prefix_3">
<text locale="de">Kinderfressende</text>
</string>
<string name="ghoul_prefix_4">
<text locale="de">Menschenfressende</text>
</string>
<string name="ghoul_prefix_5">
<text locale="de">Wahnsinnige</text>
</string>
<string name="ghoul_prefix_6">
<text locale="de">Brutale</text>
</string>
<string name="ghoul_prefix_7">
<text locale="de">Schwarze</text>
</string>
<string name="ghoul_prefix_8">
<text locale="de">Dunkle</text>
</string>
<string name="ghoul_prefix_9">
<text locale="de">Fürchterliche</text>
</string>
<string name="ghoul_prefix_10">
<text locale="de">Grauenhafte</text>
</string>
<string name="ghoul_prefix_11">
<text locale="de">Furchtbare</text>
</string>
<string name="ghoul_prefix_12">
<text locale="de">Entsetzliche</text>
</string>
<string name="ghoul_prefix_13">
<text locale="de">Schauderhafte</text>
</string>
<string name="ghoul_prefix_14">
<text locale="de">Schreckliche</text>
</string>
<string name="ghoul_prefix_15">
<text locale="de">Düstere</text>
</string>
<string name="ghoul_prefix_16">
<text locale="de">Schaurige</text>
</string>
<string name="ghoul_name_0">
<text locale="de">Ghoule</text>
</string>
<string name="ghoul_name_1">
<text locale="de">Kreaturen</text>
</string>
<string name="ghoul_name_2">
<text locale="de">Verlorene</text>
</string>
<string name="ghoul_name_3">
<text locale="de">Erschlagene</text>
</string>
<string name="ghoul_name_4">
<text locale="de">Verdammte</text>
</string>
<string name="ghoul_name_5">
<text locale="de">Schlurfende Ghoule</text>
</string>
<string name="ghoul_postfix_0">
<text locale="de">der Nacht</text>
</string>
<string name="ghoul_postfix_1">
<text locale="de">der Schatten</text>
</string>
<string name="ghoul_postfix_2">
<text locale="de">der Finsternis</text>
</string>
<string name="ghoul_postfix_3">
<text locale="de">des Bösen</text>
</string>
<string name="ghoul_postfix_4">
<text locale="de">der Erschlagenen</text>
</string>
<string name="ghoul_postfix_5">
<text locale="de">der Verfluchten</text>
</string>
<string name="ghoul_postfix_6">
<text locale="de">der Ruhelosen</text>
</string>
<string name="ghoul_postfix_7">
<text locale="de">aus dem Nebel</text>
</string>
<string name="ghoul_postfix_8">
<text locale="de">aus dem Dunkel</text>
</string>
<string name="ghoul_postfix_9">
<text locale="de">der Tiefe</text>
</string>
<string name="ghoul_postfix_10">
<text locale="de">in Ketten</text>
</string>
<string name="ghoul_postfix_11">
<text locale="de">aus dem Totenreich</text>
</string>
<string name="ghoul_postfix_12">
<text locale="de">aus der Unterwelt</text>
</string>
</strings>
</eressea>

View File

@ -1,121 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<string name="skeleton_prefix_0">
<text locale="de">Klapperige</text>
</string>
<string name="skeleton_prefix_1">
<text locale="de">Stöhnende</text>
</string>
<string name="skeleton_prefix_2">
<text locale="de">Schwarzknochige</text>
</string>
<string name="skeleton_prefix_3">
<text locale="de">Schwarzgewandete</text>
</string>
<string name="skeleton_prefix_4">
<text locale="de">Angsteinflößende</text>
</string>
<string name="skeleton_prefix_5">
<text locale="de">Heulende</text>
</string>
<string name="skeleton_prefix_6">
<text locale="de">Wartende</text>
</string>
<string name="skeleton_prefix_7">
<text locale="de">Grauenvolle</text>
</string>
<string name="skeleton_prefix_8">
<text locale="de">Schwarze</text>
</string>
<string name="skeleton_prefix_9">
<text locale="de">Dunkle</text>
</string>
<string name="skeleton_prefix_10">
<text locale="de">Fürchterliche</text>
</string>
<string name="skeleton_prefix_11">
<text locale="de">Grauenhafte</text>
</string>
<string name="skeleton_prefix_12">
<text locale="de">Furchtbare</text>
</string>
<string name="skeleton_prefix_13">
<text locale="de">Entsetzliche</text>
</string>
<string name="skeleton_prefix_14">
<text locale="de">Schauderhafte</text>
</string>
<string name="skeleton_prefix_15">
<text locale="de">Schreckliche</text>
</string>
<string name="skeleton_prefix_16">
<text locale="de">Düstere</text>
</string>
<string name="skeleton_prefix_17">
<text locale="de">Schaurige</text>
</string>
<string name="skeleton_prefix_18">
<text locale="de">Erbarmungslose</text>
</string>
<string name="skeleton_name_0">
<text locale="de">Skelette</text>
</string>
<string name="skeleton_name_1">
<text locale="de">Kreaturen</text>
</string>
<string name="skeleton_name_2">
<text locale="de">Krieger</text>
</string>
<string name="skeleton_name_3">
<text locale="de">Kämpfer</text>
</string>
<string name="skeleton_name_4">
<text locale="de">Rächer</text>
</string>
<string name="skeleton_postfix_0">
<text locale="de">der Nacht</text>
</string>
<string name="skeleton_postfix_1">
<text locale="de">der Schatten</text>
</string>
<string name="skeleton_postfix_2">
<text locale="de">der Finsternis</text>
</string>
<string name="skeleton_postfix_3">
<text locale="de">des Bösen</text>
</string>
<string name="skeleton_postfix_4">
<text locale="de">der Erschlagenen</text>
</string>
<string name="skeleton_postfix_5">
<text locale="de">der Verfluchten</text>
</string>
<string name="skeleton_postfix_6">
<text locale="de">der Gefolterten</text>
</string>
<string name="skeleton_postfix_7">
<text locale="de">der Ruhelosen</text>
</string>
<string name="skeleton_postfix_8">
<text locale="de">aus dem Nebel</text>
</string>
<string name="skeleton_postfix_9">
<text locale="de">aus dem Dunkel</text>
</string>
<string name="skeleton_postfix_10">
<text locale="de">der Tiefe</text>
</string>
<string name="skeleton_postfix_11">
<text locale="de">in Ketten</text>
</string>
<string name="skeleton_postfix_12">
<text locale="de">aus dem Totenreich</text>
</string>
<string name="skeleton_postfix_13">
<text locale="de">aus der Unterwelt</text>
</string>
</strings>
</eressea>

View File

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<string name="undead_prefix_0">
<text locale="de">Grausige</text>
</string>
<string name="undead_prefix_1">
<text locale="de">Stöhnende</text>
</string>
<string name="undead_prefix_2">
<text locale="de">Schlurfende</text>
</string>
<string name="undead_prefix_3">
<text locale="de">Schwarzgewandete</text>
</string>
<string name="undead_prefix_4">
<text locale="de">Faulende</text>
</string>
<string name="undead_prefix_5">
<text locale="de">Angsteinflößende</text>
</string>
<string name="undead_prefix_6">
<text locale="de">Heulende</text>
</string>
<string name="undead_prefix_7">
<text locale="de">Wartende</text>
</string>
<string name="undead_prefix_8">
<text locale="de">Grauenvolle</text>
</string>
<string name="undead_prefix_9">
<text locale="de">Schwarze</text>
</string>
<string name="undead_prefix_10">
<text locale="de">Dunkle</text>
</string>
<string name="undead_prefix_11">
<text locale="de">Fürchterliche</text>
</string>
<string name="undead_prefix_12">
<text locale="de">Grauenhafte</text>
</string>
<string name="undead_prefix_13">
<text locale="de">Furchtbare</text>
</string>
<string name="undead_prefix_14">
<text locale="de">Entsetzliche</text>
</string>
<string name="undead_prefix_15">
<text locale="de">Schauderhafte</text>
</string>
<string name="undead_prefix_16">
<text locale="de">Schreckliche</text>
</string>
<string name="undead_prefix_17">
<text locale="de">Gespenstische</text>
</string>
<string name="undead_prefix_18">
<text locale="de">Ekelhafte</text>
</string>
<string name="undead_prefix_19">
<text locale="de">Düstere</text>
</string>
<string name="undead_prefix_20">
<text locale="de">Schaurige</text>
</string>
<string name="undead_prefix_21">
<text locale="de">Erbarmungslose</text>
</string>
<string name="undead_prefix_22">
<text locale="de">Hungrige</text>
</string>
<string name="undead_name_0">
<text locale="de">Geister</text>
</string>
<string name="undead_name_1">
<text locale="de">Phantome</text>
</string>
<string name="undead_name_2">
<text locale="de">Vampire</text>
</string>
<string name="undead_name_3">
<text locale="de">Zombies</text>
</string>
<string name="undead_name_4">
<text locale="de">Gespenster</text>
</string>
<string name="undead_name_5">
<text locale="de">Kreaturen</text>
</string>
<string name="undead_name_6">
<text locale="de">Gestalten</text>
</string>
<string name="undead_name_7">
<text locale="de">Schemen</text>
</string>
<string name="undead_name_8">
<text locale="de">Monster</text>
</string>
<string name="undead_name_9">
<text locale="de">Krieger</text>
</string>
<string name="undead_name_10">
<text locale="de">Ghule</text>
</string>
<string name="undead_name_11">
<text locale="de">Kopflose</text>
</string>
<string name="undead_name_12">
<text locale="de">Irrlichter</text>
</string>
<string name="undead_postfix_0">
<text locale="de">der Nacht</text>
</string>
<string name="undead_postfix_1">
<text locale="de">der Schatten</text>
</string>
<string name="undead_postfix_2">
<text locale="de">der Finsternis</text>
</string>
<string name="undead_postfix_3">
<text locale="de">des Bösen</text>
</string>
<string name="undead_postfix_4">
<text locale="de">der Erschlagenen</text>
</string>
<string name="undead_postfix_5">
<text locale="de">der Verfluchten</text>
</string>
<string name="undead_postfix_6">
<text locale="de">der Gefolterten</text>
</string>
<string name="undead_postfix_7">
<text locale="de">der Ruhelosen</text>
</string>
<string name="undead_postfix_8">
<text locale="de">aus dem Nebel</text>
</string>
<string name="undead_postfix_9">
<text locale="de">aus dem Dunkel</text>
</string>
<string name="undead_postfix_10">
<text locale="de">der Tiefe</text>
</string>
<string name="undead_postfix_11">
<text locale="de">in Ketten</text>
</string>
<string name="undead_postfix_12">
<text locale="de">aus dem Totenreich</text>
</string>
<string name="undead_postfix_13">
<text locale="de">aus der Unterwelt</text>
</string>
</strings>
</eressea>

View File

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<eressea>
<strings>
<string name="zombie_prefix_0">
<text locale="de">Faulende</text>
</string>
<string name="zombie_prefix_1">
<text locale="de">Zerschlagene</text>
</string>
<string name="zombie_prefix_2">
<text locale="de">Gefolterte</text>
</string>
<string name="zombie_prefix_3">
<text locale="de">Angsteinflößende</text>
</string>
<string name="zombie_prefix_4">
<text locale="de">Leise Schlurfende</text>
</string>
<string name="zombie_prefix_5">
<text locale="de">Kinderfressende</text>
</string>
<string name="zombie_prefix_6">
<text locale="de">Schwarze</text>
</string>
<string name="zombie_prefix_7">
<text locale="de">Dunkle</text>
</string>
<string name="zombie_prefix_8">
<text locale="de">Fürchterliche</text>
</string>
<string name="zombie_prefix_9">
<text locale="de">Grauenhafte</text>
</string>
<string name="zombie_prefix_10">
<text locale="de">Furchtbare</text>
</string>
<string name="zombie_prefix_11">
<text locale="de">Entsetzliche</text>
</string>
<string name="zombie_prefix_12">
<text locale="de">Schauderhafte</text>
</string>
<string name="zombie_prefix_13">
<text locale="de">Schreckliche</text>
</string>
<string name="zombie_prefix_14">
<text locale="de">Düstere</text>
</string>
<string name="zombie_prefix_15">
<text locale="de">Schaurige</text>
</string>
<string name="zombie_name_0">
<text locale="de">Zombies</text>
</string>
<string name="zombie_name_1">
<text locale="de">Kreaturen</text>
</string>
<string name="zombie_name_2">
<text locale="de">Verlorene</text>
</string>
<string name="zombie_name_3">
<text locale="de">Erschlagene</text>
</string>
<string name="zombie_name_4">
<text locale="de">Verdammte</text>
</string>
<string name="zombie_postfix_0">
<text locale="de">der Nacht</text>
</string>
<string name="zombie_postfix_1">
<text locale="de">der Schatten</text>
</string>
<string name="zombie_postfix_2">
<text locale="de">der Finsternis</text>
</string>
<string name="zombie_postfix_3">
<text locale="de">des Bösen</text>
</string>
<string name="zombie_postfix_4">
<text locale="de">der Erschlagenen</text>
</string>
<string name="zombie_postfix_5">
<text locale="de">der Verfluchten</text>
</string>
<string name="zombie_postfix_6">
<text locale="de">der Ruhelosen</text>
</string>
<string name="zombie_postfix_7">
<text locale="de">aus dem Nebel</text>
</string>
<string name="zombie_postfix_8">
<text locale="de">aus dem Dunkel</text>
</string>
<string name="zombie_postfix_9">
<text locale="de">der Tiefe</text>
</string>
<string name="zombie_postfix_10">
<text locale="de">in Ketten</text>
</string>
<string name="zombie_postfix_11">
<text locale="de">aus dem Totenreich</text>
</string>
<string name="zombie_postfix_12">
<text locale="de">aus der Unterwelt</text>
</string>
</strings>
</eressea>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,302 @@
msgid "catamaran_a"
msgstr "ein Katamaran"
msgid "rpg_item_1"
msgstr "Pandoras Urkunde für Halbling ehrenhalber, weiblich"
msgid "rpg_item_2"
msgstr "Heilige Nußhälfte"
msgid "rpg_item_3"
msgstr "Flaschengeist Zhardamon"
msgctxt "spell"
msgid "create_potion_p0"
msgstr "Braue Siebenmeilentee"
msgctxt "spell"
msgid "create_potion_p2"
msgstr "Braue Wasser des Lebens"
msgctxt "spell"
msgid "create_potion_p3"
msgstr "Braue Schaffenstrunk"
msgctxt "spellinfo"
msgid "concealing_aura"
msgstr "Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Zeit vor den Blicken anderer verschleiern. Der Zauber schützt nicht vor Dieben und Spionen."
msgctxt "spell"
msgid "create_potion_p9"
msgstr "Braue Pferdeglück"
msgctxt "morale"
msgid "10"
msgstr "unterwürfige"
msgctxt "spellinfo"
msgid "create_potion_peasantblood"
msgstr "Zu dem gefährlichsten und geheimsten Wissen der Magier zählt das Wissen über die Macht des Todes. Auch wenn die meisten es nicht zugeben, so fasziniert dieses Thema jeden Magier. Früher oder später beschäftigen sich alle mit diesem teilweise verbotenen Gebiet. Sodann werden sie feststellen, dass es noch eine weitere Ebene der Existenz gibt, in der die Dämonen beheimatet sind. Nur Blut allein vermag den Hunger dieser Wesen zu befriedigen, wenn sie ihre Ebene verlassen und unsere betreten. Erfahrene Magier werden jedoch feststellen, dass man den Blutwein, den die Dämonen zu sich nehmen, strecken kann, so dass davon 100 anstatt nur 10 Dämonen satt werden. Da die Dämonen davon jedoch nichts wissen dürfen, muss der Magier selbst klammheimlich einen seiner urplötzlich verfügbar gewordenen Untergebenen opfern. "
msgid "scaffolding"
msgstr "Gerüst"
msgctxt "spellinfo"
msgid "raindance"
msgstr "Durch dieses uralte Tanzritual ruft der Zauberkundige die Kräfte des Lebens und der Fruchtbarkeit an. Die darauf folgenden Regenfälle begünstigen das Wachstum und erhöhen die Ernteerträge einiger Bauern der Region bis der Regen wieder nachlässt."
msgid "adamantium"
msgstr "Adamantium"
msgid "adamantiumplate"
msgstr "Adamantiumrüstung"
msgid "rpg_item_3_p"
msgstr "Flaschengeister"
msgid "barge_a"
msgstr "eine Barke"
msgctxt "spell"
msgid "create_potion_ointment"
msgstr "Braue Wundsalbe"
msgctxt "spell"
msgid "create_potion_healing"
msgstr "Braue Heiltrank"
msgid "frigate_a"
msgstr "eine Fregatte"
msgid "trireme"
msgstr "Trireme"
msgctxt "spellinfo"
msgid "create_potion_healing"
msgstr "Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt."
msgid "frigate"
msgstr "Fregatte"
msgctxt "spellinfo"
msgid "create_potion_p13"
msgstr "Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde."
msgctxt "spellinfo"
msgid "earn_silver#gwyrrd"
msgstr "Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 25 Silber verdienen."
msgctxt "describe"
msgid "lifepotion"
msgstr "Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen."
msgid "charger"
msgstr "Streitross"
msgid "cog"
msgstr "Kogge"
msgid "adamantiumplate_p"
msgstr "Adamantiumrüstungen"
msgid "cutter"
msgstr "Kutter"
msgid "caravel_a"
msgstr "eine Karavelle"
msgctxt "spellinfo"
msgid "blessedharvest"
msgstr "Für dieses Ernteritual sendet der Druide seine arkane Energie entlang der astralen Kraftlinien der gesamten Umgebung, um selbst weit entfernte Naturgeister zu erreichen. Die Beschwörung dieser Naturgeister ist eine hohe Kunst, die höchste Konzentration und vor allem viel Erfahrung erfordert. Die Bauern werden nach und nach von den besseren Ernten profitieren und ihre Ersparnisse steigern können."
msgid "adamantiumaxe"
msgstr "Adamantiumaxt"
msgid "charger_p"
msgstr "Streitrösser"
msgid "raft"
msgstr "Floß"
msgid "guardhouse"
msgstr "Wachstube"
msgid "caravel"
msgstr "Karavelle"
msgid "canoe"
msgstr "Einbaum"
msgctxt "morale"
msgid "0"
msgstr "aufständische"
msgctxt "morale"
msgid "1"
msgstr "wütende"
msgctxt "morale"
msgid "2"
msgstr "zornige"
msgctxt "morale"
msgid "3"
msgstr "unruhige"
msgctxt "morale"
msgid "4"
msgstr "gleichgültige"
msgctxt "morale"
msgid "5"
msgstr "entspannte"
msgctxt "morale"
msgid "6"
msgstr "zufriedene"
msgctxt "morale"
msgid "7"
msgstr "glückliche"
msgctxt "morale"
msgid "8"
msgstr "treue"
msgctxt "morale"
msgid "9"
msgstr "ergebene"
msgid "rep_crossbow"
msgstr "Repetierarmbrust"
msgid "packice"
msgstr "Packeis"
msgctxt "spellinfo"
msgid "commonfamiliar"
msgstr "Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird."
msgid "trireme_a"
msgstr "eine Trireme"
msgid "royalbarge_a"
msgstr "eine Königsbarke"
msgid "adamantiumaxe_p"
msgstr "Adamantiumäxte"
msgid "rpg_item_2_p"
msgstr "Nußhälften"
msgid "watch"
msgstr "Wache"
msgctxt "spellinfo"
msgid "earn_silver#draig"
msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll: niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 25 Silber pro Stufe ein."
msgid "catamaran"
msgstr "Katamaran"
msgctxt "spell"
msgid "create_potion_p13"
msgstr "Braue Elixier der Macht"
msgctxt "spellinfo"
msgid "create_potion_ointment"
msgstr "Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkeit bietet der Magier ebenso wie der Heiler. Im Gegensatz zum Heiler ist der Magier jedoch in der Lage, seine Behandlung bereits vor dem Kampf durchzuführen, indem er seine Heilkräfte in eine magische Salbe bindet, welche gelagert werden kann und nach dem Kampf nur aufgetragen werden muss."
msgid "packice_trail"
msgstr "%s"
msgid "cog_a"
msgstr "eine Kogge"
msgid "canoe_a"
msgstr "ein Einbaum"
msgid "galleon_a"
msgstr "eine Galeone"
msgid "towershield_p"
msgstr "Turmschilde"
msgid "cutter_a"
msgstr "ein Kutter"
msgid "royalbarge"
msgstr "Königsbarke"
msgctxt "spell"
msgid "commonfamiliar"
msgstr "Vertrauten binden"
msgid "barge"
msgstr "Barke"
msgctxt "spell"
msgid "create_potion_peasantblood"
msgstr "Braue Bauernblut"
msgctxt "spellinfo"
msgid "earn_silver#cerddor"
msgstr "Cerddormagier sind _die_ Gaukler unter den Magiern; sie lieben es, das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 25 Silber pro Stufe verdient haben."
msgctxt "spellinfo"
msgid "earn_silver#illaun"
msgstr "Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 25 Silber pro Stufe."
msgid "rpg_item_1_p"
msgstr "Urkunden"
msgid "guardtower"
msgstr "Wachturm"
msgid "raft_a"
msgstr "ein Floß"
msgid "dragonship"
msgstr "Drachenschiff"
msgid "galleon"
msgstr "Galeone"
msgid "towershield"
msgstr "Turmschild"
msgid "rm_adamantium"
msgstr "Adamantium"
msgid "adamantium_p"
msgstr "Adamantium"
msgctxt "spellinfo"
msgid "create_potion_p0"
msgstr "Die Zeit ist eines der ersten Geheimnisse, die jeder Magier zu erkunden versucht. Gelingt ihm dies, kann er alle seine Energie auf das Studium der Magie verwenden; die Wege zwischen Dormitorium, Bibliothek und Magierturm schafft er nun viel schneller. Um sein Herz im Takt zu halten, verwendet er einen speziellen selbstgemachten Tee. Manche Magier teilen diesen Tee mit bis zu 10 Personen. "
msgctxt "spellinfo"
msgid "create_potion_p2"
msgstr "In einem der seltsamsten Zauber kann der Magier seiner Umgebung ein klein wenig der Lebensenergie entziehen um das sogenannte Wasser des Lebens herstellen. Als Basis dient ihm hierbei der Saft aus einigen ausgesuchten Kräutern, welcher die Lebensenergie speichern kann. Da der Magier aufgrund seiner magischen Fähigkeiten immun ist, ist er der einzige, der den Saft berühren kann, ohne Schaden zu nehmen. Sodann muss er diesen eine Woche lang von Ort zu Ort tragen, damit er sich mit Lebensenergie vollsaugt, ohne einem einzelnen Ort soviel zu entfernen, dass er Schaden nimmt. "
msgctxt "spellinfo"
msgid "create_potion_p3"
msgstr "Ein weiteres Anwendungsgebiet des Wissens über die Zeit, welches ein Magier ansammelt, stellt der Schaffenstrunk dar. Auch wenn körperliche Arbeiten eher selten von Magiern ausgeführt werden, so haben diese doch ein Interesse daran, die Effizienz ihrer Untergebenen bei solchen Arbeiten zu steigern. Mornac der Weise war der erste, der entdeckte, dass man einen Trunk herstellen kann, durch den 10 Untergebene die Arbeit von 20 erledigen, wodurch der Rest für andere Experimente eingesetzt werden kann. "
msgid "dragonship_a"
msgstr "ein Drachenschiff"
msgctxt "spellinfo"
msgid "create_potion_p9"
msgstr "Obwohl für Magier das Gebiet der Liebe tabu ist und sie im strengen Zölibat leben, haben sie ein großes Wissen darüber, wie man gewisse Bedürfnisse weckt, weshalb sie immer wieder von Dorfbewohnerinnen und Dorfbewohnern nach entsprechenden Zaubern gefragt werden. Da die Verzauberung eines Bewohners jedoch streng verboten ist, bieten sie ihre Dienste nur für die Züchter an. In einem aufwendigen Ritual, welches jedoch nur dazu dient zu verschleiern, wie einfach dies eigentlich ist, vermischt der Magier vor den Augen des Züchters einige Pflanzensäfte. Dabei ruft er die Geister an, die dem Pferdezüchter das Glück bescheren sollen, um klarzumachen, das diese nur mit ihm sprechen und jeglicher Versuch des Züchters, selbst die Kräuter zu mischen, nur eine unbrauchbare Pampe produzieren würde. Anschließend überreicht der Magier dem Züchter eine Phiole, die dieser in die Tränke seiner Pferde entleeren muss."
msgctxt "spellinfo"
msgid "earn_silver#tybied"
msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat -- nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 25 Silber pro Stufe lassen sich so in einer Woche verdienen."
msgid "market"
msgstr "Marktplatz"
msgid "rep_crossbow_p"
msgstr "Repetierarmbrüste"

View File

@ -0,0 +1,302 @@
msgid "catamaran_a"
msgstr "a catamaran"
msgid "rpg_item_1"
msgstr "Pandora's Certificate"
msgid "rpg_item_2"
msgstr "piece of a holy nut"
msgid "rpg_item_3"
msgstr "bottle demon Zhardamon"
msgctxt "spell"
msgid "create_potion_p0"
msgstr "brew seven mile tea"
msgctxt "spell"
msgid "create_potion_p2"
msgstr "brew water of life"
msgctxt "spell"
msgid "create_potion_p3"
msgstr "brew busy beer"
msgctxt "spellinfo"
msgid "concealing_aura"
msgstr "This spell will hide the whole equipment of a target unit from the looks of others. It will not protect against thieves or spies."
msgctxt "spell"
msgid "create_potion_p9"
msgstr "brew horsepower potion"
msgctxt "morale"
msgid "10"
msgstr "subservient"
msgctxt "spellinfo"
msgid "create_potion_peasantblood"
msgstr "One of the most dangerous and best guarded secrets of all mages is the knowledge about the power of death. Even though most of them would not openly admit it, and it is at least partially forbidden in most countries, each of them studies death sooner or later. When they do, they quickly find out that there is another plane of existance: the home of the demons. Only blood can quelch the thirst of those, when they switch from their home to our world. But experienced mages will find out that the demons bloodwine can be deluted when appropiate herbs are included, making it enough for 100 instead of 10 demons. As the demons may not know about that, the magician has to secretly sacrifice one of his freed minions."
msgid "scaffolding"
msgstr "scaffolding"
msgctxt "spellinfo"
msgid "raindance"
msgstr "This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasants' harvest will be extraordinary good."
msgid "adamantium"
msgstr "adamantium"
msgid "adamantiumplate"
msgstr "adamantium plate"
msgid "rpg_item_3_p"
msgstr "bottle demons"
msgid "barge_a"
msgstr "a barge"
msgctxt "spell"
msgid "create_potion_ointment"
msgstr "brew ointment"
msgctxt "spell"
msgid "create_potion_healing"
msgstr "brew healing potion"
msgid "frigate_a"
msgstr "a frigate"
msgid "trireme"
msgstr "trireme"
msgctxt "spellinfo"
msgid "create_potion_healing"
msgstr "Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom."
msgid "frigate"
msgstr "frigate"
msgctxt "spellinfo"
msgid "create_potion_p13"
msgstr "Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. "
msgctxt "spellinfo"
msgid "earn_silver#gwyrrd"
msgstr "The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 25 silver pieces per level in this way."
msgctxt "describe"
msgid "lifepotion"
msgstr "The \"Water of Life\" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs."
msgid "charger"
msgstr "charger"
msgid "cog"
msgstr "cog"
msgid "adamantiumplate_p"
msgstr "adamantium plates"
msgid "cutter"
msgstr "cutter"
msgid "caravel_a"
msgstr "a caravel"
msgctxt "spellinfo"
msgid "blessedharvest"
msgstr "This ritual not only increases the output of the local farms. Activating the astral ley lines, the druid is capable of activating even the nature spirits far away. Peasants' harvest in the affected regions will be extraordinarily good for a few weeks. "
msgid "adamantiumaxe"
msgstr "adamantium axe"
msgid "charger_p"
msgstr "chargers"
msgid "raft"
msgstr "raft"
msgid "guardhouse"
msgstr "guard house"
msgid "caravel"
msgstr "caravel"
msgid "canoe"
msgstr "canoe"
msgctxt "morale"
msgid "0"
msgstr "rebellious"
msgctxt "morale"
msgid "1"
msgstr "mad"
msgctxt "morale"
msgid "2"
msgstr "angry"
msgctxt "morale"
msgid "3"
msgstr "agitated"
msgctxt "morale"
msgid "4"
msgstr "indifferent"
msgctxt "morale"
msgid "5"
msgstr "relaxed"
msgctxt "morale"
msgid "6"
msgstr "content"
msgctxt "morale"
msgid "7"
msgstr "happy"
msgctxt "morale"
msgid "8"
msgstr "loyal"
msgctxt "morale"
msgid "9"
msgstr "devoted"
msgid "rep_crossbow"
msgstr "repeating crossbow"
msgid "packice"
msgstr "fast ice"
msgctxt "spellinfo"
msgid "commonfamiliar"
msgstr "During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them."
msgid "trireme_a"
msgstr "a trireme"
msgid "royalbarge_a"
msgstr "a royal barge"
msgid "adamantiumaxe_p"
msgstr "adamantium axes"
msgid "rpg_item_2_p"
msgstr "nut halves"
msgid "watch"
msgstr "watch"
msgctxt "spellinfo"
msgid "earn_silver#draig"
msgstr "In the dark alleys you can find those who sell curses and hexes on demand -- but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 25 silver pieces per level."
msgid "catamaran"
msgstr "catamaran"
msgctxt "spell"
msgid "create_potion_p13"
msgstr "brew elixir of power"
msgctxt "spellinfo"
msgid "create_potion_ointment"
msgstr "In the aftermath of battle it is vital to heal your own troops. This can be done by a healer as well as by a magician. In contrast to a healer, the magician can fullfill this treatment already before the battle by binding magical powers into a potent salve. This salve can be stored and only needs to be applied to the wounds after the battle. "
msgid "packice_trail"
msgstr "%s"
msgid "cog_a"
msgstr "a cog"
msgid "canoe_a"
msgstr "a canoe"
msgid "galleon_a"
msgstr "a galleon"
msgid "towershield_p"
msgstr "tower shields"
msgid "cutter_a"
msgstr "a cutter"
msgid "royalbarge"
msgstr "royal barge"
msgctxt "spell"
msgid "commonfamiliar"
msgstr "Bind Familiar"
msgid "barge"
msgstr "barge"
msgctxt "spell"
msgid "create_potion_peasantblood"
msgstr "brew peasant blood"
msgctxt "spellinfo"
msgid "earn_silver#cerddor"
msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 25 silver per level. "
msgctxt "spellinfo"
msgid "earn_silver#illaun"
msgstr "No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 25 silver pieces per level and week for offering these services to peasants."
msgid "rpg_item_1_p"
msgstr "Certificates"
msgid "guardtower"
msgstr "guard tower"
msgid "raft_a"
msgstr "a raft"
msgid "dragonship"
msgstr "dragonship"
msgid "galleon"
msgstr "galleon"
msgid "towershield"
msgstr "tower shield"
msgid "rm_adamantium"
msgstr "adamantium"
msgid "adamantium_p"
msgstr "adamantium"
msgctxt "spellinfo"
msgid "create_potion_p0"
msgstr "Time is one of the first mysteries every magician tries to solve. If they succeed, they can focus all their energies on their magical studies as the ways between dormatory, library and magician tower now pass much faster. To keep their heart in tune the magicians use a special self-made tea. Some mages even share it with up to 10 people"
msgctxt "spellinfo"
msgid "create_potion_p2"
msgstr "One of the most strange spells enables the magician to withdraw a little life energy from their surroundings to produce the so called water of life. The juice of some selected herbs is used to conserve the energies of life. As the magician is protected by his magical abilities, he is the only one who can touch the juice without taking damage. This is necessary because the juice must be carried around from place to place to avoid damaging one region by taking too much energy at once."
msgctxt "spellinfo"
msgid "create_potion_p3"
msgstr "Busybeer is another application for the knowledge about time a magician accumulates. Even though manual labour is only seldom done by mages, they still show interest in increasing the efficiency of their minions that do this work for them. Mornac the Wise was the first to discover how to produce a potion that would enable 10 minions to do the work of 20, thus freeing the other 10 for different experiments."
msgid "dragonship_a"
msgstr "a dragonship"
msgctxt "spellinfo"
msgid "create_potion_p9"
msgstr "Even though mages live in strict celibacy, they know a lot about creating certain longings. Peasants keep asking them for this love potion or that. But the penality for bewitching a peasant is death, so the mages offer their services only to farmers for their breeding stock. In an elaborate ritual, which only serves to hide the simplicity of the procedure, the magician draws the fluids from certains plants. While doing so he calls upon the spirits of fertility, which of course only listen when he talkes to them. Now the farmer knows that any attempt to draw the fluids himself will only result in a useless waste of resources. Finally, the magician hands the vial with the fluids to the farmer, who pours it into his horses' drinking water."
msgctxt "spellinfo"
msgid "earn_silver#tybied"
msgstr "If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - Well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 25 silver per level that way."
msgid "market"
msgstr "marketplace"
msgid "rep_crossbow_p"
msgstr "repeating crossbows"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -87,7 +87,7 @@ function test_aurapotion50()
turn_begin()
turn_process()
assert_equal(0, u:get_item("aurapotion50"))
assert_equal(1, f:count_msg_type('aurapotion50'))
assert_equal(1, f:count_msg_type('aurapotion50_effect'))
assert_equal(50, u.aura)
turn_end()
end

View File

@ -110,8 +110,6 @@ typedef enum combatmagic {
static int missile_range[2] = { FIGHT_ROW, BEHIND_ROW };
static int melee_range[2] = { FIGHT_ROW, FIGHT_ROW };
static message *msg_separator;
const troop no_troop = { 0, 0 };
#define FORMULA_ORIG 0
@ -950,22 +948,6 @@ void drain_exp(struct unit *u, int n)
}
}
const char *rel_dam(int dam, int hp)
{
double q = (double)dam / (double)hp;
if (q > 0.75) {
return "eine klaffende Wunde";
}
else if (q > 0.5) {
return "eine schwere Wunde";
}
else if (q > 0.25) {
return "eine Wunde";
}
return "eine kleine Wunde";
}
static void vampirism(troop at, int damage)
{
if (rule_vampire > 0) {
@ -2888,9 +2870,7 @@ static void print_stats(battle * b)
message *msg;
char buf[1024];
battle_message_faction(b, f, msg_separator);
msg = msg_message("battle_army", "index name", army_index(s), sname);
msg = msg_message("para_army_index", "index name", army_index(s), sname);
battle_message_faction(b, f, msg);
msg_release(msg);
@ -2959,8 +2939,6 @@ static void print_stats(battle * b)
print_fighters(b, s);
}
message_all(b, msg_separator);
/* Besten Taktiker ermitteln */
b->max_tactics = 0;
@ -3501,12 +3479,11 @@ static int battle_report(battle * b)
bool komma = false;
sbs_init(&sbs, buf, sizeof(buf));
battle_message_faction(b, fac, msg_separator);
if (cont)
m = msg_message("lineup_battle", "turn", b->turn);
m = msg_message("para_lineup_battle", "turn", b->turn);
else
m = msg_message("after_battle", "");
m = msg_message("para_after_battle", "");
battle_message_faction(b, fac, m);
msg_release(m);
@ -4006,11 +3983,8 @@ void force_leave(region *r, battle *b) {
void do_battle(region * r)
{
battle *b = NULL;
bool fighting = false;
bool fighting;
ship *sh;
if (msg_separator == NULL) {
msg_separator = msg_message("section_battle", "");
}
fighting = start_battle(r, &b);

View File

@ -56,6 +56,7 @@
#include <util/lists.h>
#include <util/log.h>
#include <util/macros.h>
#include <util/nrmessage.h>
#include <util/rand.h>
#include <util/rng.h>
#include <util/xml.h>

View File

@ -512,17 +512,14 @@ static void report_crtypes(FILE * F, const struct locale *lang)
for (i = 0; i != MTMAXHASH; ++i) {
struct known_mtype *kmt;
for (kmt = mtypehash[i]; kmt; kmt = kmt->nexthash) {
const struct nrmessage_type *nrt = nrt_find(lang, kmt->mtype);
if (nrt) {
char buffer[DISPLAYSIZE];
int hash = (int)kmt->mtype->key;
assert(hash > 0);
fprintf(F, "MESSAGETYPE %d\n", hash);
fputc('\"', F);
fputs(str_escape(nrt_string(nrt), buffer, sizeof(buffer)), F);
fputs("\";text\n", F);
fprintf(F, "\"%s\";section\n", nrt_section(nrt));
}
char buffer[DISPLAYSIZE];
int hash = (int)kmt->mtype->key;
assert(hash > 0);
fprintf(F, "MESSAGETYPE %d\n", hash);
fputc('\"', F);
fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F);
fputs("\";text\n", F);
fprintf(F, "\"%s\";section\n", nrt_section(kmt->mtype));
}
while (mtypehash[i]) {
kmt = mtypehash[i];

View File

@ -250,7 +250,7 @@ static void test_trade_insect(CuTest *tc) {
unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s",
LOC(u->faction->locale, resourcename(it_luxury->rtype, 0))));
set_item(u, it_silver, 10);
test_set_item(u, it_silver, 10);
CuAssertPtrEquals(tc, r, u->region);
CuAssertPtrEquals(tc, (void *)it_luxury, (void *)r_luxury(u->region));
produce(u->region);
@ -283,7 +283,7 @@ static void test_buy_cmd(CuTest *tc) {
u = test_create_unit(test_create_faction(NULL), r);
unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s", LOC(u->faction->locale, resourcename(it_luxury->rtype, 0))));
set_item(u, rt_silver->itype, 1000);
test_set_item(u, rt_silver->itype, 1000);
produce(r);
CuAssertPtrNotNullMsg(tc, "trading requires a castle", test_find_messagetype(u->faction->msgs, "error119"));
@ -525,13 +525,13 @@ static void test_modify_material(CuTest *tc) {
itype->construction->materials[0].rtype = rtype;
itype->construction->materials[0].number = 2;
set_item(u, rtype->itype, 1); /* 1 iron should get us 1 sword */
test_set_item(u, rtype->itype, 1); /* 1 iron should get us 1 sword */
make_item(u, itype, 1);
CuAssertIntEquals(tc, 1, get_item(u, itype));
CuAssertIntEquals(tc, 0, get_item(u, rtype->itype));
u_setrace(u, test_create_race("smurf"));
set_item(u, rtype->itype, 2); /* 2 iron should be required now */
test_set_item(u, rtype->itype, 2); /* 2 iron should be required now */
make_item(u, itype, 1);
CuAssertIntEquals(tc, 2, get_item(u, itype));
CuAssertIntEquals(tc, 0, get_item(u, rtype->itype));
@ -576,20 +576,20 @@ static void test_modify_skill(CuTest *tc) {
mod[0].value.sa[1] = 1;
mod[0].race_mask = rc_mask(u_race(u));
set_item(u, rtype->itype, 2); /* 2 iron should get us 2 swords */
test_set_item(u, rtype->itype, 2); /* 2 iron should get us 2 swords */
make_item(u, itype, 2);
CuAssertIntEquals(tc, 2, get_item(u, itype));
CuAssertIntEquals(tc, 0, get_item(u, rtype->itype));
mod[0].value.sa[0] = NOSKILL; /* match any skill */
set_item(u, rtype->itype, 2);
test_set_item(u, rtype->itype, 2);
make_item(u, itype, 2);
CuAssertIntEquals(tc, 4, get_item(u, itype));
CuAssertIntEquals(tc, 0, get_item(u, rtype->itype));
u_setrace(u, test_create_race("smurf"));
set_item(u, rtype->itype, 2);
test_set_item(u, rtype->itype, 2);
make_item(u, itype, 1); /* only enough skill to make 1 now */
CuAssertIntEquals(tc, 5, get_item(u, itype));
CuAssertIntEquals(tc, 1, get_item(u, rtype->itype));
@ -626,7 +626,7 @@ static void test_modify_production(CuTest *tc) {
itype->construction->materials[0].rtype = rt_silver;
itype->construction->materials[0].number = 1;
set_level(u, SK_ALCHEMY, 1);
set_item(u, rt_silver->itype, 1);
test_set_item(u, rt_silver->itype, 1);
make_item(u, itype, 1);
CuAssertIntEquals(tc, 1, get_item(u, itype));
CuAssertIntEquals(tc, 0, get_item(u, rt_silver->itype));

View File

@ -224,7 +224,7 @@ int amount, struct order *ord)
change_spellpoints(u, 50);
ADDMSG(&u->faction->msgs, msg_message("aurapotion50",
ADDMSG(&u->faction->msgs, msg_message("aurapotion50_effect",
"unit region command", u, u->region, ord));
use_pooled(u, itype->rtype, GET_DEFAULT, 1);

View File

@ -37,6 +37,7 @@ without prior permission by the authors of Eressea.
#include "util/message.h"
#include "util/nrmessage.h"
#include "util/path.h"
#include "util/pofile.h"
#include "util/strings.h"
#include "util/xml.h"
@ -1030,6 +1031,42 @@ static int include_xml(const char *uri) {
return err;
}
static int add_po_string(const char *msgid, const char *msgstr, const char *msgctxt, void *data) {
struct locale * lang = (struct locale *)data;
const char * key = msgid;
if (msgctxt) {
key = mkname(msgctxt, msgid);
}
locale_setstring(lang, key, msgstr);
return 0;
}
static int include_po(const char *uri) {
char name[PATH_MAX], lname[8];
const char *filename = uri_to_file(uri, name, sizeof(name));
const char *pos = strstr(filename, ".po");
if (pos) {
size_t len;
const char *str = --pos;
while (str > filename && *str != '.') --str;
len = (size_t)(pos - str);
if (len < sizeof(lname)) {
struct locale * lang;
memcpy(lname, str+1, len);
lname[len] = 0;
lang = get_or_create_locale(lname);
if (lang) {
int err = pofile_read(filename, add_po_string, lang);
if (err < 0) {
log_error("could not parse XML from %s", uri);
}
return err;
}
}
}
return -1;
}
static void json_include(cJSON *json) {
cJSON *child;
if (json->type != cJSON_Array) {
@ -1040,7 +1077,10 @@ static void json_include(cJSON *json) {
const char *uri = child->valuestring;
int err;
if (strstr(uri, ".xml") != NULL) {
if (strstr(uri, ".po") != NULL) {
err = include_po(uri);
}
else if (strstr(uri, ".xml") != NULL) {
err = include_xml(uri);
}
else {

View File

@ -73,36 +73,6 @@ void free_borders(void)
}
}
connection *find_border(int id)
{
int key;
for (key = 0; key != BORDER_MAXHASH; key++) {
connection *bhash;
for (bhash = borders[key]; bhash != NULL; bhash = bhash->nexthash) {
connection *b;
for (b = bhash; b; b = b->next) {
if (b->id == id)
return b;
}
}
}
return NULL;
}
int resolve_borderid(variant id, void *addr)
{
int result = 0;
connection *b = NULL;
if (id.i != 0) {
b = find_border(id.i);
if (b == NULL) {
result = -1;
}
}
*(connection **)addr = b;
return result;
}
static void walk_i(region *r, connection *b, void(*cb)(connection *, void *), void *data) {
for (; b; b = b->nexthash) {
if (b->from == r || b->to == r) {

View File

@ -97,8 +97,6 @@ extern "C" {
struct border_type *next; /* for internal use only */
} border_type;
connection *find_border(int id);
int resolve_borderid(variant data, void *addr);
void free_borders(void);
void walk_connections(struct region *r, void(*cb)(struct connection *, void *), void *data);

View File

@ -581,22 +581,6 @@ int get_item(const unit * u, const item_type *itype)
return i ? i->number : 0;
}
int set_item(unit * u, const item_type *itype, int value)
{
item *i;
assert(itype);
i = *i_find(&u->items, itype);
if (!i) {
i = i_add(&u->items, i_new(itype, value));
}
else {
i->number = value;
assert(i->number >= 0);
}
return value;
}
#include "move.h"
static int

View File

@ -289,7 +289,6 @@ extern "C" {
struct item *item_spoil(const struct race *rc, int size);
int get_item(const struct unit * u, const struct item_type *itype);
int set_item(struct unit * u, const struct item_type *itype, int value);
int get_money(const struct unit *);
int set_money(struct unit *, int);
int change_money(struct unit *, int);

View File

@ -530,33 +530,6 @@ attrib_type at_target = {
NO_READ
};
unit *utarget(const unit * u)
{
attrib *a;
if (!fval(u, UFL_TARGET))
return NULL;
a = a_find(u->attribs, &at_target);
assert(a || !"flag set, but no target found");
return (unit *)a->data.v;
}
void usettarget(unit * u, const unit * t)
{
attrib *a = a_find(u->attribs, &at_target);
if (!a && t)
a = a_add(&u->attribs, a_new(&at_target));
if (a) {
if (!t) {
a_remove(&u->attribs, a);
freset(u, UFL_TARGET);
}
else {
a->data.v = (void *)t;
fset(u, UFL_TARGET);
}
}
}
/*********************/
/* at_siege */
/*********************/

View File

@ -141,12 +141,6 @@ extern "C" {
struct building *usiege(const struct unit *u);
void usetsiege(struct unit *u, const struct building *b);
struct unit *utarget(const struct unit *u);
void usettarget(struct unit *u, const struct unit *b);
struct unit *utarget(const struct unit *u);
void usettarget(struct unit *u, const struct unit *b);
const char *uprivate(const struct unit *u);
void usetprivate(struct unit *u, const char *c);

View File

@ -320,11 +320,12 @@ int walkingcapacity(const struct unit *u)
/* Genug Trolle, um die Restwagen zu ziehen? */
wagen_mit_trollen = u->number / 4;
if (wagen_mit_trollen > wagen_ohne_pferde) wagen_mit_trollen = wagen_ohne_pferde;
if (wagen_mit_trollen > wagen_ohne_pferde) {
wagen_mit_trollen = wagen_ohne_pferde;
}
/* Wagenkapazität hinzuzählen */
n += wagen_mit_trollen * vcap;
wagen_ohne_pferde -= wagen_mit_trollen;
}
n += animals * acap;
@ -2021,17 +2022,6 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting)
* the token parser needs to be initialized before calling this function!
*/
/** fleeing units use this function
*/
void run_to(unit * u, region * to)
{
region_list *route = NULL;
add_regionlist(&route, to);
travel_route(u, route, NULL, NULL, TRAVEL_RUNNING);
free_regionlist(route);
/* weder transport noch follow */
}
static const region_list *travel_i(unit * u, const region_list * route_begin,
const region_list * route_end, order * ord, int mode, follower ** followers)
{

View File

@ -723,7 +723,7 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden
struct mlist *m = msgs->begin;
while (m) {
/* messagetype * mt = m->type; */
if (!categorized || strcmp(nr_section(m->msg), section->name) == 0) {
if (!categorized || strcmp(nrt_section(m->msg->type), section->name) == 0) {
char lbuf[8192];
if (!k && categorized) {
@ -743,6 +743,10 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden
k = 1;
}
nr_render(m->msg, viewer->locale, lbuf, sizeof(lbuf), viewer);
/* Hack: some messages should start a new paragraph with a newline: */
if (strncmp("para_", m->msg->type->name, 5) == 0) {
newline(out);
}
paragraph(out, lbuf, indent, 2, 0);
}
m = m->next;

View File

@ -15,9 +15,6 @@
#ifndef H_SPL_SPELLS
#define H_SPL_SPELLS
#include "magic.h"
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -37,6 +37,22 @@
#include <stdlib.h>
#include <string.h>
int test_set_item(unit * u, const item_type *itype, int value)
{
item *i;
assert(itype);
i = *i_find(&u->items, itype);
if (!i) {
i = i_add(&u->items, i_new(itype, value));
}
else {
i->number = value;
assert(i->number >= 0);
}
return value;
}
struct race *test_create_race(const char *name)
{
race *rc = rc_get_or_create(name ? name : "smurf");

View File

@ -58,6 +58,7 @@ extern "C" {
struct building_type *test_create_buildingtype(const char *name);
void test_create_castorder(struct castorder *co, struct unit *u, int level, float force, int range, struct spellparameter *par);
struct spell * test_create_spell(void);
int test_set_item(struct unit * u, const struct item_type *itype, int value);
void test_translate_param(const struct locale *lang, param_t param, const char *text);
const char * test_get_messagetype(const struct message *msg);

View File

@ -103,11 +103,3 @@ struct trigger_type tt_gate = {
gate_read
};
trigger *trigger_gate(building * b, region * target)
{
trigger *t = t_new(&tt_gate);
gate_data *td = (gate_data *)t->data.v;
td->gate = b;
td->target = target;
return t;
}

View File

@ -24,8 +24,6 @@ extern "C" {
extern struct trigger_type tt_gate;
struct trigger *trigger_gate(struct building *b, struct region *r);
#ifdef __cplusplus
}
#endif

View File

@ -51,6 +51,7 @@ nrmessage.c
parser.c
password.c
path.c
pofile.c
rand.c
resolve.c
strings.c

View File

@ -221,6 +221,43 @@ void locale_setstring(locale * lang, const char *key, const char *value)
}
}
static const char *escape_str(const char *in, FILE *F) {
while (*in) {
char buffer[64];
size_t len = 0;
char *out = buffer;
while (sizeof(buffer) > len + 2) {
if (*in == '\0') break;
if (strchr("\\\"", *in) != NULL) {
*out++ = '\\';
++len;
}
*out++ = *in++;
++len;
}
if (len > 0) {
fwrite(buffer, 1, len, F);
}
}
return in;
}
void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt) {
if (ctxt) {
fputs("msgctxt \"", F);
escape_str(ctxt, F);
fputs("\"\nmsgid \"", F);
escape_str(id, F);
}
else {
fputs("msgid \"", F);
escape_str(id, F);
}
fputs("\"\nmsgstr \"", F);
escape_str(str, F);
fputs("\"\n\n", F);
}
const char *locale_name(const locale * lang)
{
return lang ? lang->name : "(null)";
@ -316,6 +353,13 @@ void *get_translation(const struct locale *lang, const char *str, int index) {
return NULL;
}
void locale_foreach(void(*callback)(const struct locale *, const char *)) {
const locale * lang;
for (lang = locales; lang; lang = lang->next) {
callback(lang, lang->name);
}
}
const char *localenames[] = {
"de", "en",
NULL

View File

@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define MY_LOCALE_H
#include <stdbool.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
@ -56,6 +57,9 @@ extern "C" {
void make_locales(const char *str);
void locale_foreach(void(*callback)(const struct locale *lang, const char *name));
void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt);
#define LOC(lang, s) (lang?locale_string(lang, s, true):s)
enum {

View File

@ -13,7 +13,6 @@
#include <platform.h>
#include "nrmessage.h"
#include "nrmessage_struct.h"
/* util includes */
#include "log.h"
@ -27,38 +26,42 @@
#include <string.h>
#include <stdlib.h>
typedef struct nrmessage_type {
const struct message_type *mtype;
char *vars;
struct nrmessage_type *next;
const char *section;
} nrmessage_type;
#define NRT_MAXHASH 1021
static nrmessage_type *nrtypes[NRT_MAXHASH];
const char *nrt_string(const struct nrmessage_type *type)
const char *nrt_string(const struct message_type *mtype,
const struct locale *lang)
{
return type->string;
const char * str = locale_getstring(lang, mtype->name);
if (!str) {
str = locale_getstring(default_locale, mtype->name);
}
assert(str);
return str;
}
nrmessage_type *nrt_find(const struct locale * lang,
const struct message_type * mtype)
static nrmessage_type *nrt_find(const struct message_type * mtype)
{
nrmessage_type *found = NULL;
unsigned int hash = mtype->key % NRT_MAXHASH;
nrmessage_type *type = nrtypes[hash];
while (type) {
if (type->mtype == mtype) {
if (found == NULL)
if (found == NULL) {
found = type;
else if (type->lang == NULL)
found = type;
if (lang == type->lang) {
found = type;
break;
}
}
type = type->next;
}
if (!found) {
log_warning("could not find nr-type %s for locale %s\n", mtype->name, locale_name(lang));
}
if (lang && found && found->lang != lang) {
log_warning("could not find nr-type %s for locale %s, using %s\n", mtype->name, locale_name(lang), locale_name(found->lang));
log_warning("could not find nr-type %s\n", mtype->name);
}
return found;
}
@ -97,12 +100,11 @@ const nrsection *section_add(const char *name)
}
void
nrt_register(const struct message_type *mtype, const struct locale *lang,
const char *string, int level, const char *section)
nrt_register(const struct message_type *mtype, const char *section)
{
unsigned int hash = mtype->key % NRT_MAXHASH;
nrmessage_type *nrt = nrtypes[hash];
while (nrt && (nrt->lang != lang || nrt->mtype != mtype)) {
while (nrt && nrt->mtype != mtype) {
nrt = nrt->next;
}
if (nrt) {
@ -114,10 +116,8 @@ const char *string, int level, const char *section)
char zNames[256];
char *c = zNames;
nrt = malloc(sizeof(nrmessage_type));
nrt->lang = lang;
nrt->mtype = mtype;
nrt->next = nrtypes[hash];
nrt->level = level;
if (section) {
const nrsection *s = section_find(section);
if (s == NULL) {
@ -128,8 +128,6 @@ const char *string, int level, const char *section)
else
nrt->section = NULL;
nrtypes[hash] = nrt;
assert(string && *string);
nrt->string = str_strdup(string);
*c = '\0';
for (i = 0; i != mtype->nparameters; ++i) {
if (i != 0)
@ -144,11 +142,11 @@ size_t
nr_render(const struct message *msg, const struct locale *lang, char *buffer,
size_t size, const void *userdata)
{
struct nrmessage_type *nrt = nrt_find(lang, msg->type);
struct nrmessage_type *nrt = nrt_find(msg->type);
if (nrt) {
const char *m =
translate(nrt->string, userdata, nrt->vars, msg->parameters);
translate(nrt_string(msg->type, lang), userdata, nrt->vars, msg->parameters);
if (m) {
return str_strlcpy((char *)buffer, m, size);
}
@ -161,20 +159,9 @@ size_t size, const void *userdata)
return 0;
}
int nr_level(const struct message *msg)
{
nrmessage_type *nrt = nrt_find(NULL, msg->type);
return nrt ? nrt->level : 0;
}
const char *nr_section(const struct message *msg)
{
nrmessage_type *nrt = nrt_find(default_locale, msg->type);
return nrt ? nrt->section : NULL;
}
const char *nrt_section(const nrmessage_type * nrt)
const char *nrt_section(const struct message_type * mtype)
{
nrmessage_type *nrt = nrt_find(mtype);
return nrt ? nrt->section : NULL;
}
@ -184,9 +171,9 @@ void free_nrmesssages(void) {
while (nrtypes[i]) {
nrmessage_type *nr = nrtypes[i];
nrtypes[i] = nr->next;
free(nr->string);
free(nr->vars);
free(nr);
}
}
}

View File

@ -14,6 +14,7 @@
#define H_UTIL_NRMESSAGE
#include <stddef.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
@ -33,26 +34,13 @@ extern "C" {
void free_nrmesssages(void);
void nrt_register(const struct message_type *mtype,
const struct locale *lang, const char *script,
int level, const char *section);
struct nrmessage_type *nrt_find(const struct locale *,
const struct message_type *);
const char *nrt_string(const struct nrmessage_type *type);
const char *nrt_section(const struct nrmessage_type *mt);
void nrt_register(const struct message_type *mtype, const char *section);
const char *nrt_string(const struct message_type *mtype,
const struct locale *lang);
const char *nrt_section(const struct message_type *mtype);
size_t nr_render(const struct message *msg, const struct locale *lang,
char *buffer, size_t size, const void *userdata);
int nr_level(const struct message *msg);
const char *nr_section(const struct message *msg);
/* before:
* fogblock;movement:0;de;{unit} konnte von {region} nicht nach {$dir direction} ausreisen, der Nebel war zu dicht.
* after:
* fogblock:movement:0
* $unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht.
* unit:unit region:region direction:int
*/
#ifdef __cplusplus
}

View File

@ -1,20 +0,0 @@
#ifndef CLASS_NRMESSAGE_STRUCT
#define CLASS_NRMESSAGE_STRUCT
/* This file should not be included by anything in the server. If you
* feel that you need to include it, it's a sure sign that you're trying to
* do something BAD. */
typedef struct nrmessage_type {
const struct message_type *mtype;
const struct locale *lang;
char *string;
char *vars;
struct nrmessage_type *next;
int level;
const char *section;
} nrmessage_type;
extern nrmessage_type *get_nrmessagetypes(void);
#endif

115
src/util/pofile.c Normal file
View File

@ -0,0 +1,115 @@
#ifdef _MSC_VER
#include <platform.h>
#endif
#include "pofile.h"
#include "log.h"
#include "strings.h"
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define MAXLINE 2048
static char po_line[MAXLINE];
static int po_lineno;
char * read_line(FILE *F) {
char * read = fgets(po_line, MAXLINE, F);
++po_lineno;
return read;
}
char * read_multiline(FILE *F, char *line, char *buffer, size_t size) {
char *output = buffer;
while (line) {
size_t len;
char *read = line;
while (read[0] && isspace(read[0])) {
/* eat whitespace */
++read;
}
if (read[0] != '"') {
break;
}
++read;
str_unescape(read);
len = strlen(read);
if (len >= 2) {
/* strip trailing quote (and possible newline) */
if (read[len - 1] == '\n') {
--len;
}
if (read[len - 1] == '"') {
--len;
}
if (size > len) {
/* copy into buffer */
memcpy(output, read, len);
output += len;
size -= len;
output[0] = '\0';
}
}
line = read_line(F);
}
return line;
}
int pofile_read(const char *filename, int (*callback)(const char *msgid, const char *msgstr, const char *msgctxt, void *data), void *data) {
FILE * F = fopen(filename, "rt");
char msgctxt[32];
char msgid[64];
char msgstr[2048];
char *line;
int err = 0;
if (!F) {
log_error("could not open %s", filename);
}
msgctxt[0] = 0;
msgid[0] = 0;
line = read_line(F);
while (line) {
char token[8];
int err = sscanf(line, "%8s", token);
if (err == 1) {
char *text = NULL;
size_t size, len = strlen(token);
line = line + len + 1;
if (len == 7 && memcmp(token, "msgctxt", 7) == 0) {
text = msgctxt;
size = sizeof(msgctxt);
}
else if (len == 5 && memcmp(token, "msgid", 5) == 0) {
text = msgid;
size = sizeof(msgid);
}
else if (len == 6 && memcmp(token, "msgstr", 6) == 0) {
line = read_multiline(F, line, msgstr, sizeof(msgstr));
if (msgid[0]) {
err = callback(msgid, msgstr, msgctxt[0] ? msgctxt : NULL, data);
if (err != 0) {
break;
}
msgctxt[0] = 0;
msgid[0] = 0;
}
}
if (text) {
line = read_multiline(F, line, text, size);
}
}
else {
line = read_line(F);
}
}
if (ferror(F)) {
log_error("read error in %s:%d.", filename, po_lineno);
return -1;
}
fclose(F);
return err;
}

8
src/util/pofile.h Normal file
View File

@ -0,0 +1,8 @@
#pragma once
#ifndef H_POFILE
#define H_POFILE
int pofile_read(const char *filename, int (*callback)(const char *msgid, const char *msgstr, const char *msgctxt, void *data), void *data);
#endif

View File

@ -144,9 +144,9 @@ void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, c
*s = 0;
}
unsigned int str_hash(const char *s)
int str_hash(const char *s)
{
unsigned int key = 0;
int key = 0;
assert(s);
while (*s) {
key = key * 37 + *s++;
@ -271,3 +271,38 @@ void sbs_strcpy(struct sbstring *sbs, const char *str)
}
sbs->end = sbs->begin + len;
}
char *str_unescape(char *str) {
char *read = str, *write = str;
while (*read) {
char * pos = strchr(read, '\\');
if (pos) {
size_t len = pos - read;
memmove(write, read, len);
write += len;
read += (len + 1);
switch (read[0]) {
case 'r':
*write++ = '\r';
break;
case 'n':
*write++ = '\n';
break;
case 't':
*write++ = '\t';
break;
default:
*write++ = read[0];
}
*write = 0;
++read;
}
else {
size_t len = strlen(read);
memmove(write, read, len);
write[len] = 0;
break;
}
}
return str;
}

View File

@ -26,13 +26,15 @@ extern "C" {
#endif
void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, const char *value);
const char *str_escape(const char *str, char *buffer, size_t len);
unsigned int str_hash(const char *s);
int str_hash(const char *s);
size_t str_slprintf(char * dst, size_t size, const char * format, ...);
size_t str_strlcpy(char *dst, const char *src, size_t len);
size_t str_strlcat(char *dst, const char *src, size_t len);
char *str_strdup(const char *s);
const char *str_escape(const char *str, char *buffer, size_t len);
char *str_unescape(char *str);
unsigned int jenkins_hash(unsigned int a);
unsigned int wang_hash(unsigned int a);

View File

@ -9,6 +9,19 @@
#include <string.h>
#include "strings.h"
static void test_str_unescape(CuTest * tc)
{
char scratch[64];
strcpy(scratch, "1234 5678");
str_unescape(scratch);
CuAssertStrEquals(tc, "1234 5678", scratch);
strcpy(scratch, "\\\"\\\\\\n\\t\\r\\a");
str_unescape(scratch);
CuAssertStrEquals(tc, "\"\\\n\t\ra", scratch);
}
static void test_str_escape(CuTest * tc)
{
char scratch[64];
@ -122,6 +135,7 @@ CuSuite *get_strings_suite(void)
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_str_hash);
SUITE_ADD_TEST(suite, test_str_escape);
SUITE_ADD_TEST(suite, test_str_unescape);
SUITE_ADD_TEST(suite, test_str_replace);
SUITE_ADD_TEST(suite, test_str_slprintf);
SUITE_ADD_TEST(suite, test_str_strlcat);

View File

@ -10,12 +10,23 @@ This program may not be used, modified or distributed
without prior permission by the authors of Eressea.
*/
#ifdef _MSC_VER
#include <platform.h>
#include <kernel/config.h>
#endif
#include "xmlreader.h"
#include "alchemy.h"
#include "guard.h"
#include "keyword.h"
#include "move.h"
#include "prefix.h"
#include "attributes/attributes.h"
#include "modules/score.h"
#include "kernel/building.h"
#include "kernel/calendar.h"
#include "kernel/item.h"
#include "kernel/messages.h"
#include "kernel/race.h"
@ -27,26 +38,15 @@ without prior permission by the authors of Eressea.
#include "kernel/spell.h"
#include "kernel/spellbook.h"
#include "alchemy.h"
#include "kernel/calendar.h"
#include "guard.h"
#include "keyword.h"
#include "move.h"
#include "prefix.h"
#include <modules/score.h>
#include <attributes/attributes.h>
/* util includes */
#include <util/attrib.h>
#include <util/crmessage.h>
#include <util/functions.h>
#include <util/language.h>
#include <util/log.h>
#include <util/message.h>
#include <util/nrmessage.h>
#include <util/strings.h>
#include <util/xml.h>
#include "util/attrib.h"
#include "util/crmessage.h"
#include "util/functions.h"
#include "util/language.h"
#include "util/log.h"
#include "util/message.h"
#include "util/nrmessage.h"
#include "util/strings.h"
#include "util/xml.h"
/* libxml includes */
#include <libxml/tree.h>
@ -83,16 +83,6 @@ static variant xml_fraction(xmlNodePtr node, const char *name) {
return frac_make(0, 1);
}
static void xml_readtext(xmlNodePtr node, struct locale **lang, xmlChar ** text)
{
xmlChar *propValue = xmlGetProp(node, BAD_CAST "locale");
assert(propValue != NULL);
*lang = get_locale((const char *)propValue);
xmlFree(propValue);
*text = xmlNodeListGetString(node->doc, node->children, 1);
}
static spellref *xml_spellref(xmlNode * node, const char *name)
{
xmlChar *propValue = xmlGetProp(node, BAD_CAST name);
@ -104,31 +94,6 @@ static spellref *xml_spellref(xmlNode * node, const char *name)
return NULL;
}
static xmlChar *xml_cleanup_string(xmlChar * str)
{
xmlChar *read = str;
xmlChar *write = str;
while (*read) {
/* eat leading whitespace */
if (*read && isspace(*read)) {
while (*read && isspace(*read)) {
++read;
}
*write++ = ' ';
}
while (*read) {
if (*read == '\n')
break;
if (*read == '\r')
break;
*write++ = *read++;
}
}
*write = 0;
return str;
}
static resource_mod * xml_readmodifiers(xmlXPathObjectPtr result, xmlNodePtr node) {
/* reading eressea/resources/resource/modifier */
if (result->nodesetval != NULL && result->nodesetval->nodeNr > 0) {
@ -1360,31 +1325,14 @@ static int parse_messages(xmlDocPtr doc)
}
propSection = xmlGetProp(node, BAD_CAST "section");
if (propSection == NULL)
if (propSection == NULL) {
propSection = BAD_CAST default_section;
/* strings */
xpath->node = node;
result = xmlXPathEvalExpression(BAD_CAST "text", xpath);
assert(result->nodesetval->nodeNr>0);
for (k = 0; k != result->nodesetval->nodeNr; ++k) {
xmlNodePtr node = result->nodesetval->nodeTab[k];
struct locale *lang;
xmlChar *propText;
xml_readtext(node, &lang, &propText);
if (lang) {
xml_cleanup_string(propText);
nrt_register(mtype, lang, (const char *)propText, 0,
(const char *)propSection);
}
xmlFree(propText);
}
xmlXPathFreeObject(result);
nrt_register(mtype, (const char *)propSection);
if (propSection != BAD_CAST default_section)
if (propSection != BAD_CAST default_section) {
xmlFree(propSection);
}
}
xmlXPathFreeObject(messages);
@ -1393,78 +1341,6 @@ static int parse_messages(xmlDocPtr doc)
return results;
}
static void
xml_readstrings(xmlXPathContextPtr xpath, xmlNodePtr * nodeTab, int nodeNr,
bool names)
{
int i;
for (i = 0; i != nodeNr; ++i) {
xmlNodePtr stringNode = nodeTab[i];
xmlChar *propName = xmlGetProp(stringNode, BAD_CAST "name");
xmlChar *propNamespace = NULL;
xmlXPathObjectPtr result;
int k;
char zName[128];
assert(propName != NULL);
if (names)
propNamespace = xmlGetProp(stringNode->parent, BAD_CAST "name");
mkname_buf((const char *)propNamespace, (const char *)propName, zName);
if (propNamespace != NULL)
xmlFree(propNamespace);
xmlFree(propName);
/* strings */
xpath->node = stringNode;
result = xmlXPathEvalExpression(BAD_CAST "text", xpath);
for (k = 0; k != result->nodesetval->nodeNr; ++k) {
xmlNodePtr textNode = result->nodesetval->nodeTab[k];
struct locale *lang;
xmlChar *propText;
xml_readtext(textNode, &lang, &propText);
if (propText != NULL) {
assert(strcmp(zName,
(const char *)xml_cleanup_string(BAD_CAST zName)) == 0);
if (lang) {
xml_cleanup_string(propText);
locale_setstring(lang, zName, (const char *)propText);
}
xmlFree(propText);
}
else {
log_warning("string %s has no text in locale %s\n", zName, locale_name(lang));
}
}
xmlXPathFreeObject(result);
}
}
static int parse_strings(xmlDocPtr doc)
{
xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
xmlXPathObjectPtr strings;
int results = 0;
/* reading eressea/strings/string */
strings = xmlXPathEvalExpression(BAD_CAST "/eressea/strings/string", xpath);
xml_readstrings(xpath, strings->nodesetval->nodeTab,
strings->nodesetval->nodeNr, false);
results += strings->nodesetval->nodeNr;
xmlXPathFreeObject(strings);
strings =
xmlXPathEvalExpression(BAD_CAST "/eressea/strings/namespace/string", xpath);
xml_readstrings(xpath, strings->nodesetval->nodeTab,
strings->nodesetval->nodeNr, true);
results += strings->nodesetval->nodeNr;
xmlXPathFreeObject(strings);
xmlXPathFreeContext(xpath);
return results;
}
void register_xmlreader(void)
{
#ifndef _MSC_VER /* gcc and clang complain about unused function */
@ -1477,6 +1353,5 @@ void register_xmlreader(void)
#endif
xml_register_callback(parse_strings);
xml_register_callback(parse_messages);
}