Page 7 of 10
Posted: Fri Dec 05, 2008 12:49 am
by JensAyton
https://bb.oolite.space/viewtopic.php?t= ... c&start=75
OSH wrote:Ok. I can volunteer make a Polish version of OOlite. But i I'm not a programmer, only translator...
Thanks!
Translating Oolite doesn’t really involve programming; it’s mostly filling in lists of sentences and words with little placeholders in.
I’ve put together a starter kit for Polish
here. It’s a simple OXP containing the following files:
- requires.plist specifies that it’s for Oolite 1.72 and later. (Some of the strings changed between 1.71 and 1.72.)
- oolite-font.plist and oolite-font-l2.png switch Oolite to the ISO-Latin-2 character set, so you have letters like Ł and Ż.
- descriptions.plist contains most of the text that needs translating. Much of it consists of key-value pairs, like "energy-bomb-activated" = ( "Energy bomb triggered." ). Here, the key ("energy-bomb-activated") should not be translated, only the value. (Many of the values are lists, where each item should be translated.) Some of the values contain placeholders like %@ or %f; these must be kept in the same order.
- missiontext.plist contains additional text.
- equipment.plist contains the definitions of equipment items. The third item in each definition is a name and the fifth is a description; these need to be translated.
- hud.plist and hud-small.plist contain some text, like “SPD” and “ROLL”. It may be a bit tricky to find it all, but of course you’ve got it all at the bottom of the screen when you play.
- shipdata-overrides.plist contains names for ships.
One file that should
not be translated is
commodities.plist; the names in that are translated through
descriptions.plist.
The most difficult part is building the system description grammar (system_description in
descriptions.plist). Building grammatically correct sentences by gluing words together is hard, and making them match the original English descriptions is harder. As mentioned upstream you can get Oolite to spit out a graph of the grammar, like
this or
this. Under Mac OS X, use the following terminal command when Oolite is not running:
Code: Select all
defaults write org.aegidian.oolite universe-dump-debug-graphviz -bool true
Under Windows or Linux, you need to manually edit the GNUStep defaults file. Under Linux, it lives (by default) at ~/GNUstep/Defaults/.GNUstepDefaults; for Windows, <installation dir>/oolite.app/GNUstep/Defaults/.GNUstepDefaults. You need to find this line:
and add the following line after it:
Code: Select all
"universe-dump-debug-graphviz" = YES;
This results in a file named SystemDescription.dot being written to the Logs folder. Except I now see this only happens under OS X, due to a minor oversight; this will be fixed in the next release. Currently it will use ~/.Oolite/Diagnostics/ under Linux, and I’m not sure about Windows.
Posted: Fri Dec 05, 2008 12:56 am
by another_commander
The location for the SystemDescription.dot under Windows is <installation dir>\oolite.app\.Oolite\Diagnostics.
Posted: Fri Dec 05, 2008 1:12 am
by JensAyton
Forgot to mention – to convert the dot file to something viewable, you’ll need
graphviz. Also, this new
shipdata-overrides.plist with just names in is useful for translation to any language.
Posted: Fri Dec 05, 2008 9:52 am
by OSH
Big thanks Ahruman. I hope, Polish version of Oolite will be soon ready...
Posted: Fri Dec 05, 2008 12:27 pm
by JensAyton
Ahruman wrote:Some of the values contain placeholders like %@ or %f; these must be kept in the same order.
A clarification on this: the placeholders in question are %@, or % followed by a lowercase letter (like %u), or % followed by a number and then a lowercase letter (like %02d or %.0f).
% followed by a capital H, I or R is an Oolite-specific function which can be safely rearranged, added or moved: %H is the system name, %I is %H followed by “ian” (or rather, the value of planetname-derivative-suffix from
descriptions.plist, and %R is a random name like “Ab’eri”. (There’s also a %X, which is like %R but provides a greater range of random names. However, I just realised that’s a terrible choice for technical reasons, and it’ll be changing to %N in future releases. It isn’t used in
descriptions.plist anyway.)
A backslash (\) is used to encode “special” characters: \t means a tab, \n a new line, " a quotation mark ("), and \\ a backslash.
Posted: Sat Dec 06, 2008 3:02 pm
by OSH
Hmm. I've installed Polish starter kit, launch Oolite and saw this:
Why is this font so S E P A R A T E D ?
And anything else: I can't use typical polish signs like ł or ż. When I replace ROLL with OBRÓT I see blank field...
Posted: Sat Dec 06, 2008 3:58 pm
by JensAyton
OK, the expanded-text issue is a simple fix: the width tables were off by a factor of two because I forgot to adjust for scale when I changed the tool to create higher-resolution textures. A fixed
oolite-font.plist for Latin-2 is
here.
The other issue is a bigger problem. It suggests that GNUstep may not support Windows-Latin-2 encoding.
Posted: Sat Dec 06, 2008 4:41 pm
by JensAyton
Just for verification, please try replacing ROLL with just Ó, and Oolite on the title screen with Ółite (in theme-music-credit).
Posted: Sat Dec 06, 2008 5:10 pm
by OSH
Ahruman wrote:Just for verification, please try replacing ROLL with just Ó, and Oolite on the title screen with Ółite (in theme-music-credit).
When I make these changes in Polish-starter-kit.oxp, replacing ROLL with ÓÓÓÓ brings blank field...but I can't replace "Oolite" with "Ółite", because this has no effect (all texts on main screen are unchanged). And when I write this string into main "description.plist" in the main OOlite.app/config, game doesn't start.
I see, hud.plist ist UTF-encoded. Maybe this causes this issue?
Posted: Sat Dec 06, 2008 5:26 pm
by JensAyton
Yes, all the files must be in UTF-8. (Actually, that’s not strictly true for the XML format, but those should be in UTF-8.)
Posted: Sat Dec 06, 2008 5:58 pm
by another_commander
I have just checked the functionality of the Latin-2, Cyrillic and Greek oxp sets and confirm that they all work fine under GNUstep (once the width fix has been applied, that is). Haven't tried the Turkish set, but I have no reason to believe that it will give problems. OSH, can you please post your hud.plist that has problems displaying ROLL in Polish?
Posted: Sat Dec 06, 2008 7:48 pm
by OSH
Of course, here is hud.plist:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>dials</key><!-- these are drawn, in order, after the legends -->
<array>
<dict><!-- Targetting enhancement -->
<key>equipment_required</key>
<string>EQ_SCANNER_SHOW_MISSILE_TARGET</string>
<key>selector</key>
<string>drawTargetReticle:</string>
</dict>
<dict><!-- scanner -->
<key>alpha</key>
<real>0.75</real>
<key>selector</key>
<string>drawScanner:</string>
<key>x</key>
<integer>0</integer>
<key>y</key>
<integer>-180</integer>
<key>height</key>
<real>72</real>
<key>width</key>
<real>288</real>
<key>rgb_color</key>
<array>
<real>1.0</real>
<real>0</real>
<real>0</real>
</array>
</dict>
<dict><!-- scanner zoom indicator -->
<key>alpha</key>
<real>1</real>
<key>selector</key>
<string>drawScannerZoomIndicator:</string>
<key>x</key>
<integer>108</integer>
<key>y</key>
<integer>-216</integer>
</dict>
<dict><!-- compass -->
<key>alpha</key>
<real>1</real>
<key>selector</key>
<string>drawCompass:</string>
<key>x</key>
<integer>132</integer>
<key>y</key>
<integer>-216</integer>
</dict>
<dict><!-- station aegis -->
<key>alpha</key>
<real>1</real>
<key>selector</key>
<string>drawAegis:</string>
<key>x</key>
<integer>-132</integer>
<key>y</key>
<integer>-216</integer>
</dict>
<dict><!-- fuel scoop status -->
<key>alpha</key>
<real>0.75</real>
<key>selector</key>
<string>drawScoopStatus:</string>
<key>x</key>
<integer>-132</integer>
<key>y</key>
<integer>-152</integer>
</dict>
<dict><!-- speed bar, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawSpeedBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>200</integer>
<key>y</key>
<integer>-145</integer>
</dict>
<dict><!-- roll bar, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawRollBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>200</integer>
<key>y</key>
<integer>-160</integer>
</dict>
<dict><!-- pitch bar, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawPitchBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>200</integer>
<key>y</key>
<integer>-170</integer>
</dict>
<dict><!-- energy guage, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>48</integer>
<key>selector</key>
<string>drawEnergyGauge:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>200</integer>
<key>y</key>
<integer>-205</integer>
<key>labelled</key>
<true/>
</dict>
<dict><!-- forward shield bar, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawForwardShieldBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-146</integer>
</dict>
<dict><!-- aft shield bar, can draw a surround 2 units out from the dial size specified -->
<key>draw_surround</key>
<true/>
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawAftShieldBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-162</integer>
</dict>
<dict><!-- just draws a surround 2 units around the selected size, you could also use drawGreenSurround: -->
<key>height</key>
<integer>40</integer>
<key>selector</key>
<string>drawYellowSurround:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-194</integer>
</dict>
<dict><!-- fuel bar -->
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawFuelBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-179</integer>
</dict>
<dict><!-- cabin temperature bar -->
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawCabinTempBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-189</integer>
</dict>
<dict><!-- weapon temperature bar -->
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawWeaponTempBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-199</integer>
</dict>
<dict><!-- altitude bar -->
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawAltitudeBar:</string>
<key>width</key>
<integer>80</integer>
<key>x</key>
<integer>-200</integer>
<key>y</key>
<integer>-209</integer>
</dict>
<dict><!-- missile display, x and y give the location, the x-spacing is given by spacing, the size defines the icon size -->
<key>height</key>
<integer>12</integer>
<key>selector</key>
<string>drawMissileDisplay:</string>
<key>spacing</key>
<integer>16</integer>
<key>width</key>
<integer>12</integer>
<key>x</key>
<integer>-228</integer>
<key>y</key>
<integer>-224</integer>
</dict>
<dict><!-- status indicator light, x and y give the location, the size defines the icon size -->
<key>height</key>
<integer>8</integer>
<key>selector</key>
<string>drawStatusLight:</string>
<key>width</key>
<integer>8</integer>
<key>x</key>
<integer>-108</integer>
<key>y</key>
<integer>-216</integer>
</dict>
<dict><!-- ship's clock, x and y give the location, the size defines the character size -->
<key>height</key>
<integer>12</integer>
<key>selector</key>
<string>drawClock:</string>
<key>width</key>
<integer>12</integer>
<key>x</key>
<integer>-48</integer>
<key>y</key>
<integer>-234</integer>
</dict>
<dict><!-- fps counter, x and y give the location, the size defines the character size -->
<key>height</key>
<integer>18</integer>
<key>selector</key>
<string>drawFPSInfoCounter:</string>
<key>width</key>
<integer>18</integer>
<key>x</key>
<integer>-300</integer>
<key>y</key>
<integer>220</integer>
</dict>
</array>
<key>legends</key><!-- these are drawn, in order, before the dials, add any other images you want here -->
<array>
<!-- LHS -->
<dict>
<key>text</key>
<string>FWD</string>
<key>x</key>
<integer>-264</integer>
<key>y</key>
<string>-158</string>
<key>height</key>
<integer>20</integer>
<key>width</key>
<integer>10</integer>
</dict>
<dict>
<key>text</key>
<string>AFT</string>
<key>x</key>
<integer>-262</integer>
<key>y</key>
<string>-174</string>
<key>height</key>
<integer>20</integer>
<key>width</key>
<integer>10</integer>
</dict>
<dict>
<key>text</key>
<string>FUEL</string>
<key>x</key>
<integer>-264</integer>
<key>y</key>
<string>-188</string>
<key>height</key>
<integer>14</integer>
<key>width</key>
<integer>9</integer>
</dict>
<dict>
<key>text</key>
<string>CT</string>
<key>x</key>
<integer>-255</integer>
<key>y</key>
<string>-198</string>
<key>height</key>
<integer>14</integer>
<key>width</key>
<integer>9</integer>
</dict>
<dict>
<key>text</key>
<string>LT</string>
<key>x</key>
<integer>-254</integer>
<key>y</key>
<string>-208</string>
<key>height</key>
<integer>14</integer>
<key>width</key>
<integer>9</integer>
</dict>
<dict>
<key>text</key>
<string>ALT</string>
<key>x</key>
<integer>-260</integer>
<key>y</key>
<string>-218</string>
<key>height</key>
<integer>14</integer>
<key>width</key>
<integer>9</integer>
</dict>
<dict>
<key>text</key>
<string>MISS</string>
<key>x</key>
<integer>-266</integer>
<key>y</key>
<string>-236</string>
<key>height</key>
<integer>16</integer>
<key>width</key>
<integer>10</integer>
</dict>
<!-- RHS -->
<dict>
<key>text</key>
<string>SPD</string>
<key>x</key>
<integer>241</integer>
<key>y</key>
<string>-158</string>
<key>height</key>
<integer>20</integer>
<key>width</key>
<integer>10</integer>
</dict>
<dict>
<key>text</key>
<string>ÓÓÓÓ</string>
<key>x</key>
<integer>241</integer>
<key>y</key>
<string>-168</string>
<key>height</key>
<integer>12</integer>
<key>width</key>
<integer>9</integer>
</dict>
<dict>
<key>text</key>
<string>PITCH</string>
<key>x</key>
<integer>241</integer>
<key>y</key>
<string>-178</string>
<key>height</key>
<integer>12</integer>
<key>width</key>
<integer>9</integer>
</dict>
</array>
<key>reticle_target_sensitive</key>
<false/>
</dict>
</plist>
EDIT:
It works! I've saved this file by mistake in ANSI-codepage. When I set to UTF-8 óóóó is visible
Thanks for support, but I'm sure, I will have new questions
Posted: Sat Dec 06, 2008 9:30 pm
by OSH
Something is wrong...When I change title credits by editing file description.plist, nothing is changed. When I change this credits in the main descriptions.plist file in the directory OOlite\oolite.app\config, the gam doesn't start. What's up ?
Posted: Sat Dec 06, 2008 9:44 pm
by JensAyton
OSH wrote:Something is wrong...When I change title credits by editing file description.plist, nothing is changed. When I change this credits in the main descriptions.plist file in the directory OOlite\oolite.app\config, the gam doesn't start. What's up ? :shock:
You’ve broken the file, possibly by using data in an encoding other than UTF-8 (making the file as a whole invalid UTF-8). This should be reflected in the log.
Posted: Sat Dec 06, 2008 9:51 pm
by OSH
Which editor is suitable for editing .plist files? I've opened it with notepad...but even saving (without any changes) causes, the game doesn't start...