Importing SVN archives - Trunk

This commit is contained in:
Emmanuel BENOîT 2018-10-23 09:43:42 +02:00
parent fc4c6bd340
commit ff53af6668
507 changed files with 8866 additions and 2450 deletions

View file

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<buildables xmlns="http://www.deepclone.com/lw/b6/m1/buildables" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/buildables buildables.xsd">
<building name="milFactory" description="milFactoryDescription" type="WORK" output="5" workers="200">
<cost build="100" upkeep="10" work="4800" />
</building>
<building name="turret" description="turretDescription" type="DEF" output="10" workers="5">
<cost build="40" upkeep="2" work="600" />
</building>
<building name="indFactory" description="indFactoryDescription" type="CASH" output="4" workers="500">
<cost build="500" upkeep="20" work="28800" />
<tech name="civTech" level="1" />
</building>
<building name="reanimationCentre" description="reanimationCentreDescription" type="POP" output="1" workers="300">
<cost build="4000" upkeep="200" work="57600" />
<tech name="civTech" level="2" />
</building>
<building name="superTurret" description="superTurretDescription" type="DEF" output="500" workers="1">
<cost build="4000" upkeep="10" work="20000" />
<tech name="civTech" level="3" />
</building>
<ship name="fighter" description="fighterDescription" time="3" power="10">
<cost build="100" upkeep="20" work="100" />
</ship>
<ship name="cruiser" description="cruiserDescription" time="5" power="100">
<cost build="500" upkeep="80" work="500" />
<tech name="milTech" level="1" />
</ship>
<ship name="bCruiser" description="bCruiserDescription" time="4" power="335">
<cost build="2500" upkeep="320" work="2500" />
<tech name="milTech" level="2" />
</ship>
<ship name="dreadnought" description="dreadnoughtDescription" time="6" power="5000">
<cost build="12500" upkeep="1280" work="12500" />
<tech name="milTech" level="3" />
</ship>
</buildables>

View file

@ -10,15 +10,15 @@
</building>
<building name="indFactory" description="indFactoryDescription" type="CASH" output="1" workers="500">
<cost build="500" upkeep="20" work="28800" />
<tech name="civTech" level="1" />
<tech>indFactTech</tech>
</building>
<building name="reanimationCentre" description="reanimationCentreDescription" type="POP" output="1" workers="300">
<cost build="4000" upkeep="200" work="57600" />
<tech name="civTech" level="2" />
<tech>reanimationTech</tech>
</building>
<building name="superTurret" description="superTurretDescription" type="DEF" output="500" workers="1">
<cost build="4000" upkeep="10" work="20000" />
<tech name="civTech" level="3" />
<tech>superTurretTech</tech>
</building>
<ship name="fighter" description="fighterDescription" time="3" power="10">
@ -26,15 +26,15 @@
</ship>
<ship name="cruiser" description="cruiserDescription" time="5" power="100">
<cost build="500" upkeep="80" work="5000" />
<tech name="milTech" level="1" />
<tech>cruisersTech</tech>
</ship>
<ship name="bCruiser" description="bCruiserDescription" time="4" power="335">
<cost build="2500" upkeep="320" work="25000" />
<tech name="milTech" level="2" />
<tech>bCruisersTech</tech>
</ship>
<ship name="dreadnought" description="dreadnoughtDescription" time="6" power="5000">
<cost build="12500" upkeep="1280" work="125000" />
<tech name="milTech" level="3" />
<tech>dreadnoughtsTech</tech>
</ship>
</buildables>

View file

@ -25,7 +25,7 @@
<xs:complexType name="buildable" abstract="true">
<xs:sequence>
<xs:element name="cost" type="cost" />
<xs:element name="tech" type="tech" minOccurs="0" />
<xs:element name="tech" type="xs:token" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string" />
<xs:attribute name="description" use="required" type="xs:string" />
@ -56,9 +56,4 @@
<xs:attribute name="upkeep" use="required" type="xs:nonNegativeInteger" />
</xs:complexType>
<xs:complexType name="tech">
<xs:attribute name="name" use="required" type="xs:string" />
<xs:attribute name="level" use="required" type="xs:positiveInteger" />
</xs:complexType>
</xs:schema>

View file

