# HG changeset patch # User Stefano Rivera # Date 1299587863 -7200 # Node ID 2f1952748cdb0ca9dbc4a3a0174f0501154bf876 # Parent 0ce08d5e2acb98b49d49c90c57bc21bc88ea288c# Parent 7d8e4f2a5bbe669dd2d4ac53b4e3daa9e440fed2 merge i18n and Russian translation diff -r 0ce08d5e2acb -r 2f1952748cdb README-i18n.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README-i18n.txt Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,41 @@ +These are notes on internationalization and translation. They are +suitable for Unix like systems. As prerequisites you need `gettext' +being installed and (if you want to translate) some editor for +gettext catalogs like `poedit' or `virtaal'. In case you are familiar +with gettext ".po" format any text editor will do. + + +== How do I translate suspended-sentence into my language? == + +First of all look if there is already translation catalog for +your locale in `po/' subdirectory. The file should be named like +`.po' where is the language code for your locale. +For example, catalog for German is called `de.po'. If it is there +you can start translating. + +If there is no file for your locale you need to generate it. To do +this navigate to the `po/' directory in terminal and type command + + msginit -l + +where is two-letters-language-code you need. Then translate +generated file using your preferred editor. + +To get new translation to work you need to compile and install it by +executing `install-po.sh' script. + + +== How can I mark the string in code as translatable? == + +Just surround it with _( and ) like + "Hello, world" -> _("Hello, world!") + +_() is a function in `gamelib/i18n.py' file, so you might want to +import it first. + + from gamelib.i18n import _ + +And don't forget to update message catalogs with new strings. To do +that just execute `update-po.sh' script. It collects all translatable +strings from files that are specified in `po/POTFILES'. Make sure the +file you worked on is in there. diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/DejaVu-Copyright.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/fonts/DejaVu-Copyright.txt Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,50 @@ +Copyright: + +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/DejaVuSans-Bold.ttf Binary file Resources/fonts/DejaVuSans-Bold.ttf has changed diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/DejaVuSans.ttf Binary file Resources/fonts/DejaVuSans.ttf has changed diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/Vera-Copyright.txt --- a/Resources/fonts/Vera-Copyright.txt Fri Sep 10 18:47:17 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -Bitstream Vera Fonts Copyright - -The fonts have a generous copyright, allowing derivative works (as -long as "Bitstream" or "Vera" are not in the names), and full -redistribution (so long as they are not *sold* by themselves). They -can be be bundled, redistributed and sold with any software. - -The fonts are distributed under the following copyright: - -Copyright -========= - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream -Vera is a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute -the Font Software, including without limitation the rights to use, -copy, merge, publish, distribute, and/or sell copies of the Font -Software, and to permit persons to whom the Font Software is furnished -to do so, subject to the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Bitstream" or the word "Vera". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Bitstream Vera" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, -OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT -SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font -Software without prior written authorization from the Gnome Foundation -or Bitstream Inc., respectively. For further information, contact: -fonts at gnome dot org. - -Copyright FAQ -============= - - 1. I don't understand the resale restriction... What gives? - - Bitstream is giving away these fonts, but wishes to ensure its - competitors can't just drop the fonts as is into a font sale system - and sell them as is. It seems fair that if Bitstream can't make money - from the Bitstream Vera fonts, their competitors should not be able to - do so either. You can sell the fonts as part of any software package, - however. - - 2. I want to package these fonts separately for distribution and - sale as part of a larger software package or system. Can I do so? - - Yes. A RPM or Debian package is a "larger software package" to begin - with, and you aren't selling them independently by themselves. - See 1. above. - - 3. Are derivative works allowed? - Yes! - - 4. Can I change or add to the font(s)? - Yes, but you must change the name(s) of the font(s). - - 5. Under what terms are derivative works allowed? - - You must change the name(s) of the fonts. This is to ensure the - quality of the fonts, both to protect Bitstream and Gnome. We want to - ensure that if an application has opened a font specifically of these - names, it gets what it expects (though of course, using fontconfig, - substitutions could still could have occurred during font - opening). You must include the Bitstream copyright. Additional - copyrights can be added, as per copyright law. Happy Font Hacking! - - 6. If I have improvements for Bitstream Vera, is it possible they might get - adopted in future versions? - - Yes. The contract between the Gnome Foundation and Bitstream has - provisions for working with Bitstream to ensure quality additions to - the Bitstream Vera font family. Please contact us if you have such - additions. Note, that in general, we will want such additions for the - entire family, not just a single font, and that you'll have to keep - both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add - glyphs to the font, they must be stylistically in keeping with Vera's - design. Vera cannot become a "ransom note" font. Jim Lyles will be - providing a document describing the design elements used in Vera, as a - guide and aid for people interested in contributing to Vera. - - 7. I want to sell a software package that uses these fonts: Can I do so? - - Sure. Bundle the fonts with your software and sell your software - with the fonts. That is the intent of the copyright. - - 8. If applications have built the names "Bitstream Vera" into them, - can I override this somehow to use fonts of my choosing? - - This depends on exact details of the software. Most open source - systems and software (e.g., Gnome, KDE, etc.) are now converting to - use fontconfig (see www.fontconfig.org) to handle font configuration, - selection and substitution; it has provisions for overriding font - names and subsituting alternatives. An example is provided by the - supplied local.conf file, which chooses the family Bitstream Vera for - "sans", "serif" and "monospace". Other software (e.g., the XFree86 - core server) has other mechanisms for font substitution. - diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/Vera.ttf Binary file Resources/fonts/Vera.ttf has changed diff -r 0ce08d5e2acb -r 2f1952748cdb Resources/fonts/VeraBd.ttf Binary file Resources/fonts/VeraBd.ttf has changed diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/gamescreen.py --- a/gamelib/gamescreen.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/gamescreen.py Tue Mar 08 14:37:43 2011 +0200 @@ -15,6 +15,7 @@ from widgets import (MessageDialog, BoomButton, HandButton, PopupMenu, PopupMenuButton) +from gamelib.i18n import _ class InventoryView(PaletteView): @@ -142,7 +143,7 @@ self.border_width = 5 self.border_color = (0, 0, 0) # parent only gets set when we get added to the scene - self.close = BoomButton('Close', self.close_but, screen) + self.close = BoomButton(_('Close'), self.close_but, screen) self.add(self.close) def close_but(self): @@ -214,7 +215,7 @@ self.add(self.state_widget) self.popup_menu = PopupMenu(self) - self.menubutton = PopupMenuButton('Menu', + self.menubutton = PopupMenuButton(_('Menu'), action=self.popup_menu.show_menu) self.handbutton = HandButton(action=self.hand_pressed) diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/i18n.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gamelib/i18n.py Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,6 @@ +# internationalization + +from gettext import gettext + +def _(s): + return unicode(gettext(s), "utf-8") diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/main.py --- a/gamelib/main.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/main.py Tue Mar 08 14:37:43 2011 +0200 @@ -10,6 +10,8 @@ import os.path right_path = os.path.dirname(os.path.dirname(__file__)) sys.path.insert(0, right_path) +import gettext +import locale from optparse import OptionParser import pygame @@ -63,6 +65,11 @@ # debug the specified scene state.DEBUG_SCENE = opts.scene state.DEBUG_RECTS = opts.rects + + locale.setlocale(locale.LC_ALL, "") + gettext.bindtextdomain("suspended-sentence", data.filepath('locale')) + gettext.textdomain("suspended-sentence") + display = pygame.display.set_mode(SCREEN, SWSURFACE) pygame.display.set_icon(pygame.image.load( data.filepath('icons/suspended_sentence24x24.png'))) diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/bridge.py --- a/gamelib/scenes/bridge.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/bridge.py Tue Mar 08 14:37:43 2011 +0200 @@ -9,6 +9,7 @@ from albow.resource import get_image from gamelib.cursor import CursorSprite +from gamelib.i18n import _ from gamelib.state import Scene, Item, Thing, Result from gamelib.sound import get_current_playlist from gamelib.constants import DEBUG @@ -59,16 +60,16 @@ self.add_thing(JimPanel()) self.add_thing(StarField()) self.add_thing(GenericDescThing('bridge.wires', 1, - "The brightly coloured wires contrast with the drab walls.", + _("The brightly coloured wires contrast with the drab walls."), ((46, 4, 711, 143),))) self.add_thing(GenericDescThing('bridge.note', 2, - "\"Dammit JIM, I'm a doctor, not an engineer!\"", + _("\"Dammit JIM, I'm a doctor, not an engineer!\""), ( (491, 494, 194, 105), (422, 533, 71, 66), ))) self.doctor = GenericDescThing('bridge.skel', 3, - "A skeleton hangs improbably from the wires.", + _("A skeleton hangs improbably from the wires."), ( (632, 148, 40, 29), (683, 176, 30, 101), @@ -113,13 +114,13 @@ return Result(detail_view='bridge_comp_detail') def interact_with_titanium_leg(self, item): - return Result("You can't break the duraplastic screen.") + return Result(_("You can't break the duraplastic screen.")) def interact_with_machete(self, item): - return Result("Scratching the screen won't help you.") + return Result(_("Scratching the screen won't help you.")) def get_description(self): - return "The main bridge computer screen." + return _("The main bridge computer screen.") class MassageChairBase(Thing): @@ -142,9 +143,9 @@ def get_description(self): if self.get_data('contains_superconductor'): - return "A top of the line Massage-o-Matic Captain's Executive Command Chair. " \ - "It's massaging a skeleton." - return "The chair won't work any more, it has no power." + return _("A top of the line Massage-o-Matic Captain's Executive Command Chair. " \ + "It's massaging a skeleton.") + return _("The chair won't work any more, it has no power.") class MassageChair(Thing): @@ -193,15 +194,15 @@ INITIAL = 'stethoscope' def get_description(self): - return "A stethoscope hangs from the neck of the skeleton." + return _("A stethoscope hangs from the neck of the skeleton.") def interact_without(self): self.state.add_inventory_item('stethoscope') self.scene.remove_thing(self) # Fill in the doctor's rect self.scene.doctor.rect.append(self.rect) - return Result("You pick up the stethoscope and verify that the doctor's " - "heart has stopped. Probably a while ago.") + return Result(_("You pick up the stethoscope and verify that the doctor's " + "heart has stopped. Probably a while ago.")) class TapedSuperconductor(Item): @@ -221,8 +222,8 @@ taped_superconductor = TapedSuperconductor('taped_superconductor') self.state.add_item(taped_superconductor) self.state.replace_inventory_item(self.name, taped_superconductor.name) - return Result("You rip off a piece of duct tape and stick it on the superconductor. " - "It almost sticks to itself, but you successfully avoid disaster.") + return Result(_("You rip off a piece of duct tape and stick it on the superconductor. " + "It almost sticks to itself, but you successfully avoid disaster.")) class SuperconductorThing(Thing): @@ -241,8 +242,8 @@ self.state.current_scene.things['bridge.massagechair_base'] \ .set_data('contains_superconductor', False) self.scene.remove_thing(self) - return (Result("The superconductor module unclips easily."), - make_jim_dialog(("Prisoner %s. That chair you've destroyed was " + return (Result(_("The superconductor module unclips easily.")), + make_jim_dialog(_("Prisoner %s. That chair you've destroyed was " "property of the ship's captain. " "You will surely be punished." ) % PLAYER_ID, self.state)) @@ -274,9 +275,9 @@ def leave(self): self.description = random.choice([ - "The lights flash in interesting patterns.", - "The flashing lights don't mean anything to you.", - "The console lights flash and flicker.", + _("The lights flash in interesting patterns."), + _("The flashing lights don't mean anything to you."), + _("The console lights flash and flicker."), ]) def get_description(self): @@ -319,18 +320,18 @@ def get_description(self): if self.scene.get_data('ai panel') == 'closed': - return "The sign reads 'Warning: Authorized Techinicians Only'." + return _("The sign reads 'Warning: Authorized Techinicians Only'.") def interact_without(self): if self.scene.get_data('ai status') == 'online': return self.interact_default(None) elif self.scene.get_data('ai panel') == 'closed': - return Result("You are unable to open the panel with your bare hands.") + return Result(_("You are unable to open the panel with your bare hands.")) elif self.scene.get_data('ai panel') == 'open': self.scene.set_data('ai panel', 'broken') self.scene.set_data('ai status', 'dead') self.set_interact('broken') - return Result("You unplug various important-looking wires.") + return Result(_("You unplug various important-looking wires.")) def interact_with_machete(self, item): @@ -339,18 +340,18 @@ elif self.scene.get_data('ai panel') == 'closed': self.scene.set_data('ai panel', 'open') self.set_interact('open') - return Result("Using the machete, you lever the panel off.") + return Result(_("Using the machete, you lever the panel off.")) elif self.scene.get_data('ai panel') == 'open': self.scene.set_data('ai panel', 'broken') self.scene.set_data('ai status', 'dead') self.set_interact('broken') - return Result("You smash various delicate components with the machete.") + return Result(_("You smash various delicate components with the machete.")) def interact_default(self, item): if self.scene.get_data('ai status') == 'online': - return (Result('You feel a shock from the panel.'), - make_jim_dialog("Prisoner %s. Please step away from the panel. " - "You are not an authorized technician." % PLAYER_ID, self.state)) + return (Result(_('You feel a shock from the panel.')), + make_jim_dialog(_("Prisoner %s. Please step away from the panel. " + "You are not an authorized technician.") % PLAYER_ID, self.state)) class ChairDetail(Scene): @@ -447,13 +448,13 @@ def interact_without(self): if self.state.scenes['bridge'].get_data('ai status') == 'online': - return make_jim_dialog("You are not authorized to change the destination.", self.state) + return make_jim_dialog(_("You are not authorized to change the destination."), self.state) if not self.ai_blocked: - return Result("There's no good reason to choose to go to the penal colony.") + return Result(_("There's no good reason to choose to go to the penal colony.")) if self.state.scenes['bridge'].get_data('ai status') == 'looping': - return Result("You could change the destination, but when JIM recovers, it'll just get reset.") + return Result(_("You could change the destination, but when JIM recovers, it'll just get reset.")) if self.state.scenes['bridge'].get_data('ai status') == 'dead': - return Result("You change the destination.", soundfile="beep550.ogg", end_game=True) + return Result(_("You change the destination."), soundfile="beep550.ogg", end_game=True) class CompUpButton(Thing): """Up button on log screen""" diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/crew_quarters.py --- a/gamelib/scenes/crew_quarters.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/crew_quarters.py Tue Mar 08 14:37:43 2011 +0200 @@ -8,6 +8,8 @@ from gamelib.scenes.game_constants import PLAYER_ID from gamelib.scenes.game_widgets import Door, BaseCamera, make_jim_dialog +from gamelib.i18n import _ + class CrewQuarters(Scene): FOLDER = "crew_quarters" @@ -26,10 +28,10 @@ self.add_thing(PosterThing()) self.add_thing(MonitorCamera()) self.add_thing(GenericDescThing('crew.plant', 1, - "The plant is doing surprisingly well for centuries of neglect", + _("The plant is doing surprisingly well for centuries of neglect"), ((624, 215, 61, 108),))) self.add_thing(GenericDescThing('crew.cat', 2, - "A picture of a cat labelled 'Clementine'", + _("A picture of a cat labelled 'Clementine'"), ((722, 382, 66, 72),))) @@ -68,30 +70,30 @@ self.set_data('has_tape', False) self.state.add_inventory_item('duct_tape') self.set_interact('empty_safe') - return Result("Duct tape. It'll stick to everything except " - "ducts, apparently.") - return Result("The perfectly balanced door swings frictionlessly " - "to and fro. What craftsmanship!") - return Result("The safe is locked. This might be an interesting " - "challenge, if suitable equipment can be found.") + return Result(_("Duct tape. It'll stick to everything except " + "ducts, apparently.")) + return Result(_("The perfectly balanced door swings frictionlessly " + "to and fro. What craftsmanship!")) + return Result(_("The safe is locked. This might be an interesting " + "challenge, if suitable equipment can be found.")) def interact_with_stethoscope(self, item): if self.get_data('is_cracked'): - return Result("It's already unlocked. There's no more challenge.") + return Result(_("It's already unlocked. There's no more challenge.")) # TODO: Add years to the sentence for safecracking. # TODO: Wax lyrical some more about safecracking. self.set_data('is_cracked', True) self.set_interact('full_safe') - return (Result("Even after centuries of neglect, the tumblers slide" + return (Result(_("Even after centuries of neglect, the tumblers slide" " almost silently into place. Turns out the combination" " was '1 2 3 4 5'. An idiot must keep his luggage in" - " here."), - make_jim_dialog("Prisoner %s, you have been observed committing a felony violation. " - "This will go onto your permanent record, and your sentence may be extended by up to twenty years." + " here.")), + make_jim_dialog(_("Prisoner %s, you have been observed committing a felony violation. " + "This will go onto your permanent record, and your sentence may be extended by up to twenty years.") % PLAYER_ID, self.state)) def get_description(self): - return "Ah, a vintage Knoxx & Co. model QR3. Quaint, but reasonably secure." + return _("Ah, a vintage Knoxx & Co. model QR3. Quaint, but reasonably secure.") class FishbowlThing(Thing): @@ -112,18 +114,19 @@ def interact_without(self): if not self.get_data('has_bowl'): - return Result("What's the point of lugging around a very dead fish " - "and a kilogram or so of sand?") + return Result(_("What's the point of lugging around a very dead fish " + "and a kilogram or so of sand?")) self.set_interact('fish_no_bowl') self.set_data('has_bowl', False) self.state.add_inventory_item('fishbowl') - return Result("The fishbowl is useful, but its contents aren't.") + return Result(_("The fishbowl is useful, but its contents aren't.")) def get_description(self): if self.get_data('has_bowl'): - return "This fishbowl looks exactly like an old science fiction space helmet." + return _("This fishbowl looks exactly like an old science fiction space helmet.") else: - return "An evicted dead fish and some sand lie forlornly on the table" + return _("An evicted dead fish and some sand lie forlornly on the table") + class Fishbowl(Item): "A bowl. Sans fish." @@ -136,8 +139,8 @@ helmet = FishbowlHelmet('helmet') self.state.add_item(helmet) self.state.replace_inventory_item(self.name, helmet.name) - return Result("You duct tape the edges of the helmet. The seal is" - " crude, but it will serve as a workable helmet if needed.") + return Result(_("You duct tape the edges of the helmet. The seal is" + " crude, but it will serve as a workable helmet if needed.")) class FishbowlHelmet(Item): @@ -183,10 +186,10 @@ def interact_without(self): self.state.add_inventory_item('escher_poster') self.scene.remove_thing(self) - return Result("This poster will go nicely on your bedroom wall.") + return Result(_("This poster will go nicely on your bedroom wall.")) def get_description(self): - return "A paradoxical poster hangs below the security camera." + return _("A paradoxical poster hangs below the security camera.") class EscherPoster(Item): diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/cryo.py --- a/gamelib/scenes/cryo.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/cryo.py Tue Mar 08 14:37:43 2011 +0200 @@ -14,6 +14,7 @@ from gamelib.scenes.game_constants import PLAYER_ID from gamelib.scenes.game_widgets import Door, make_jim_dialog +from gamelib.i18n import _ class Cryo(Scene): @@ -49,7 +50,7 @@ # Flavour items # pipes self.add_thing(GenericDescThing('cryo.pipes', 1, - "These pipes carry cooling fluid to the cryo units.", + _("These pipes carry cooling fluid to the cryo units."), ( (552, 145, 129, 66), (636, 82, 165, 60), @@ -60,8 +61,8 @@ # cryo units self.add_thing(GenericCryoUnit(2, - "An empty cryo chamber.", - "Prisoner 81E4-C8900480E635. Embezzlement. 20 years.", + _("An empty cryo chamber."), + _("Prisoner 81E4-C8900480E635. Embezzlement. 20 years."), ( (155, 430, 50, 35), (125, 450, 60, 35), @@ -70,8 +71,8 @@ ))) self.add_thing(GenericCryoUnit(3, - "A working cryo chamber. The frosted glass obscures the details of the occupant.", - "Prisoner 9334-CE1EB0243BAB. Murder. 40 years.", + _("A working cryo chamber. The frosted glass obscures the details of the occupant."), + _("Prisoner 9334-CE1EB0243BAB. Murder. 40 years."), ( (215, 430, 50, 35), (205, 450, 50, 35), @@ -80,8 +81,8 @@ ))) self.add_thing(GenericCryoUnit(4, - "A broken cryo chamber. The skeleton inside has been picked clean.", - "Prisoner BFBC-8BF4C6B7492B. Importing illegal alien biomatter. 15 years.", + _("A broken cryo chamber. The skeleton inside has been picked clean."), + _("Prisoner BFBC-8BF4C6B7492B. Importing illegal alien biomatter. 15 years."), ( (275, 430, 50, 70), (255, 460, 50, 70), @@ -89,24 +90,24 @@ ))) self.add_thing(GenericCryoUnit(5, - "A working cryo chamber. The frosted glass obscures the details of the occupant.", - "Prisoner B520-99495B8C41CE. Copyright infringement. 60 years.", + _("A working cryo chamber. The frosted glass obscures the details of the occupant."), + _("Prisoner B520-99495B8C41CE. Copyright infringement. 60 years."), ( (340, 430, 50, 70), (330, 500, 60, 50), ))) self.add_thing(GenericCryoUnit(6, - "An empty cryo unit. Recently filled by you.", - "Prisoner %s. Safecracking, grand larceny. 30 years." % PLAYER_ID, + _("An empty cryo unit. Recently filled by you."), + _("Prisoner %s. Safecracking, grand larceny. 30 years.") % PLAYER_ID, ( (399, 426, 70, 56), (404, 455, 69, 120), ))) self.add_thing(GenericCryoUnit(7, - "An empty cryo unit.", - "Prisoner 83F1-CE32D3234749. Spamming. 5 years.", + _("An empty cryo unit."), + _("Prisoner 83F1-CE32D3234749. Spamming. 5 years."), ( (472, 432, 58, 51), (488, 455, 41, 134), @@ -114,8 +115,8 @@ ))) self.add_thing(GenericCryoUnit(8, - "An empty cryo unit.", - "Prisoner A455-9DF9F43C43E5. Medical malpractice. 10 years.", + _("An empty cryo unit."), + _("Prisoner A455-9DF9F43C43E5. Medical malpractice. 10 years."), ( (596, 419, 69, 39), (616, 442, 82, 40), @@ -131,14 +132,14 @@ if self.get_data('greet'): self.set_data('greet', False) return make_jim_dialog( - "Greetings, Prisoner %s. I am the Judicial " - "Incarceration Monitor. " - "You have been woken early under the terms of the " - "emergency conscription act to assist with repairs to " - "the ship. Your behaviour during this time will " - "be noted on your record and will be relayed to " - "prison officials when we reach the destination. " - "Please report to the bridge." % PLAYER_ID, self.state) + _("Greetings, Prisoner %s. I am the Judicial " + "Incarceration Monitor. " + "You have been woken early under the terms of the " + "emergency conscription act to assist with repairs to " + "the ship. Your behaviour during this time will " + "be noted on your record and will be relayed to " + "prison officials when we reach the destination. " + "Please report to the bridge.") % PLAYER_ID, self.state) def leave(self): # Stop music @@ -161,13 +162,13 @@ self.state.add_item(pipe) self.state.add_inventory_item(pipe.name) self.set_interact("chopped") - responses = [Result("It takes more effort than one would expect, but " - "eventually the pipe is separated from the wall.", + responses = [Result(_("It takes more effort than one would expect, but " + "eventually the pipe is separated from the wall."), soundfile="chop-chop.ogg")] if self.state.current_scene.get_data('vandalism_warn'): self.state.current_scene.set_data('vandalism_warn', False) responses.append(make_jim_dialog( - ("Prisoner %s. Vandalism is an offence punishable by a " + _("Prisoner %s. Vandalism is an offence punishable by a " "minimum of an additional 6 months to your sentence." ) % PLAYER_ID, self.state)) return responses @@ -177,13 +178,13 @@ def interact_without(self): if self.get_data('fixed'): - return Result("These pipes aren't attached to the wall very solidly.") + return Result(_("These pipes aren't attached to the wall very solidly.")) return None def get_description(self): if self.get_data('fixed'): - return "These pipes carry cooling fluid to empty cryo units." - return "There used to be a pipe carrying cooling fluid here." + return _("These pipes carry cooling fluid to empty cryo units.") + return _("There used to be a pipe carrying cooling fluid here.") class UncuttableCryoPipes(Thing): @@ -200,17 +201,17 @@ INITIAL = "fixed" def interact_with_machete(self, item): - return Result("These pipes carry fluid to the working cryo units." - " Chopping them down doesn't seem sensible.") + return Result(_("These pipes carry fluid to the working cryo units." + " Chopping them down doesn't seem sensible.")) def is_interactive(self, tool=None): return True def interact_without(self): - return Result("These pipes aren't attached to the wall very solidly.") + return Result(_("These pipes aren't attached to the wall very solidly.")) def get_description(self): - return "These pipes carry cooling fluid to the working cryo units." + return _("These pipes carry cooling fluid to the working cryo units.") class TubeFragment(CloneableItem): @@ -282,13 +283,13 @@ return Result(detail_view='cryo_detail') def interact_with_titanium_leg(self, item): - return Result("You hit the chamber that used to hold this very leg. Nothing happens as a result.", + return Result(_("You hit the chamber that used to hold this very leg. Nothing happens as a result."), soundfile="clang2.ogg") def get_description(self): if self.get_data('contains_titanium_leg'): - return "A broken cryo chamber, with a poor unfortunate corpse inside." - return "A broken cryo chamber. The corpse inside is missing a leg." + return _("A broken cryo chamber, with a poor unfortunate corpse inside.") + return _("A broken cryo chamber. The corpse inside is missing a leg.") class GenericCryoUnit(GenericDescThing): @@ -309,9 +310,9 @@ def interact_with_titanium_leg(self, item): return Result(random.choice([ - "You bang on the chamber with the titanium femur. Nothing much happens.", - "Hitting the cryo unit with the femur doesn't achieve anything.", - "You hit the chamber with the femur. Nothing happens.", + _("You bang on the chamber with the titanium femur. Nothing much happens."), + _("Hitting the cryo unit with the femur doesn't achieve anything."), + _("You hit the chamber with the femur. Nothing happens."), ]), soundfile="clang2.ogg") @@ -335,18 +336,18 @@ def interact_with_titanium_leg(self, item): if self.get_data('door') == "ajar": self.open_door() - return Result("You wedge the titanium femur into the chain and twist. With a satisfying *snap*, the chain breaks and the door opens.", soundfile='break.ogg') + return Result(_("You wedge the titanium femur into the chain and twist. With a satisfying *snap*, the chain breaks and the door opens."), soundfile='break.ogg') elif self.get_data('door') == "shut": - text = "You bang on the door with the titanium femur. It makes a clanging sound." + text = _("You bang on the door with the titanium femur. It makes a clanging sound.") return Result(text, soundfile='clang.ogg') else: - return Result("You wave the femur in the doorway. Nothing happens.") + return Result(_("You wave the femur in the doorway. Nothing happens.")) def interact_without(self): if self.get_data('door') == "shut": self.half_open_door() if self.get_data('door') != "open": - return Result("It moves slightly and then stops. A chain on the other side is preventing it from opening completely.", soundfile='chain.ogg') + return Result(_("It moves slightly and then stops. A chain on the other side is preventing it from opening completely."), soundfile='chain.ogg') else: self.state.set_current_scene('map') return None @@ -364,11 +365,11 @@ def get_description(self): if self.get_data('door') == "open": - return 'An open doorway leads to the rest of the ship.' + return _('An open doorway leads to the rest of the ship.') elif self.get_data('door') == "ajar": - return ("A rusty door. It can't open all the way because of a " + return _("A rusty door. It can't open all the way because of a " "chain on the other side.") - return 'A rusty door. It is currently closed.' + return _('A rusty door. It is currently closed.') class CryoComputer(Thing): @@ -389,10 +390,10 @@ return Result(detail_view='cryo_comp_detail') def interact_with_titanium_leg(self, item): - return Result("Hitting it with the leg accomplishes nothing.") + return Result(_("Hitting it with the leg accomplishes nothing.")) def get_description(self): - return "A computer terminal, with some text on it." + return _("A computer terminal, with some text on it.") class TitaniumLegThing(Thing): @@ -410,10 +411,10 @@ self.state.add_inventory_item('titanium_leg') self.state.current_scene.things['cryo.unit.1'].set_data('contains_titanium_leg', False) self.scene.remove_thing(self) - return Result("The skeletal occupant of this cryo unit has an artificial femur made of titanium. You take it.") + return Result(_("The skeletal occupant of this cryo unit has an artificial femur made of titanium. You take it.")) def get_description(self): - return "This femur looks synthetic." + return _("This femur looks synthetic.") class PlaqueThing(Thing): @@ -428,10 +429,10 @@ INITIAL = "plaque" def interact_without(self): - return Result("The plaque is welded to the unit. You can't shift it.") + return Result(_("The plaque is welded to the unit. You can't shift it.")) def get_description(self): - return "'Prisoner 98CC-764E646391EE. War crimes. 45 years." + return _("'Prisoner 98CC-764E646391EE. War crimes. 45 years.") class FullBottle(Item): @@ -455,16 +456,16 @@ INITIAL = 'pools' def get_description(self): - return "Coolant leaks disturbingly from the bulkheads." + return _("Coolant leaks disturbingly from the bulkheads.") def interact_without(self): - return Result("It's gooey") + return Result(_("It's gooey")) def interact_with_detergent_bottle(self, item): full = FullBottle('full_detergent_bottle') self.state.add_item(full) self.state.replace_inventory_item(item.name, full.name) - return Result("You scoop up some coolant and fill the bottle.") + return Result(_("You scoop up some coolant and fill the bottle.")) class CryoCompDetail(Scene): diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/engine.py --- a/gamelib/scenes/engine.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/engine.py Tue Mar 08 14:37:43 2011 +0200 @@ -10,6 +10,7 @@ from gamelib.scenes.game_constants import PLAYER_ID from gamelib.scenes.game_widgets import Door, make_jim_dialog +from gamelib.i18n import _ class Engine(Scene): @@ -39,14 +40,14 @@ self.add_thing(ComputerConsole()) self.add_thing(ToMap()) self.add_thing(GenericDescThing('engine.body', 1, - "Dead. Those cans must have been past their sell-by date.", + _("Dead. Those cans must have been past their sell-by date."), ( (594, 387, 45, 109), (549, 479, 60, 55), ) )) self.add_thing(GenericDescThing('engine.superconductors', 4, - "Superconductors. The engines must be power hogs.", + _("Superconductors. The engines must be power hogs."), ( (679, 246, 50, 56), (473, 280, 28, 23), @@ -54,8 +55,8 @@ ) )) self.add_thing(GenericDescThing('engine.floor_hole', 5, - "A gaping hole in the floor of the room. " - "It is clearly irreparable.", + _("A gaping hole in the floor of the room. " + "It is clearly irreparable."), ( (257, 493, 141, 55), (301, 450, 95, 45), @@ -64,25 +65,25 @@ ) )) self.add_thing(GenericDescThing('engine.empty_cans', 7, - "Empty chocolate-covered bacon cans? Poor guy, he must have found them irresistible.", + _("Empty chocolate-covered bacon cans? Poor guy, he must have found them irresistible."), ( (562, 422, 30, 31), ) )) self.add_thing(GenericDescThing('engine.engines', 8, - "The engines. They don't look like they are working.", + _("The engines. They don't look like they are working."), ( (342, 261, 109, 81), ) )) self.add_thing(GenericDescThing('engine.laser_cutter', 9, - "A burned-out laser cutter. It may be responsible for the hole in the floor.", + _("A burned-out laser cutter. It may be responsible for the hole in the floor."), ( (120, 466, 115, 67), ) )) self.add_thing(GenericDescThing('engine.fuel_lines', 10, - "The main fuel line for the engines.", + _("The main fuel line for the engines."), ( (220, 49, 59, 75), (239, 84, 51, 66), @@ -102,20 +103,20 @@ ) )) self.add_thing(GenericDescThing('engine.spare_fuel_line', 11, - "The spare fuel line. If something went wrong with the main one, you would hook that one up.", + _("The spare fuel line. If something went wrong with the main one, you would hook that one up."), ( (512, 49, 68, 44), ) )) self.add_thing(GenericDescThing('engine.danger_area', 12, - "The sign says DANGER. You would be wise to listen to it.", + _("The sign says DANGER. You would be wise to listen to it."), ( (293, 343, 211, 46), ) )) self.add_thing(GenericDescThing('engine.exit_sign', 13, - "It's one of those glow-in-the-dark signs needed to satisfy the " - "health and safety inspectors.", + _("It's one of those glow-in-the-dark signs needed to satisfy the " + "health and safety inspectors."), ( (681, 322, 80, 33), ) @@ -127,16 +128,16 @@ self.set_data('engine online', True) self.remove_thing(self.things['engine.engines.8']) self.add_thing(Engines()) - return make_jim_dialog("The engines are now operational. You have" - "done a satisfactory job, Prisoner %s." % PLAYER_ID, + return make_jim_dialog(_("The engines are now operational. You have" + "done a satisfactory job, Prisoner %s.") % PLAYER_ID, self.state) def enter(self): if self.get_data('greet'): self.set_data('greet', False) return Result( - "With your improvised helmet, the automatic airlock allows you into the engine room. Even if there wasn't a vacuum " - "it would be eerily quiet.") + _("With your improvised helmet, the automatic airlock allows you into the engine room. Even if there wasn't a vacuum " + "it would be eerily quiet.")) class Engines(Thing): NAME = 'engine.engines' @@ -151,7 +152,7 @@ return False def get_description(self): - return "All systems are go! Or at least the engines are." + return _("All systems are go! Or at least the engines are.") class CanOpener(Item): @@ -169,13 +170,13 @@ INITIAL = 'canopener' def get_description(self): - return "A can opener. Looks like you won't be starving" + return _("A can opener. Looks like you won't be starving") def interact_without(self): self.state.add_inventory_item('canopener') self.scene.remove_thing(self) - return Result("You pick up the can opener. It looks brand new; " - "the vacuum has kept it in perfect condition.") + return Result(_("You pick up the can opener. It looks brand new; " + "the vacuum has kept it in perfect condition.")) class SuperconductorSocket(Thing): @@ -196,33 +197,33 @@ def get_description(self): if self.get_data('present') and not self.get_data('working'): - return "That superconductor looks burned out. It's wedged in there pretty firmly." + return _("That superconductor looks burned out. It's wedged in there pretty firmly.") elif not self.get_data('present'): - return "An empty superconductor socket" + return _("An empty superconductor socket") else: - return "A working superconductor." + return _("A working superconductor.") def interact_without(self): if self.get_data('present') and not self.get_data('working'): - return Result("It's wedged in there pretty firmly, it won't come out.") + return Result(_("It's wedged in there pretty firmly, it won't come out.")) elif self.get_data('working'): - return Result("You decide that working engines are more important than having a shiny superconductor.") + return Result(_("You decide that working engines are more important than having a shiny superconductor.")) def interact_with_machete(self, item): if self.get_data('present') and not self.get_data('working'): self.set_interact('removed') self.set_data('present', False) - return Result("With leverage, the burned-out superconductor snaps out. " - "You discard it.") + return Result(_("With leverage, the burned-out superconductor snaps out. " + "You discard it.")) def interact_with_superconductor(self, item): if self.get_data('present'): - return Result("It might help to remove the broken superconductor first") + return Result(_("It might help to remove the broken superconductor first")) else: - return Result("You plug in the superconductor, and feel a hum " + return Result(_("You plug in the superconductor, and feel a hum " "as things kick into life. " "Unfortunately, it's the wrong size for the socket " - "and just falls out again when you let go.") + "and just falls out again when you let go.")) def interact_with_taped_superconductor(self, item): if not self.get_data('present'): @@ -230,12 +231,12 @@ self.set_data('present', True) self.set_data('working', True) self.state.remove_inventory_item(item.name) - results = [Result("The chair's superconductor looks over-specced " - "for this job, but it should work.")] + results = [Result(_("The chair's superconductor looks over-specced " + "for this job, but it should work."))] results.append(self.scene.engine_online_check()) return results else: - return Result("It might help to remove the broken superconductor first.") + return Result(_("It might help to remove the broken superconductor first.")) class CryoContainers(Thing): @@ -254,8 +255,8 @@ def get_description(self): if not self.get_data('filled'): - return "Those are coolant reservoirs. They look empty." - return "The coolant reservoirs are full." + return _("Those are coolant reservoirs. They look empty.") + return _("The coolant reservoirs are full.") def is_interactive(self, tool=None): return False @@ -275,22 +276,22 @@ INITIAL = 'containers' def get_description(self): - return "The receptacles for the coolant reservoirs." + return _("The receptacles for the coolant reservoirs.") def interact_without(self): - return Result("You stick your finger in the receptacle. " - "It almost gets stuck.") + return Result(_("You stick your finger in the receptacle. " + "It almost gets stuck.")) def interact_with_full_detergent_bottle(self, item): if not self.scene.things['engine.cracked_pipe'].get_data('fixed'): - return Result("Pouring the precious cryo fluid into a" - " container connected to a cracked pipe would be a waste.") + return Result(_("Pouring the precious cryo fluid into a" + " container connected to a cracked pipe would be a waste.")) self.state.remove_inventory_item(item.name) self.scene.things['engine.cryo_containers'].set_data('filled', True) self.scene.things['engine.cryo_containers'].set_interact('full') - results = [Result("You fill the reservoirs. " + results = [Result(_("You fill the reservoirs. " "The detergent bottle was just big enough, which " - "is handy, because it's sprung a leak.")] + "is handy, because it's sprung a leak."))] results.append(self.scene.engine_online_check()) return results @@ -336,10 +337,10 @@ def get_description(self): if not self.scene.things['engine.cryo_containers'].get_data('filled'): - return "These pipes carry coolant to the superconductors. " \ - "They feel warm." - return "These pipes carry coolant to the superconductors. " \ - "They are very cold." + return _("These pipes carry coolant to the superconductors. " \ + "They feel warm.") + return _("These pipes carry coolant to the superconductors. " \ + "They are very cold.") def is_interactive(self, tool=None): return False @@ -364,8 +365,8 @@ def get_description(self): if self.scene.things['engine.superconductor'].get_data('working'): - return "Power lines. They are delivering power to the engines." - return "Power lines. It looks like they aren't working correctly." + return _("Power lines. They are delivering power to the engines.") + return _("Power lines. It looks like they aren't working correctly.") def is_interactive(self, tool=None): return False @@ -454,8 +455,8 @@ return False def get_description(self): - return "A gaping hole in the floor of the room. You're guessing" \ - " that's why there's a vacuum in here." + return _("A gaping hole in the floor of the room. You're guessing" \ + " that's why there's a vacuum in here.") class CrackedPipe(Thing): @@ -474,20 +475,20 @@ def get_description(self): if self.get_data('fixed'): - return "The duct tape appears to be holding." + return _("The duct tape appears to be holding.") else: - return "The pipe looks cracked and won't hold" \ - " fluid until it's fixed." + return _("The pipe looks cracked and won't hold" \ + " fluid until it's fixed.") def interact_with_duct_tape(self, item): if self.get_data('fixed'): - return Result("The duct tape already there appears to be " - "sufficient.") + return Result(_("The duct tape already there appears to be " + "sufficient.")) else: self.set_data('fixed', True) self.set_interact('taped') - return Result("You apply your trusty duct tape to the " - "creak, sealing it.") + return Result(_("You apply your trusty duct tape to the " + "creak, sealing it.")) class ComputerConsole(Thing): @@ -506,7 +507,7 @@ return Result(detail_view='engine_comp_detail') def get_description(self): - return "A computer console. It's alarmingly close to the engine." + return _("A computer console. It's alarmingly close to the engine.") class EngineCompDetail(Scene): @@ -563,7 +564,7 @@ INITIAL = "door" def get_description(self): - return "The airlock leads back to the rest of the ship." + return _("The airlock leads back to the rest of the ship.") SCENES = [Engine] diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/game_widgets.py --- a/gamelib/scenes/game_widgets.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/game_widgets.py Tue Mar 08 14:37:43 2011 +0200 @@ -1,6 +1,7 @@ """Generic, game specific widgets""" +from gamelib.i18n import _ from gamelib.state import Thing, Result @@ -22,7 +23,7 @@ self.state.set_current_scene("map") def get_description(self): - return 'An open doorway leads to the rest of the ship.' + return _('An open doorway leads to the rest of the ship.') def interact_default(self, item): return self.interact_without() @@ -47,11 +48,11 @@ def get_description(self): status = self.state.scenes['bridge'].get_data('ai status') if status == 'online': - return "A security camera watches over the room" + return _("A security camera watches over the room") elif status == 'looping': - return "The security camera is currently offline but should be working soon" + return _("The security camera is currently offline but should be working soon") else: - return "The security camera is powered down" + return _("The security camera is powered down") def is_interactive(self, tool=None): return self.state.scenes['bridge'].get_data('ai status') == 'online' @@ -59,7 +60,7 @@ def interact_with_escher_poster(self, item): # Order matters here, because of helper function if self.state.scenes['bridge'].get_data('ai status') == 'online': - ai_response = make_jim_dialog("3D scene reconstruction failed. Critical error. Entering emergency shutdown.", self.state) + ai_response = make_jim_dialog(_("3D scene reconstruction failed. Critical error. Entering emergency shutdown."), self.state) self.state.scenes['bridge'].set_data('ai status', 'looping') return ai_response diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/machine.py --- a/gamelib/scenes/machine.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/machine.py Tue Mar 08 14:37:43 2011 +0200 @@ -7,6 +7,7 @@ from gamelib.scenes.game_widgets import Door +from gamelib.i18n import _ class Machine(Scene): @@ -27,7 +28,7 @@ self.add_item(CryoPipesThree('cryo_pipes_three')) self.add_item(Manual('manual')) self.add_thing(GenericDescThing('machine.wires', 2, - "Wires run to all the machines in the room", + _("Wires run to all the machines in the room"), ( (250, 172, 252, 12), (388, 183, 114, 13), @@ -47,16 +48,16 @@ (674, 54, 23, 36), ))) self.add_thing(GenericDescThing('machine.diagram', 3, - "A wiring diagram of some sort", + _("A wiring diagram of some sort"), ((694, 140, 94, 185),))) self.add_thing(GenericDescThing('machine.powerpoint', 4, - "The cables to this power point have been cut", + _("The cables to this power point have been cut"), ((155, 22, 92, 74),))) self.add_thing(GenericDescThing("machine.powerpoint", 5, - "All the machines run off this powerpoint", + _("All the machines run off this powerpoint"), ((593, 19, 74, 57),))) self.add_thing(GenericDescThing("machine.drill_press", 6, - "An impressive looking laser drill press", + _("An impressive looking laser drill press"), ( (519, 338, 36, 63), (545, 348, 93, 46), @@ -69,7 +70,7 @@ (605, 304, 26, 8), ))) self.add_thing(GenericDescThing("machine.drill_press_block", 7, - "The block for the laser drill press", # TODO: fix description + _("The block for the laser drill press"), # TODO: fix description ((461, 446, 38, 27),))) @@ -115,40 +116,40 @@ self.set_interact("can_and_tube") def interact_without(self): - return Result("You really don't want to put your hand in there.") + return Result(_("You really don't want to put your hand in there.")) def interact_with_empty_can(self, item): contents = self.get_data('contents') if "can" in contents: - return Result("There is already a can in the welder.") + return Result(_("There is already a can in the welder.")) self.state.remove_inventory_item(item.name) contents.add("can") self.update_contents() - return Result("You carefully place the can in the laser welder.") + return Result(_("You carefully place the can in the laser welder.")) def interact_with_tube_fragment(self, item): contents = self.get_data('contents') if "tube" in contents: - return Result("There is already a tube fragment in the welder.") + return Result(_("There is already a tube fragment in the welder.")) self.state.remove_inventory_item(item.name) contents.add("tube") self.update_contents() - return Result("You carefully place the tube fragments in the laser welder.") + return Result(_("You carefully place the tube fragments in the laser welder.")) def get_description(self): contents = self.get_data('contents') if not contents: - return "This is a Smith and Wesson 'zOMG' class high-precision laser welder." + return _("This is a Smith and Wesson 'zOMG' class high-precision laser welder.") if len(contents) == 1: - msg = "The laser welder looks hungry, somehow." + msg = _("The laser welder looks hungry, somehow.") if "can" in contents: - msg += " It currently contains an empty can." + msg += _(" It currently contains an empty can.") elif "tube" in contents: - msg += " It currently contains a tube fragment." + msg += _(" It currently contains a tube fragment.") elif len(contents) == 2: - msg = "The laser welder looks expectant. " + msg = _("The laser welder looks expectant. ") if "can" in contents and "tube" in contents: - msg += " It currently contains an empty can and a tube fragment." + msg += _(" It currently contains an empty can and a tube fragment.") return msg @@ -165,32 +166,32 @@ def interact_without(self): contents = self.scene.things["machine.welder.slot"].get_data("contents") if not contents: - return Result("The laser welder doesn't currently contain anything weldable.") + return Result(_("The laser welder doesn't currently contain anything weldable.")) elif len(contents) == 1: if "can" in contents: - return Result("The laser welder needs something to weld the can to.") + return Result(_("The laser welder needs something to weld the can to.")) elif "tube" in contents: - return Result("The laser welder needs something to weld the tube fragments to.") + return Result(_("The laser welder needs something to weld the tube fragments to.")) else: self.scene.things["machine.welder.slot"].set_data("contents", set()) self.scene.things["machine.welder.slot"].update_contents() if self.state.items["cryo_pipes_one"] in self.state.inventory: self.state.replace_inventory_item("cryo_pipes_one", "cryo_pipes_two") - return Result("With high-precision spitzensparken, you weld" - " together a second pipe. You bundle the two pipes together.", + return Result(_("With high-precision spitzensparken, you weld" + " together a second pipe. You bundle the two pipes together."), soundfile='laser.ogg') elif self.state.items["cryo_pipes_two"] in self.state.inventory: self.state.replace_inventory_item("cryo_pipes_two", "cryo_pipes_three") - return Result("With high-precision spitzensparken, you create yet" - " another pipe. You store it with the other two.", + return Result(_("With high-precision spitzensparken, you create yet" + " another pipe. You store it with the other two."), soundfile='laser.ogg') elif self.state.items["cryo_pipes_three"] in self.state.inventory: # just for safety return None else: self.state.add_inventory_item("cryo_pipes_one") - return Result("With high-precision spitzensparken, the can and tube are welded" - " into a whole greater than the sum of the parts.", + return Result(_("With high-precision spitzensparken, the can and tube are welded" + " into a whole greater than the sum of the parts."), soundfile='laser.ogg') @@ -205,7 +206,7 @@ INITIAL = 'lights' def get_description(self): - return "The power lights pulse expectantly." + return _("The power lights pulse expectantly.") class CryoPipesOne(Item): @@ -243,17 +244,17 @@ INITIAL = "grind" def interact_without(self): - return Result("It looks like it eats fingers. Perhaps a different approach is in order?") + return Result(_("It looks like it eats fingers. Perhaps a different approach is in order?")) def interact_with_titanium_leg(self, item): self.state.replace_inventory_item(item.name, 'machete') - return Result("After much delicate grinding and a few close calls with" + return Result(_("After much delicate grinding and a few close calls with" " various body parts, the titanium femur now resembles" - " a machete more than a bone. Nice and sharp, too.", + " a machete more than a bone. Nice and sharp, too."), soundfile="grinder.ogg") def get_description(self): - return "A pretty ordinary, albeit rather industrial, grinding machine." + return _("A pretty ordinary, albeit rather industrial, grinding machine.") class TitaniumMachete(Item): @@ -276,9 +277,9 @@ def interact_without(self): self.scene.remove_thing(self) self.state.add_inventory_item("manual") - return Result("Ah! The ship's instruction manual. You'd feel better" + return Result(_("Ah! The ship's instruction manual. You'd feel better" " if the previous owner wasn't lying next to it with a" - " gaping hole in his rib cage.") + " gaping hole in his rib cage.")) class Manual(Item): diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/map.py --- a/gamelib/scenes/map.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/map.py Tue Mar 08 14:37:43 2011 +0200 @@ -13,6 +13,7 @@ from gamelib.scenes.game_constants import PLAYER_ID from gamelib.scenes.game_widgets import make_jim_dialog +from gamelib.i18n import _ class Map(Scene): @@ -38,15 +39,15 @@ if self.get_data('implant'): self.set_data('implant', False) ai1 = make_jim_dialog( - "Under the terms of the emergency conscription " + _("Under the terms of the emergency conscription " "act, I have downloaded the ship's schematics to your " - "neural implant to help you navigate around the ship.", + "neural implant to help you navigate around the ship."), self.state) if ai1: - return ai1, make_jim_dialog("Prisoner %s, you are a " + return ai1, make_jim_dialog(_("Prisoner %s, you are a " "class 1 felon. Obtaining access to the ship's schematics " "constitutes a level 2 offence and carries a minimal penalty " - "of an additional 3 years on your sentence." % PLAYER_ID, self.state) + "of an additional 3 years on your sentence.") % PLAYER_ID, self.state) class DoorThing(Thing): @@ -125,9 +126,9 @@ def interact(self, item): if not self.state.is_in_inventory('helmet'): - return Result('The airlock refuses to open. The automated' + return Result(_('The airlock refuses to open. The automated' ' voice says: "Hull breach beyond this door. Personnel' - ' must be equipped for vacuum before entry."') + ' must be equipped for vacuum before entry."')) else: return super(ToEngine, self).interact(item) @@ -180,8 +181,8 @@ INITIAL = 'areas' def interact(self, _item): - return Result("You look in the door, but just see empty space: " - "that room appears to have been obliterated by meteors.") + return Result(_("You look in the door, but just see empty space: " + "that room appears to have been obliterated by meteors.")) class HydroponicsArea(Thing): @@ -197,9 +198,9 @@ INITIAL = 'areas' def interact(self, _item): - return Result("Peering in through the window, you see that the entire " + return Result(_("Peering in through the window, you see that the entire " "chamber is overgrown with giant broccoli. It would " - "take you years to cut a path through that.") + "take you years to cut a path through that.")) SCENES = [Map] diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/scenes/mess.py --- a/gamelib/scenes/mess.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/scenes/mess.py Tue Mar 08 14:37:43 2011 +0200 @@ -13,6 +13,7 @@ from gamelib.scenes.game_constants import PLAYER_ID from gamelib.scenes.game_widgets import Door +from gamelib.i18n import _ class Mess(Scene): @@ -34,13 +35,13 @@ # Flavour items # extra cans on shelf self.add_thing(GenericDescThing('mess.cans', 1, - "A large collection of rusted, useless cans.", + _("A large collection of rusted, useless cans."), ( (154, 335, 89, 106), (152, 435, 63, 66), ))) self.add_thing(GenericDescThing('mess.broccoli', 2, - "An impressively overgrown broccoli.", + _("An impressively overgrown broccoli."), ( (503, 89, 245, 282), (320, 324, 229, 142), @@ -51,7 +52,7 @@ """Base class for the cans""" def interact_with_full_can(self, item): - return Result("You bang the cans together. It sounds like two cans being banged together.", soundfile="can_hit.ogg") + return Result(_("You bang the cans together. It sounds like two cans being banged together."), soundfile="can_hit.ogg") def interact_with_dented_can(self, item): return self.interact_with_full_can(item) @@ -60,13 +61,13 @@ return self.interact_with_full_can(item) def interact_with_machete(self, item): - return Result("You'd mangle it beyond usefulness.") + return Result(_("You'd mangle it beyond usefulness.")) def interact_with_canopener(self, item): empty = EmptyCan('empty_can') self.state.add_item(empty) self.state.replace_inventory_item(self.name, empty.name) - return Result("You open both ends of the can, discarding the hideous contents.") + return Result(_("You open both ends of the can, discarding the hideous contents.")) class EmptyCan(BaseCan): @@ -76,10 +77,10 @@ CURSOR = CursorSprite('empty_can_cursor.png') def interact_with_titanium_leg(self, item): - return Result("Flattening the can doesn't look like a useful thing to do.") + return Result(_("Flattening the can doesn't look like a useful thing to do.")) def interact_with_canopener(self, item): - return Result("There's nothing left to open on this can") + return Result(_("There's nothing left to open on this can")) class FullCan(BaseCan): @@ -92,7 +93,7 @@ dented = DentedCan("dented_can") self.state.add_item(dented) self.state.replace_inventory_item(self.name, dented.name) - return Result("You club the can with the femur. The can gets dented, but doesn't open.", soundfile="can_hit.ogg") + return Result(_("You club the can with the femur. The can gets dented, but doesn't open."), soundfile="can_hit.ogg") class DentedCan(BaseCan): @@ -102,7 +103,7 @@ CURSOR = CursorSprite('dented_can_cursor.png') def interact_with_titanium_leg(self, item): - return Result("You club the can with the femur. The dents shift around, but it still doesn't open.", soundfile="can_hit.ogg") + return Result(_("You club the can with the femur. The dents shift around, but it still doesn't open."), soundfile="can_hit.ogg") class CansOnShelf(Thing): @@ -133,15 +134,15 @@ if starting_cans == 1: self.scene.remove_thing(self) return Result({ - 3: "Best before a long time in the past. Better not eat these.", - 2: "Mmmm. Nutritious bacteria stew.", - 1: "Candied silkworms. Who stocked this place?!", + 3: _("Best before a long time in the past. Better not eat these."), + 2: _("Mmmm. Nutritious bacteria stew."), + 1: _("Candied silkworms. Who stocked this place?!"), }[starting_cans]) else: - return Result("The rest of the cans are rusted beyond usefulness.") + return Result(_("The rest of the cans are rusted beyond usefulness.")) def get_description(self): - return "The contents of these cans look synthetic." + return _("The contents of these cans look synthetic.") class Tubes(Thing): @@ -163,69 +164,69 @@ def get_description(self): if self.get_data('status') == "blocked": - return "The broccoli seems to have become entangled with something." + return _("The broccoli seems to have become entangled with something.") elif self.get_data("status") == "broken": - return "These broken pipes look important." + return _("These broken pipes look important.") elif self.get_data("status") == "replaced": - return "The pipes have been repaired but are the repairs aren't airtight, yet" + return _("The pipes have been repaired but are the repairs aren't airtight, yet") else: - return "Your fix looks like it's holding up well." + return _("Your fix looks like it's holding up well.") def interact_with_machete(self, item): if self.get_data("status") == "blocked": self.set_data("status", "broken") self.set_interact("broken") - return Result("With a flurry of disgusting mutant vegetable " + return Result(_("With a flurry of disgusting mutant vegetable " "chunks, you clear the overgrown broccoli away from " "the access panel and reveal some broken tubes. " - "They look important.", + "They look important."), soundfile='chopping.ogg') elif self.get_data("status") == "broken": - return Result("It looks broken enough already.") + return Result(_("It looks broken enough already.")) elif self.get_data("status") == "replaced": - return Result("Cutting holes won't repair the leaks.") + return Result(_("Cutting holes won't repair the leaks.")) else: - return Result("After all that effort fixing it, chopping it to " - "bits doesn't seem very smart.") + return Result(_("After all that effort fixing it, chopping it to " + "bits doesn't seem very smart.")) def interact_with_cryo_pipes_three(self, item): if self.get_data("status") == "blocked": - return Result("It would get lost in the fronds.") + return Result(_("It would get lost in the fronds.")) else: self.state.remove_inventory_item(item.name) self.set_data('status', 'replaced') self.set_interact("replaced") self.scene.set_data('life support status', 'replaced') return Result( - "The pipes slot neatly into place, but don't make an airtight seal. " - "One of the pipes has cracked slightly as well." + _("The pipes slot neatly into place, but don't make an airtight seal. " + "One of the pipes has cracked slightly as well.") ) def interact_with_duct_tape(self, item): if self.get_data("status") == "broken": - return Result("It would get lost in the fronds.") + return Result(_("It would get lost in the fronds.")) elif self.get_data("status") == 'fixed': - return Result("There's quite enough tape on the ducting already.") + return Result(_("There's quite enough tape on the ducting already.")) else: self.set_data("fixed", True) self.set_data("status", "fixed") self.set_interact("fixed") self.scene.set_data('life support status', 'fixed') # TODO: A less anticlimactic climax? - return Result("It takes quite a lot of tape, but eventually everything is" + return Result(_("It takes quite a lot of tape, but eventually everything is" " airtight and ready to hold pressure. Who'd've thought duct" - " tape could actually be used to tape ducts?") + " tape could actually be used to tape ducts?")) def interact_without(self): if self.get_data("status") == "blocked": - return Result("The mutant broccoli resists your best efforts.") + return Result(_("The mutant broccoli resists your best efforts.")) elif self.get_data("status") == "broken": - return Result("Shoving the broken pipes around doesn't help much.") + return Result(_("Shoving the broken pipes around doesn't help much.")) elif self.get_data("status") == "replaced": - return Result("Do you really want to hold it together for the " - "rest of the voyage?") + return Result(_("Do you really want to hold it together for the " + "rest of the voyage?")) else: - return Result("You don't find any leaks. Good job, Prisoner %s." % PLAYER_ID) + return Result(_("You don't find any leaks. Good job, Prisoner %s.") % PLAYER_ID) class Boomslang(Thing): @@ -284,14 +285,14 @@ def interact_without(self): if self.get_data('taken'): - return Result("The remaining bottles leak.") + return Result(_("The remaining bottles leak.")) self.set_data('taken', True) self.set_interact('taken') self.state.add_inventory_item('detergent_bottle') - return Result("You pick up an empty dishwashing liquid bottle. You can't find any sponges.") + return Result(_("You pick up an empty dishwashing liquid bottle. You can't find any sponges.")) def get_description(self): - return "Empty plastic containers. They used to hold dishwasher soap." + return _("Empty plastic containers. They used to hold dishwasher soap.") class DetergentBottle(Item): diff -r 0ce08d5e2acb -r 2f1952748cdb gamelib/widgets.py --- a/gamelib/widgets.py Fri Sep 10 18:47:17 2010 +0200 +++ b/gamelib/widgets.py Tue Mar 08 14:37:43 2011 +0200 @@ -16,6 +16,7 @@ from constants import BUTTON_SIZE from cursor import CursorWidget +from gamelib.i18n import _ class BoomLabel(albow.controls.Label): @@ -75,7 +76,7 @@ class BoomButton(BoomLabel): def __init__(self, text, action, screen): - super(BoomButton, self).__init__(text, font=get_font(20, 'Vera.ttf'), margin=4) + super(BoomButton, self).__init__(text, font=get_font(20, 'DejaVuSans.ttf'), margin=4) self.bg_color = (0, 0, 0) self._frame_color = Color(50, 50, 50) self.action = action @@ -159,7 +160,7 @@ def __init__(self, text, action): albow.controls.Button.__init__(self, text, action) - self.font = get_font(16, 'Vera.ttf') + self.font = get_font(16, 'DejaVuSans.ttf') self.set_rect(Rect(0, 0, BUTTON_SIZE, BUTTON_SIZE)) self.margin = (BUTTON_SIZE - self.font.get_linesize()) / 2 @@ -171,12 +172,12 @@ self.screen = screen self.shell = screen.shell items = [ - ('Quit Game', 'quit'), - ('Exit to Main Menu', 'main_menu'), + (_('Quit Game'), 'quit'), + (_('Exit to Main Menu'), 'main_menu'), ] # albow.menu.Menu ignores title string albow.menu.Menu.__init__(self, None, items) - self.font = get_font(16, 'Vera.ttf') + self.font = get_font(16, 'DejaVuSans.ttf') def show_menu(self): """Call present, with the correct position""" diff -r 0ce08d5e2acb -r 2f1952748cdb install-po.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/install-po.sh Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,10 @@ +#!/bin/sh + +# Compiles and installs translation catalogs + +for pofile in po/*.po; do + molang=`echo $pofile | sed -e 's#po/\(.*\)\\.po#\\1#'`; + mofile=`echo $pofile | sed -e 's/\\.po/.mo/'`; + mkdir -p Resources/locale/$molang/LC_MESSAGES + msgfmt $pofile -o Resources/locale/$molang/LC_MESSAGES/suspended-sentence.mo +done diff -r 0ce08d5e2acb -r 2f1952748cdb po/POTFILES --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/po/POTFILES Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,11 @@ +gamelib/widgets.py +gamelib/gamescreen.py +gamelib/scenes/bridge.py +gamelib/scenes/crew_quarters.py +gamelib/scenes/cryo.py +gamelib/scenes/engine.py +gamelib/scenes/machine.py +gamelib/scenes/manual.py +gamelib/scenes/map.py +gamelib/scenes/mess.py +gamelib/scenes/game_widgets.py diff -r 0ce08d5e2acb -r 2f1952748cdb po/ru.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/po/ru.po Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,1076 @@ +# Russian translations for suspended-sentence package +# Русские переводы для пакета suspended-sentence. +# Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the suspended-sentence package. +# Sergey Basalaev , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: suspended-sentence 1.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-08 14:36+0200\n" +"PO-Revision-Date: 2011-02-16 18:36+0600\n" +"Last-Translator: Serguey G Basalaev \n" +"Language-Team: Russian\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: gamelib/widgets.py:175 +msgid "Quit Game" +msgstr "Выйти из игры" + +#: gamelib/widgets.py:176 +msgid "Exit to Main Menu" +msgstr "Главное меню" + +#: gamelib/gamescreen.py:146 +msgid "Close" +msgstr "Закрыть" + +#: gamelib/gamescreen.py:218 +msgid "Menu" +msgstr "Меню" + +#: gamelib/scenes/bridge.py:63 +msgid "The brightly coloured wires contrast with the drab walls." +msgstr "Яркие разноцветные провода контрастируют с блеклыми стенами." + +#: gamelib/scenes/bridge.py:66 +msgid "\"Dammit JIM, I'm a doctor, not an engineer!\"" +msgstr "«Проклятый JIM, я доктор, а не инженер!»" + +#: gamelib/scenes/bridge.py:72 +msgid "A skeleton hangs improbably from the wires." +msgstr "Скелет неправдоподобно свисает с проводов." + +#: gamelib/scenes/bridge.py:117 +msgid "You can't break the duraplastic screen." +msgstr "Вы не можете разбить дюралепластиковый экран." + +#: gamelib/scenes/bridge.py:120 +msgid "Scratching the screen won't help you." +msgstr "Царапание экрана вам не поможет." + +#: gamelib/scenes/bridge.py:123 +msgid "The main bridge computer screen." +msgstr "Экран главного компьютера капитанского моста." + +#: gamelib/scenes/bridge.py:146 +msgid "" +"A top of the line Massage-o-Matic Captain's Executive Command Chair. It's " +"massaging a skeleton." +msgstr "" +"Лучшее из линейки Массаж-о-матик Кресло Капитана Команды. Оно массажирует " +"скелет." + +#: gamelib/scenes/bridge.py:148 +msgid "The chair won't work any more, it has no power." +msgstr "Кресло больше не будет работать, оно лишено питания." + +#: gamelib/scenes/bridge.py:197 +msgid "A stethoscope hangs from the neck of the skeleton." +msgstr "Стетоскоп свисает с шеи скелета." + +#: gamelib/scenes/bridge.py:204 +msgid "" +"You pick up the stethoscope and verify that the doctor's heart has stopped. " +"Probably a while ago." +msgstr "" +"Вы берёте стетоскоп и убеждаетесь, что сердце доктора остановилось. Вероятно " +"уже давно." + +#: gamelib/scenes/bridge.py:225 +msgid "" +"You rip off a piece of duct tape and stick it on the superconductor. It " +"almost sticks to itself, but you successfully avoid disaster." +msgstr "" +"Вы отрываете кусок трубопроводной ленты и приклеиваете её к сверхпроводнику. " +"Она почти прилипает сама к себе, но вы успешно избегаете катастрофы." + +#: gamelib/scenes/bridge.py:245 +msgid "The superconductor module unclips easily." +msgstr "Чип сверхпроводника легко отделяется." + +#: gamelib/scenes/bridge.py:246 +#, python-format +msgid "" +"Prisoner %s. That chair you've destroyed was property of the ship's captain. " +"You will surely be punished." +msgstr "" +"Заключённый %s. Кресло, испорченное вами, было имуществом капитана корабля. " +"Вы обязательно будете наказаны." + +#: gamelib/scenes/bridge.py:278 +msgid "The lights flash in interesting patterns." +msgstr "Огни мигают в интересных комбинациях." + +#: gamelib/scenes/bridge.py:279 +msgid "The flashing lights don't mean anything to you." +msgstr "Мигающие огни ничего для вас не значат." + +#: gamelib/scenes/bridge.py:280 +msgid "The console lights flash and flicker." +msgstr "Огни консоли мигают и мерцают." + +#: gamelib/scenes/bridge.py:323 +msgid "The sign reads 'Warning: Authorized Techinicians Only'." +msgstr "На знаке написано 'Предупреждение: Только Авторизованные Техники'." + +#: gamelib/scenes/bridge.py:329 +msgid "You are unable to open the panel with your bare hands." +msgstr "Вы не можете открыть панель голыми руками." + +#: gamelib/scenes/bridge.py:334 +msgid "You unplug various important-looking wires." +msgstr "Вы отсоединяете всякие важно выглядящие провода." + +#: gamelib/scenes/bridge.py:343 +msgid "Using the machete, you lever the panel off." +msgstr "Используя мачете, вы снимаете панель." + +#: gamelib/scenes/bridge.py:348 +msgid "You smash various delicate components with the machete." +msgstr "Вы разбиваете разные хрупкие детали с помощью мачете." + +#: gamelib/scenes/bridge.py:352 +msgid "You feel a shock from the panel." +msgstr "Вас бьёт током от панели." + +#: gamelib/scenes/bridge.py:353 +#, python-format +msgid "" +"Prisoner %s. Please step away from the panel. You are not an authorized " +"technician." +msgstr "" +"Заключённый %s. Пожалуйста, отойдите от панели. Вы не являетесь " +"авторизованным техником." + +#: gamelib/scenes/bridge.py:451 +msgid "You are not authorized to change the destination." +msgstr "Вы не имеете права изменять пункт назначения." + +#: gamelib/scenes/bridge.py:453 +msgid "There's no good reason to choose to go to the penal colony." +msgstr "Нет причины выбирать полёт в колонию." + +#: gamelib/scenes/bridge.py:455 +msgid "" +"You could change the destination, but when JIM recovers, it'll just get " +"reset." +msgstr "" +"Вы можете изменить пункт назначения, но когда JIM восстановится, он сбросит " +"его обратно." + +#: gamelib/scenes/bridge.py:457 +msgid "You change the destination." +msgstr "Вы изменяете пункт назначения." + +#: gamelib/scenes/crew_quarters.py:31 +msgid "The plant is doing surprisingly well for centuries of neglect" +msgstr "Растение перенесло века забвения неожиданно хорошо." + +#: gamelib/scenes/crew_quarters.py:34 +msgid "A picture of a cat labelled 'Clementine'" +msgstr "Изображение кота, подписанное 'Клементин'" + +#: gamelib/scenes/crew_quarters.py:73 +msgid "Duct tape. It'll stick to everything except ducts, apparently." +msgstr "Трубопроводная лента. Она прилипает ко всему, кроме трубопровода." + +#: gamelib/scenes/crew_quarters.py:75 +msgid "" +"The perfectly balanced door swings frictionlessly to and fro. What " +"craftsmanship!" +msgstr "" +"Идеально сбалансированная дверь легко качается туда-сюда. Ну что за работа!" + +#: gamelib/scenes/crew_quarters.py:77 +msgid "" +"The safe is locked. This might be an interesting challenge, if suitable " +"equipment can be found." +msgstr "" +"Сейф закрыт. Может быть интересным вызовом для вас, если найти подходящее " +"оборудование." + +#: gamelib/scenes/crew_quarters.py:82 +msgid "It's already unlocked. There's no more challenge." +msgstr "Он уже открыт. Это больше не интересно." + +#: gamelib/scenes/crew_quarters.py:87 +msgid "" +"Even after centuries of neglect, the tumblers slide almost silently into " +"place. Turns out the combination was '1 2 3 4 5'. An idiot must keep his " +"luggage in here." +msgstr "" +"Даже после веков забвения, замки двигаются почти бесшумно. Выясняется, что " +"комбинация была '1 2 3 4 5'. Наверное, здесь хранил свой багаж идиот." + +#: gamelib/scenes/crew_quarters.py:91 +#, python-format +msgid "" +"Prisoner %s, you have been observed committing a felony violation. This will " +"go onto your permanent record, and your sentence may be extended by up to " +"twenty years." +msgstr "" +"Заключённый %s, вы были замечены за совершением уголовного преступления. Это " +"войдёт в ваше личное дело, и ваш срок может быть увеличен до двадцати лет." + +#: gamelib/scenes/crew_quarters.py:96 +msgid "Ah, a vintage Knoxx & Co. model QR3. Quaint, but reasonably secure." +msgstr "" +"Ах, винтажная модель QR3 от Knoxx & Co. Древняя, но довольно безопасная." + +#: gamelib/scenes/crew_quarters.py:117 +msgid "" +"What's the point of lugging around a very dead fish and a kilogram or so of " +"sand?" +msgstr "" +"Какой смысл таскать с собой мёртвую рыбину и килограмм или около того песка?" + +#: gamelib/scenes/crew_quarters.py:122 +msgid "The fishbowl is useful, but its contents aren't." +msgstr "Аквариум может пригодиться, а вот его содержимое вряд ли." + +#: gamelib/scenes/crew_quarters.py:126 +msgid "This fishbowl looks exactly like an old science fiction space helmet." +msgstr "" +"Этот аквариум выглядит в точности как космический шлем из старой научной " +"фантастики." + +#: gamelib/scenes/crew_quarters.py:128 +msgid "An evicted dead fish and some sand lie forlornly on the table" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:142 +msgid "" +"You duct tape the edges of the helmet. The seal is crude, but it will serve " +"as a workable helmet if needed." +msgstr "" +"Вы прилепяете ленту к краям шлема. Крепление грубое, но оно может послужить, " +"как рабочий шлем, если нужно." + +#: gamelib/scenes/crew_quarters.py:189 +msgid "This poster will go nicely on your bedroom wall." +msgstr "Этот плакат будет неплохо смотреться на стене вашей спальни." + +#: gamelib/scenes/crew_quarters.py:192 +msgid "A paradoxical poster hangs below the security camera." +msgstr "Парадоксальный плакат висит под камерой безопасности." + +#: gamelib/scenes/cryo.py:53 +msgid "These pipes carry cooling fluid to the cryo units." +msgstr "По этим трубам охлаждающая жидкость подаётся к криокамерам." + +#: gamelib/scenes/cryo.py:64 +msgid "An empty cryo chamber." +msgstr "Пустая криокамера." + +#: gamelib/scenes/cryo.py:65 +msgid "Prisoner 81E4-C8900480E635. Embezzlement. 20 years." +msgstr "Заключённый 81E4-C8900480E635. Хищение имущества. 20 лет." + +#: gamelib/scenes/cryo.py:74 gamelib/scenes/cryo.py:93 +msgid "" +"A working cryo chamber. The frosted glass obscures the details of the " +"occupant." +msgstr "Работающая криокамера. Обитатель не виден из-за замёрзшего стекла." + +#: gamelib/scenes/cryo.py:75 +msgid "Prisoner 9334-CE1EB0243BAB. Murder. 40 years." +msgstr "Заключённый 9334-CE1EB0243BAB. Убийство. 40 лет." + +#: gamelib/scenes/cryo.py:84 +msgid "A broken cryo chamber. The skeleton inside has been picked clean." +msgstr "Сломанная криокамера. Скелет внутри был обчищен." + +#: gamelib/scenes/cryo.py:85 +msgid "" +"Prisoner BFBC-8BF4C6B7492B. Importing illegal alien biomatter. 15 years." +msgstr "" +"Заключённый BFBC-8BF4C6B7492B. Импорт нелегальной биоматерии пришельцев. 15 " +"лет." + +#: gamelib/scenes/cryo.py:94 +msgid "Prisoner B520-99495B8C41CE. Copyright infringement. 60 years." +msgstr "Заключённый B520-99495B8C41CE. Нарушение авторских прав. 60 лет." + +#: gamelib/scenes/cryo.py:101 +msgid "An empty cryo unit. Recently filled by you." +msgstr "Пустая криокамера. Недавно в ней были вы." + +#: gamelib/scenes/cryo.py:102 +#, python-format +msgid "Prisoner %s. Safecracking, grand larceny. 30 years." +msgstr "Заключённый %s. Взлом сейфа, кражи в крупных размерах. 30 лет." + +#: gamelib/scenes/cryo.py:109 gamelib/scenes/cryo.py:118 +msgid "An empty cryo unit." +msgstr "Пустая криокамера." + +#: gamelib/scenes/cryo.py:110 +msgid "Prisoner 83F1-CE32D3234749. Spamming. 5 years." +msgstr "Заключённый 83F1-CE32D3234749. Спам. 5 лет." + +#: gamelib/scenes/cryo.py:119 +msgid "Prisoner A455-9DF9F43C43E5. Medical malpractice. 10 years." +msgstr "Заключённый A455-9DF9F43C43E5. Медицинская халатность. 10 лет." + +#: gamelib/scenes/cryo.py:135 +#, python-format +msgid "" +"Greetings, Prisoner %s. I am the Judicial Incarceration Monitor. You have " +"been woken early under the terms of the emergency conscription act to assist " +"with repairs to the ship. Your behaviour during this time will be noted on " +"your record and will be relayed to prison officials when we reach the " +"destination. Please report to the bridge." +msgstr "" +"Приветствую вас, Заключённый %s. Я — JIM, Монитор Судебного Заключения. Вы " +"были пробуждены раньше срока в соответствии с предписанием о помощи в " +"починке корабля при чрезвычайной ситуации. Ваше поведение в течение " +"ремонтных работ будет занесено в личное дело и рассмотрено официальными " +"лицами по прибытии в пункт назначения. Пожалуйста, отрапортуйте на " +"капитанский мост." + +#: gamelib/scenes/cryo.py:165 +msgid "" +"It takes more effort than one would expect, but eventually the pipe is " +"separated from the wall." +msgstr "" +"Это требует больше усилий, чем можно было ожидать, но в конце концов труба " +"отделяется от стены." + +#: gamelib/scenes/cryo.py:171 +#, python-format +msgid "" +"Prisoner %s. Vandalism is an offence punishable by a minimum of an " +"additional 6 months to your sentence." +msgstr "" +"Заключённый %s. Вандализм является правонарушением и карается как минимум " +"дополнительными 6 меcяцами к вашему сроку." + +#: gamelib/scenes/cryo.py:181 gamelib/scenes/cryo.py:211 +msgid "These pipes aren't attached to the wall very solidly." +msgstr "Эти трубы не очень прочно прикреплены к стене." + +#: gamelib/scenes/cryo.py:186 +msgid "These pipes carry cooling fluid to empty cryo units." +msgstr "По этим трубам охлаждающая жидкость подаётся к пустым криокамерам." + +#: gamelib/scenes/cryo.py:187 +msgid "There used to be a pipe carrying cooling fluid here." +msgstr "Здесь была труба, подающая охлаждающую жидкость." + +#: gamelib/scenes/cryo.py:204 +msgid "" +"These pipes carry fluid to the working cryo units. Chopping them down " +"doesn't seem sensible." +msgstr "Эти трубы подают охлаждающую жидкость к работающим криокамерам. " + +#: gamelib/scenes/cryo.py:214 +msgid "These pipes carry cooling fluid to the working cryo units." +msgstr "По этим трубам охлаждающая жидкость подаётся к рабочим криокамерам." + +#: gamelib/scenes/cryo.py:286 +msgid "" +"You hit the chamber that used to hold this very leg. Nothing happens as a " +"result." +msgstr "" +"Вы ударяете по камере, в которой находилась эта нога. В итоге ничего не " +"происходит." + +#: gamelib/scenes/cryo.py:291 +msgid "A broken cryo chamber, with a poor unfortunate corpse inside." +msgstr "Сломанная криокамера, с бедным несчастным телом внутри." + +#: gamelib/scenes/cryo.py:292 +msgid "A broken cryo chamber. The corpse inside is missing a leg." +msgstr "Сломанная криокамера. У тела внутри отсутствует нога." + +#: gamelib/scenes/cryo.py:313 +msgid "You bang on the chamber with the titanium femur. Nothing much happens." +msgstr "" +"Вы стучите по камере титановым бедром. Не происходит ничего особенного." + +#: gamelib/scenes/cryo.py:314 +msgid "Hitting the cryo unit with the femur doesn't achieve anything." +msgstr "Стучание ребром по криокамере ничего не даёт." + +#: gamelib/scenes/cryo.py:315 +msgid "You hit the chamber with the femur. Nothing happens." +msgstr "Вы бьёте бедром по камере. Ничего не происходит." + +#: gamelib/scenes/cryo.py:339 +msgid "" +"You wedge the titanium femur into the chain and twist. With a satisfying " +"*snap*, the chain breaks and the door opens." +msgstr "" +"Вы просовываете титановое бедро в цепь и поворачиваете. С удовлетворённым " +"*хрусь*, цепь ломается, и дверь открывается." + +#: gamelib/scenes/cryo.py:341 +msgid "" +"You bang on the door with the titanium femur. It makes a clanging sound." +msgstr "Вы стучите по двери титановым бедром. Она издаёт гулкий звук." + +#: gamelib/scenes/cryo.py:344 +msgid "You wave the femur in the doorway. Nothing happens." +msgstr "Вы машете бедром в дверном проходе. Ничего не происходит." + +#: gamelib/scenes/cryo.py:350 +msgid "" +"It moves slightly and then stops. A chain on the other side is preventing it " +"from opening completely." +msgstr "" +"Дверь немного двигается и затем останавливается. Цепь на другой стороне " +"мешает ей полностью открыться." + +#: gamelib/scenes/cryo.py:368 gamelib/scenes/game_widgets.py:26 +msgid "An open doorway leads to the rest of the ship." +msgstr "Открытый дверной проём ведёт к оставшей части корабля." + +#: gamelib/scenes/cryo.py:370 +msgid "" +"A rusty door. It can't open all the way because of a chain on the other side." +msgstr "" +"Ржавая дверь. Она не может полностью открыться из-за цепи на другой стороне." + +#: gamelib/scenes/cryo.py:372 +msgid "A rusty door. It is currently closed." +msgstr "Ржавая дверь. Сейчас она закрыта." + +#: gamelib/scenes/cryo.py:393 +msgid "Hitting it with the leg accomplishes nothing." +msgstr "Стучание ногой по этому не принесёт результатов." + +#: gamelib/scenes/cryo.py:396 +msgid "A computer terminal, with some text on it." +msgstr "Терминал компьютера, на нём какой-то текст." + +#: gamelib/scenes/cryo.py:414 +msgid "" +"The skeletal occupant of this cryo unit has an artificial femur made of " +"titanium. You take it." +msgstr "" +"У скелета, обитающего в этой криокамере искусственное бедро, сделанное из " +"титана. Вы берёте его." + +#: gamelib/scenes/cryo.py:417 +msgid "This femur looks synthetic." +msgstr "Это бедро кажется искусственным." + +#: gamelib/scenes/cryo.py:432 +msgid "The plaque is welded to the unit. You can't shift it." +msgstr "Пластина впаяна в камеру. Вы не можете её сдвинуть." + +#: gamelib/scenes/cryo.py:435 +msgid "'Prisoner 98CC-764E646391EE. War crimes. 45 years." +msgstr "Заключённый 98CC-764E646391EE. Военные преступления. 45 лет." + +#: gamelib/scenes/cryo.py:459 +msgid "Coolant leaks disturbingly from the bulkheads." +msgstr "Охладитель тревожно вытекает из-под переборки." + +#: gamelib/scenes/cryo.py:462 +msgid "It's gooey" +msgstr "" + +#: gamelib/scenes/cryo.py:468 +msgid "You scoop up some coolant and fill the bottle." +msgstr "Вы зачерпываете немного охладителя и наполняете бутылку." + +#: gamelib/scenes/engine.py:43 +msgid "Dead. Those cans must have been past their sell-by date." +msgstr "Чёрт. Похоже все эти банки уже просрочены." + +#: gamelib/scenes/engine.py:50 +msgid "Superconductors. The engines must be power hogs." +msgstr "Сверхпроводники. Двигатели наверняка прожорливы." + +#: gamelib/scenes/engine.py:58 +#, fuzzy +msgid "A gaping hole in the floor of the room. It is clearly irreparable." +msgstr "Сквозная дыра в полу. Вы полагаете что это причина вакуума здесь." + +#: gamelib/scenes/engine.py:68 +msgid "" +"Empty chocolate-covered bacon cans? Poor guy, he must have found them " +"irresistible." +msgstr "" +"Пустые банки из под бекона в шоколаде? Бедный парень, он наверное нашёл их " +"беззащитными." + +#: gamelib/scenes/engine.py:74 +msgid "The engines. They don't look like they are working." +msgstr "Двигатели. Непохоже, что они работают." + +#: gamelib/scenes/engine.py:80 +msgid "" +"A burned-out laser cutter. It may be responsible for the hole in the floor." +msgstr "" +"Перегоревший лазерный резак. Он может быть ответственен за дыру в полу." + +#: gamelib/scenes/engine.py:86 +msgid "The main fuel line for the engines." +msgstr "Главная топливная шина для двигателей." + +#: gamelib/scenes/engine.py:106 +msgid "" +"The spare fuel line. If something went wrong with the main one, you would " +"hook that one up." +msgstr "" +"Запасная топливная шина. Она задействуется, если что-то случится с главной." + +#: gamelib/scenes/engine.py:112 +msgid "The sign says DANGER. You would be wise to listen to it." +msgstr "Знак гласит ОПАСНОСТЬ. Будет мудро прислушаться к нему." + +#: gamelib/scenes/engine.py:118 +#, fuzzy +msgid "" +"It's one of those glow-in-the-dark signs needed to satisfy the health and " +"safety inspectors." +msgstr "" +"Это один из тех светящихся в темноте знаков выхода, которые вы видите " +"повсюду." + +#: gamelib/scenes/engine.py:131 +#, python-format +msgid "" +"The engines are now operational. You havedone a satisfactory job, Prisoner " +"%s." +msgstr "" +"Двигатели теперь работоспособны. Вы проделали удовлетворительную работу, " +"Заключённый %s." + +#: gamelib/scenes/engine.py:139 +msgid "" +"With your improvised helmet, the automatic airlock allows you into the " +"engine room. Even if there wasn't a vacuum it would be eerily quiet." +msgstr "" +"С вашим импровизированным шлемом, автоматический шлюз допускает вас в " +"двигательный отсек. Даже если бы здесь не было вакуума, тишина бы была " +"жуткой." + +#: gamelib/scenes/engine.py:155 +msgid "All systems are go! Or at least the engines are." +msgstr "Все системы приведены в действие! Ну, по крайней мере, двигатели." + +#: gamelib/scenes/engine.py:173 +msgid "A can opener. Looks like you won't be starving" +msgstr "Открывашка для консервов. Похоже, вы не умрёте с голоду" + +#: gamelib/scenes/engine.py:178 +msgid "" +"You pick up the can opener. It looks brand new; the vacuum has kept it in " +"perfect condition." +msgstr "" +"Вы подбираете открывашку для консервов. Она выглядит совершенно новой; " +"вакуум сохранил её в отличном состоянии." + +#: gamelib/scenes/engine.py:200 +msgid "" +"That superconductor looks burned out. It's wedged in there pretty firmly." +msgstr "Сверхпроводник выглядит сгоревшим. Он впаян достаточно крепко." + +#: gamelib/scenes/engine.py:202 +msgid "An empty superconductor socket" +msgstr "Пустой разъём для сверхпроводника" + +#: gamelib/scenes/engine.py:204 +msgid "A working superconductor." +msgstr "Рабочий сверхпроводник." + +#: gamelib/scenes/engine.py:208 +msgid "It's wedged in there pretty firmly, it won't come out." +msgstr "Он впаян достаточно крепко и не вынимается." + +#: gamelib/scenes/engine.py:210 +msgid "" +"You decide that working engines are more important than having a shiny " +"superconductor." +msgstr "" +"Вы решаете, что иметь работающие двигатели важнее, чем сверкающий " +"сверхпроводник." + +#: gamelib/scenes/engine.py:216 +#, fuzzy +msgid "With leverage, the burned-out superconductor snaps out. You discard it." +msgstr "С помощью рычага, сгоревший сверхпроводник выскакивает." + +#: gamelib/scenes/engine.py:221 +msgid "It might help to remove the broken superconductor first" +msgstr "Возможно, стоит сначала вынуть сгоревший сверхпроводник" + +#: gamelib/scenes/engine.py:223 +msgid "" +"You plug in the superconductor, and feel a hum as things kick into life. " +"Unfortunately, it's the wrong size for the socket and just falls out again " +"when you let go." +msgstr "" +"Вы вставляете сверхпроводник и чувствуете вибрацию, когда вещи начинают " +"оживать. К сожалению, он не подходит к сокету по размеру и выпадает, когда " +"вы убираете руку." + +#: gamelib/scenes/engine.py:234 +msgid "" +"The chair's superconductor looks over-specced for this job, but it should " +"work." +msgstr "" +"Сверхпроводник от кресла кажется слишком специфичным для этой работы, но он " +"работает." + +#: gamelib/scenes/engine.py:239 +msgid "It might help to remove the broken superconductor first." +msgstr "Может стоит сначала удалить сгоревший сверхпроводник." + +#: gamelib/scenes/engine.py:258 +msgid "Those are coolant reservoirs. They look empty." +msgstr "Это резервуары для охладителя. Они пусты." + +#: gamelib/scenes/engine.py:259 +msgid "The coolant reservoirs are full." +msgstr "Резервуары наполнены охладителем." + +#: gamelib/scenes/engine.py:279 +msgid "The receptacles for the coolant reservoirs." +msgstr "Приёмники для резервуаров с охладителем." + +#: gamelib/scenes/engine.py:282 +msgid "You stick your finger in the receptacle. It almost gets stuck." +msgstr "Вы засовываете палец в приёмник. Он почти застревает." + +#: gamelib/scenes/engine.py:287 +msgid "" +"Pouring the precious cryo fluid into a container connected to a cracked pipe " +"would be a waste." +msgstr "" +"Вылить драгоценный охладитель в контейнер, соединённый с треснувшей трубой, " +"было бы расточительством." + +#: gamelib/scenes/engine.py:292 +msgid "" +"You fill the reservoirs. The detergent bottle was just big enough, which is " +"handy, because it's sprung a leak." +msgstr "" +"Вы наполняете резервуары. Бутылка очистителя оказалось достаточно большой, " +"что удобно, поскольку в ней обнаружилась течь." + +#: gamelib/scenes/engine.py:340 +msgid "These pipes carry coolant to the superconductors. They feel warm." +msgstr "Эти трубы подают охладитель к сверхпроводникам. Они тёплые." + +#: gamelib/scenes/engine.py:342 +msgid "These pipes carry coolant to the superconductors. They are very cold." +msgstr "Эти трубы подают охладитель к сверхпроводникам. Они очень холодные." + +#: gamelib/scenes/engine.py:368 +msgid "Power lines. They are delivering power to the engines." +msgstr "Шины питания. По ним подаётся питание на двигатели." + +#: gamelib/scenes/engine.py:369 +msgid "Power lines. It looks like they aren't working correctly." +msgstr "Шины питания. Похоже, они не работают." + +#: gamelib/scenes/engine.py:458 +msgid "" +"A gaping hole in the floor of the room. You're guessing that's why there's a " +"vacuum in here." +msgstr "Сквозная дыра в полу. Вы полагаете что это причина вакуума здесь." + +#: gamelib/scenes/engine.py:478 +msgid "The duct tape appears to be holding." +msgstr "Похоже, клейкая лента держится." + +#: gamelib/scenes/engine.py:480 +msgid "The pipe looks cracked and won't hold fluid until it's fixed." +msgstr "" +"В трубе трещина и она не сможет удерживать жидкость, пока её не починят." + +#: gamelib/scenes/engine.py:485 +msgid "The duct tape already there appears to be sufficient." +msgstr "На этом уже достаточно клейкой ленты." + +#: gamelib/scenes/engine.py:490 +msgid "You apply your trusty duct tape to the creak, sealing it." +msgstr "Вы заклеиваете разрыв вашей надёжной лентой, запечатывая его." + +#: gamelib/scenes/engine.py:510 +msgid "A computer console. It's alarmingly close to the engine." +msgstr "Компьютерная консоль. Она в опасной близости от двигателя." + +#: gamelib/scenes/engine.py:567 +msgid "The airlock leads back to the rest of the ship." +msgstr "Шлюз ведёт к оставшей части корабля." + +#: gamelib/scenes/machine.py:31 +msgid "Wires run to all the machines in the room" +msgstr "Провода идут ко всем приборам в этой комнате" + +#: gamelib/scenes/machine.py:51 +msgid "A wiring diagram of some sort" +msgstr "Диаграмма какого-то соединения проводов." + +#: gamelib/scenes/machine.py:54 +msgid "The cables to this power point have been cut" +msgstr "Кабели к этой точке питания были обрезаны" + +#: gamelib/scenes/machine.py:57 +msgid "All the machines run off this powerpoint" +msgstr "Все приборы птаются из этой точки" + +#: gamelib/scenes/machine.py:60 +msgid "An impressive looking laser drill press" +msgstr "Внушительно выглядящая лазерная дрель" + +#: gamelib/scenes/machine.py:73 +msgid "The block for the laser drill press" +msgstr "Блок для лазерной дрели" + +#: gamelib/scenes/machine.py:119 +msgid "You really don't want to put your hand in there." +msgstr "Вы точно не хотите класть туда свою руку." + +#: gamelib/scenes/machine.py:124 +msgid "There is already a can in the welder." +msgstr "В сварочной машине уже есть банка." + +#: gamelib/scenes/machine.py:128 +msgid "You carefully place the can in the laser welder." +msgstr "Вы осторожно кладёте банку в лазерную сварку." + +#: gamelib/scenes/machine.py:133 +msgid "There is already a tube fragment in the welder." +msgstr "В сварочной машине уже есть фрагмент трубы." + +#: gamelib/scenes/machine.py:137 +msgid "You carefully place the tube fragments in the laser welder." +msgstr "Вы осторожно кладёте фрагмент трубы в лазерную сварку." + +#: gamelib/scenes/machine.py:142 +msgid "This is a Smith and Wesson 'zOMG' class high-precision laser welder." +msgstr "" +"Это высокоточная лазерная сварочная машина Смита и Вессона класса 'zOMG'." + +#: gamelib/scenes/machine.py:144 +msgid "The laser welder looks hungry, somehow." +msgstr "Лазерная сварка выглядит какой-то голодной." + +#: gamelib/scenes/machine.py:146 +msgid " It currently contains an empty can." +msgstr " Сейчас она содержит пустую банку." + +#: gamelib/scenes/machine.py:148 +msgid " It currently contains a tube fragment." +msgstr " Сейчас она содержит фрагмент трубы." + +#: gamelib/scenes/machine.py:150 +msgid "The laser welder looks expectant. " +msgstr "Лазерная сварка выглядит выжидающей. " + +#: gamelib/scenes/machine.py:152 +msgid " It currently contains an empty can and a tube fragment." +msgstr " Сейчас она содержит пустую банку и фрагмент трубы." + +#: gamelib/scenes/machine.py:169 +msgid "The laser welder doesn't currently contain anything weldable." +msgstr "Лазерная сварка сейчас не содержит ничего, что можно сварить." + +#: gamelib/scenes/machine.py:172 +msgid "The laser welder needs something to weld the can to." +msgstr "Лазерной сварке нужно что-нибудь, к чему можно приварить банку." + +#: gamelib/scenes/machine.py:174 +msgid "The laser welder needs something to weld the tube fragments to." +msgstr "" +"Лазерной сварке нужно что-нибудь, к чему можно приварить фрагменты трубы." + +#: gamelib/scenes/machine.py:180 +msgid "" +"With high-precision spitzensparken, you weld together a second pipe. You " +"bundle the two pipes together." +msgstr "" +"С высокоточным искрением, вы свариваете вторую трубу. Вы кладёте обе трубы " +"вместе." + +#: gamelib/scenes/machine.py:185 +msgid "" +"With high-precision spitzensparken, you create yet another pipe. You store " +"it with the other two." +msgstr "" +"С высокоточным искрением, вы создаёте ещё одну трубу. Вы добавляете её к " +"первым двум." + +#: gamelib/scenes/machine.py:193 +msgid "" +"With high-precision spitzensparken, the can and tube are welded into a whole " +"greater than the sum of the parts." +msgstr "" +"С высокоточным искрением, банка и труба свариваются в целое, большее суммы " +"своих частей." + +#: gamelib/scenes/machine.py:209 +msgid "The power lights pulse expectantly." +msgstr "Огни питания выжидающе пульсируют." + +#: gamelib/scenes/machine.py:247 +msgid "" +"It looks like it eats fingers. Perhaps a different approach is in order?" +msgstr "Похоже, эта машина ест пальцы. Может нужен другой подход?" + +#: gamelib/scenes/machine.py:251 +msgid "" +"After much delicate grinding and a few close calls with various body parts, " +"the titanium femur now resembles a machete more than a bone. Nice and sharp, " +"too." +msgstr "" +"После достаточно затруднительной заточки, пару раз чуть не стоившей вам " +"некоторых частей тела, титановое бедро теперь больше напоминает мачете, чем " +"кость. Прелестное и острое." + +#: gamelib/scenes/machine.py:257 +msgid "A pretty ordinary, albeit rather industrial, grinding machine." +msgstr "Вполне обычная, хотя и вполне промышленная, шлифовальная машина." + +#: gamelib/scenes/machine.py:280 +msgid "" +"Ah! The ship's instruction manual. You'd feel better if the previous owner " +"wasn't lying next to it with a gaping hole in his rib cage." +msgstr "" +"Ах! Инструкция по обращению с кораблём. Вы бы почувствовали себя лучше, если " +"бы предыдущий владелец не лежал рядом с ней со сквозной дырой в грудной " +"клетке." + +#: gamelib/scenes/map.py:42 +msgid "" +"Under the terms of the emergency conscription act, I have downloaded the " +"ship's schematics to your neural implant to help you navigate around the " +"ship." +msgstr "" +"В соответствии с предписанием при чрезвычайных ситуациях, я загрузил схему " +"корабля в ваш невральный имплантант, чтобы помочь вам ориентироваться на " +"корабле." + +#: gamelib/scenes/map.py:47 +#, python-format +msgid "" +"Prisoner %s, you are a class 1 felon. Obtaining access to the ship's " +"schematics constitutes a level 2 offence and carries a minimal penalty of an " +"additional 3 years on your sentence." +msgstr "" +"Заключённый %s, вы нарушитель класса 1. Получение доступа к схемам корабля " +"является преступлением уровня 2 и карается как минимум 3 дополнительными " +"годами к вашему сроку." + +#: gamelib/scenes/map.py:129 +msgid "" +"The airlock refuses to open. The automated voice says: \"Hull breach beyond " +"this door. Personnel must be equipped for vacuum before entry.\"" +msgstr "" +"Шлюз не открывается. Голос автомата произносит: «За этой дверью повреждён " +"корпус. Перед входом персонал должен быть экипирован для вакуума.»" + +#: gamelib/scenes/map.py:184 +msgid "" +"You look in the door, but just see empty space: that room appears to have " +"been obliterated by meteors." +msgstr "" +"Вы смотрете в дверь, но видите только пустое пространство: эта комната была " +"уничтожена метеоритами." + +#: gamelib/scenes/map.py:201 +msgid "" +"Peering in through the window, you see that the entire chamber is overgrown " +"with giant broccoli. It would take you years to cut a path through that." +msgstr "" +"Взглянув в окно, вы видите, что вся комната заросла гигантской брокколи. Вам " +"потребуются годы, чтобы прорубить через неё дорогу." + +#: gamelib/scenes/mess.py:38 +msgid "A large collection of rusted, useless cans." +msgstr "Большая коллекция ржавых бесполезных банок." + +#: gamelib/scenes/mess.py:44 +msgid "An impressively overgrown broccoli." +msgstr "Впечатляюще разросшаяся брокколи." + +#: gamelib/scenes/mess.py:55 +msgid "" +"You bang the cans together. It sounds like two cans being banged together." +msgstr "" +"Вы стучите банками друг о друга. Звучит так, словно стучат двумя банками " +"друг о друга." + +#: gamelib/scenes/mess.py:64 +msgid "You'd mangle it beyond usefulness." +msgstr "Вы раскромсаете их так, что их невозможно будет использовать." + +#: gamelib/scenes/mess.py:70 +msgid "You open both ends of the can, discarding the hideous contents." +msgstr "Вы открываете оба конца банки, вытряхивая отвратительное содержимое." + +#: gamelib/scenes/mess.py:80 +msgid "Flattening the can doesn't look like a useful thing to do." +msgstr "Расплющивание банки не кажется полезным занятием." + +#: gamelib/scenes/mess.py:83 +msgid "There's nothing left to open on this can" +msgstr "На этой банке больше нечего открыть" + +#: gamelib/scenes/mess.py:96 +msgid "You club the can with the femur. The can gets dented, but doesn't open." +msgstr "Вы долбите банку бедром. Банка становится помятой, но не открывается." + +#: gamelib/scenes/mess.py:106 +msgid "" +"You club the can with the femur. The dents shift around, but it still " +"doesn't open." +msgstr "" +"Вы долбите банку бедром. Она вся покрывается вмятинами, но всё же не " +"открывается." + +#: gamelib/scenes/mess.py:137 +msgid "Best before a long time in the past. Better not eat these." +msgstr "Срок годности давно прошёл. Лучше не есть это." + +#: gamelib/scenes/mess.py:138 +msgid "Mmmm. Nutritious bacteria stew." +msgstr "Ммммм. Питательная тушёнка с бактериями." + +#: gamelib/scenes/mess.py:139 +msgid "Candied silkworms. Who stocked this place?!" +msgstr "Засахаренные черви. Кто снабжает это место?!" + +#: gamelib/scenes/mess.py:142 +msgid "The rest of the cans are rusted beyond usefulness." +msgstr "Оставшиеся банки слишком ржавые, чтобы их использовать." + +#: gamelib/scenes/mess.py:145 +msgid "The contents of these cans look synthetic." +msgstr "Содержимое этих банок кажется искусственным." + +#: gamelib/scenes/mess.py:167 +msgid "The broccoli seems to have become entangled with something." +msgstr "Похоже, брокколи что-то оплела." + +#: gamelib/scenes/mess.py:169 +msgid "These broken pipes look important." +msgstr "Эти сломанные трубы выглядят очень важными." + +#: gamelib/scenes/mess.py:171 +msgid "The pipes have been repaired but are the repairs aren't airtight, yet" +msgstr "Трубопровод починен, но всё ещё не герметичен" + +#: gamelib/scenes/mess.py:173 +msgid "Your fix looks like it's holding up well." +msgstr "Похоже, ваши заплатки хорошо держатся." + +#: gamelib/scenes/mess.py:179 +msgid "" +"With a flurry of disgusting mutant vegetable chunks, you clear the overgrown " +"broccoli away from the access panel and reveal some broken tubes. They look " +"important." +msgstr "" +"В туче отвратительных кусков мутировавшего овоща, вы расчищаете панель " +"доступа от брокколи-переростка, и освобождаете некоторые сломанные трубы. " +"Они выглядят важными." + +#: gamelib/scenes/mess.py:185 +msgid "It looks broken enough already." +msgstr "Они уже достаточно сломаны." + +#: gamelib/scenes/mess.py:187 +msgid "Cutting holes won't repair the leaks." +msgstr "Прорубание дыр не починит течи." + +#: gamelib/scenes/mess.py:189 +msgid "" +"After all that effort fixing it, chopping it to bits doesn't seem very smart." +msgstr "" +"После всего труда, затраченного на их восстановление, порубить их на кусочки " +"— не очень умный поступок." + +#: gamelib/scenes/mess.py:194 gamelib/scenes/mess.py:207 +msgid "It would get lost in the fronds." +msgstr "Это потеряется в зарослях." + +#: gamelib/scenes/mess.py:201 +msgid "" +"The pipes slot neatly into place, but don't make an airtight seal. One of " +"the pipes has cracked slightly as well." +msgstr "" +"Трубы с трудом вставляются на место и крепление не герметично. К тому же " +"одна из труб треснула." + +#: gamelib/scenes/mess.py:209 +msgid "There's quite enough tape on the ducting already." +msgstr "На трубопроводе уже вполне достаточно ленты." + +#: gamelib/scenes/mess.py:216 +msgid "" +"It takes quite a lot of tape, but eventually everything is airtight and " +"ready to hold pressure. Who'd've thought duct tape could actually be used to " +"tape ducts?" +msgstr "" +"На это уходит довольно много ленты, но в конце концов всё герметично и " +"способно выдержать давление. Кто бы мог подумать, что трубопроводная лента " +"может быть использована для обмотки труб?" + +#: gamelib/scenes/mess.py:222 +msgid "The mutant broccoli resists your best efforts." +msgstr "Мутировавшая брокколи сопротивляется вашим лучшим попыткам." + +#: gamelib/scenes/mess.py:224 +msgid "Shoving the broken pipes around doesn't help much." +msgstr "Расталкивание сломанных труб не очень поможет." + +#: gamelib/scenes/mess.py:226 +msgid "Do you really want to hold it together for the rest of the voyage?" +msgstr "Вы действительно хотите держать их вместе всю оставшуюся часть полёта?" + +#: gamelib/scenes/mess.py:229 +#, python-format +msgid "You don't find any leaks. Good job, Prisoner %s." +msgstr "Вы не находите никаких утечек. Отличная работа, Заключённый %s." + +#: gamelib/scenes/mess.py:288 +msgid "The remaining bottles leak." +msgstr "Оставшиеся бутылки протекают." + +#: gamelib/scenes/mess.py:292 +msgid "" +"You pick up an empty dishwashing liquid bottle. You can't find any sponges." +msgstr "" +"Вы подбираете пусую бутылку из-под чистящего средства. Вы не можете найти " +"губку." + +#: gamelib/scenes/mess.py:295 +msgid "Empty plastic containers. They used to hold dishwasher soap." +msgstr "" +"Пустые пластиковые контейнеры. В них хранилось средство для мытья посуды." + +#: gamelib/scenes/game_widgets.py:51 +msgid "A security camera watches over the room" +msgstr "Камера безопасности следит за комнатой" + +#: gamelib/scenes/game_widgets.py:53 +msgid "The security camera is currently offline but should be working soon" +msgstr "" + +#: gamelib/scenes/game_widgets.py:55 +#, fuzzy +msgid "The security camera is powered down" +msgstr "Камера безопасности следит за комнатой" + +#: gamelib/scenes/game_widgets.py:63 +msgid "" +"3D scene reconstruction failed. Critical error. Entering emergency shutdown." +msgstr "" +"Реконструция 3D-сцены не удалась. Критическая ошибка. Начинаю аварийное " +"отключение." + +#~ msgid "A control panel. It seems dead." +#~ msgstr "Панель управления. Похоже, она не работает." diff -r 0ce08d5e2acb -r 2f1952748cdb po/suspended-sentence.pot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/po/suspended-sentence.pot Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,950 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-08 14:36+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gamelib/widgets.py:175 +msgid "Quit Game" +msgstr "" + +#: gamelib/widgets.py:176 +msgid "Exit to Main Menu" +msgstr "" + +#: gamelib/gamescreen.py:146 +msgid "Close" +msgstr "" + +#: gamelib/gamescreen.py:218 +msgid "Menu" +msgstr "" + +#: gamelib/scenes/bridge.py:63 +msgid "The brightly coloured wires contrast with the drab walls." +msgstr "" + +#: gamelib/scenes/bridge.py:66 +msgid "\"Dammit JIM, I'm a doctor, not an engineer!\"" +msgstr "" + +#: gamelib/scenes/bridge.py:72 +msgid "A skeleton hangs improbably from the wires." +msgstr "" + +#: gamelib/scenes/bridge.py:117 +msgid "You can't break the duraplastic screen." +msgstr "" + +#: gamelib/scenes/bridge.py:120 +msgid "Scratching the screen won't help you." +msgstr "" + +#: gamelib/scenes/bridge.py:123 +msgid "The main bridge computer screen." +msgstr "" + +#: gamelib/scenes/bridge.py:146 +msgid "" +"A top of the line Massage-o-Matic Captain's Executive Command Chair. It's " +"massaging a skeleton." +msgstr "" + +#: gamelib/scenes/bridge.py:148 +msgid "The chair won't work any more, it has no power." +msgstr "" + +#: gamelib/scenes/bridge.py:197 +msgid "A stethoscope hangs from the neck of the skeleton." +msgstr "" + +#: gamelib/scenes/bridge.py:204 +msgid "" +"You pick up the stethoscope and verify that the doctor's heart has stopped. " +"Probably a while ago." +msgstr "" + +#: gamelib/scenes/bridge.py:225 +msgid "" +"You rip off a piece of duct tape and stick it on the superconductor. It " +"almost sticks to itself, but you successfully avoid disaster." +msgstr "" + +#: gamelib/scenes/bridge.py:245 +msgid "The superconductor module unclips easily." +msgstr "" + +#: gamelib/scenes/bridge.py:246 +#, python-format +msgid "" +"Prisoner %s. That chair you've destroyed was property of the ship's captain. " +"You will surely be punished." +msgstr "" + +#: gamelib/scenes/bridge.py:278 +msgid "The lights flash in interesting patterns." +msgstr "" + +#: gamelib/scenes/bridge.py:279 +msgid "The flashing lights don't mean anything to you." +msgstr "" + +#: gamelib/scenes/bridge.py:280 +msgid "The console lights flash and flicker." +msgstr "" + +#: gamelib/scenes/bridge.py:323 +msgid "The sign reads 'Warning: Authorized Techinicians Only'." +msgstr "" + +#: gamelib/scenes/bridge.py:329 +msgid "You are unable to open the panel with your bare hands." +msgstr "" + +#: gamelib/scenes/bridge.py:334 +msgid "You unplug various important-looking wires." +msgstr "" + +#: gamelib/scenes/bridge.py:343 +msgid "Using the machete, you lever the panel off." +msgstr "" + +#: gamelib/scenes/bridge.py:348 +msgid "You smash various delicate components with the machete." +msgstr "" + +#: gamelib/scenes/bridge.py:352 +msgid "You feel a shock from the panel." +msgstr "" + +#: gamelib/scenes/bridge.py:353 +#, python-format +msgid "" +"Prisoner %s. Please step away from the panel. You are not an authorized " +"technician." +msgstr "" + +#: gamelib/scenes/bridge.py:451 +msgid "You are not authorized to change the destination." +msgstr "" + +#: gamelib/scenes/bridge.py:453 +msgid "There's no good reason to choose to go to the penal colony." +msgstr "" + +#: gamelib/scenes/bridge.py:455 +msgid "" +"You could change the destination, but when JIM recovers, it'll just get " +"reset." +msgstr "" + +#: gamelib/scenes/bridge.py:457 +msgid "You change the destination." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:31 +msgid "The plant is doing surprisingly well for centuries of neglect" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:34 +msgid "A picture of a cat labelled 'Clementine'" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:73 +msgid "Duct tape. It'll stick to everything except ducts, apparently." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:75 +msgid "" +"The perfectly balanced door swings frictionlessly to and fro. What " +"craftsmanship!" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:77 +msgid "" +"The safe is locked. This might be an interesting challenge, if suitable " +"equipment can be found." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:82 +msgid "It's already unlocked. There's no more challenge." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:87 +msgid "" +"Even after centuries of neglect, the tumblers slide almost silently into " +"place. Turns out the combination was '1 2 3 4 5'. An idiot must keep his " +"luggage in here." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:91 +#, python-format +msgid "" +"Prisoner %s, you have been observed committing a felony violation. This will " +"go onto your permanent record, and your sentence may be extended by up to " +"twenty years." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:96 +msgid "Ah, a vintage Knoxx & Co. model QR3. Quaint, but reasonably secure." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:117 +msgid "" +"What's the point of lugging around a very dead fish and a kilogram or so of " +"sand?" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:122 +msgid "The fishbowl is useful, but its contents aren't." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:126 +msgid "This fishbowl looks exactly like an old science fiction space helmet." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:128 +msgid "An evicted dead fish and some sand lie forlornly on the table" +msgstr "" + +#: gamelib/scenes/crew_quarters.py:142 +msgid "" +"You duct tape the edges of the helmet. The seal is crude, but it will serve " +"as a workable helmet if needed." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:189 +msgid "This poster will go nicely on your bedroom wall." +msgstr "" + +#: gamelib/scenes/crew_quarters.py:192 +msgid "A paradoxical poster hangs below the security camera." +msgstr "" + +#: gamelib/scenes/cryo.py:53 +msgid "These pipes carry cooling fluid to the cryo units." +msgstr "" + +#: gamelib/scenes/cryo.py:64 +msgid "An empty cryo chamber." +msgstr "" + +#: gamelib/scenes/cryo.py:65 +msgid "Prisoner 81E4-C8900480E635. Embezzlement. 20 years." +msgstr "" + +#: gamelib/scenes/cryo.py:74 gamelib/scenes/cryo.py:93 +msgid "" +"A working cryo chamber. The frosted glass obscures the details of the " +"occupant." +msgstr "" + +#: gamelib/scenes/cryo.py:75 +msgid "Prisoner 9334-CE1EB0243BAB. Murder. 40 years." +msgstr "" + +#: gamelib/scenes/cryo.py:84 +msgid "A broken cryo chamber. The skeleton inside has been picked clean." +msgstr "" + +#: gamelib/scenes/cryo.py:85 +msgid "" +"Prisoner BFBC-8BF4C6B7492B. Importing illegal alien biomatter. 15 years." +msgstr "" + +#: gamelib/scenes/cryo.py:94 +msgid "Prisoner B520-99495B8C41CE. Copyright infringement. 60 years." +msgstr "" + +#: gamelib/scenes/cryo.py:101 +msgid "An empty cryo unit. Recently filled by you." +msgstr "" + +#: gamelib/scenes/cryo.py:102 +#, python-format +msgid "Prisoner %s. Safecracking, grand larceny. 30 years." +msgstr "" + +#: gamelib/scenes/cryo.py:109 gamelib/scenes/cryo.py:118 +msgid "An empty cryo unit." +msgstr "" + +#: gamelib/scenes/cryo.py:110 +msgid "Prisoner 83F1-CE32D3234749. Spamming. 5 years." +msgstr "" + +#: gamelib/scenes/cryo.py:119 +msgid "Prisoner A455-9DF9F43C43E5. Medical malpractice. 10 years." +msgstr "" + +#: gamelib/scenes/cryo.py:135 +#, python-format +msgid "" +"Greetings, Prisoner %s. I am the Judicial Incarceration Monitor. You have " +"been woken early under the terms of the emergency conscription act to assist " +"with repairs to the ship. Your behaviour during this time will be noted on " +"your record and will be relayed to prison officials when we reach the " +"destination. Please report to the bridge." +msgstr "" + +#: gamelib/scenes/cryo.py:165 +msgid "" +"It takes more effort than one would expect, but eventually the pipe is " +"separated from the wall." +msgstr "" + +#: gamelib/scenes/cryo.py:171 +#, python-format +msgid "" +"Prisoner %s. Vandalism is an offence punishable by a minimum of an " +"additional 6 months to your sentence." +msgstr "" + +#: gamelib/scenes/cryo.py:181 gamelib/scenes/cryo.py:211 +msgid "These pipes aren't attached to the wall very solidly." +msgstr "" + +#: gamelib/scenes/cryo.py:186 +msgid "These pipes carry cooling fluid to empty cryo units." +msgstr "" + +#: gamelib/scenes/cryo.py:187 +msgid "There used to be a pipe carrying cooling fluid here." +msgstr "" + +#: gamelib/scenes/cryo.py:204 +msgid "" +"These pipes carry fluid to the working cryo units. Chopping them down " +"doesn't seem sensible." +msgstr "" + +#: gamelib/scenes/cryo.py:214 +msgid "These pipes carry cooling fluid to the working cryo units." +msgstr "" + +#: gamelib/scenes/cryo.py:286 +msgid "" +"You hit the chamber that used to hold this very leg. Nothing happens as a " +"result." +msgstr "" + +#: gamelib/scenes/cryo.py:291 +msgid "A broken cryo chamber, with a poor unfortunate corpse inside." +msgstr "" + +#: gamelib/scenes/cryo.py:292 +msgid "A broken cryo chamber. The corpse inside is missing a leg." +msgstr "" + +#: gamelib/scenes/cryo.py:313 +msgid "You bang on the chamber with the titanium femur. Nothing much happens." +msgstr "" + +#: gamelib/scenes/cryo.py:314 +msgid "Hitting the cryo unit with the femur doesn't achieve anything." +msgstr "" + +#: gamelib/scenes/cryo.py:315 +msgid "You hit the chamber with the femur. Nothing happens." +msgstr "" + +#: gamelib/scenes/cryo.py:339 +msgid "" +"You wedge the titanium femur into the chain and twist. With a satisfying " +"*snap*, the chain breaks and the door opens." +msgstr "" + +#: gamelib/scenes/cryo.py:341 +msgid "" +"You bang on the door with the titanium femur. It makes a clanging sound." +msgstr "" + +#: gamelib/scenes/cryo.py:344 +msgid "You wave the femur in the doorway. Nothing happens." +msgstr "" + +#: gamelib/scenes/cryo.py:350 +msgid "" +"It moves slightly and then stops. A chain on the other side is preventing it " +"from opening completely." +msgstr "" + +#: gamelib/scenes/cryo.py:368 gamelib/scenes/game_widgets.py:26 +msgid "An open doorway leads to the rest of the ship." +msgstr "" + +#: gamelib/scenes/cryo.py:370 +msgid "" +"A rusty door. It can't open all the way because of a chain on the other side." +msgstr "" + +#: gamelib/scenes/cryo.py:372 +msgid "A rusty door. It is currently closed." +msgstr "" + +#: gamelib/scenes/cryo.py:393 +msgid "Hitting it with the leg accomplishes nothing." +msgstr "" + +#: gamelib/scenes/cryo.py:396 +msgid "A computer terminal, with some text on it." +msgstr "" + +#: gamelib/scenes/cryo.py:414 +msgid "" +"The skeletal occupant of this cryo unit has an artificial femur made of " +"titanium. You take it." +msgstr "" + +#: gamelib/scenes/cryo.py:417 +msgid "This femur looks synthetic." +msgstr "" + +#: gamelib/scenes/cryo.py:432 +msgid "The plaque is welded to the unit. You can't shift it." +msgstr "" + +#: gamelib/scenes/cryo.py:435 +msgid "'Prisoner 98CC-764E646391EE. War crimes. 45 years." +msgstr "" + +#: gamelib/scenes/cryo.py:459 +msgid "Coolant leaks disturbingly from the bulkheads." +msgstr "" + +#: gamelib/scenes/cryo.py:462 +msgid "It's gooey" +msgstr "" + +#: gamelib/scenes/cryo.py:468 +msgid "You scoop up some coolant and fill the bottle." +msgstr "" + +#: gamelib/scenes/engine.py:43 +msgid "Dead. Those cans must have been past their sell-by date." +msgstr "" + +#: gamelib/scenes/engine.py:50 +msgid "Superconductors. The engines must be power hogs." +msgstr "" + +#: gamelib/scenes/engine.py:58 +msgid "A gaping hole in the floor of the room. It is clearly irreparable." +msgstr "" + +#: gamelib/scenes/engine.py:68 +msgid "" +"Empty chocolate-covered bacon cans? Poor guy, he must have found them " +"irresistible." +msgstr "" + +#: gamelib/scenes/engine.py:74 +msgid "The engines. They don't look like they are working." +msgstr "" + +#: gamelib/scenes/engine.py:80 +msgid "" +"A burned-out laser cutter. It may be responsible for the hole in the floor." +msgstr "" + +#: gamelib/scenes/engine.py:86 +msgid "The main fuel line for the engines." +msgstr "" + +#: gamelib/scenes/engine.py:106 +msgid "" +"The spare fuel line. If something went wrong with the main one, you would " +"hook that one up." +msgstr "" + +#: gamelib/scenes/engine.py:112 +msgid "The sign says DANGER. You would be wise to listen to it." +msgstr "" + +#: gamelib/scenes/engine.py:118 +msgid "" +"It's one of those glow-in-the-dark signs needed to satisfy the health and " +"safety inspectors." +msgstr "" + +#: gamelib/scenes/engine.py:131 +#, python-format +msgid "" +"The engines are now operational. You havedone a satisfactory job, Prisoner " +"%s." +msgstr "" + +#: gamelib/scenes/engine.py:139 +msgid "" +"With your improvised helmet, the automatic airlock allows you into the " +"engine room. Even if there wasn't a vacuum it would be eerily quiet." +msgstr "" + +#: gamelib/scenes/engine.py:155 +msgid "All systems are go! Or at least the engines are." +msgstr "" + +#: gamelib/scenes/engine.py:173 +msgid "A can opener. Looks like you won't be starving" +msgstr "" + +#: gamelib/scenes/engine.py:178 +msgid "" +"You pick up the can opener. It looks brand new; the vacuum has kept it in " +"perfect condition." +msgstr "" + +#: gamelib/scenes/engine.py:200 +msgid "" +"That superconductor looks burned out. It's wedged in there pretty firmly." +msgstr "" + +#: gamelib/scenes/engine.py:202 +msgid "An empty superconductor socket" +msgstr "" + +#: gamelib/scenes/engine.py:204 +msgid "A working superconductor." +msgstr "" + +#: gamelib/scenes/engine.py:208 +msgid "It's wedged in there pretty firmly, it won't come out." +msgstr "" + +#: gamelib/scenes/engine.py:210 +msgid "" +"You decide that working engines are more important than having a shiny " +"superconductor." +msgstr "" + +#: gamelib/scenes/engine.py:216 +msgid "With leverage, the burned-out superconductor snaps out. You discard it." +msgstr "" + +#: gamelib/scenes/engine.py:221 +msgid "It might help to remove the broken superconductor first" +msgstr "" + +#: gamelib/scenes/engine.py:223 +msgid "" +"You plug in the superconductor, and feel a hum as things kick into life. " +"Unfortunately, it's the wrong size for the socket and just falls out again " +"when you let go." +msgstr "" + +#: gamelib/scenes/engine.py:234 +msgid "" +"The chair's superconductor looks over-specced for this job, but it should " +"work." +msgstr "" + +#: gamelib/scenes/engine.py:239 +msgid "It might help to remove the broken superconductor first." +msgstr "" + +#: gamelib/scenes/engine.py:258 +msgid "Those are coolant reservoirs. They look empty." +msgstr "" + +#: gamelib/scenes/engine.py:259 +msgid "The coolant reservoirs are full." +msgstr "" + +#: gamelib/scenes/engine.py:279 +msgid "The receptacles for the coolant reservoirs." +msgstr "" + +#: gamelib/scenes/engine.py:282 +msgid "You stick your finger in the receptacle. It almost gets stuck." +msgstr "" + +#: gamelib/scenes/engine.py:287 +msgid "" +"Pouring the precious cryo fluid into a container connected to a cracked pipe " +"would be a waste." +msgstr "" + +#: gamelib/scenes/engine.py:292 +msgid "" +"You fill the reservoirs. The detergent bottle was just big enough, which is " +"handy, because it's sprung a leak." +msgstr "" + +#: gamelib/scenes/engine.py:340 +msgid "These pipes carry coolant to the superconductors. They feel warm." +msgstr "" + +#: gamelib/scenes/engine.py:342 +msgid "These pipes carry coolant to the superconductors. They are very cold." +msgstr "" + +#: gamelib/scenes/engine.py:368 +msgid "Power lines. They are delivering power to the engines." +msgstr "" + +#: gamelib/scenes/engine.py:369 +msgid "Power lines. It looks like they aren't working correctly." +msgstr "" + +#: gamelib/scenes/engine.py:458 +msgid "" +"A gaping hole in the floor of the room. You're guessing that's why there's a " +"vacuum in here." +msgstr "" + +#: gamelib/scenes/engine.py:478 +msgid "The duct tape appears to be holding." +msgstr "" + +#: gamelib/scenes/engine.py:480 +msgid "The pipe looks cracked and won't hold fluid until it's fixed." +msgstr "" + +#: gamelib/scenes/engine.py:485 +msgid "The duct tape already there appears to be sufficient." +msgstr "" + +#: gamelib/scenes/engine.py:490 +msgid "You apply your trusty duct tape to the creak, sealing it." +msgstr "" + +#: gamelib/scenes/engine.py:510 +msgid "A computer console. It's alarmingly close to the engine." +msgstr "" + +#: gamelib/scenes/engine.py:567 +msgid "The airlock leads back to the rest of the ship." +msgstr "" + +#: gamelib/scenes/machine.py:31 +msgid "Wires run to all the machines in the room" +msgstr "" + +#: gamelib/scenes/machine.py:51 +msgid "A wiring diagram of some sort" +msgstr "" + +#: gamelib/scenes/machine.py:54 +msgid "The cables to this power point have been cut" +msgstr "" + +#: gamelib/scenes/machine.py:57 +msgid "All the machines run off this powerpoint" +msgstr "" + +#: gamelib/scenes/machine.py:60 +msgid "An impressive looking laser drill press" +msgstr "" + +#: gamelib/scenes/machine.py:73 +msgid "The block for the laser drill press" +msgstr "" + +#: gamelib/scenes/machine.py:119 +msgid "You really don't want to put your hand in there." +msgstr "" + +#: gamelib/scenes/machine.py:124 +msgid "There is already a can in the welder." +msgstr "" + +#: gamelib/scenes/machine.py:128 +msgid "You carefully place the can in the laser welder." +msgstr "" + +#: gamelib/scenes/machine.py:133 +msgid "There is already a tube fragment in the welder." +msgstr "" + +#: gamelib/scenes/machine.py:137 +msgid "You carefully place the tube fragments in the laser welder." +msgstr "" + +#: gamelib/scenes/machine.py:142 +msgid "This is a Smith and Wesson 'zOMG' class high-precision laser welder." +msgstr "" + +#: gamelib/scenes/machine.py:144 +msgid "The laser welder looks hungry, somehow." +msgstr "" + +#: gamelib/scenes/machine.py:146 +msgid " It currently contains an empty can." +msgstr "" + +#: gamelib/scenes/machine.py:148 +msgid " It currently contains a tube fragment." +msgstr "" + +#: gamelib/scenes/machine.py:150 +msgid "The laser welder looks expectant. " +msgstr "" + +#: gamelib/scenes/machine.py:152 +msgid " It currently contains an empty can and a tube fragment." +msgstr "" + +#: gamelib/scenes/machine.py:169 +msgid "The laser welder doesn't currently contain anything weldable." +msgstr "" + +#: gamelib/scenes/machine.py:172 +msgid "The laser welder needs something to weld the can to." +msgstr "" + +#: gamelib/scenes/machine.py:174 +msgid "The laser welder needs something to weld the tube fragments to." +msgstr "" + +#: gamelib/scenes/machine.py:180 +msgid "" +"With high-precision spitzensparken, you weld together a second pipe. You " +"bundle the two pipes together." +msgstr "" + +#: gamelib/scenes/machine.py:185 +msgid "" +"With high-precision spitzensparken, you create yet another pipe. You store " +"it with the other two." +msgstr "" + +#: gamelib/scenes/machine.py:193 +msgid "" +"With high-precision spitzensparken, the can and tube are welded into a whole " +"greater than the sum of the parts." +msgstr "" + +#: gamelib/scenes/machine.py:209 +msgid "The power lights pulse expectantly." +msgstr "" + +#: gamelib/scenes/machine.py:247 +msgid "" +"It looks like it eats fingers. Perhaps a different approach is in order?" +msgstr "" + +#: gamelib/scenes/machine.py:251 +msgid "" +"After much delicate grinding and a few close calls with various body parts, " +"the titanium femur now resembles a machete more than a bone. Nice and sharp, " +"too." +msgstr "" + +#: gamelib/scenes/machine.py:257 +msgid "A pretty ordinary, albeit rather industrial, grinding machine." +msgstr "" + +#: gamelib/scenes/machine.py:280 +msgid "" +"Ah! The ship's instruction manual. You'd feel better if the previous owner " +"wasn't lying next to it with a gaping hole in his rib cage." +msgstr "" + +#: gamelib/scenes/map.py:42 +msgid "" +"Under the terms of the emergency conscription act, I have downloaded the " +"ship's schematics to your neural implant to help you navigate around the " +"ship." +msgstr "" + +#: gamelib/scenes/map.py:47 +#, python-format +msgid "" +"Prisoner %s, you are a class 1 felon. Obtaining access to the ship's " +"schematics constitutes a level 2 offence and carries a minimal penalty of an " +"additional 3 years on your sentence." +msgstr "" + +#: gamelib/scenes/map.py:129 +msgid "" +"The airlock refuses to open. The automated voice says: \"Hull breach beyond " +"this door. Personnel must be equipped for vacuum before entry.\"" +msgstr "" + +#: gamelib/scenes/map.py:184 +msgid "" +"You look in the door, but just see empty space: that room appears to have " +"been obliterated by meteors." +msgstr "" + +#: gamelib/scenes/map.py:201 +msgid "" +"Peering in through the window, you see that the entire chamber is overgrown " +"with giant broccoli. It would take you years to cut a path through that." +msgstr "" + +#: gamelib/scenes/mess.py:38 +msgid "A large collection of rusted, useless cans." +msgstr "" + +#: gamelib/scenes/mess.py:44 +msgid "An impressively overgrown broccoli." +msgstr "" + +#: gamelib/scenes/mess.py:55 +msgid "" +"You bang the cans together. It sounds like two cans being banged together." +msgstr "" + +#: gamelib/scenes/mess.py:64 +msgid "You'd mangle it beyond usefulness." +msgstr "" + +#: gamelib/scenes/mess.py:70 +msgid "You open both ends of the can, discarding the hideous contents." +msgstr "" + +#: gamelib/scenes/mess.py:80 +msgid "Flattening the can doesn't look like a useful thing to do." +msgstr "" + +#: gamelib/scenes/mess.py:83 +msgid "There's nothing left to open on this can" +msgstr "" + +#: gamelib/scenes/mess.py:96 +msgid "You club the can with the femur. The can gets dented, but doesn't open." +msgstr "" + +#: gamelib/scenes/mess.py:106 +msgid "" +"You club the can with the femur. The dents shift around, but it still " +"doesn't open." +msgstr "" + +#: gamelib/scenes/mess.py:137 +msgid "Best before a long time in the past. Better not eat these." +msgstr "" + +#: gamelib/scenes/mess.py:138 +msgid "Mmmm. Nutritious bacteria stew." +msgstr "" + +#: gamelib/scenes/mess.py:139 +msgid "Candied silkworms. Who stocked this place?!" +msgstr "" + +#: gamelib/scenes/mess.py:142 +msgid "The rest of the cans are rusted beyond usefulness." +msgstr "" + +#: gamelib/scenes/mess.py:145 +msgid "The contents of these cans look synthetic." +msgstr "" + +#: gamelib/scenes/mess.py:167 +msgid "The broccoli seems to have become entangled with something." +msgstr "" + +#: gamelib/scenes/mess.py:169 +msgid "These broken pipes look important." +msgstr "" + +#: gamelib/scenes/mess.py:171 +msgid "The pipes have been repaired but are the repairs aren't airtight, yet" +msgstr "" + +#: gamelib/scenes/mess.py:173 +msgid "Your fix looks like it's holding up well." +msgstr "" + +#: gamelib/scenes/mess.py:179 +msgid "" +"With a flurry of disgusting mutant vegetable chunks, you clear the overgrown " +"broccoli away from the access panel and reveal some broken tubes. They look " +"important." +msgstr "" + +#: gamelib/scenes/mess.py:185 +msgid "It looks broken enough already." +msgstr "" + +#: gamelib/scenes/mess.py:187 +msgid "Cutting holes won't repair the leaks." +msgstr "" + +#: gamelib/scenes/mess.py:189 +msgid "" +"After all that effort fixing it, chopping it to bits doesn't seem very smart." +msgstr "" + +#: gamelib/scenes/mess.py:194 gamelib/scenes/mess.py:207 +msgid "It would get lost in the fronds." +msgstr "" + +#: gamelib/scenes/mess.py:201 +msgid "" +"The pipes slot neatly into place, but don't make an airtight seal. One of " +"the pipes has cracked slightly as well." +msgstr "" + +#: gamelib/scenes/mess.py:209 +msgid "There's quite enough tape on the ducting already." +msgstr "" + +#: gamelib/scenes/mess.py:216 +msgid "" +"It takes quite a lot of tape, but eventually everything is airtight and " +"ready to hold pressure. Who'd've thought duct tape could actually be used to " +"tape ducts?" +msgstr "" + +#: gamelib/scenes/mess.py:222 +msgid "The mutant broccoli resists your best efforts." +msgstr "" + +#: gamelib/scenes/mess.py:224 +msgid "Shoving the broken pipes around doesn't help much." +msgstr "" + +#: gamelib/scenes/mess.py:226 +msgid "Do you really want to hold it together for the rest of the voyage?" +msgstr "" + +#: gamelib/scenes/mess.py:229 +#, python-format +msgid "You don't find any leaks. Good job, Prisoner %s." +msgstr "" + +#: gamelib/scenes/mess.py:288 +msgid "The remaining bottles leak." +msgstr "" + +#: gamelib/scenes/mess.py:292 +msgid "" +"You pick up an empty dishwashing liquid bottle. You can't find any sponges." +msgstr "" + +#: gamelib/scenes/mess.py:295 +msgid "Empty plastic containers. They used to hold dishwasher soap." +msgstr "" + +#: gamelib/scenes/game_widgets.py:51 +msgid "A security camera watches over the room" +msgstr "" + +#: gamelib/scenes/game_widgets.py:53 +msgid "The security camera is currently offline but should be working soon" +msgstr "" + +#: gamelib/scenes/game_widgets.py:55 +msgid "The security camera is powered down" +msgstr "" + +#: gamelib/scenes/game_widgets.py:63 +msgid "" +"3D scene reconstruction failed. Critical error. Entering emergency shutdown." +msgstr "" diff -r 0ce08d5e2acb -r 2f1952748cdb update-po.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/update-po.sh Tue Mar 08 14:37:43 2011 +0200 @@ -0,0 +1,9 @@ +#!/bin/sh + +# Updates translation catalogs + +xgettext -f po/POTFILES -o po/suspended-sentence.pot + +for f in po/*.po; do + msgmerge -U $f po/suspended-sentence.pot; +done