@ -1,24 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text
i18n-text.xsd">
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text i18n-text.xsd">
<include>text/buildings.xml</include>
<include>text/mail.xml</include>
<include>text/preferences.xml</include>
<include>text/technologies.xml</include>
<language id="en" name="English">
<from-file id="registrationMail" source="data/registrationMail-en.txt" />
<from-file id="passwordRecoveryMail" source="data/passwordRecoveryMail-en.txt" />
<from-file id="reactivationMail" source="data/reactivationMail-en.txt" />
<from-file id="addressChangeMail" source="data/addressChangeMail-en.txt" />
<from-file id="adminRecapMail" source="data/adminRecapMail.txt" />
<from-file id="messageMail" source="data/messageMail-en.txt" />
<from-file id="recapMail" source="data/recapMail-en.txt" />
<from-file id="quitMail" source="data/quitMail-en.txt" />
<from-file id="bannedMail" source="data/bannedMail-en.txt" />
<from-file id="banLiftedMail" source="data/banLiftedMail-en.txt" />
<from-file id="adminErrorMail" source="data/adminErrorMail.txt" />
<from-file id="inactivityWarningMail" source="data/inactivityWarningMail-en.txt" />
<from-file id="inactivityQuitMail" source="data/inactivityQuitMail-en.txt" />
<inline-string id="instantNotification">
<value>
***
@ -48,89 +38,6 @@ ${text}
<value>Messages from administrators:</value>
</inline-string>
<inline-string id="civTech">
<value>Civilian technologies</value>
</inline-string>
<inline-string id="civTechDescription">
<value>They're not just your slaves, they're your scientists, poets and workers. Make the poets work first, then use these technologies to increase their productivity! Useless poets.</value>
</inline-string>
<inline-string id="indFactTech">
<value>Universal assemblers</value>
</inline-string>
<inline-string id="indFactTechDescription">
<value>You know how it is when you have a thingy-bob that you need to build but you just don't have the right tool. Well, fear no more, Universal Assemblers will solve all your problems! Build anything and everything with these clever machines, they are 1337.</value>
</inline-string>
<inline-string id="reanimationTech">
<value>Corpse reanimation</value>
</inline-string>
<inline-string id="reanimationTechDescription">
<value>Tired of workers dying too early? Want a little less perspiration in your corporation? Zombies will work, won't complain and best of all, they can be fed on almost anything! Feed them your enemies! But mostly, use them to increase factory productivity by a rather nice amount.</value>
</inline-string>
<inline-string id="superTurretTech">
<value>Biological generators</value>
</inline-string>
<inline-string id="superTurretTechDescription">
<value>For every turret a military commander wants, there is a bigger, stronger turret he wants more. Now you too can have such a turret! It will defend your planet with ease while you venture out into the galaxy, bending it to your will. Available in all good hardware stores.</value>
</inline-string>
<inline-string id="milTech">
<value>Military technologies</value>
</inline-string>
<inline-string id="milTechDescription">
<value>It is only one who is thoroughly acquainted with the evils of war that can thoroughly understand the profitable way of carrying it on. - Sun Tzu</value>
</inline-string>
<inline-string id="cruisersTech">
<value>Orbital construction</value>
</inline-string>
<inline-string id="cruisersTechDescription">
<value>Ships built on the ground must endure the stress of atmospheric flight before they are even able to dominate the vast emptiness of space. Build them in space and they will be sleeker, more powerful and now free of the need for windows. Use your brand new Cruisers to dominate the known universe.</value>
</inline-string>
<inline-string id="bCruisersTech">
<value>Structural reinforcement</value>
</inline-string>
<inline-string id="bCruisersTechDescription">
<value>The power of your Cruisers can be augmented by an improved design! Take advantage of a more structurally sound space vehicle that can bring empires to their knees with its speed and technological grace.</value>
</inline-string>
<inline-string id="dreadnoughtsTech">
<value>Automated space docks</value>
</inline-string>
<inline-string id="dreadnoughtsTechDescription">
<value>Technology has advanced. The ultimate weapon is now available. Claim the awesome power of the Dreadnought and crush your enemies. Ever wanted a tank in space? Well, now you have it. All their base are belong to you.</value>
</inline-string>
<inline-string id="milFactory">
<value>Ship parts factory</value>
</inline-string>
<inline-string id="milFactoryDescription">
<value>A Ship parts factory is a mass production factory for the creation of components used in your space faring vessels. They are essential to any space empire; Properly managed factories produce new vehicles quickly and efficiently.</value>
</inline-string>
<inline-string id="turret">
<value>Defence turret</value>
</inline-string>
<inline-string id="turretDescription">
<value>Exploration without vigilance is the action of a fool. Turrets are the last line of defence for the planet, super massive weapons capable of destroying orbital vehicles from the ground. They can be placed anywhere, on any building or vacant land in your domain and will defend your planets from attack.</value>
</inline-string>
<inline-string id="indFactory">
<value>Generic assembly line</value>
</inline-string>
<inline-string id="indFactoryDescription">
<value>Factories are the backbone of a thriving economy, providing goods and matériel to buy and sell on the free market. Your brand new Generic assembly lines will enhance your wealth and keep the population employed. Properly managed factories produce many economic benefits for an empire.</value>
</inline-string>
<inline-string id="reanimationCentre">
<value>Reanimation centre</value>
</inline-string>
<inline-string id="reanimationCentreDescription">
<value>People are frail but cheap and robots are hard wearing but expensive. Renew the life of your workers and you can take advantage of a cheap zombie resource, giving you a third option for keeping your empire thriving.</value>
</inline-string>
<inline-string id="superTurret">
<value>Biological turret</value>
</inline-string>
<inline-string id="superTurretDescription">
<value>The perfect union of man and machine, Biological Turrets are a blending of the technological and the biological to provide the ultimate defence for your planets. More powerful and accurate than Turrets, in ground based defence they are unmatched. Keep your people away from them, however, as they tend to hunger for human flesh.</value>
</inline-string>
<inline-string id="fighter">
<value>Fighter</value>
</inline-string>
@ -156,64 +63,6 @@ ${text}
<value>Bring the Dread. The Dreadnought is a large capital ship with awesome power and capabilities, expensive and slow but the ultimate in space domination.</value>
</inline-string>
<inline-string id="pgDisplay">
<value>Display preferences</value>
</inline-string>
<inline-string id="pUseRLTime">
<value>Real-life time</value>
</inline-string>
<inline-string id="pUseRLTimeDescription">
<value>Selecting this option will cause all durations to be displayed using real-life minutes.</value>
</inline-string>
<inline-string id="pgMap">
<value>Map defaults</value>
</inline-string>
<inline-string id="pMapX">
<value>Map centre (X)</value>
</inline-string>
<inline-string id="pMapXDescription">
<value>The abscissa of the default map centre.</value>
</inline-string>
<inline-string id="pMapY">
<value>Map centre (Y)</value>
</inline-string>
<inline-string id="pMapYDescription">
<value>The ordinates of the default map centre.</value>
</inline-string>
<inline-string id="pMapSize">
<value>Map size</value>
</inline-string>
<inline-string id="pMapSizeDescription">
<value>The default size of the map.</value>
</inline-string>
<inline-string id="pgMail">
<value>E-mail settings</value>
</inline-string>
<inline-string id="pMailOnPM">
<value>Private messages</value>
</inline-string>
<inline-string id="pMailOnPMDescription">
<value>Select the type of e-mail notifications you will get for private messages sent by other empires.</value>
</inline-string>
<inline-string id="pMailOnAlliance">
<value>Alliance messages</value>
</inline-string>
<inline-string id="pMailOnAllianceDescription">
<value>Select the type of e-mail notifications you will get for alliance-wise messages.</value>
</inline-string>
<inline-string id="pMailOnIM">
<value>Internal messages</value>
</inline-string>
<inline-string id="pMailOnIMDescription">
<value>Select the type of e-mail notifications you will get for internal game messages.</value>
</inline-string>
<inline-string id="pMailOnAdmin">
<value>Messages from administrators</value>
</inline-string>
<inline-string id="pMailOnAdminDescription">
<value>Select the type of e-mail notifications you will get for messages sent by the game's administrators.</value>
</inline-string>
<inline-string id="mapSizeSmall">
<value>Small (3x3)</value>
</inline-string>
@ -276,7 +125,7 @@ ${text}
<inline-string id="imEmptyMilQueues">
<value>Some of your planets have finished constructing ships:</value>
</inline-string>
<inline-string id="imtEmptyMilQueue">
<value>Empty military queue at ${location}</value>
</inline-string>
@ -291,7 +140,7 @@ ${text}
<inline-string id="imBattleStart">
<value>{{battle:${battleId} Battle #${battleId}}} has started at ${location}.</value>
</inline-string>
<inline-string id="imtBattleEnd">
<value>Battle ended at ${location}</value>
</inline-string>
@ -306,7 +155,7 @@ ${text}
<inline-string id="imStrikeStart">
<value>The citizens of ${location} are in a really bad mood and have started leaving their posts... We'd better do something about this.</value>
</inline-string>
<inline-string id="imtStrikeEnd">
<value>Situation back to normal on ${location}</value>
</inline-string>
@ -321,14 +170,14 @@ ${text}
<inline-string id="imLostPlanet">
<value>We have lost control of ${location}, which was taken from us by ${taker}.</value>
</inline-string>
<inline-string id="imtAbandonPlanet">
<value>Planet ${location} abandoned</value>
</inline-string>
<inline-string id="imAbandonPlanet">
<value>Our forces have completed the evacuation of ${location}; the citizens of this world are left to fend for themselves.</value>
</inline-string>
<!-- Internal messages - planet taken -->
<inline-string id="imtTakePlanet">
<value>Planet ${location} conquered</value>
@ -339,7 +188,7 @@ ${text}
<inline-string id="imTakePlanet">
<value>We have seized control of planet ${location} from the clutches of ${owner}.</value>
</inline-string>
<!-- Empire messages -->
<inline-string id="imtTechAvailable">
<value>${tech} available</value>
@ -359,7 +208,7 @@ ${text}
<inline-string id="imDebtEnd">
<value>Good to see that our money problems are over, Sir. Good job. Well, of course it'd been better if these problems had never started... Sir? What are you doing with this handgu-</value>
</inline-string>
<!-- Alliance messages -->
<inline-string id="imtPendingRequest">
<value>Pending alliance request</value>
@ -409,7 +258,7 @@ ${text}
<inline-string id="imAllianceDisbanded">
<value>The leader has left and the alliance was disbanded.</value>
</inline-string>
<!-- Fleets -->
<inline-string id="imtFleetArrival">
<value>Fleets have arrived at ${location}</value>
@ -468,7 +317,7 @@ ${text}
<inline-string id="imfSwitchDefence">
<value>: switched to defence</value>
</inline-string>
<!-- Administration messages -->
<inline-string id="imAdminWarning">
<value>You currently have ${warnings} warning(s). Please note that, upon reaching 3 warnings, the administration team will consider banning you.</value>
@ -503,7 +352,7 @@ Your alliance, ${oldName}, had a name that was considered either vulgar, disresp
It was disbanded.</value>
</inline-string>
<!-- Bug tracker -->
<inline-string id="imtBugReportUpdate">
<value>Bug report #${id} updated</value>
@ -518,20 +367,6 @@ It was disbanded.</value>
</language>
<language id="fr" name="Français">
<from-file id="registrationMail" source="data/registrationMail-fr.txt" />
<from-file id="passwordRecoveryMail" source="data/passwordRecoveryMail-fr.txt" />
<from-file id="reactivationMail" source="data/reactivationMail-fr.txt" />
<from-file id="addressChangeMail" source="data/addressChangeMail-fr.txt" />
<from-file id="adminRecapMail" source="data/adminRecapMail.txt" />
<from-file id="messageMail" source="data/messageMail-fr.txt" />
<from-file id="recapMail" source="data/recapMail-fr.txt" />
<from-file id="quitMail" source="data/quitMail-fr.txt" />
<from-file id="bannedMail" source="data/bannedMail-fr.txt" />
<from-file id="banLiftedMail" source="data/banLiftedMail-fr.txt" />
<from-file id="adminErrorMail" source="data/adminErrorMail.txt" />
<from-file id="inactivityWarningMail" source="data/inactivityWarningMail-fr.txt" />
<from-file id="inactivityQuitMail" source="data/inactivityQuitMail-fr.txt" />
<inline-string id="instantNotification">
<value>
***
@ -561,89 +396,6 @@ ${text}
<value>Messages des administrateurs :</value>
</inline-string>
<inline-string id="civTech">
<value>Technologies civiles</value>
</inline-string>
<inline-string id="civTechDescription">
<value>Ce ne sont pas uniquement vos esclaves, ce sont vos chercheurs, poètes et ouvriers. Faites travailler d'abord les poètes, puis utilisez ces technologies pour augmenter leur productivité! Poètes inutiles...</value>
</inline-string>
<inline-string id="indFactTech">
<value>Assembleurs universels</value>
</inline-string>
<inline-string id="indFactTechDescription">
<value>Vous savez ce que c'est d'avoir un truc à construire, alors que malheureusement vous ne diposez pas du bon outil. Eh bien, plus de peur : les Assembleurs Universels vont résoudre tous vos problèmes! Construisez tout et n'importe quoi avec ces machines intelligentes, elles sont 1337.</value>
</inline-string>
<inline-string id="reanimationTech">
<value>Réanimation de cadavres</value>
</inline-string>
<inline-string id="reanimationTechDescription">
<value>Fatigué de ces ouvriers qui passent l'arme à gauche trop tôt? Vous voulez un peu plus de transpiration dans vos ateliers ? Les zombies vont travailler, ne vont pas se plaindre, et encore mieux ils peuvent être nourris avec n'importe quoi - y compris avec vos énemis! Mais surtout, utilisez les pour augmenter de manière significative la productivité de vos usines.</value>
</inline-string>
<inline-string id="superTurretTech">
<value>Générateurs biologiques</value>
</inline-string>
<inline-string id="superTurretTechDescription">
<value>Pour chaque tourelle qu'un commandant militaire réclame, il en est une qu'il désire encore plus. Maintenant, vous aussi pouvez avoir de telles tourelles! Elles défendront vos planètes avec aisance, pendant que vous vous aventurerez dans la galaxie, la pliant à votre volonté. Disponible chez tous les bons quincaillers.</value>
</inline-string>
<inline-string id="milTech">
<value>Technologies militaires</value>
</inline-string>
<inline-string id="milTechDescription">
<value>Ceux qui ne comprennent pas les dommages que la guerre peut causer n'en comprendront jamais les avantages. - Sun Tzu</value>
</inline-string>
<inline-string id="cruisersTech">
<value>Construction orbitale</value>
</inline-string>
<inline-string id="cruisersTechDescription">
<value>Les vaisseaux construits à la surface doivent subir le stress du vol atmosphérique avant même d'être lancés à assaut du grand vide interstellaire. Construisez-les dans l'espace et ils seront plus gracieux, plus puissants, et ne nécessiteront plus de fenêtres. Utilisez vos tout nouveaux croiseurs pour dominer l'univers connu.</value>
</inline-string>
<inline-string id="bCruisersTech">
<value>Consolidation structurelle</value>
</inline-string>
<inline-string id="bCruisersTechDescription">
<value>La puissance de vos croiseurs peut être augmentée par une conception améliorée! Profitez d'un véhicule à la structure mieux adaptée à l'espace qui peut mettre des empires à genoux grâce à sa vitesse et sa finesse technologique.</value>
</inline-string>
<inline-string id="dreadnoughtsTech">
<value>Docks orbitaux automatisés</value>
</inline-string>
<inline-string id="dreadnoughtsTechDescription">
<value>La technologie a évolué. L'arme ultime est maintenant disponible. Revendiquez la puissance écrasante du cuirassé et pulvérisez vos opposants. Déjà rêvé d'un tank de l'espace ? Eh bien, maintenant, vous l'avez. All their base are belong to you.</value>
</inline-string>
<inline-string id="milFactory">
<value>Fabrique de pièces de vaisseaux</value>
</inline-string>
<inline-string id="milFactoryDescription">
<value>Une fabrique de pièces de vaisseaux est une usine de production de masse pour la création des composants utilisés dans vos vaisseaux spatiaux. Elles sont essentielles à tout empire spatial ; bien gérées, elles produisent de nouveaux vaisseaux rapidement et efficacement.</value>
</inline-string>
<inline-string id="turret">
<value>Tourelle défensive</value>
</inline-string>
<inline-string id="turretDescription">
<value>Explorer sans être sur ses gardes est une statégie de lunatique. Les tourelles défensives sont la dernière ligne de défense d'une planète, énormes armes capables de détruire des véhicules en orbite depuis le sol. Elles peuvent être placées n'importe où, sur n'importe quel bâtiment ou espace dégagé de votre domaine, et défendront vos planètes contre les attaques.</value>
</inline-string>
<inline-string id="indFactory">
<value>Ligne de production générique</value>
</inline-string>
<inline-string id="indFactoryDescription">
<value>Les usines sont l'épine dorsale d'une économie florissante, fournissant des biens et pièces détachées qui peuvent être vendues sur le marché. Vos Lignes de production génériques flambant neuves vont augmenter votre richesse et conserver votre population dans l'emploi. Des usines bien gérées fournissent de nombreux bénéfices économiques à un empire.</value>
</inline-string>
<inline-string id="reanimationCentre">
<value>Centre de réanimation</value>
</inline-string>
<inline-string id="reanimationCentreDescription">
<value>Les humains sont frêles mais peu coûteux et les robots sont endurants mais très chers. Renouvelez la vie de vos travailleurs et vous pourrez tirer partie d'une ressource de zombies bon marché, vous permettant d'explorer une troisième voie pour conserver un empire florissant.</value>
</inline-string>
<inline-string id="superTurret">
<value>Tourelle biologique</value>
</inline-string>
<inline-string id="superTurretDescription">
<value>L'union parfaite de l'homme et de la machine, les tourelles biologiques sont un mélange du technologique et du biologique pour fournir la défense ultime à vos planètes. Plus puissantes et précises que les tourelles, au niveau défense au sol, elles ne peuvent être surclassées. Mais gardez votre population à distance, car elles ont tendance à avoir faim de chair humaine!</value>
</inline-string>
<inline-string id="fighter">
<value>Chasseur</value>
</inline-string>
@ -669,64 +421,6 @@ ${text}
<value>Amenez la cuirasse. Le cuirassé est un énorme vaisseau aux performances et à la puissance impressionantes, cher et lent, mais le nec plus ultra de la domination spatiale.</value>
</inline-string>
<inline-string id="pgDisplay">
<value>Préférences d'affichage</value>
</inline-string>
<inline-string id="pUseRLTime">
<value>Temps réel</value>
</inline-string>
<inline-string id="pUseRLTimeDescription">
<value>Les durées seront affichées en utilisant de "vraies" mesures si cette option est sélectionnée.</value>
</inline-string>
<inline-string id="pgMap">
<value>Carte</value>
</inline-string>
<inline-string id="pMapX">
<value>Centre de la carte (X)</value>
</inline-string>
<inline-string id="pMapXDescription">
<value>L'abscisse par défaut du centre de la carte.</value>
</inline-string>
<inline-string id="pMapY">
<value>Centre de la carte (Y)</value>
</inline-string>
<inline-string id="pMapYDescription">
<value>L'ordonnée par défaut du centre de la carte.</value>
</inline-string>
<inline-string id="pMapSize">
<value>Taille de la carte</value>
</inline-string>
<inline-string id="pMapSizeDescription">
<value>La taille par défaut de la carte.</value>
</inline-string>
<inline-string id="pgMail">
<value>Envoi de courrier électronique</value>
</inline-string>
<inline-string id="pMailOnPM">
<value>Messages privés</value>
</inline-string>
<inline-string id="pMailOnPMDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque d'autres empires vous envoient des messages privés.</value>
</inline-string>
<inline-string id="pMailOnAlliance">
<value>Messages d'alliance</value>
</inline-string>
<inline-string id="pMailOnAllianceDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message d'alliance.</value>
</inline-string>
<inline-string id="pMailOnIM">
<value>Messages internes</value>
</inline-string>
<inline-string id="pMailOnIMDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message interne du jeu.</value>
</inline-string>
<inline-string id="pMailOnAdmin">
<value>Messages des administrateurs</value>
</inline-string>
<inline-string id="pMailOnAdminDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message des administrateurs du jeu.</value>
</inline-string>
<inline-string id="mapSizeSmall">
<value>Petite (3x3)</value>
</inline-string>
@ -789,7 +483,7 @@ ${text}
<inline-string id="imEmptyMilQueues">
<value>Certaines de vos planètes ont fini de construire des vaisseaux :</value>
</inline-string>
<inline-string id="imtEmptyMilQueue">
<value>Liste de construction militaire vide sur ${location}</value>
</inline-string>
@ -804,7 +498,7 @@ ${text}
<inline-string id="imBattleStart">
<value>{{battle:${battleId} La bataille #${battleId}}} a commencé sur ${location}.</value>
</inline-string>
<inline-string id="imtBattleEnd">
<value>Bataille terminée sur ${location}</value>
</inline-string>
@ -819,7 +513,7 @@ ${text}
<inline-string id="imStrikeStart">
<value>Les habitants de ${location} sont de très mauvaise humeur et ont commencé à quitter leurs postes... Nous devrions faire quelque chose à ce sujet.</value>
</inline-string>
<inline-string id="imtStrikeEnd">
<value>Situation revenue à la normale sur ${location}</value>
</inline-string>
@ -834,14 +528,14 @@ ${text}
<inline-string id="imLostPlanet">
<value>Nous avons perdu le contrôle de ${location}, qui nous a été prise par ${taker}.</value>
</inline-string>
<inline-string id="imtAbandonPlanet">
<value>Abandon de la planète ${location}</value>
</inline-string>
<inline-string id="imAbandonPlanet">
<value>Nos forces ont terminé l'évacutation de ${location}; les habitants de ce monde sont livrés à eux-mêmes.</value>
</inline-string>
<!-- Internal messages - planet taken -->
<inline-string id="imtTakePlanet">
<value>Conquête de la planète${location}</value>
@ -852,7 +546,7 @@ ${text}
<inline-string id="imTakePlanet">
<value>Nous avons pris le contrôle de la planète ${location} des griffes de ${owner}.</value>
</inline-string>
<!-- Empire messages -->
<inline-string id="imtTechAvailable">
<value>${tech} disponible</value>
@ -872,7 +566,7 @@ ${text}
<inline-string id="imDebtEnd">
<value>C'est bon de voir que nos problèmes d'argent sont résolus, Chef. Bien joué. Bien sûr, ça aurait été mieux si ces problèmes n'avaient jamais eu lieu... Chef, qu'est ce que vous faites avec ce pistol-</value>
</inline-string>
<!-- Alliance messages -->
<inline-string id="imtPendingRequest">
<value>Demande d'alliance en attente</value>
@ -922,7 +616,7 @@ ${text}
<inline-string id="imAllianceDisbanded">
<value>Le dirigeant est parti et l'alliance a été dissoute.</value>
</inline-string>
<!-- Fleets -->
<inline-string id="imtFleetArrival">
<value>Arrivée de flottes sur ${location}</value>
@ -981,7 +675,7 @@ ${text}
<inline-string id="imfSwitchDefence">
<value>: est passée en défensee</value>
</inline-string>
<!-- Administration messages -->
<inline-string id="imAdminWarning">
<value>Vous avez actuellement ${warnings} avertissement(s). Veuillez noter que, lorsque vous atteindrez 3 avertissements, l'équipe d'administration va envisager votre expulsion.</value>
@ -1016,7 +710,7 @@ Votre alliance, ${oldName}, avait un nom qui a été considéré comme vulgaire,
Elle a été dissoute.</value>
</inline-string>
<!-- Bug tracker -->
<inline-string id="imtBugReportUpdate">
<value>Rapport de bug #${id} mis à jour</value>

View file

@ -5,6 +5,7 @@
<xs:element name="lw-text-data">
<xs:complexType>
<xs:sequence>
<xs:element name="include" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="language" type="language" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<technologies xmlns="http://www.deepclone.com/lw/b6/m1/techs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/techs techs.xsd">
<tech-line name="milTech" description="milTechDescription">
<level name="cruisersTech" description="cruisersTechDescription"
points="5000" cost="10000" />
<level name="bCruisersTech" description="bCruisersTechDescription"
points="20000" cost="30000" />
<level name="dreadnoughtsTech" description="dreadnoughtsTechDescription"
points="48000" cost="100000" />
</tech-line>
<tech-line name="civTech" description="civTechDescription">
<level name="indFactTech" description="indFactTechDescription"
points="2000" cost="5000" />
<level name="reanimationTech" description="reanimationTechDescription"
points="10000" cost="25000" />
<level name="superTurretTech" description="superTurretTechDescription"
points="30000" cost="125000" />
</tech-line>
</technologies>

View file

@ -1,23 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<technologies xmlns="http://www.deepclone.com/lw/b6/m1/techs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/techs techs.xsd">
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/techs techs-m2.xsd">
<tech-line name="milTech" description="milTechDescription">
<level name="cruisersTech" description="cruisersTechDescription"
points="25000" cost="10000" />
<level name="bCruisersTech" description="bCruisersTechDescription"
points="900000" cost="400000" />
<level name="dreadnoughtsTech" description="dreadnoughtsTechDescription"
points="2250000" cost="1012500" />
</tech-line>
<category name="milTech" description="milTechDescription" />
<category name="civTech" description="civTechDescription" />
<tech-line name="civTech" description="civTechDescription">
<level name="indFactTech" description="indFactTechDescription"
points="10000" cost="5000" />
<level name="reanimationTech" description="reanimationTechDescription"
points="562500" cost="281250" />
<level name="superTurretTech" description="superTurretTechDescription"
points="1350000" cost="607500" />
</tech-line>
<technology name="cruisersTech" category="milTech" description="cruisersTechDescription" points="5000" cost="10000" />
<technology name="bCruisersTech" category="milTech" description="bCruisersTechDescription" points="20000"
cost="30000">
<depends on="cruisersTech" />
</technology>
<technology name="dreadnoughtsTech" category="milTech" description="dreadnoughtsTechDescription" points="48000"
cost="100000">
<depends on="bCruisersTech" />
</technology>
<technology name="indFactTech" category="civTech" description="indFactTechDescription" points="2000" cost="5000" />
<technology name="reanimationTech" category="civTech" description="reanimationTechDescription" points="10000"
cost="25000">
<depends on="indFactTech" />
</technology>
<technology name="superTurretTech" category="civTech" description="superTurretTechDescription" points="30000"
cost="125000">
<depends on="reanimationTech" />
</technology>
</technologies>

View file

@ -5,24 +5,30 @@
<xs:element name="technologies">
<xs:complexType>
<xs:sequence>
<xs:element name="tech-line" type="tech-line" minOccurs="1" maxOccurs="unbounded" />
<xs:element name="category" type="category" minOccurs="1" maxOccurs="unbounded" />
<xs:element name="technology" type="technology" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="tech-line">
<xs:sequence>
<xs:element name="level" type="tech-level" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:complexType name="category">
<xs:attribute name="name" use="required" type="xs:token" />
<xs:attribute name="description" use="required" type="xs:token" />
</xs:complexType>
<xs:complexType name="tech-level">
<xs:complexType name="technology">
<xs:sequence>
<xs:element name="depends" type="dependency" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:token" />
<xs:attribute name="category" use="required" type="xs:token" />
<xs:attribute name="description" use="required" type="xs:token" />
<xs:attribute name="points" use="required" type="xs:positiveInteger" />
<xs:attribute name="cost" use="required" type="xs:positiveInteger" />
</xs:complexType>
<xs:complexType name="dependency">
<xs:attribute name="on" use="required" type="xs:token" />
</xs:complexType>
</xs:schema>

View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text ../i18n-text.xsd">
<language id="en" name="English">
<inline-string id="milFactory">
<value>Ship parts factory</value>
</inline-string>
<inline-string id="milFactoryDescription">
<value>A Ship parts factory is a mass production factory for the creation of components used in your space faring vessels. They are essential to any space empire; Properly managed factories produce new vehicles quickly and efficiently.</value>
</inline-string>
<inline-string id="turret">
<value>Defence turret</value>
</inline-string>
<inline-string id="turretDescription">
<value>Exploration without vigilance is the action of a fool. Turrets are the last line of defence for the planet, super massive weapons capable of destroying orbital vehicles from the ground. They can be placed anywhere, on any building or vacant land in your domain and will defend your planets from attack.</value>
</inline-string>
<inline-string id="indFactory">
<value>Generic assembly line</value>
</inline-string>
<inline-string id="indFactoryDescription">
<value>Factories are the backbone of a thriving economy, providing goods and matériel to buy and sell on the free market. Your brand new Generic assembly lines will enhance your wealth and keep the population employed. Properly managed factories produce many economic benefits for an empire.</value>
</inline-string>
<inline-string id="reanimationCentre">
<value>Reanimation centre</value>
</inline-string>
<inline-string id="reanimationCentreDescription">
<value>People are frail but cheap and robots are hard wearing but expensive. Renew the life of your workers and you can take advantage of a cheap zombie resource, giving you a third option for keeping your empire thriving.</value>
</inline-string>
<inline-string id="superTurret">
<value>Biological turret</value>
</inline-string>
<inline-string id="superTurretDescription">
<value>The perfect union of man and machine, Biological Turrets are a blending of the technological and the biological to provide the ultimate defence for your planets. More powerful and accurate than Turrets, in ground based defence they are unmatched. Keep your people away from them, however, as they tend to hunger for human flesh.</value>
</inline-string>
</language>
<language name="Français" id="fr">
<inline-string id="milFactory">
<value>Fabrique de pièces de vaisseaux</value>
</inline-string>
<inline-string id="milFactoryDescription">
<value>Une fabrique de pièces de vaisseaux est une usine de production de masse pour la création des composants utilisés dans vos vaisseaux spatiaux. Elles sont essentielles à tout empire spatial ; bien gérées, elles produisent de nouveaux vaisseaux rapidement et efficacement.</value>
</inline-string>
<inline-string id="turret">
<value>Tourelle défensive</value>
</inline-string>
<inline-string id="turretDescription">
<value>Explorer sans être sur ses gardes est une statégie de lunatique. Les tourelles défensives sont la dernière ligne de défense d'une planète, énormes armes capables de détruire des véhicules en orbite depuis le sol. Elles peuvent être placées n'importe où, sur n'importe quel bâtiment ou espace dégagé de votre domaine, et défendront vos planètes contre les attaques.</value>
</inline-string>
<inline-string id="indFactory">
<value>Ligne de production générique</value>
</inline-string>
<inline-string id="indFactoryDescription">
<value>Les usines sont l'épine dorsale d'une économie florissante, fournissant des biens et pièces détachées qui peuvent être vendues sur le marché. Vos Lignes de production génériques flambant neuves vont augmenter votre richesse et conserver votre population dans l'emploi. Des usines bien gérées fournissent de nombreux bénéfices économiques à un empire.</value>
</inline-string>
<inline-string id="reanimationCentre">
<value>Centre de réanimation</value>
</inline-string>
<inline-string id="reanimationCentreDescription">
<value>Les humains sont frêles mais peu coûteux et les robots sont endurants mais très chers. Renouvelez la vie de vos travailleurs et vous pourrez tirer partie d'une ressource de zombies bon marché, vous permettant d'explorer une troisième voie pour conserver un empire florissant.</value>
</inline-string>
<inline-string id="superTurret">
<value>Tourelle biologique</value>
</inline-string>
<inline-string id="superTurretDescription">
<value>L'union parfaite de l'homme et de la machine, les tourelles biologiques sont un mélange du technologique et du biologique pour fournir la défense ultime à vos planètes. Plus puissantes et précises que les tourelles, au niveau défense au sol, elles ne peuvent être surclassées. Mais gardez votre population à distance, car elles ont tendance à avoir faim de chair humaine!</value>
</inline-string>
</language>
</lw-text-data>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text ../i18n-text.xsd">
<language id="en" name="English">
<from-file id="registrationMail" source="mail/registrationMail-en.txt" />
<from-file id="passwordRecoveryMail" source="mail/passwordRecoveryMail-en.txt" />
<from-file id="reactivationMail" source="mail/reactivationMail-en.txt" />
<from-file id="addressChangeMail" source="mail/addressChangeMail-en.txt" />
<from-file id="adminRecapMail" source="mail/adminRecapMail.txt" />
<from-file id="messageMail" source="mail/messageMail-en.txt" />
<from-file id="recapMail" source="mail/recapMail-en.txt" />
<from-file id="quitMail" source="mail/quitMail-en.txt" />
<from-file id="bannedMail" source="mail/bannedMail-en.txt" />
<from-file id="banLiftedMail" source="mail/banLiftedMail-en.txt" />
<from-file id="adminErrorMail" source="mail/adminErrorMail.txt" />
<from-file id="inactivityWarningMail" source="mail/inactivityWarningMail-en.txt" />
<from-file id="inactivityQuitMail" source="mail/inactivityQuitMail-en.txt" />
</language>
<language id="fr" name="Français">
<from-file id="registrationMail" source="mail/registrationMail-fr.txt" />
<from-file id="passwordRecoveryMail" source="mail/passwordRecoveryMail-fr.txt" />
<from-file id="reactivationMail" source="mail/reactivationMail-fr.txt" />
<from-file id="addressChangeMail" source="mail/addressChangeMail-fr.txt" />
<from-file id="adminRecapMail" source="mail/adminRecapMail.txt" />
<from-file id="messageMail" source="mail/messageMail-fr.txt" />
<from-file id="recapMail" source="mail/recapMail-fr.txt" />
<from-file id="quitMail" source="mail/quitMail-fr.txt" />
<from-file id="bannedMail" source="mail/bannedMail-fr.txt" />
<from-file id="banLiftedMail" source="mail/banLiftedMail-fr.txt" />
<from-file id="adminErrorMail" source="mail/adminErrorMail.txt" />
<from-file id="inactivityWarningMail" source="mail/inactivityWarningMail-fr.txt" />
<from-file id="inactivityQuitMail" source="mail/inactivityQuitMail-fr.txt" />
</language>
</lw-text-data>

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Address change
Legacy Worlds (B6M2) - Address change
Hello,
You are receiving this message because an user of Legacy Worlds (you, presumably) requested to change his or her address to ${address}.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Changement d'adresse
Legacy Worlds (B6M2) - Changement d'adresse
Bonjour,
Vous avez reçu ce message car un utilisateur de Legacy Worlds (vous, probablement) a demandé à ce que son adresse soit changée pour ${address}.

View file

@ -1,4 +1,4 @@
[LWB6-ADMIN] Server errors
[LWB6M2-ADMIN] Server errors
Errors have been found in the server's system log. Intervention might be required.
${contents}

View file

@ -1,4 +1,4 @@
[LWB6-ADMIN] Recap
[LWB6M2-ADMIN] Recap
Here's what happened in the past 12 hours...
${contents}

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Ban lifted
Legacy Worlds (B6M2) - Ban lifted
Hello,
The ban on your account has been lifted.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Bannissement levé
Legacy Worlds (B6M2) - Bannissement levé
Bonjour,
Le bannissement de votre compte a été levé.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) account banned
Legacy Worlds (B6M2) account banned
Hello,
Your Legacy Worlds account has been banned by the game's administrators for the following reason:

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Compte banni
Legacy Worlds (B6M2) - Compte banni
Bonjour,
Votre compte Legacy Worlds a été banni par les administrateurs du jeu pour la raison suivante :

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Inactive account closed
Legacy Worlds (B6M2) - Inactive account closed
Hello,
This email is being sent to inform you that your account on Legacy Worlds has been disabled. It had been inactive for 28 days.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Fermeture de compte inactif
Legacy Worlds (B6M2) - Fermeture de compte inactif
Bonjour,
Ce message vous a été envoyé pour vous prévenir que votre compte sur Legacy Worlds a été désactivé. Il a été inactif pendant 28 jours.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Inactivity
Legacy Worlds (B6M2) - Inactivity
Hello,
This email is being sent to warn you that your account on Legacy Worlds has been inactive for the past three weeks. Unless you connect in the coming week, it will be closed and your empire will be lost.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Inactivité
Legacy Worlds (B6M2) - Inactivité
Bonjour,
Ce message vous a été envoyé pour vous prévenir que votre compte sur Legacy Worlds a été inactif pendant les trois dernières semaines. À moins que vous vous connectiez durant la semaine procahine, il sera fermé et votre empire sera perdu.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - New messages
Legacy Worlds (B6M2) - New messages
Hello ${empire},
You have just received new messages in Legacy Worlds.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Nouveaux messages
Legacy Worlds (B6M2) - Nouveaux messages
Bonjour ${empire},
Vous venez de recevoir de nouveaux messages sur Legacy Worlds!

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) password recovery
Legacy Worlds (B6M2) password recovery
Hello,
You are receiving this message because an user of Legacy Worlds (you, presumably) requested to recover his password.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Récupération de mot de passe
Legacy Worlds (B6M2) - Récupération de mot de passe
Bonjour,
Vous avez reçu ce message car un utilisateur de Legacy Worlds (vous, probablement) a demandé à récupérer son mot de passe oublié.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Account closed
Legacy Worlds (B6M2) - Account closed
Hello,
This email is being sent to confirm that your account has been closed as you requested.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Compte désactivé
Legacy Worlds (B6M2) - Compte désactivé
Bonjour,
Cet e-mail vous est envoyé pour confirmer que votre compte a été fermé à votre demande.

View file

@ -1,8 +1,8 @@
Legacy Worlds (B6M1) - Account reactivation
Legacy Worlds (B6M2) - Account reactivation
Hello,
Thank you for revisiting at Legacy Worlds!
Please note that you reactivated your account for "Beta 6 Milestone 1", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news.
Please note that you reactivated your account for "Beta 6 Milestone 2", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news.
Before we reactivate your account, there's just one more step to complete your request.
You have to connect to the site using your e-mail address and password, then validate your account reactivation using the confirmation code below.

View file

@ -1,8 +1,8 @@
Legacy Worlds (B6M1) - Réactivation de votre compte
Legacy Worlds (B6M2) - Réactivation de votre compte
Bonjour,
Merci de revenir sur Legacy Worlds!
Veuillez remarquer que vous venez de réactiver un compte sur le jeu "Beta 6 Milestone 1", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles.
Veuillez remarquer que vous venez de réactiver un compte sur le jeu "Beta 6 Milestone 2", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles.
Avant que nous réactivions votre compte, il vous reste une dernière étape à accomplir.
Vous allez devoir vous connecter au site en utilisant votre adresse électronique et votre mot de passe, puis valider la réactivation de votre compte en saisissant le code de confirmation ci-dessous.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Today's messages
Legacy Worlds (B6M2) - Today's messages
Hello ${empire},
Here is a reminder of the messages you received today.

View file

@ -1,4 +1,4 @@
Legacy Worlds (B6M1) - Messages du jour
Legacy Worlds (B6M2) - Messages du jour
Bonjour ${empire},
Voici un récapitulatif des messages que vous avez reçu aujourd'hui.

View file

@ -1,8 +1,8 @@
Legacy Worlds (B6M1) - Your account
Legacy Worlds (B6M2) - Your account
Hello,
Thank you for registering at Legacy Worlds!
Please note that you registered to "Beta 6 Milestone 1", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news.
Please note that you registered to "Beta 6 Milestone 2", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news.
Before we activate your account, there's just one more step to complete your registration.
You have to connect to the site using the e-mail address and password you chose, then validate your account using the confirmation code below.

View file

@ -1,8 +1,8 @@
Legacy Worlds (B6M1) - Votre compte
Legacy Worlds (B6M2) - Votre compte
Bonjour,
Merci de vous être enregistré(e) sur Legacy Worlds!
Veuillez remarquer que vous venez de créer un compte sur le jeu "Beta 6 Milestone 1", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles.
Veuillez remarquer que vous venez de créer un compte sur le jeu "Beta 6 Milestone 2", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles.
Avant que nous activions votre compte, il vous reste une dernière étape à accomplir.
Vous allez devoir vous connecter au site en utilisant l'adresse électronique et le mot de passe que vous avez choisi, puis valider votre compte en saisissant le code de confirmation ci-dessous.

View file

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text ../i18n-text.xsd">
<language id="en" name="English">
<inline-string id="pgDisplay">
<value>Display preferences</value>
</inline-string>
<inline-string id="pUseRLTime">
<value>Real-life time</value>
</inline-string>
<inline-string id="pUseRLTimeDescription">
<value>Selecting this option will cause all durations to be displayed using real-life minutes.</value>
</inline-string>
<inline-string id="pgMap">
<value>Map defaults</value>
</inline-string>
<inline-string id="pMapX">
<value>Map centre (X)</value>
</inline-string>
<inline-string id="pMapXDescription">
<value>The abscissa of the default map centre.</value>
</inline-string>
<inline-string id="pMapY">
<value>Map centre (Y)</value>
</inline-string>
<inline-string id="pMapYDescription">
<value>The ordinates of the default map centre.</value>
</inline-string>
<inline-string id="pMapSize">
<value>Map size</value>
</inline-string>
<inline-string id="pMapSizeDescription">
<value>The default size of the map.</value>
</inline-string>
<inline-string id="pgMail">
<value>E-mail settings</value>
</inline-string>
<inline-string id="pMailOnPM">
<value>Private messages</value>
</inline-string>
<inline-string id="pMailOnPMDescription">
<value>Select the type of e-mail notifications you will get for private messages sent by other empires.</value>
</inline-string>
<inline-string id="pMailOnAlliance">
<value>Alliance messages</value>
</inline-string>
<inline-string id="pMailOnAllianceDescription">
<value>Select the type of e-mail notifications you will get for alliance-wise messages.</value>
</inline-string>
<inline-string id="pMailOnIM">
<value>Internal messages</value>
</inline-string>
<inline-string id="pMailOnIMDescription">
<value>Select the type of e-mail notifications you will get for internal game messages.</value>
</inline-string>
<inline-string id="pMailOnAdmin">
<value>Messages from administrators</value>
</inline-string>
<inline-string id="pMailOnAdminDescription">
<value>Select the type of e-mail notifications you will get for messages sent by the game's administrators.</value>
</inline-string>
</language>
<language name="Français" id="fr">
<inline-string id="pgDisplay">
<value>Préférences d'affichage</value>
</inline-string>
<inline-string id="pUseRLTime">
<value>Temps réel</value>
</inline-string>
<inline-string id="pUseRLTimeDescription">
<value>Les durées seront affichées en utilisant de "vraies" mesures si cette option est sélectionnée.</value>
</inline-string>
<inline-string id="pgMap">
<value>Carte</value>
</inline-string>
<inline-string id="pMapX">
<value>Centre de la carte (X)</value>
</inline-string>
<inline-string id="pMapXDescription">
<value>L'abscisse par défaut du centre de la carte.</value>
</inline-string>
<inline-string id="pMapY">
<value>Centre de la carte (Y)</value>
</inline-string>
<inline-string id="pMapYDescription">
<value>L'ordonnée par défaut du centre de la carte.</value>
</inline-string>
<inline-string id="pMapSize">
<value>Taille de la carte</value>
</inline-string>
<inline-string id="pMapSizeDescription">
<value>La taille par défaut de la carte.</value>
</inline-string>
<inline-string id="pgMail">
<value>Envoi de courrier électronique</value>
</inline-string>
<inline-string id="pMailOnPM">
<value>Messages privés</value>
</inline-string>
<inline-string id="pMailOnPMDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque d'autres empires vous envoient des messages privés.</value>
</inline-string>
<inline-string id="pMailOnAlliance">
<value>Messages d'alliance</value>
</inline-string>
<inline-string id="pMailOnAllianceDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message d'alliance.</value>
</inline-string>
<inline-string id="pMailOnIM">
<value>Messages internes</value>
</inline-string>
<inline-string id="pMailOnIMDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message interne du jeu.</value>
</inline-string>
<inline-string id="pMailOnAdmin">
<value>Messages des administrateurs</value>
</inline-string>
<inline-string id="pMailOnAdminDescription">
<value>Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message des administrateurs du jeu.</value>
</inline-string>
</language>
</lw-text-data>

View file

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<lw-text-data xmlns="http://www.deepclone.com/lw/b6/m1/i18n-text" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.deepclone.com/lw/b6/m1/i18n-text ../i18n-text.xsd">
<language id="en" name="English">
<inline-string id="civTech">
<value>Civilian technologies</value>
</inline-string>
<inline-string id="civTechDescription">
<value>They're not just your slaves, they're your scientists, poets and workers. Make the poets work first, then use these technologies to increase their productivity! Useless poets.</value>
</inline-string>
<inline-string id="indFactTech">
<value>Universal assemblers</value>
</inline-string>
<inline-string id="indFactTechDescription">
<value>You know how it is when you have a thingy-bob that you need to build but you just don't have the right tool. Well, fear no more, Universal Assemblers will solve all your problems! Build anything and everything with these clever machines, they are 1337.</value>
</inline-string>
<inline-string id="reanimationTech">
<value>Corpse reanimation</value>
</inline-string>
<inline-string id="reanimationTechDescription">
<value>Tired of workers dying too early? Want a little less perspiration in your corporation? Zombies will work, won't complain and best of all, they can be fed on almost anything! Feed them your enemies! But mostly, use them to increase factory productivity by a rather nice amount.</value>
</inline-string>
<inline-string id="superTurretTech">
<value>Biological generators</value>
</inline-string>
<inline-string id="superTurretTechDescription">
<value>For every turret a military commander wants, there is a bigger, stronger turret he wants more. Now you too can have such a turret! It will defend your planet with ease while you venture out into the galaxy, bending it to your will. Available in all good hardware stores.</value>
</inline-string>
<inline-string id="milTech">
<value>Military technologies</value>
</inline-string>
<inline-string id="milTechDescription">
<value>It is only one who is thoroughly acquainted with the evils of war that can thoroughly understand the profitable way of carrying it on. - Sun Tzu</value>
</inline-string>
<inline-string id="cruisersTech">
<value>Orbital construction</value>
</inline-string>
<inline-string id="cruisersTechDescription">
<value>Ships built on the ground must endure the stress of atmospheric flight before they are even able to dominate the vast emptiness of space. Build them in space and they will be sleeker, more powerful and now free of the need for windows. Use your brand new Cruisers to dominate the known universe.</value>
</inline-string>
<inline-string id="bCruisersTech">
<value>Structural reinforcement</value>
</inline-string>
<inline-string id="bCruisersTechDescription">
<value>The power of your Cruisers can be augmented by an improved design! Take advantage of a more structurally sound space vehicle that can bring empires to their knees with its speed and technological grace.</value>
</inline-string>
<inline-string id="dreadnoughtsTech">
<value>Automated space docks</value>
</inline-string>
<inline-string id="dreadnoughtsTechDescription">
<value>Technology has advanced. The ultimate weapon is now available. Claim the awesome power of the Dreadnought and crush your enemies. Ever wanted a tank in space? Well, now you have it. All their base are belong to you.</value>
</inline-string>
</language>
<language name="Français" id="fr">
<inline-string id="civTech">
<value>Technologies civiles</value>
</inline-string>
<inline-string id="civTechDescription">
<value>Ce ne sont pas uniquement vos esclaves, ce sont vos chercheurs, poètes et ouvriers. Faites travailler d'abord les poètes, puis utilisez ces technologies pour augmenter leur productivité! Poètes inutiles...</value>
</inline-string>
<inline-string id="indFactTech">
<value>Assembleurs universels</value>
</inline-string>
<inline-string id="indFactTechDescription">
<value>Vous savez ce que c'est d'avoir un truc à construire, alors que malheureusement vous ne diposez pas du bon outil. Eh bien, plus de peur : les Assembleurs Universels vont résoudre tous vos problèmes! Construisez tout et n'importe quoi avec ces machines intelligentes, elles sont 1337.</value>
</inline-string>
<inline-string id="reanimationTech">
<value>Réanimation de cadavres</value>
</inline-string>
<inline-string id="reanimationTechDescription">
<value>Fatigué de ces ouvriers qui passent l'arme à gauche trop tôt? Vous voulez un peu plus de transpiration dans vos ateliers ? Les zombies vont travailler, ne vont pas se plaindre, et encore mieux ils peuvent être nourris avec n'importe quoi - y compris avec vos énemis! Mais surtout, utilisez les pour augmenter de manière significative la productivité de vos usines.</value>
</inline-string>
<inline-string id="superTurretTech">
<value>Générateurs biologiques</value>
</inline-string>
<inline-string id="superTurretTechDescription">
<value>Pour chaque tourelle qu'un commandant militaire réclame, il en est une qu'il désire encore plus. Maintenant, vous aussi pouvez avoir de telles tourelles! Elles défendront vos planètes avec aisance, pendant que vous vous aventurerez dans la galaxie, la pliant à votre volonté. Disponible chez tous les bons quincaillers.</value>
</inline-string>
<inline-string id="milTech">
<value>Technologies militaires</value>
</inline-string>
<inline-string id="milTechDescription">
<value>Ceux qui ne comprennent pas les dommages que la guerre peut causer n'en comprendront jamais les avantages. - Sun Tzu</value>
</inline-string>
<inline-string id="cruisersTech">
<value>Construction orbitale</value>
</inline-string>
<inline-string id="cruisersTechDescription">
<value>Les vaisseaux construits à la surface doivent subir le stress du vol atmosphérique avant même d'être lancés à assaut du grand vide interstellaire. Construisez-les dans l'espace et ils seront plus gracieux, plus puissants, et ne nécessiteront plus de fenêtres. Utilisez vos tout nouveaux croiseurs pour dominer l'univers connu.</value>
</inline-string>
<inline-string id="bCruisersTech">
<value>Consolidation structurelle</value>
</inline-string>
<inline-string id="bCruisersTechDescription">
<value>La puissance de vos croiseurs peut être augmentée par une conception améliorée! Profitez d'un véhicule à la structure mieux adaptée à l'espace qui peut mettre des empires à genoux grâce à sa vitesse et sa finesse technologique.</value>
</inline-string>
<inline-string id="dreadnoughtsTech">
<value>Docks orbitaux automatisés</value>
</inline-string>
<inline-string id="dreadnoughtsTechDescription">
<value>La technologie a évolué. L'arme ultime est maintenant disponible. Revendiquez la puissance écrasante du cuirassé et pulvérisez vos opposants. Déjà rêvé d'un tank de l'espace ? Eh bien, maintenant, vous l'avez. All their base are belong to you.</value>
</inline-string>
</language>
</lw-text-data>

View file

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Legacy Worlds Beta 6 - Default data source configuration -->
<!--
This file is provided as an example on how to configure the game
server's data sources. It configures a memory-based HSQL database,
initialising its schemas and structure.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="hibernateProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop><!-- -->
</props>
</property>
</bean>
</beans>

View file

@ -4,12 +4,12 @@
<parent>
<artifactId>legacyworlds-server</artifactId>
<groupId>com.deepclone.lw</groupId>
<version>5.99.1</version>
<version>5.99.2</version>
</parent>
<groupId>com.deepclone.lw</groupId>
<artifactId>legacyworlds-server-main</artifactId>
<version>5.99.1</version>
<version>5.99.2</version>
<name>Legacy Worlds server</name>
<description>Server main classes and JAR builder.</description>
@ -29,6 +29,11 @@
<groupId>com.deepclone.lw</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>legacyworlds-server-beans-events</artifactId>
<groupId>com.deepclone.lw</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>legacyworlds-server-beans-i18n</artifactId>
<groupId>com.deepclone.lw</groupId>
@ -54,6 +59,16 @@
<groupId>com.deepclone.lw</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>legacyworlds-server-beans-techs</artifactId>
<groupId>com.deepclone.lw</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>legacyworlds-server-beans-updates</artifactId>
<groupId>com.deepclone.lw</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>legacyworlds-server-beans-user</artifactId>
<groupId>com.deepclone.lw</groupId>

View file

@ -52,7 +52,7 @@ public class ImportBuildables
public CostData cost;
public TechData tech;
public String tech;
}
@SuppressWarnings( "serial" )
@ -70,18 +70,6 @@ public class ImportBuildables
public int work;
}
@SuppressWarnings( "serial" )
@XStreamAlias( "tech" )
public static class TechData
implements Serializable
{
@XStreamAsAttribute
public String name;
@XStreamAsAttribute
public int level;
}
@SuppressWarnings( "serial" )
@XStreamAlias( "building" )
public static class BuildingData
@ -196,7 +184,6 @@ public class ImportBuildables
this.uocBuildingDep.addParameter( "output_type" , "building_output_type" );
this.uocBuildingDep.addParameter( "output" , Types.INTEGER );
this.uocBuildingDep.addParameter( "dep_name" , Types.VARCHAR );
this.uocBuildingDep.addParameter( "dep_level" , Types.INTEGER );
this.uocShipNoDep = new StoredProc( dataSource , "tech" , "uoc_ship" );
this.uocShipNoDep.addParameter( "name" , Types.VARCHAR );
@ -216,7 +203,6 @@ public class ImportBuildables
this.uocShipDep.addParameter( "power" , Types.INTEGER );
this.uocShipDep.addParameter( "flight_time" , Types.INTEGER );
this.uocShipDep.addParameter( "dep_name" , Types.VARCHAR );
this.uocShipDep.addParameter( "dep_level" , Types.INTEGER );
}
@ -241,7 +227,7 @@ public class ImportBuildables
ship.cost.upkeep , ship.power , ship.time );
} else {
this.uocShipDep.execute( ship.name , ship.description , ship.cost.build , ship.cost.work ,
ship.cost.upkeep , ship.power , ship.time , ship.tech.name , ship.tech.level );
ship.cost.upkeep , ship.power , ship.time , ship.tech );
}
}
@ -256,7 +242,7 @@ public class ImportBuildables
} else {
this.uocBuildingDep.execute( building.name , building.description , building.cost.build ,
building.cost.work , building.cost.upkeep , building.workers , building.type.toString( ) ,
building.output , building.tech.name , building.tech.level );
building.output , building.tech );
}
}

View file

@ -31,17 +31,26 @@ public class ImportTechs
private final Logger logger = Logger.getLogger( ImportTechs.class );
private static class ImportError
extends RuntimeException
{
private static final long serialVersionUID = 1L;
}
@XStreamAlias( "technologies" )
@SuppressWarnings( "serial" )
public static class Techs
public static class Technologies
implements Serializable
{
@XStreamImplicit( itemFieldName = "tech-line" )
public List< TechLine > lines;
@XStreamImplicit( itemFieldName = "category" )
public List< Category > categories;
@XStreamImplicit( itemFieldName = "technology" )
public List< Technology > technologies;
}
@SuppressWarnings( "serial" )
public static class TechLine
public static class Category
implements Serializable
{
@XStreamAsAttribute
@ -49,18 +58,18 @@ public class ImportTechs
@XStreamAsAttribute
public String description;
@XStreamImplicit( itemFieldName = "level" )
public List< TechLevel > levels;
}
@SuppressWarnings( "serial" )
public static class TechLevel
public static class Technology
implements Serializable
{
@XStreamAsAttribute
public String name;
@XStreamAsAttribute
public String category;
@XStreamAsAttribute
public String description;
@ -69,23 +78,57 @@ public class ImportTechs
@XStreamAsAttribute
public int cost;
@XStreamImplicit( itemFieldName = "depends" )
public List< Dependency > dependencies;
}
@SuppressWarnings( "serial" )
public static class Dependency
implements Serializable
{
@XStreamAlias( "on" )
@XStreamAsAttribute
public String dependsOn;
}
/** The file from which technology definitions will be loaded */
private File file;
/** The transaction template used to execute the import transaction */
private TransactionTemplate tTemplate;
private StoredProc uocLine;
private StoredProc uocLevel;
/** Wrapper for the stored procedure which updates or creates technology categories */
private StoredProc uocCategory;
/** Wrapper for the stored procedure which updates or creates technology definitions */
private StoredProc uocTechnology;
/** Wrapper for the stored procedure which adds a dependency to a technology */
private StoredProc addDependency;
/**
* Initialise an XStream instance using the annotations on the {@link Technologies} class and
* its various component classes.
*
* @return the initialised XStream instance
*/
private XStream initXStream( )
{
XStream xstream = new XStream( );
xstream.processAnnotations( Techs.class );
xstream.processAnnotations( Technologies.class );
return xstream;
}
private Techs loadData( )
/**
* Load technology definitions from an XML data file, deserialising it as a {@link Technologies}
* instance through XStream.
*
* @return the technology definition instance or <code>null</code> if an error occurs.
*/
private Technologies loadData( )
{
FileInputStream fis;
try {
@ -96,7 +139,7 @@ public class ImportTechs
try {
XStream xstream = this.initXStream( );
return (Techs) xstream.fromXML( fis );
return (Technologies) xstream.fromXML( fis );
} catch ( Exception e ) {
e.printStackTrace( );
return null;
@ -110,9 +153,15 @@ public class ImportTechs
}
/**
* Create a basic Spring context containing the components that may be used to connect to the
* database.
*
* @return the initialised Spring context
*/
private ClassPathXmlApplicationContext createContext( )
{
// Load data source and Hibernate properties
// Load data source properties
String[] dataConfig = {
this.getDataSource( )
};
@ -127,44 +176,159 @@ public class ImportTechs
}
/**
* Create the {@link #tTemplate} transaction template from the transaction manager in the
* context. In addition, initialise stored procedure wrappers {@link #uocCategory},
* {@link #uocTechnology}.
*
* @param ctx
* the Spring context
*/
private void getBeans( ApplicationContext ctx )
{
PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class );
this.tTemplate = new TransactionTemplate( tManager );
DataSource dataSource = ctx.getBean( DataSource.class );
this.uocLine = new StoredProc( dataSource , "tech" , "uoc_line" );
this.uocLine.addParameter( "tln" , Types.VARCHAR );
this.uocLine.addParameter( "tld" , Types.VARCHAR );
this.uocLevel = new StoredProc( dataSource , "tech" , "uoc_level" );
this.uocLevel.addParameter( "tech_line" , Types.VARCHAR );
this.uocLevel.addParameter( "level" , Types.INTEGER );
this.uocLevel.addParameter( "name" , Types.VARCHAR );
this.uocLevel.addParameter( "desc" , Types.VARCHAR );
this.uocLevel.addParameter( "points" , Types.INTEGER );
this.uocLevel.addParameter( "cost" , Types.INTEGER );
this.uocCategory = new StoredProc( dataSource , "tech" , "uoc_category" );
this.uocCategory.addOutput( "rv" , Types.INTEGER );
this.uocCategory.addParameter( "cat_name" , Types.VARCHAR );
this.uocCategory.addParameter( "cat_desc" , Types.VARCHAR );
this.uocTechnology = new StoredProc( dataSource , "tech" , "uoc_technology" );
this.uocTechnology.addOutput( "rv" , Types.INTEGER );
this.uocTechnology.addParameter( "nt_name" , Types.VARCHAR );
this.uocTechnology.addParameter( "nt_cat" , Types.VARCHAR );
this.uocTechnology.addParameter( "nt_desc" , Types.VARCHAR );
this.uocTechnology.addParameter( "nt_points" , Types.INTEGER );
this.uocTechnology.addParameter( "nt_cost" , Types.INTEGER );
this.addDependency = new StoredProc( dataSource , "tech" , "add_dependency" );
this.addDependency.addOutput( "rv" , Types.INTEGER );
this.addDependency.addParameter( "nd_name" , Types.VARCHAR );
this.addDependency.addParameter( "nd_dep" , Types.VARCHAR );
}
private void importTechnologies( Techs data )
/**
* Import the technology data stored as a {@link Technologies} instance.
*
* @param data
* the technology categories and technology definitions to import
*
* @throws ImportError
* if the definitions are erroneous
*/
private void importTechnologies( Technologies data )
{
for ( TechLine line : data.lines ) {
this.uocLine.execute( line.name , line.description );
this.importCategories( data.categories );
for ( Technology tech : data.technologies ) {
this.importTechnology( tech );
}
}
int i = 1;
for ( TechLevel level : line.levels ) {
this.uocLevel.execute( line.name , i , level.name , level.description , level.points , level.cost );
i++;
/**
* Import a single technology definition, along with its dependencies.
*
* @param technology
* the technology definition to import
*
* @throws ImportError
* if the definition is incorrect
*/
private void importTechnology( Technology technology )
{
this.logger.debug( "Importing technology " + technology.name );
int result = (Integer) this.uocTechnology.execute( technology.name , technology.category ,
technology.description , technology.points , technology.cost ).get( "rv" );
switch ( result ) {
case 0:
break;
case 1:
this.logger.error( "Technology " + technology.name + ": name string not found" );
throw new ImportError( );
case 2:
this.logger.error( "Technology " + technology.name + ": category '" + technology.category
+ "' not found" );
throw new ImportError( );
case 3:
this.logger.error( "Technology " + technology.name + ": description string '" + technology.description
+ "' not found" );
throw new ImportError( );
case 4:
this.logger.error( "Technology " + technology.name + ": invalid points and/or cost" );
throw new ImportError( );
}
if ( technology.dependencies == null ) {
return;
}
for ( Dependency dep : technology.dependencies ) {
result = (Integer) this.addDependency.execute( technology.name , dep.dependsOn ).get( "rv" );
switch ( result ) {
case 0:
break;
case 1:
this.logger.error( "Technology " + technology.name + ": not found while adding dependency" );
throw new ImportError( );
case 2:
this.logger.error( "Technology " + technology.name + ": dependency '" + dep.dependsOn
+ "' not found" );
throw new ImportError( );
case 3:
this.logger.error( "Technology " + technology.name + ": duplicate dependency '" + dep.dependsOn
+ "'" );
throw new ImportError( );
}
}
}
/**
* Import the list of categories into the database using the <em>tech.uoc_category</em> stored
* procedure.
*
* @param categories
* the list of categories
*
* @throws ImportError
* if the stored procedure returns a failure code
*/
private void importCategories( List< Category > categories )
{
for ( Category category : categories ) {
this.logger.debug( "Importing category " + category.name );
int result = (Integer) this.uocCategory.execute( category.name , category.description ).get( "rv" );
switch ( result ) {
case 0:
break;
case 1:
this.logger.error( "Category " + category.name + ": name string not found" );
throw new ImportError( );
case 2:
this.logger.error( "Category " + category.name + ": description string '" + category.description
+ "' not found" );
throw new ImportError( );
}
}
}
/**
* Load the technologies and related data from the file specified on the command line, then
* start a database transaction during which categories, technologies and dependencies will be
* created. If anything should go wrong during the import, rollback the transaction.
*
*/
@Override
public void run( )
{
final Techs data = this.loadData( );
final Technologies data = this.loadData( );
if ( data == null ) {
System.err.println( "could not read data" );
return;
@ -181,8 +345,10 @@ public class ImportTechs
try {
importTechnologies( data );
rv = true;
} catch ( ImportError e ) {
rv = false;
} catch ( RuntimeException e ) {
logger.error( e.getMessage( ) );
logger.error( "error during import" , e );
rv = false;
}
if ( !rv ) {
@ -202,6 +368,15 @@ public class ImportTechs
}
/**
* Make sure that the command-line parameters of this tool consist in a single file name, that
* the file exists and is readable, setting {@link #file} accordingly.
*
* @param options
* the array of command line parameters
*
* @return <code>true</code> if the parameters are ok, <code>false</code> otherwise.
*/
@Override
public boolean setOptions( String... options )
{

View file

@ -2,8 +2,7 @@ package com.deepclone.lw.cli;
import java.io.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
@ -19,10 +18,8 @@ import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.deepclone.lw.cli.i18n.LoadableText;
import com.deepclone.lw.cli.i18n.Loader;
@ -32,125 +29,12 @@ public class ImportText
private final Logger logger = Logger.getLogger( ImportText.class );
@SuppressWarnings( "serial" )
public abstract static class StringData
implements Serializable
{
@XStreamAsAttribute
public String id;
public abstract String getString( );
}
@SuppressWarnings( "serial" )
@XStreamAlias( "inline-string" )
public static class InlineString
extends StringData
{
public String value;
@Override
public String getString( )
{
return this.value;
}
}
@SuppressWarnings( "serial" )
@XStreamAlias( "from-file" )
public static class FileString
extends StringData
{
@XStreamAsAttribute
public String source;
@Override
public String getString( )
{
StringBuilder sBuilder = new StringBuilder( );
try {
BufferedReader in = new BufferedReader( new FileReader( source ) );
String str;
while ( ( str = in.readLine( ) ) != null ) {
sBuilder.append( str );
sBuilder.append( "\n" );
}
in.close( );
} catch ( IOException e ) {
throw new RuntimeException( "Could not read " + source );
}
return sBuilder.toString( );
}
}
@SuppressWarnings( "serial" )
public static class LanguageData
implements Serializable
{
@XStreamAsAttribute
public String id;
@XStreamAsAttribute
public String name;
@XStreamImplicit
public List< StringData > strings = new LinkedList< StringData >( );
}
@SuppressWarnings( "serial" )
@XStreamAlias( "lw-text-data" )
public static class TextData
implements Serializable
{
@XStreamImplicit( itemFieldName = "language" )
public List< LanguageData > languages = new LinkedList< LanguageData >( );
}
private File file;
private TransactionTemplate tTemplate;
private SimpleJdbcCall uocTranslation;
private SimpleJdbcCall uocLanguage;
private XStream initXStream( )
{
XStream xstream = new XStream( );
xstream.processAnnotations( TextData.class );
xstream.processAnnotations( InlineString.class );
xstream.processAnnotations( FileString.class );
return xstream;
}
private TextData loadData( )
{
FileInputStream fis;
try {
fis = new FileInputStream( this.file );
} catch ( FileNotFoundException e ) {
return null;
}
try {
XStream xstream = this.initXStream( );
return (TextData) xstream.fromXML( fis );
} catch ( Exception e ) {
e.printStackTrace( );
return null;
} finally {
try {
fis.close( );
} catch ( IOException e ) {
// EMPTY
}
}
}
private ClassPathXmlApplicationContext createContext( )
{
// Load data source and Hibernate properties
@ -188,26 +72,23 @@ public class ImportText
}
private void importText( TextData data )
private void importText( LoadableText data )
{
for ( LanguageData ld : data.languages ) {
this.importLanguage( ld );
for ( String lId : data.getLanguages( ) ) {
this.importLanguage( data , lId );
}
}
private void importLanguage( LanguageData ld )
private void importLanguage( LoadableText data , String lId )
{
if ( ld.strings == null ) {
return;
}
// Try creating or updating the language
this.uocLanguage.execute( ld.id , ld.name );
this.uocLanguage.execute( lId , data.getLanguageName( lId ) );
// Import translations
for ( StringData sd : ld.strings ) {
this.uocTranslation.execute( ld.id , sd.id , sd.getString( ) );
for ( Map.Entry< String , String > string : data.getStrings( lId ) ) {
System.out.println( "Language " + lId + " string " + string.getKey( ) );
this.uocTranslation.execute( lId , string.getKey( ) , string.getValue( ) );
}
}
@ -215,11 +96,8 @@ public class ImportText
@Override
public void run( )
{
final TextData data = this.loadData( );
if ( data == null ) {
System.err.println( "could not read data" );
return;
}
Loader textLoader = new Loader( this.file );
final LoadableText data = textLoader.load( );
AbstractApplicationContext ctx = this.createContext( );
this.createTemplates( ctx );
@ -245,7 +123,7 @@ public class ImportText
} );
if ( rv ) {
this.logger.info( "Text import successful" );
System.out.println( "Text import successful" );
}
ToolBase.destroyContext( ctx );

View file

@ -0,0 +1,54 @@
/**
*
*/
package com.deepclone.lw.cli.i18n;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@SuppressWarnings( "serial" )
@XStreamAlias( "from-file" )
public class FileString
extends StringData
{
private File sourceFile;
@XStreamAsAttribute
public String source;
@Override
public String getString( )
{
StringBuilder sBuilder = new StringBuilder( );
System.out.println( "Loading text from " + this.sourceFile.getAbsolutePath( ) );
try {
BufferedReader in = new BufferedReader( new FileReader( this.sourceFile ) );
String str;
while ( ( str = in.readLine( ) ) != null ) {
sBuilder.append( str );
sBuilder.append( "\n" );
}
in.close( );
} catch ( IOException e ) {
throw new RuntimeException( "Could not read " + this.sourceFile.getAbsolutePath( ) );
}
return sBuilder.toString( );
}
@Override
public void setLoader( Loader loader )
{
this.sourceFile = new File( loader.getDirectory( ) , this.source );
}
}

View file

@ -0,0 +1,28 @@
/**
*
*/
package com.deepclone.lw.cli.i18n;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@SuppressWarnings( "serial" )
@XStreamAlias( "inline-string" )
public class InlineString
extends StringData
{
public String value;
@Override
public String getString( )
{
return this.value;
}
@Override
public void setLoader( Loader loader )
{
// EMPTY
}
}

View file

@ -0,0 +1,36 @@
/**
*
*/
package com.deepclone.lw.cli.i18n;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@SuppressWarnings( "serial" )
public class LanguageData
implements Serializable
{
@XStreamAsAttribute
public String id;
@XStreamAsAttribute
public String name;
@XStreamImplicit
public List< StringData > strings = new LinkedList< StringData >( );
public void setLoader( Loader loader )
{
for ( StringData sd : this.strings ) {
sd.setLoader( loader );
}
}
}

View file

@ -0,0 +1,73 @@
package com.deepclone.lw.cli.i18n;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class LoadableText
{
private final Map< String , String > languageNames;
private final Map< String , Map< String , String >> text;
public LoadableText( TextData data )
{
this.languageNames = new HashMap< String , String >( );
this.text = new HashMap< String , Map< String , String > >( );
if ( data.languages == null ) {
return;
}
for ( LanguageData language : data.languages ) {
this.languageNames.put( language.id , language.name );
Map< String , String > strings = new HashMap< String , String >( );
this.text.put( language.id , strings );
for ( StringData string : language.strings ) {
strings.put( string.id , string.getString( ) );
}
}
}
public void merge( LoadableText text )
{
for ( Map.Entry< String , String > entry : text.languageNames.entrySet( ) ) {
Map< String , String > lStrings = this.text.get( entry.getKey( ) );
if ( lStrings == null ) {
this.languageNames.put( entry.getKey( ) , entry.getValue( ) );
lStrings = new HashMap< String , String >( );
this.text.put( entry.getKey( ) , lStrings );
}
for ( Map.Entry< String , String > string : text.text.get( entry.getKey( ) ).entrySet( ) ) {
if ( lStrings.put( string.getKey( ) , string.getValue( ) ) != null ) {
throw new RuntimeException( "String '" + string.getKey( ) + "' defined more than once" );
}
}
}
}
public Set< String > getLanguages( )
{
return this.languageNames.keySet( );
}
public String getLanguageName( String lId )
{
return this.languageNames.get( lId );
}
public Set< Map.Entry< String , String >> getStrings( String lId )
{
return this.text.get( lId ).entrySet( );
}
}

View file

@ -0,0 +1,99 @@
package com.deepclone.lw.cli.i18n;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import com.thoughtworks.xstream.XStream;
public class Loader
{
private final Set< String > included;
private final XStream xstream;
private final File file;
private final String directory;
public Loader( File file )
{
this.included = new HashSet< String >( );
this.xstream = new XStream( );
this.xstream.processAnnotations( TextData.class );
this.xstream.processAnnotations( InlineString.class );
this.xstream.processAnnotations( FileString.class );
this.file = file;
this.directory = this.file.getAbsoluteFile( ).getParent( );
}
public Loader( Loader parent , String included )
{
this.included = parent.included;
this.xstream = parent.xstream;
if ( included.charAt( 0 ) == '/' ) {
this.file = new File( included );
} else {
this.file = new File( parent.directory , included );
}
this.directory = this.file.getAbsoluteFile( ).getParent( );
}
public LoadableText load( )
{
System.out.println( "Loading data file " + this.file.getAbsolutePath( ) );
TextData data = this.loadFile( );
data.setLoader( this );
LoadableText result = new LoadableText( data );
if ( data.includes != null ) {
for ( String file : data.includes ) {
Loader child = new Loader( this , file );
if ( this.included.contains( child.file.getAbsolutePath( ) ) ) {
continue;
}
this.included.add( child.file.getAbsolutePath( ) );
result.merge( child.load( ) );
}
}
return result;
}
private TextData loadFile( )
{
FileInputStream fis;
try {
fis = new FileInputStream( this.file );
} catch ( FileNotFoundException e ) {
throw new RuntimeException( e );
}
try {
return (TextData) this.xstream.fromXML( fis );
} catch ( Exception e ) {
throw new RuntimeException( e );
} finally {
try {
fis.close( );
} catch ( IOException e ) {
// EMPTY
}
}
}
public String getDirectory( )
{
return this.directory;
}
}

View file

@ -0,0 +1,25 @@
/**
*
*/
package com.deepclone.lw.cli.i18n;
import java.io.Serializable;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@SuppressWarnings( "serial" )
public abstract class StringData
implements Serializable
{
@XStreamAsAttribute
public String id;
public abstract String getString( );
public abstract void setLoader( Loader loader );
}

View file

@ -0,0 +1,34 @@
/**
*
*/
package com.deepclone.lw.cli.i18n;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@SuppressWarnings( "serial" )
@XStreamAlias( "lw-text-data" )
public class TextData
implements Serializable
{
@XStreamImplicit( itemFieldName = "include" )
public List< String > includes = new LinkedList< String >( );
@XStreamImplicit( itemFieldName = "language" )
public List< LanguageData > languages = new LinkedList< LanguageData >( );
public void setLoader( Loader loader )
{
for ( LanguageData l : this.languages ) {
l.setLoader( loader );
}
}
}

View file

@ -38,9 +38,10 @@ public class Server
builder.setScope( BeanDefinition.SCOPE_SINGLETON );
builder.addPropertyValue( "serviceName" , name );
builder.addPropertyValue( "service" , bean );
builder.addPropertyValue( "ServiceInterface" , iface.getCanonicalName( ) );
builder.addPropertyValue( "serviceInterface" , iface.getCanonicalName( ) );
builder.addPropertyValue( "registryPort" , String.valueOf( this.getRmiPort( ) ) );
builder.addPropertyValue( "servicePort" , String.valueOf( sPort ) );
builder.addPropertyValue( "registryHost" , "localhost" );
ctx.registerBeanDefinition( name , builder.getBeanDefinition( ) );
}
@ -48,17 +49,31 @@ public class Server
private AbstractApplicationContext makeRMIContext( ApplicationContext parent )
{
GenericApplicationContext context = new GenericApplicationContext( parent );
this.addRMIService( context , "termSrv" , parent.getBean( "terminator" ) , ServerTerminator.class , this.getTerminationPort( ) );
this.addRMIService( context , "sessionSrv" , parent.getBean( "sessionManager" ) , SessionManager.class , this.getServicePort( ) );
this.addRMIRegistry( context );
this.addRMIService( context , "termSrv" , parent.getBean( "terminator" ) , ServerTerminator.class , this
.getTerminationPort( ) );
this.addRMIService( context , "sessionSrv" , parent.getBean( "sessionManager" ) , SessionManager.class , this
.getServicePort( ) );
context.refresh( );
return context;
}
private void addRMIRegistry( GenericApplicationContext context )
{
BeanDefinitionBuilder builder;
builder = BeanDefinitionBuilder.rootBeanDefinition( "org.springframework.remoting.rmi.RmiRegistryFactoryBean" );
builder.setScope( BeanDefinition.SCOPE_SINGLETON );
builder.addPropertyValue( "port" , String.valueOf( this.getRmiPort( ) ) );
builder.addPropertyValue( "alwaysCreate" , "true" );
context.registerBeanDefinition( "rmiRegistry" , builder.getBeanDefinition( ) );
}
private ApplicationContext makeDataConfigContext( )
{
String[] dSource = {
this.getDataSource( ) ,
this.getDataSource( ) ,
};
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dSource );
ctx.refresh( );

View file

@ -22,6 +22,8 @@
<import resource="configuration/naming-beans.xml" />
<import resource="configuration/simple-beans.xml" />
<import resource="configuration/system-beans.xml" />
<import resource="configuration/techs-beans.xml" />
<import resource="configuration/updates-beans.xml" />
<import resource="configuration/user-beans.xml" />
</beans>