Spielplatz 02

#! /usr/bin/env ruby
# encoding: UTF-8

# iolate.rb:
#
#   Version 2.8.2
#
# Extract the translateable text from 
# the dokwiki-file cpage.dkw to the Textfile 
# transfertext.utf8 and after translation
# reinsert it
#  
#  Copyright  04.03.2023
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
 
# == syntax 
#
# iolate.rb [-i inputfilename] 
#           [-o throughputfilename] 
#           [-c separation character]
#           [-k]
#           [-v] 
#           [-h] 
#
# -i 
#  name of the file in dokuwiki-syntax. If none is given, 
#  cpage.dkw is assumed
#
# -o 
#  Name of the text file which contains the text in dokuwiki-syntax.
#  If none is given transfertext.utf8 is assumed
#
# -c 
#  Character to seperate languages in transfertext.utf8
#  from oneanother. The default is ~. You may need this option,
#  if a ~ is naturally occuring in the text
#
# -k
#  Keep tags in the outputfile transfertext.utf8
#
# -e 
#  ignore empty lines
#
# -v
#  verbose
#
# -h
#  show help
#

# == file formats
#
# cpage.dkw
# has to be formated according to https://comicslate.org/en/wiki/12balloons
# Only the text in text boxes between the the first tag pair
# {{cotan>...}} ... {{<cotan}} is extractet into transfertext.utf8,
# text boxes  before or after this are left unchanged
# The first ... here represents a Filename which must not contain }}  
# The second ... represents the string which is searched for translateable text
# which must not itself contain {{<cotan}}.
# Only text in textboxs is extraxted i.e. the line before the text must
# start with an @ wich is followed by at least four 
# comma seperated integeres, e.g. @37,25,419,112 
# After the text there has to be a line containing exactly one ~ character
# at the start of the line, marking the end of the texbox
# The following holds true für the translated file  cpage.dkw
# All <...> tags are removed from the result of the second run 
# All [...] tags which are not at the start of the first line, 
#           are removed from the result of the second run
# All -. are removed
# All linefeeds and carriage returns are removed
# The removing of <...> and [...] tags can be suppressed with -k
# This file is than also used as output to store the data
# between passes in yaml format.  
#
# cpages.yaml
# stores all the data of the file cpages.dkw except for the text which 
# has to be translated
#
# transfertext.utf8
# In the extracted text all text from one textbox is concatenatet into 
# one line, seperated by a space. The text of all textboxes 
# is concatenated seperated by one LF character per box.
# This output file is used as input in the second pass.
# The translated text has to concur to the same specification
# in order to be used for the construction of cpages1.dkw
#
# cpages1.dkw
# The recreated file containing the markup from  cpage.dkw and the text
# from transfertext.utf8

# == usage in context
#
# 0. It is assumed that you have the current version of 
#    the ruby interpreter installed as well as the gems 
#    listed under "dependecies". Copy this script into 
#    a directory on your computer. All further file handling
#    is assumed to take place there
# 
# 1. copy the content of the strip you want to translate 
#    or at least {{cotan>...}}, {{<cotan}} and what is between them 
#    into the file called cpage.dkw in the directory where
#    the executable file iolate.rb is located
#
# 2. execute, e.g call ruby iolate.rb
# 
# 3. open the file transfertext.utf8 and copy its contense 
#    into the input field of a translation service or programm
#    like Deepl.com or lingvanex.com
# 
# 4. translate
#
# 5. overcopy the text in transfertext.utf8 with 
#    the translation and save the file
# 
# 6. execute iolate.rb again
#
# 7. cpages1.dkw should now contain the translation
#    inserted into the dokuwiki
#

# == Ho to do many translations at the same time
#
# 1. proceed as described above for the first translation 
#    up to step 5
# 
# 2. start the line imediately after the first translation
#    with the languge seperation character and the letter code
#    for the next language
#
# 3. do the same with alls the languages, you want to 
#    insert translations for, i.e loop through the steps
#    4 und 5 above, until you are done
# 
# 4  continue with step 6. above
#
# 7. there should now be a cpages1.dkw file for every 
#    language for which you inserted into the dokuwiki


# == todo
#
# 1. add a loop and REST-api combatibility 
#    to this script, to translate whole comics at once
#

# == constants
#
NEWLINECHAR = "\n" # EOL standard char to indicate end of line
SYSLIMITFILENAME = 255 # maximal length of a file name for ext4
# one of these letters after a ~ gives an outputfilename with the corresponding language name
COUNTRYLETTERS = [ ["b", "Brazilian"], ["l", "Bulgarian"], ["c", "Chinese"], ["d", "Danish"], ["f", "French"], ["g", "German"], ["h", "Hungarian"], ["p", "Portuguese"], ["j", "Japanese"], ["k", "Ukrainian"], ["r", "Russian"], ["s", "Spanish"], ["t", "Turkish"], ["u", "Finnish"], ["o", "Polish"]  ]
DEFAULTLANGUAGELETTER = "g" # translations without an indicating letter are considered to be German
# DEFAULTLANGUAGELETTER = "f" # translations without an indicating letter are considered to be French

# == dependecies

# class for handling filenames, pathnames, etc. 
begin
  require 'pathname' 
rescue Exception
  STDERR.puts "warnung: require of pathname failed." 
end

# class for parsing commandline options
begin
  require 'optparse' 
rescue Exception
  STDERR.puts "warnung: require of optparse failed." 
  # exit 1 # nonfatal if no options are given, so cross your fingers
end

# class for serialization
begin
  require 'yaml' 
rescue Exception
  STDERR.puts "warnung: require of yaml failed." 
  exit 1
end

# == methods
#
# to keep in line with a functional approch which might be easier 
# to port to javascript with opal, we make no use of oo,
# but use the methods of this object as functions

# remove everything between sBeginChar 
# und sEndChar including those characters
# allover sStr and return sStr
def removebetween(sStr, sBeginChar="<", sEndChar=">")
  iBegin = sStr.index(sBeginChar)
  while not iBegin.nil?
     iEnd =  sStr.index(sEndChar, iBegin + 1)
     if iEnd.nil?
       return sStr 
     else
       sStr.slice!(iBegin, iEnd - iBegin + 1)
       iBegin = sStr.index(sBeginChar)
     end
  end
return sStr 
end

# returns true if a string represents an integer
def is_i?(sMayBeInteger)
  /\A[-+]?\d+\z/ === sMayBeInteger
end

def is_number? string
  true if Float(string) rescue false
end

# remove dokuwikiformatting
def removedwformating(sStr)
  adokuwikiSubs = Array.new([["\\\\", ""]]) # remove \\ wich are used, to force linebreaks in the dokuwiki syntax
  adokuwikiSubs <<  (["-.", ""]) # remove -. wich is used for optional hyphenation
  ggsub sStr, adokuwikiSubs
end

# like gsub!, but takes an array as the second argument
def ggsub(sStr, aSubs)
  aSubs.each { |as|
    sStr.gsub!(as[0], as[1])
  }
  return sStr
end

# returns true, if the string sLine is the first line of a text or mask box
def isBoxStart(sLine)
  unless sLine.start_with? "@" # has to start with @
    return false
  end
  asLine = sLine[1...-1].rstrip.split "," # get rid of the @ and slit the rest of the line into coordinates, if it is a box
  unless asLine.length > 3 # al leas four coordinates
    return false
  end
  unless is_number?(asLine[0]) # each coordinate has to be a float, testing the first
    return false
  end
  unless is_number?(asLine[1]) # each coordinate has to be a float, testing the second
    return false
  end
  unless is_number?(asLine[2]) # each coordinate has to be a float, testing the third
    return false
  end
  unless is_number?(asLine[3][0]) # TODO not a complete test yet, some non textboxes might fulfill this and slip through
    return false
  end
  return true
end

# returns true, if the string sLine is the first line of a text box
def isTextBoxStart(sLine, sNextLine)
  unless sNextLine.nil? # there is something ahead, i.e. a second line
    if isBoxStart(sLine)
      unless sNextLine.chr == "#" # no mask 
        return true
      end
    end
  end
  return false
end

# splits a filename into extension and the part before
# unlike File.extname the dot is returned as part of the extension,
# so if the filename ends in a dot, this dot is returned as the extension
# Returns an array, where the second entry is the 
# extension with the dot or an empty string and 
# the first entry is what remains from the filename
def splitbasename(sFilename)
  iDotPos = sFilename.rindex(".") # position of rightmost dot
  aF = Array.new
  if iDotPos.nil? # no extension
    aF << sFilename
    aF << ""
  else
    aF << sFilename[0...iDotPos]
    aF << sFilename[iDotPos..-1]
  end
  return aF
end

# shortens the basename, until it is of legal length
def shortentolegallength(sFilename)
if SYSLIMITFILENAME < 3
  STDERR.puts "Error: file system doesn't support long filenames."
  exit 1 # not your usual file system
end
aFilename = File.split(sFilename) # 
il = aFilename[1].length
aB = splitbasename(aFilename[1]) # field of two elements for the extension and the stuff before it
if il > SYSLIMITFILENAME # too long
  iDif = il - SYSLIMITFILENAME
  if aB[0].length > iDif # we want to keep at least one letter, to avoid producing dot files
    aB[0] = aB[0...-iDif]
  else 
    iresttocut = iDif - aB[0].length + 1
    aB[0] = aB[0].chr # keep one letter
    aB[1] = aB[0...-iresttocut] # additionally shorten the extension
  end 
end
return aFilename[0] + File::SEPARATOR + aB[0] + aB[1]
end

# gives the name of a language given by a letter
def languagefromletter(slchar)
  ael = COUNTRYLETTERS.select {|schar| schar[0] == slchar } 
  if ael.nil?
    return nil
  else  
    return ael[0][1]
  end
end

# gives the phrase memory of a language given by the language's letter
def phrasememoryfromletter(slchar, asPhrasesTT)
  slanguage = languagefromletter(slchar)
  if slanguage.nil?
    return nil
  else
    return phrasememoryfromname(slanguage, asPhrasesTT)
  end
end

# gives the phrase memory of a language given by the language's name in English
# asPhrasesTT is a field containing an arbitrary number of subfields,
# where the first entry  is a language name and the second the phrase in this language
def phrasememoryfromname(slanguage, asPhrasesTT)
  slPhrases = asPhrasesTT.select { |slPhr| slanguage == slPhr[0] }
  return slPhrases[0] # return the first found phrase in this language
end

# remove the last lines if they are empty
def removeterminatingemptylines(stranslation)
  iemptylinepos = stranslation.rindex("\n\n") # position of the last empty lines
  if ! iemptylinepos.nil? # an empty line has been found
    while iemptylinepos == stranslation.length - 2 # do this loop as lon as the last line is empty
      stranslation.slice!(stranslation.length - 2, stranslation.length) # TODO why does stranslation.slice!(-2, -1) not work
      # stranslation.slice! (-2) , -1 # TODO (-2) instead of -2 in order to avoid the warnung of ambigous syntax, but still does not work
      iemptylinepos = stranslation.rindex("\n\n") # position of the last empty line, if there still is one
    end 
  end
  return stranslation
end

# if the string contains an empty line, remove it and everything before it
# if there are more than one empty line, only the last of them is relevant
def removebeforeemptyline(stranslation)
  iemptylinepos = stranslation.rindex("\n\n") # position of the last empty lines
  stranslation.slice! 0, iemptylinepos + 2 unless iemptylinepos.nil? # TODO why do we have 2 here instead of 1?
  return stranslation
end

# returns true, if there is an empty line after a separater character
def emptylineintranslation(stranslation, sSeparaterChar)
  iSepCharpos = stranslation.index(sSeparaterChar) # position of the first separater character
  if iSepCharpos.nil?
    return false
  else 
    iemptylinepos = stranslation.rindex("\n\n") # position of the last empty lines
    if iemptylinepos.nil?
      return false
    else
      if iemptylinepos > iSepCharpos 
        return true
      else
        return false
      end
    end  
  end
end

# == main
#
# This contains all the phrases wich are always translated, regardless of where they appear eg. headers
# the translation can be provided in the DATA-section at the end of this file and is read from there
# here we prepare the field used to contain all the translations of the phrases for each language
asPhrasesToTranslate = COUNTRYLETTERS.map { |sla| [ sla[1] ] } # an array with an array for each language, containing as its only element the name of the language 
sOrig = "" # outside of the loop to be persistent between runs
# reading the phrases from the data section
DATA.each_line do |sDATAline| # read the phrases from the DATA section
# the space "\x85" can not be removed, because it doesn't exist in UTF-8 encoding l = "\x85".force_encoding("ASCII-8BIT") l.encode("UTF-8")
# the non breaking space 160.chr can not be removed, because it doesn't exist in UTF-8 encoding
  sDATAlinestripped = sDATAline[0..-2].gsub(" ", "").gsub(9.chr.encode("UTF-8"), "").strip # remove certain whitespaces and others at the beginning and the end
  if ! (sDATAlinestripped.empty? || sDATAlinestripped[0..1] == "##") # ignore lines wich only contain certain whitespaces or which start with ##, maybe after some whitespaces 
    sLangChar = sDATAline.chr # the first character indicates the language, cf. COUNTRYLETTERS
    if sLangChar == "#" # ignore comments 
      # nothing to do here
    elsif sLangChar == "=" # origin's language, e.g. englisch, so safe the phrase in the origin's language into sOrig
      sOrig = sDATAline[2..-2] # skip first two characters (i.e. indicating character and space) and the last (i.e the newline)
    else
      ap = phrasememoryfromletter(sLangChar, asPhrasesToTranslate) # get the subfield for this language from asPhrasesToTranslate 
      if not ap.nil? # if there is a subfield for this language's letter, add a subsubfield to it, containing the phrase in the original language and this language
        if sDATAline.length > 3 # ignore empty translation lines
          ap << [sOrig, sDATAline[2..-2]] # build a field with the phrase in the original language in the first entry and the translation in the second entry
        end
      end
    end
  end
end
# parse the command ĺine
options = {:verbose => nil, :dokuinfilename => "cpage.dkw", :textoutputfilename => "transfertext.utf8", :sepcharacter => "~", :fkeep => false, :fkeepempty => false} # default values go here
opt_parser = OptionParser.new do |opts|
  opts.banner = "Usage: ocr-latest-png.rb [-i dokuinfilename] [-o textoutputfilename] [-c separationcharacter] [-k] [-v] [-h]" 
  opts.on("-i filename", "--inputfile", "name of the dokuwiki file from which to extract translateable text. The default is cpages.dkw.") do |anopt|
    options[:dokuinfilename] = anopt
  end
  opts.on("-o filename", "--outputtext", "name of the text file to which translateable text is written. The default istransfertext.utf8.") do |anopt|
    options[:textoutputfilename] = anopt
  end
  opts.on("-c separationcharacter", "--separationcharacter", "the charcter used to seperate different languages in transfertext.utf8. The default is ~.") do |anopt|
    options[:sepcharacter] = anopt
  end
    opts.on("-k filename", "--keeptags", "do not atempt to delete all tags. The default is to delete them.") do |anopt|
    options[:fkeep] = anopt
  end
    opts.on("-e keepemty", "--keepemtyline", "do not delete empty lines at the end and do not delete the first empty line and everything before it. Default is do delete") do |anopt|
    options[:fkeepempty] = anopt
  end
  opts.on("-v", "--[no-]verbose", "show comments") do |anopt| 
    options[:verbose] = anopt
  end  
  opts.on("-h", "--help", "show this help.") do
    puts opts
    exit
  end
end
begin
  opt_parser.parse!
rescue OptionParser::InvalidOption
  STDERR.puts "\nunknown option"
  STDERR.puts "in line" + __LINE__ # the current line number in the source file.
  STDERR.puts $! # error message
  STDERR.puts $@ # error position
  raise
end
# set verbosity flag
if ! options[:verbose].nil?
  $ivc = 0
else
  $ivc = 1 
end
sDokuwikifile = "cpage.dkw" # default name
if options[:dokuinfilename].nil? # should be impossible, but well ...
  STDERR.puts "after the -i option there needs to be a filename" if $ivc > 0
  exit 1
else
  sDokuwikifile = options[:dokuinfilename]
end
sTransferfile = "transfertext.utf8"
if options[:textoutputfilename].nil? # also impossible
  STDERR.puts "after the -o option there needs to be a filename" if $ivc > 0
  exit 1
else
  sTransferfile = options[:textoutputfilename]
end
sSepChar = "~"
if options[:sepcharacter].nil? # also impossible
  STDERR.puts "after the -c option there needs to be a separation character for the different languages" if $ivc > 0
  exit 1
else
  sSepChar = options[:sepcharacter]
end
fkeep = options[:fkeep]
fkeepempty = options[:fkeepemty]
bInCotan = false # flag, we start before the first ctan bloc 
bInTextbox = false # flag, we start outside of a textbox
iNrTextboxes = 0 # the total number of textboxes which were red
asPageAsLines = Array.new # the markup pieces of the file are collected here 
aiTextLineNumbersInPage = Array.new # the line numbers of the text box lines in the page
asTextLines = Array.new # the text lines from the text boxes, one element per textbox contains all the lines from this textbox
asTextboxTags = Array.new # the tags at the start of a text line
unless File.exists? sTransferfile # if true, we are pre translation, otherwise post translation
  if File.exists? sDokuwikifile # we are pre-translation, so look for the input dokuwiki file
    file = File.open(sDokuwikifile, "r") # open the input dokuwiki file
  else
    STDERR.puts "Dokuwiki file " + sDokuwikifile + " could not be found. Maybe you have to use the option -i to make the correct name known."  
    exit 1
  end
  aText = file.read.split "\n" # the the input dokuwiki file as an array of lines
  file.close
  sTextBoxText = String.new # string to collect all the text from a textbox in
  aText.each_index { |iline|
    sline = aText[iline]
    if bInCotan # starting to search for textboxes
      if sline.include? "{{<cotan}}" # stop searching for textboxes, if you're out of the cotan block
        bInCotan = false # as {{<cotan}} indicates the end of a cotan block, we are no longer in the block
        asPageAsLines << sline # hand cotan block's tail through unchanged
      else 
        if bInTextbox
	      if sline.strip == "~".chr # this is the way a textbox ends, not with a !, but with a ~
            sTextBoxText += "\n" # the whole text in this texbox as one line has been collected in earlier runs of the aText.each_index loop and is now terminated with a LF
	        asTextLines << sTextBoxText # all the text from the text box has been collected and can now be stored as one line in the array of textboxlines
            sTextBoxText = String.new # reset the string to empty, to collect the lines from the next texbox here
	        asPageAsLines << "" # store an empty line here as a dummy, because the text goes to asTextLine
            asPageAsLines << sline # lines before and after a textbox, including the textbox's head and tail are just handed through unaltered
	        bInTextbox = false
	      else 
	        sline.strip! # remove white space from the end and the beginning whitespace = "\x00\t\n\v\f\r "
	        if sTextBoxText.empty? # this is the first text box content line, the line could start with tags, which we want to save to asTextboxTags
              if sline.chr == "[" # text line starts with a tag
                while sline.chr == "[" # a tag is still at the start of the line
                  iClose = sline.index "]" # get the position of the closing parenthesis
                  if iClose == -1 # no closing parenthesis found
                    break # the rest of the line is supposed to contain the text
                  else
                    asTextboxTags[iNrTextboxes - 1] += sline[0..iClose] # save the tag by appending it to the previous tags in the same line
                    sline = sline[iClose + 1 .. -1] # remove the tag from the line
                  end
                end # next [-tag 
              end # all starting tags removed
	        end # the starting tags in non first text box lines in textboxes are not saved
            unless fkeep # remove other tags unless blocked
              removedwformating sline # remove dokuwiki formating
            end
            sline.strip! # strip again in case there where whitespaces after or before tags	        
	        if ! sTextBoxText.empty? # if the text has various lines concatenate them all seperated by a blank
	          sTextBoxText += " " #first append the blank to the text already there
	        end
            sTextBoxText += sline # concatenate each line, because the whole text in the textbox has to be one line, terminated with a LF
	      end        
        else # not in a Textbox
          asPageAsLines << sline #lines before and after a textbox, including the textbox's head and tail are just handed through 
	      if isTextBoxStart(sline, aText[iline + 1]) # a textbox starts with this line, but also a mask
		    aiTextLineNumbersInPage << asPageAsLines.length - 1 # the line number in the output file where the text belongs.
	        asTextboxTags << "" # initialize tag memory for this textbox
	        iNrTextboxes += 1 # keep count of the textboxes	        
	        bInTextbox = true
	      end
        end  
      end
    else 
      asPageAsLines << sline # lines before and after the cotan block, including the cotan block's head and tail are just handed through 
      bInCotan = ( sline[0..7] == "{{cotan>" )# the beginning of a contan block was found, so starting with the next loop pass we are inside this cotan block
    end   
  } # next line of the dokuwiki file
  # collect all information for the second pass in an array 
  oSerializedData = Array.new
  oSerializedData << fkeep
  oSerializedData << iNrTextboxes
  oSerializedData << asPageAsLines 
  oSerializedData << aiTextLineNumbersInPage
  oSerializedData << asTextboxTags
  # oSerializedData << asTextLines # the text goes to the file sTransferfile instead
  # write intermediate file for second pass, using the original dokuwiki file name with a yaml extension
  iDotPos = sDokuwikifile.rindex "."
  iDotPos = sDokuwikifile.length if iDotPos.nil?
  sYamlFile = Pathname.new(sDokuwikifile).sub_ext(".yaml")
  File.open(sYamlFile, "w") do |file|
    file.puts YAML::dump(oSerializedData)
  end  
  # write textfile to be translated, i.e. it contains the text which has to be translated and it is expected to be filled with the translation for the second pass
#File.write(sTransferfile, concatstringarray(asTextLines,""))
  File.open(sTransferfile, "w") { |file|
    asTextLines.each { |s|
      file.write s
    }
  }  
else # post translation
  # try to delete old translations from the run before, so that they are not mistaken for new
  # this only works, if the commandline arguments which are used to determine those filenames have not changed
  # construct the names for the output file by inserting the number of the translation and the language before the extension dot
  iDotPos = sDokuwikifile.rindex "." # determine the position of the last dot in the filename of the dokueiki file
  iDotPos = sDokuwikifile.length if iDotPos.nil? # in case the filename lacks a dot, use the length of the filename
  sOldOutputfileTemplate = ""
  10.times{ |iOnePossibleLanguage| # the number of translations we assume migt have existed in the last run
    if iDotPos != sDokuwikifile.length # insert language name before dot
      sOldOutputfileTemplate = shortentolegallength( sDokuwikifile[0..iDotPos-1] + iOnePossibleLanguage.to_s )
    else # add shortend language name, because if the file is without extension, we assume that length is expansive
      sOldOutputfileTemplate = shortentolegallength( sDokuwikifile + iOnePossibleLanguage.to_s )
    end      
    Dir.glob(sOldOutputfileTemplate + "*") { |sOldOutputfile|
      File.delete sOldOutputfile if File.exist?(sOldOutputfile) 
    }
  }
  # reconstract the name of the yaml file 
  sYamlFile = Pathname.new(sDokuwikifile).sub_ext(".yaml") # name of the yaml file reconstructed
  oSerializedData = Array.new # an array to take the contains of the yaml file
  oSerializedData = YAML.load_file(sYamlFile) # load the yaml-file into the array
  # extract the data from the array
  fkeep = oSerializedData[0] # Flag indicating if HTML-mark up is to be kept
  iNrTextboxes = oSerializedData[1] # the number of txtboxes should equal the lines of translated text
  asPageAsLines  = oSerializedData[2]
  aiTextLineNumbersInPage = oSerializedData[3]
  asTextboxTags = oSerializedData[4] # [...]-style mark up at the beginning of a textbox, if there is one
  stranslation = String.new # a string to take all the translations from the transfer-file
  # load translated text
  if File.exists? sTransferfile
    file = File.open(sTransferfile, "r") # load all translations
    stranslation = file.read 
    file.close
  else
    STDERR.puts "Transfer file " + sTransferfile + " could not be found. Maybe you have to use the option -o to make the correct name known."  
    exit 1
  end  
  removeterminatingemptylines stranslation # ignore empty lines after the last translation
  if emptylineintranslation(stranslation, sSepChar) # a translation should not contain empty lines
    STDERR.puts "Error. Where is an empty line in a translation."  
    exit 1    
  else
    if ! fkeepempty # if not wanted otherwise remove the first empty line and everything before it
      removebeforeemptyline stranslation
    end
  end
  asAllTranslatedText = stranslation.split sSepChar # various languages are seperated by a sSepChar wich by default is a ~ and optionally an additional letter to indicate the language
  sLanguage = String.new # holds the language of the second and following translations
  asAllTranslatedText.each_index { |iOneLanguage| # one language at a time, by number 
    asTranslatedText = Array.new # to contain one translation as an Array of strings
    sOneLanguage = asAllTranslatedText[iOneLanguage] # the translated text of this language in one string wih linebraks 
    asTranslatedText = sOneLanguage.split "\n" # get the lines for this language
    if iOneLanguage > 0 # more than one language according to the number of subfiles. Starting with the second language there's the possibilty that there is a letter indicating a language after the ~
      sFirstLine = asTranslatedText[0][0] # the separation character e.g. ~, was already removed, so this is the second character in the original first line and maybe more characters after it
      if sFirstLine.empty? # no language identifying letter or language given
         # sLanguage = "" # stays empty
      else # an additional character can indicate a languge
         allLangs = COUNTRYLETTERS.select { |sl| # search through all letters indicating countries, select returns the letter for which the block returns true 
           fReturn = false # we have not found a letter indicating a language yet
           sFirstLine.each_char { |sChar| # search through all chars in the string, which should in fact be only one
             if sl[0].upcase == sChar.upcase # compare upercases of the letters, so the case is irrelevant here
               fReturn = true # a valid letter indicates the langugea of the translation
             end
           }
           fReturn # returns true if the corresponding language indicating letter was found in the first line
         } 
         allLangs.each_index { |iL| # allLangs contains the subfield of COUNTRYLETTERS with the matching letter and the full name of the language, there should only be one such element  in the field, i.e, thde structure is [[... , ...]]
           if iL == 0 # this should be the case 
             sLanguage = allLangs[0][1] # this is the second elemnt of the subfield, i.e. the full name of the language
           else
             sLanguage = sLanguage + "-" + allLangs[iL][1] # in case there are more entries all full language nanme are appended into the string, seperated by "-" 
           end
         }
      end # we now have a language string which contains all languages of the translation, which was overly complicated, because we restricted the line to one charcter indicating a language and therefore to one language
      asTranslatedText.shift # remove the first line of this languge's block, as it does not contain translated text, but only was used for the separater and the language-letter
    end # end of the search for the name of the language 
    if asTranslatedText.length != iNrTextboxes # regardless of language every translation has to have the same number of lines
      if $ivc > 0
        if sLanguage == ""
          STDERR.puts "warning for default language "  
        else        
          STDERR.puts "warning for language " + sLanguage  
        end
        STDERR.puts "warning: the number of textboxes " + iNrTextboxes.to_s + " does not equal the number of translated strings " + asTranslatedText.length.to_s + "."  
      end
    end
    # get the translateable phrases for this language, this is used to translate text outside the text boxes, like e.g. headings
    if sLanguage.empty? 
      sdefLang = languagefromletter(DEFAULTLANGUAGELETTER) # use the default language if non given
      if sdefLang.nil? 
        asPhrasesForLanguage = Array.new # empty array
      else
        asPhrasesForLanguage = asPhrasesToTranslate.select { |asa| asa[0] == sdefLang } # return a field with all translations for this language, i.e the lines beginning with 
      end
    else # use the language indicated in the seperator line
      asPhrasesForLanguage = asPhrasesToTranslate.select { |asa| asa[0] == sLanguage } # make translation
    end
    asPhrasesForLanguage = asPhrasesForLanguage[0] unless asPhrasesForLanguage.empty? # TODO why is this a three times array?
    sOutputtext = String.new # collect the new dokuwiki-file to be written in ths variable
    # iTextBoxCur = 0
    asPageAsLines.each_index { |iline| # go through all the lines of the dokuwiki source page by their number
      iTextBoxCur = aiTextLineNumbersInPage.find_index(iline - 1) # do a lookup, whether this line's number is in the table of translateable lines
      if iTextBoxCur.nil? # do we have no translation for this line?
        sPL = asPageAsLines[iline] # no translation, so take the line as handed down from the original
          unless asPhrasesForLanguage.empty? # but if we have phrases for this language .,.
            # note that only lines without a translation are translated automatically, as the automatic translation, 
            # especially of short phrases like "Hi" could have unwanted side effects, but it still can have such effects
            # on this remaining lines, so don't goive translations for phrases which are non-unique
            asPhrasesForLanguage.each { |colmem| # ... go through all the phrases to see, if part of this line can be translated this way
              if colmem.class.to_s == "Array" # there has to be an original and a translated text in this element of the phrases collection, i.e. it has to be an array
                 if ! colmem[1].empty? # deleting is not considered translation here
                   sPL = sPL.gsub(colmem[0],colmem[1]) # translate in this line only
                 end
              end
            } #  next phrase
          end
        sOutputtext = sOutputtext + sPL + "\n" # this line gets appended to the output, and may be handed through unchanged, i.e. in the original language
      else # there is a translation for this line which we take from the sTransferfile
        if asTranslatedText[iTextBoxCur].nil? # catch out of array error, if there are too few lines of translated text
          unless sLanguage == ""
            STDERR.puts "warning for language " + sLanguage  
          end
          STDERR.puts " no textbox found for " + iTextBoxCur.to_s + " Too few lines of translated text"
          exit 1           
        else
          sOutputtext = sOutputtext  + asTextboxTags[iTextBoxCur] + asTranslatedText[iTextBoxCur] + "\n"
        end
        # iTextBoxCur += 1
      end
    }
    # remove trailing empty lines
    while sOutputtext[sOutputtext.length - 1] == "\n"
      sOutputtext.chomp!
    end
    # construct a name for the output file by inserting the number of the translation and the language before the extension dot
    iDotPos = sDokuwikifile.rindex "."
    iDotPos = sDokuwikifile.length if iDotPos.nil?
    if iDotPos != sDokuwikifile.length # insert language name before dot
      sOutputfile = shortentolegallength( sDokuwikifile[0..iDotPos-1] + "-" + iOneLanguage.to_s + "-" + sLanguage + sDokuwikifile[iDotPos..-1] )
    else # add shortend language name, because if the file is without extension, we assume that length is expansive
      sOutputfile = shortentolegallength( sDokuwikifile + iOneLanguage.to_s + sLanguage[0..2] )
    end
    # write final output 
    File.open(sOutputfile, "w") do |file|
      file.puts sOutputtext
    end
  } # this translation is finished, go to the next  
  File.delete sTransferfile # cleaning up
  # File.delete sYamlFile # cleaning up
end
#
# The following DATA-section provides how 
# to translate certain phrases. A = denotes
# the phrase in the original language, 
# which is english in the following examples
# This section gets red into asPhrasesToTranslate
__END__
= Color by George Peterson
b Cor por George Peterson
c 乔治-彼得森的色彩
d Farve af George Peterson
f Couleur par George Peterson
g Farbe von George Peterson
h Színezd George Peterson
j カラー:ジョージ・ピーターソン
k Художник Джордж Петерсон
l Цвят от George Peterson
o Kolor: George Peterson
p Cor por George Peterson
r Цвет по Джорджу Петерсону
s Color de George Peterson
t George Peterson tarafından renklendirilmiştir
u Väri George Peterson
= Cameo by 
b Cameo por 
c 伪装者 
d Cameo af 
f Cameo par 
g Cameo von 
h Cameo a 
j カメラマン 
k Завітайте до нас 
l Камео от 
o Występują m.in. 
p Cameo por 
r В ролях 
s Cameo de 
t Cameo tarafından
u Cameo 
= Provisional Title: Return to the Station
b Título provisório: Retorno à Estação Espacial
c 临时标题。返回空间站
d Foreløbig titel: Tilbage til rumstationen 
f Titre provisoire : Retour à la station
g Vorläufiger Titel: Rückkehr zur Station
h Ideiglenes cím: Visszatérés az állomásra 
j 仮のタイトル 宇宙ステーションへの帰還
k Тимчасова назва: Повернення на станцію
l Временно заглавие: Завръщане на гарата
o Tytuł tymczasowy: Powrót na stację
p Título provisório: Regresso à Estação
r Предварительное название: Возвращение на станцию 
s Título provisional: Regreso a la estación  
t Geçici Başlık: İstasyona Dönüş
u Väliaikainen nimi: Avaruusasemalle paluu
= Return to the Station
b Retorno à Estação Espacial
c 返回空间站
d Tilbage til rumstationen 
f Retour à la station
g Rückkehr zur Station
h Visszatérés az állomásra 
j 仮のタイトル 宇宙ステーションへの帰還
k Повернення на станцію
l Завръщане на гарата
o Powrót na stację
p Regresso à Estação
r Возвращение на станцию 
s Regreso a la estación  
t İstasyona Geri Dönün
u Avaruusasemalle paluu
= The adventure begins!
b A aventura começa!
c 冒险开始了!
d Eventyret begynder!
f L'aventure commence !
g Das Abenteuer beginnt!
h Kezdődik a kaland!
j 冒険が始まる
k Пригода починається!
l Приключението започва!
o Zaczynamy przygodę!
p A aventura começa!
r 
s ¡Comienza la aventura!
t Macera başlıyor!
u Seikkailu alkaa!
= Doggy! First appearance of Florence
b Cãozinho! Primeira aparição de Florença
c 狗狗! 佛罗伦萨的首次亮相
d Doggy! Første gang Florence dukker op
f Chien ! Première apparition de Florence
g 
h Kutyus! Florence első megjelenése
j わんわん! フローレンス初登場
k Песик! Перша поява Флоренс
l Кученце! Първа поява на Флоренция
o Piesek! Pierwsze pojawienie się Florence
p Cãozinho! Primeira aparição de Florence
r 
s ¡Perro! Primera aparición de Florence
t Köpekçik! Florence'ın ilk görünüşü
u Doggy! Florence ensiesiintyminen
= Arrival at the ship. Repairs begin. Sort of
b Chegada ao navio. Início das reparações. Tipo de
c 到达船上。开始修理。算是
d Ankomst til skibet. Reparationerne begynder. På en måde
f Arrivée au navire. Début des réparations. En quelque sorte
g 
h Érkezés a hajóra. Megkezdődik a javítás. Valamiféle
j 船に到着。修理開始。一応
k Прибуття на корабель. Починається ремонт. Щось на кшталт
l Пристигане на кораба. Започва ремонтът. Нещо като
o Przybycie na statek. Rozpoczynają się naprawy. Tak jakby
p Chegada ao navio. Início das reparações. Tipo de
r 
s Llegada al barco. Comienzan las reparaciones. Algo así como
t Gemiye varış. Onarımlar başlıyor. Bir çeşit
u Saapuminen laivaan. Korjaukset alkavat. Tavallaan
= The road trip to the abandoned colony ship gets underway
b A viagem para o navio da colônia abandonada começa
c 
d 
f 
g 
h 
j 
k Розпочинається подорож до покинутого корабля-колонії
l 
o Wyprawa do opuszczonego statku kolonialnego rusza w drogę
p 
r 
s 
t Terk edilmiş koloni gemisine doğru yola çıkılıyor
u 
= Asteroids and other close encounters
b Asteróides e outros encontros íntimos
c 
d 
f 
g 
h 
j 
k Астероїди та інші близькі зіткнення
l 
o Asteroidy i inne bliskie spotkania
p 
r 
s 
t Asteroitler ve diğer yakın karşılaşmalar
u 
= Arrival at the abandoned colony ship
b Chegada ao navio da colônia abandonada
c 抵达被遗弃的殖民船
d Ankomst til det forladte koloniskib
f Arrivée au vaisseau-colonie abandonné
g Ankunft auf dem verlassenen Kolonieschiff
h Megérkezés az elhagyott kolóniahajóra
j 放置されたコロニー船への到着
k Прибуття на покинутий корабель колонії
l Пристигане на изоставения колониален кораб
o Przybycie na opuszczony statek kolonialny
p Chegada ao navio da colónia abandonada
r 
s Llegada a la nave colonia abandonada
t Terk edilmiş koloni gemisine varış
u Saapuminen hylätylle siirtokunta-alukselle
= AIEEE! Radiation!
b AIEEE! Radiação!
c AIEEE! 辐射!
d AIEEE! Stråling!
f AIEEE ! Radiation !
g AIEEE! Strahlung!
h AIEEE! Sugárzás!
j AIEEE! 放射線だ!
k ААААА! Радіація!
l AIEEE! Радиация!
o AIEEE! Promieniowanie!
p AIEEE! Radiação!
r 
s ¡AIEEE! ¡Radiación!
t AIEEE! Radyasyon!
u AIEEE! Säteilyä!
= Fun with an open ventilation shaft
b Diversão com um eixo de ventilação aberto
c 开放式通风井的乐趣
d Sjovt med en åben ventilationsskakt
f Amusement avec un puits de ventilation ouvert
g Spaß mit einem offenen Lüftungsschacht
h Szórakozás egy nyitott szellőzőaknával
j オープンベンチレーションシャフトで楽しむ
k Забава з відкритою вентиляційною шахтою
l Забавление с отворена вентилационна шахта
o Zabawa z otwartym szybem wentylacyjnym
p Diversão com um poço de ventilação aberto
r Açık havalandırma bacası ile eğlence
s Diversión con un pozo de ventilación abierto
t Açık havalandırma bacası ile eğlence
u Hauskaa avoimella tuuletuskuilulla
= A truck, a JATO rocket, and duct tape. Three great things that go great together!
b Um caminhão, um foguete JATO, e fita adesiva. Três grandes coisas que combinam muito bem!
c 一辆卡车,一枚JATO火箭,以及胶带。三件伟大的事情,可以很好地结合在一起!
d En lastbil, en JATO-raket og gaffatape. Tre fantastiske ting, der passer godt sammen!
f Un camion, une fusée JATO, et du ruban adhésif. Trois choses géniales qui vont bien ensemble !
g Ein Lastwagen, eine JATO-Rakete und Klebeband. Drei tolle Dinge, die gut zusammenpassen!
h Egy teherautó, egy JATO rakéta és ragasztószalag. Három nagyszerű dolog, ami remekül illik egymáshoz!
j トラック、JATOロケット、そしてガムテープ。三拍子揃った素晴らしい作品です。
k Вантажівка, ракета JATO та скотч. Три чудові речі, які чудово поєднуються!
l Камион, ракета JATO и тиксо. Три страхотни неща, които се съчетават чудесно!
o Ciężarówka, rakieta JATO i taśma klejąca. Trzy wspaniałe rzeczy, które świetnie się razem komponują!
p Um camião, um foguete JATO, e fita adesiva. Três grandes coisas que combinam muito bem!
r 
s Un camión, un cohete JATO y cinta adhesiva. ¡Tres grandes cosas que van muy bien juntas!
t Bir kamyon, bir JATO roketi ve koli bandı. Birlikte harika giden üç harika şey!
u Kuorma-auto, JATO-raketti ja ilmastointiteippiä. Kolme hienoa asiaa, jotka sopivat hyvin yhteen!
= Catch! The first appearance of Sawtooth Rivergrinder
b Apanhe! A primeira aparição do Sawtooth Rivergrinder
c 接住! 锯齿型河流粉碎机的首次亮相
d Fang! Den første optræden af Sawtooth Rivergrinder
f Attrape ! La première apparition de Sawtooth Rivergrinder.
g Fangen Sie! Der erste Auftritt von Sawtooth Rivergrinder
h Kapd el! A Fűrészfogú Folyóőrlő első megjelenése
j キャッチ! ノコギリリバーグラインダー初登場
k Лови! Перша поява містера Пилкозуба-риболова
l Уловете! Първата поява на Sawtooth Rivergrinder
o Łap! Pierwsze pojawienie się Sawtooth Rivergrinder
p Apanha! A primeira aparição de Sawtooth Rivergrinder
r 
s ¡Atrapa! La primera aparición de Sawtooth Rivergrinder
t Yakalayın! Sawtooth Rivergrinder'ın ilk görünüşü
u Ota kiinni! Sawtooth Rivergrinderin ensiesiintyminen
= Home again. Arrival back at the ship
b Novamente em casa. Chegada de volta ao navio
c 再次回家。抵达后回到船上
d Hjemme igen. Ankomst tilbage til skibet
f Retour à la maison. Arrivée au navire
g Wieder zu Hause. Ankunft zurück auf dem Schiff
h Újra itthon. Visszaérkezés a hajóra
j 再び故郷へ 再び船に到着
k Знову вдома. Прибуття на корабель
l Отново у дома. Пристигане обратно на кораба
o Znowu w domu. Powrót na statek
p Novamente em casa. Chegada de volta ao navio
r 
s De nuevo en casa. Llegada al barco
t Tekrar eve. Gemiye geri varış
u Taas kotona. Saapuminen takaisin laivaan
= Repairs on the port fusion engine begin. How much trouble can it be to replace a section of pipe?
b Início das reparações no motor de fusão portuária. Quantos problemas podem ser 
c 港口融合发动机的维修工作开始了。更换一段管道能有多大的麻烦?
d Reparationer påbegyndes på bagbords fusionsmotor. Hvor meget besvær kan det være at udskifte en del af et rør?
f Les réparations sur le moteur à fusion portuaire commencent. A quel point est-ce difficile de remplacer une section de tuyau ?
g Die Reparaturen am Backbord-Fusionsmotor beginnen. Wie viel Aufwand kann es sein, ein Rohrstück zu ersetzen?
h Megkezdődik a bal oldali fúziós hajtómű javítása. Mekkora gondot jelenthet egy csőszakasz cseréje?
j ポートフュージョンエンジンの修理が始まる。パイプの一部を交換するのは、どれくらいの手間がかかるのだろう?
k Починаються ремонтні роботи на портовому термоядерному двигуні. Наскільки складною може бути заміна ділянки труби?
l Започва ремонт на левия двигател за сливане. Колко трудно може да бъде да се замени една част от тръбата?
o Rozpoczynają się naprawy silnika termojądrowego w porcie. Ile kłopotu może sprawić wymiana jednego odcinka rury?
p Início das reparações no motor de fusão do porto. Quanta dificuldade pode ser a substituição de uma secção de tubagem?
r 
s Comienzan las reparaciones en el motor de fusión de babor. ¿Cuánto puede costar reemplazar una sección de tubería?
t Liman füzyon motorunun onarımı başlıyor. Bir boru parçasını değiştirmek ne kadar zahmetli olabilir ki?
u Paapuurin fuusiomoottorin korjaukset alkavat. Kuinka paljon vaivaa voi olla putken osan vaihtamisesta?
= Power! We have power! Or how to start a fusion reactor
b Potência! Nós temos energia! Ou como dar partida a um reator de fusão
c 权力! 我们有动力!或如何启动核聚变反应堆
d Power! Vi har magt! Eller hvordan man starter en fusionsreaktor
f Le pouvoir ! Nous avons de l'énergie ! Ou comment démarrer un réacteur à fusion
g Macht! Wir haben Strom! Oder wie man einen Fusionsreaktor startet
h Hatalom! Nekünk van hatalmunk! Vagy hogyan kell beindítani egy fúziós reaktort
j パワーがある!電力がある! または核融合炉を起動する方法
k Сила! У нас є енергія! Або як запустити термоядерний реактор
l Мощност! Имаме власт! Или как да стартираме термоядрен реактор
o Moc! Mamy moc! Albo jak uruchomić reaktor fuzyjny
p Poder! Nós temos poder! Ou como iniciar um reactor de fusão
r 
s ¡Poder! ¡Tenemos energía! O cómo poner en marcha un reactor de fusión
t Güç! Gücümüz var! Ya da bir füzyon reaktörü nasıl başlatılır
u Voimaa! Meillä on valtaa! Tai miten käynnistää fuusioreaktori
= These people have got to get their priorities straight
b Estas pessoas têm que ter suas prioridades claras
c 这些人必须搞清楚他们的优先事项
d Disse mennesker er nødt til at få styr på deres prioriteringer
f Ces gens doivent mettre de l'ordre dans leurs priorités
g Diese Leute müssen ihre Prioritäten richtig setzen
h Ezeknek az embereknek rendbe kell tenniük a prioritásaikat.
j この人たちは優先順位をはっきりさせなければならない
k Цим людям треба визначитися з пріоритетами
l Тези хора трябва да изяснят приоритетите си
o Ci ludzie muszą uporządkować swoje priorytety.
p Estas pessoas têm que ter as suas prioridades bem definidas
r 
s Esta gente tiene que tener sus prioridades claras
t Bu insanlar önceliklerini doğru belirlemeli.
u Näiden ihmisten on saatava tärkeysjärjestyksensä kuntoon.
= Lunch and bunnies
b Almoço e coelhinhos
c 午餐和小兔子
d Frokost og kaniner
f Déjeuner et lapins
g Mittagessen und Kaninchen
h Ebéd és nyuszik
j お弁当とうさぎ
k Обід та кролики
l Обяд и зайчета
o Lunch i króliczki
p Lunch i króliczki
r 
s Almuerzo y conejitos
t Öğle yemeği ve tavşanlar
u Lounas ja puput
= A gratuitous shower scene
b Uma cena de banho gratuita
c 一个无偿的淋浴场景
d En gratis brusebadsscene
f Une scène de douche gratuite
g Eine unentgeltliche Duschszene
h Egy indokolatlan zuhanyjelenet
j 無償のシャワーシーン
k Сцена безоплатного душу
l Безпричинна сцена под душа
o Nieodpłatna scena pod prysznicem
p Uma cena de duche gratuita
r 
s Una escena de ducha gratuita
t Gereksiz bir duş sahnesi
u Tarpeeton suihkukohtaus
= Trip to "The Golden Trough", the finest in bad cuisine
b Viagem ao "The Golden Trough", o melhor da má cozinha
c 去 "金槽 "旅行,最好的坏菜。
d Udflugt til "The Golden Trough", det fineste i det dårlige køkken
f Voyage à "The Golden Trough", le meilleur de la mauvaise cuisine
g Ausflug zum "Goldenen Trog", dem Feinsten der schlechten Küche
h Kirándulás az "Aranyvályúba", a legfinomabb rossz konyhába
j 不味い料理の最高峰「黄金のトラフ」への旅
k Поїздка в "Золоте корито", найкраще в поганій кухні
l Екскурзия до "Златното корито", най-доброто в лошата кухня
o Wycieczka do "Złotego Koryta", czyli najwspanialsza zła kuchnia
p Viagem ao "The Golden Trough", o melhor da má cozinha
r 
s Viaje a "El Comedero de Oro", lo mejor de la mala cocina
t Kötü mutfağın en iyisi "The Golden Trough "a gezi
u Retki "The Golden Trough" -ravintolaan, jossa tarjoillaan huonoa ruokaa.
= How to catch a deer. Sort of
b Caçador de cervos, por assim dizer
c 可以这么说,猎鹿人
d Hjortejæger, så at sige
f Cerbère pour ainsi dire
g Hirschfängerin sozusagen
h Szarvasvadász, hogy úgy mondjam
j ディアハンター
k Як вполювати оленя. Начебто
l Ловец на елени, така да се каже
o Jak złapać jelenia. W pewnym sensie
p Caçador de veados, por assim dizer
r «Как поймать оленя» в картинках
s Cazador de ciervos, por así decirlo
t Bir geyik nasıl yakalanır. Bir çeşit
u Hirvenmetsästäjä, niin sanoakseni
= Covering your tracks
b Cobrindo seus rastros
c 掩盖你的踪迹
d Dækning af dine spor
f Couvrir vos traces
g Verwischen Sie Ihre Spuren
h A nyomok eltüntetése
j 痕跡を消す
k Замітання слідів
l Прикриване на следи
o Ukrywanie śladów
p Cobrir os seus rastos
r 
s Cubrir sus huellas
t İzlerinizi örtmek
u Jälkien peittäminen
= Hurricane Joe is moving in
b O furacão Joe está chegando
c 飓风 "乔 "来了
d Orkanen Joe er på vej ind
f L'ouragan Joe s'installe
g Hurrikan Joe ist im Anmarsch
h Joe hurrikán közeledik
j ハリケーン・ジョーがやってくる
k Ураган Джо наближається
l Ураганът Джо се придвижва
o Huragan Joe wkracza do akcji
p O furacão Joe está a chegar
r 
s El huracán Joe se acerca
t Joe Kasırgası yaklaşıyor.
u Hurrikaani Joe lähestyy
= We came here to rescue this?
b Viemos aqui para resgatar isto?
c 我们来这里是为了拯救这个?
d Vi kom her for at redde denne?
f On est venu ici pour sauver ça ?
g Wir sind hier, um das zu retten?
h Azért jöttünk ide, hogy ezt megmentsük?
j 私たちはこれを救うためにここに来たのか?
k Ми прийшли сюди, щоб врятувати це?
l Дойдохме тук, за да го спасим?
o Przyjechaliśmy tu, żeby to uratować?
p Viemos aqui para salvar isto?
r 
s ¿Vinimos a rescatar esto?
t Buraya bunu kurtarmaya mı geldik?
u Tulimmeko tänne pelastamaan tämän?
= Well, we got almost everyone back
b Bem, temos quase todos de volta
c 嗯,我们几乎把所有人都找回来了
d Nå, vi fik næsten alle tilbage
f Eh bien, nous avons récupéré presque tout le monde
g Nun, wir haben fast alle zurück.
h Nos, majdnem mindenkit visszakaptunk.
j まあ、ほぼ全員を取り戻したわけですが
k Що ж, ми повернули майже всіх.
l Е, върнахме почти всички
o Cóż, mamy prawie wszystkich z powrotem
p Bem, temos quase todos de volta
r 
s Bueno, tenemos a casi todos de vuelta
t Neredeyse herkesi geri aldık.
u No, saimme melkein kaikki takaisin
= Canine in the water
b Canino na água
c 水中的犬类
d Hund i vandet
f Canin dans l'eau
g Hund im Wasser
h Kutya a vízben
j 水中のイヌ
k Собака у воді
l Куче във водата
o Pies w wodzie
p Canino na água
r 
s Canino en el agua
t Köpek suda
u Koira vedessä
= Sam the card flounder
b Sam a solha de cartão
c 纸牌比目鱼山姆
d Sam kortet flunder
f Sam, le joueur de cartes
g Sam die Kartenflunder
h Sam a kártya lepattant
j サム・ザ・カード・フラウンダー
k Сем - картковий флуктуатор
l Сам на картата flounder
o Sam - flądra do kart.
p Sam a solha de cartão
r 
s Sam el tahúr
t Kart pisi balığı Sam
u Sam kortin kampela
= You ought to be in pictures
b Você deveria estar em fotos
c 你应该在照片中出现
d Du burde være på billeder
f Vous devriez être dans les photos
g Sie sollten auf Bildern zu sehen sein
h Képeken kéne szerepelned.
j あなたは写真になるべきです
k Ви повинні бути на фотографіях
l Трябва да сте в снимки
o Powinnaś być na zdjęciach
p Deveria estar em imagens
r 
s Deberías salir en las fotos
t Fotoğraflarda olmalısın.
u Sinun pitäisi olla kuvissa
= Meanwhile, back at the vet's…
b Enquanto isso, de volta ao veterinário…
c 同时,回到兽医那里…
d I mellemtiden er vi tilbage hos dyrlægen…
f Pendant ce temps, chez le vétérinaire…
g In der Zwischenzeit, beim Tierarzt…
h Eközben az állatorvosnál…
j 一方、獣医のところでは…
k Тим часом, у ветеринара…
l Междувременно при ветеринарния лекар…
o Tymczasem, z powrotem u weterynarza…
p Entretanto, de volta ao veterinário…
r 
s Mientras tanto, en el veterinario…
t Bu arada, veterinerde…
u Sillä välin eläinlääkärin luona…
= Sam to the rescue!
b Sam para o resgate!
c 萨姆来救人!
d Sam til undsætning!
f Sam à la rescousse !
g Sam als Retter annehmen!
h Sam a megmentő!
j サム・トゥ・レスキュー!
k Сем поспішає на допомогу!
l Сам на помощ!
o Sam na ratunek!
p Sam ao salvamento!
r 
s ¡Sam al rescate!
t Sam kurtarmaya geldi!
u Sam pelastaa meidät!
= Off to new destinations, if we can figure out where we're going
b Para novos destinos, se conseguirmos descobrir para onde estamos indo
c 去往新的目的地,如果我们能弄清楚我们要去的地方的话
d På vej mod nye destinationer, hvis vi kan finde ud af, hvor vi skal hen
f En route vers de nouvelles destinations, si nous parvenons à savoir où nous allons.
g Auf zu neuen Ufern, sobald wir wissen wie das geht
h Új úticélok felé, ha rájövünk, hová megyünk.
j 行き先が決まれば、新たな目的地へ。
k Вирушаємо до нових місць призначення, якщо зможемо зрозуміти, куди ми їдемо
l Към нови дестинации, ако успеем да разберем къде отиваме
o Wyruszamy do nowych miejsc, jeśli uda nam się ustalić, dokąd zmierzamy.
p Para novos destinos, se conseguirmos descobrir para onde vamos
r 
s Hacia nuevos destinos, si sabemos adónde vamos
t Nereye gittiğimizi bulabilirsek, yeni hedeflere doğru yola çıkıyoruz.
u Uusiin kohteisiin, jos vain saamme selville, minne olemme menossa.
= Business opportunities, don't wait up
b Oportunidades de negócios, não espere acordado
c 商业机会,不要等待
d Forretningsmuligheder, vent ikke op
f Opportunités commerciales, n'attendez pas
g Geschäftschancen warten nicht, man muss sie ergreifen. Sei es mit Tentakeln.
h Üzleti lehetőségek, ne várjon
j ビジネスチャンス、待ったなし
k Бізнес-можливості, не чекайте
l Бизнес възможности, не изчаквайте
o Możliwości biznesowe, nie czekaj
p Oportunidades de negócio, não espere acordado
r Правда бизнесу не товарищ
s Oportunidades de negocio, no espere
t İş fırsatları, beklemeyin
u Liiketoimintamahdollisuudet, älä odota
= There are better things to wake up to
b Há coisas melhores para se acordar
c 有更好的东西可以唤醒
d Der er bedre ting at vågne op til
f Il y a de meilleures choses pour se réveiller
g 
h Vannak jobb dolgok is, amikre fel lehet ébredni
j 目覚めにはもっといいことがある
k Є кращі речі, заради яких варто прокидатися
l Има по-добри неща, с които да се събудите
o Są lepsze rzeczy do obudzenia się
p Há coisas melhores para acordar
r 
s Hay mejores cosas con las que despertarse
t Uyanmak için daha iyi şeyler var
u On parempiakin asioita herätä
= Niomi and Tangent show up to repair the water pump
b Niomi e Tangent aparecem para reparar a bomba d'água
c 尼奥米和唐吉诃德出现,修理水泵
d Niomi og Tangent dukker op for at reparere vandpumpen
f Niomi et Tangent se montrent pour réparer la pompe à eau.
g 
h Niomi és Tangent megjelennek, hogy megjavítsák a vízszivattyút.
j ニオミとタンジェントが水ポンプの修理に現れる
k Ніомі і Тангенс з'являються, щоб відремонтувати водяний насос
l Ниоми и Тангент се появяват, за да поправят водната помпа
o Niomi i Tangent pojawiają się, aby naprawić pompę wodną
p Niomi e Tangent aparecem para reparar a bomba de água
r 
s Niomi y Tangent aparecen para reparar la bomba de agua
t Niomi ve Tangent su pompasını onarmak için ortaya çıktı
u Niomi ja Tangent saapuvat korjaamaan vesipumppua -
= Hey, where's my wallet?
b Ei, onde está minha carteira?
c 嘿,我的钱包呢?
d Hey, hvor er min pung?
f Hé, où est mon portefeuille ?
g 
h Hé, hol a tárcám?
j おい、財布はどこだ?
k Гей, де мій гаманець?
l Ей, къде е портфейлът ми?
o Hej, gdzie jest mój portfel?
p Onde está a minha carteira?
r 
s ¿Dónde está mi cartera?
t Hey, cüzdanım nerede?
u Hei, missä lompakkoni on?
= Time to wake up and stalk the coffee
b Hora de acordar e perseguir o café
c 该起床了,该喝咖啡了
d Tid til at vågne op og snige sig til kaffen
f Il est temps de se réveiller et de traquer le café
g 
h Itt az ideje, hogy felébredj és a kávét cserkészd be
j 目覚めの時間、コーヒーのストーキング
k Час прокидатися і переслідувати каву
l Време е да се събудим и да изпием кафето
o Czas się obudzić i napić się kawy.
p Hora de acordar e perseguir o café
r 
s Hora de levantarse y acechar el café
t Uyanma ve kahve içme zamanı
u Aika herätä ja väijyä kahvia
########################################################
= Florence gets the sticky notes of doom
b Florença recebe as notas pegajosas da desgraça
c 佛罗伦萨得到厄运的贴纸
d Florence får de uheldige sedler
f Florence obtient les notes autocollantes de la malédiction
g Florence bekommt die Klebezettel der Vernichtung
h Florence megkapja a végzet öntapadós jegyzeteit
j 運命の付箋を手にするフローレンス
k Флоренція отримує липкі нотки приреченості
l Флоренция получава самозалепващите се бележки на съдбата
o Florencja otrzymuje karteczki samoprzylepne zagłady
p Florença recebe as notas pegajosas da desgraça
r Флоренция получает липкие записки судьбы
s Florence recibe las notas adhesivas de la destrucción
t Floransa kıyametin yapışkan notlarını alıyor
u Florence saa tuomion muistilaput
= Day of the dead
b Dia dos mortos
c 死者之日
d De dødes dag
f Le jour des morts
g Totentag
h A halottak napja
j デイ・オブ・ザ・デッド
k День мертвих
l Ден на мъртвите
o Dzień zmarłych
p Dia dos mortos
r
s Día de los muertos
t Ölüler Günü
u Kuolleiden päivä
= When robot factories go to war
b Quando as fábricas de robôs vão para a guerra
c 当机器人工厂开战时
d Når robotfabrikker går i krig
f Quand les usines de robots partent en guerre
g Wenn Roboterfabriken in den Krieg ziehen
h Amikor a robotgyárak háborúba mennek
j ロボット工場が戦争に行くとき
k Коли заводи роботів йдуть на війну
l Когато фабриките за роботи тръгват на война
o Gdy fabryki robotów idą na wojnę
p Quando as fábricas de robôs vão para a guerra
r 
s Cuando las fábricas de robots entran en guerra
t Robot fabrikaları savaşa girdiğinde
u Коли заводи роботів йдуть на війну
= Edge and the word filter
b 
c 
d 
f 
g 
h 
j 
k Край і фільтр слів
l 
o Edge i filtr słów
p 
r 
s 
t 
u 
= Clippy spots a wolf and tells Mr. Kornada
b 
c 
d 
f 
g 
h 
j 
k Кліппі помітив вовка і каже пану Корнаді
l 
o Clippy zauważa wilka i mówi o tym panu Kornadzie
p 
r 
s 
t 
u 
= Off to see Mr. Raibert
b Fora para ver o Sr. Raibert
c 去见Raibert先生
d På vej til hr. Raibert
f Je vais voir M. Raibert
g Unterwegs zum Treffen mit Herrn Raibert
h Elmegyek Raibert úrhoz
j ライバート氏に会いに行く
k До пана Райбера.
l Отивам при г-н Райберт
o Z wizytą u pana Raiberta
p Fora para ver o Sr. Raibert
r Пошел к мистеру Райберту
s Vamos a ver al Sr. Raibert
t 
u Menossa tapaamaan herra Raibertia
= Dumpster diving for wolves
b Mergulho em lixeiras para lobos
c 垃圾箱中的狼群
d Dumpster diving for ulve
f Plonger dans les poubelles pour trouver des loups
g Containernde Wölfe
h Szemétbúvárkodás farkasokért
j オオカミのダンプカー・ダイビング
l Търсене на вълци в кофите за боклук
o Poszukiwanie wilków w śmietniku
p Mergulho em contentores de lixo para lobos
r Погружение в мусорный контейнер в поисках волков
s Búsqueda de lobos en el contenedor
t 
u Roskasukellus susien löytämiseksi
= Off to see the Mayor
b Vamos até o prefeito
c 让我们去找市长
d Lad os gå til borgmesteren
f En route pour la mairesse
g Auf zur Bürgermeisterin
h Menjünk a polgármesterhez
j 市長のところへ行こう
k На зустріч з міським головою
l На посещение при кмета
o Z wizytą u burmistrza
p Vamos até ao presidente da câmara
r Давайте обратимся к мэру
s Vamos a ver a la alcaldesa
t 
u Mennään pormestarin luo
= Breaking and entering for fun and profit
b Arrombamento e entrada para diversão e lucro
c 为了乐趣和利益而破门而入
d Indbrud og indbrud for sjov og profit
f Effraction pour le plaisir et le profit
g Einbruch und Raubzüge bringen Spaß und Geld
h Betörés és behatolás szórakozásból és haszonszerzés céljából
j 遊び心と利益のための不法侵入
l Влизане с взлом за забавление и печалба
o Włamanie i kradzież dla zabawy i zysku
p Arrombamento e entrada por diversão e lucro
r Проникновение с приколом
s Los robos y asaltos aportan diversión y dinero
t 
u Murtautuminen huvin ja voiton tavoittelemiseksi
= A secret meeting and Sawtooth's birthday
b Uma reunião secreta e o aniversário de Sawtooth
c 秘密会议和Sawtooth的生日
d Et hemmeligt møde og Sawtooths fødselsdag
f Une réunion secrète et l'anniversaire de Sawtooth
g Ein geheimes Treffen und Sawtooths Geburtstag
h Egy titkos találkozó és Fűrészfog születésnapja
j 秘密会議とノコギリソウの誕生日
l Тайна среща и рожден ден на Sawtooth
o Tajne spotkanie i urodziny Sawtootha
p Uma reunião secreta e o aniversário de Sawtooth
r Секретная встреча на дне рождения Пилозуба
s Una reunión secreta y el cumpleaños de Sawtooth
t 
u Salainen kokous ja Sahanhampaan syntymäpäivä
= Edge and immunity
b 
c 
d 
f 
g 
h 
j 
l 
o Edge immunitet
p 
r 
s 
t 
u 
= Spiking the servers
b Espicaçando os servidores
c 加注服务器
d Spiking af serverne
f Piquez les serveurs
g Die Server spicken
h A szerverek felturbózása
j サーバーへのスパイク
l Спийкване на сървърите
o Podsłuchiwanie serwerów
p Espicaçar os servidores
r «Прокалывание» серверов
s Pegar a los servidores
t 
u Palvelimien piikittäminen
= Edge reactivates Blunt
b Edge reativa o Blunt
c 边缘重新激活钝器
d Edge genaktiverer Blunt
f Edge réactive Blunt
g Edge reaktiviert Blunt
h Edge újra aktiválja Blunt
j エッジがブラントを再活性化
l Edge активира отново Blunt
o Edge reaktywuje Blunta
p Edge reactiva o Blunt
r Эдж перезапускает Железяку
s Edge reactiva Blunt
t 
u Edge aktivoi Bluntin uudelleen
= Robot chases wolf
b robô persegue lobo
c 机器人追赶狼
d robot jagter ulv
f un robot chasse le loup
g Roboter jagt Wolf
h robot üldözi a farkast
j ロボットが狼を追う
l Робот преследва вълк
o Robot goni wilka
p robô persegue lobo
r Робот гонится за волком
s el robot persigue al lobo
t 
u robotti jahtaa sutta
= Into the Ecosystems Unlimited compound
b Dentro do composto Ecosystems Unlimited
c 进入生态系统的无限复合
d Ind i Ecosystems Unlimited-forbindelsen
f Dans l'enceinte d'Ecosystems Unlimited
g Aufs Ecosystems Unlimited Firmengelände
h Az Ecosystems Unlimited vegyületbe
j エコシステムズ・アンリミテッドの化合物の中へ
l В състава на Ecosystems Unlimited
o Wewnątrz kompleksu Ecosystems Unlimited
p Dentro do composto Ecosystems Unlimited
r Внутри «Экосистемс Анлимитед»
s En el recinto de Ecosystems Unlimited
t
u Ecosystems Unlimited -yhdisteeseen
= Clippy discovers his plan has failed
b Clippy descobre que seu plano falhou
c Clippy发现他的计划失败了
d Clippy opdager, at hans plan er mislykkedes
f Clippy découvre que son plan a échoué
g Clippy erkennt, dass sein Plan in die Hose gegangen ist
h Clippy rájön, hogy terve kudarcot vallott
l Клипи открива, че планът му се е провалил
o Clippy odkrywa, że jego plan się nie powiódł
p Clippy descobre que o seu plano falhou
j クリッピーの計画が失敗したことを知る
r Клиппи обнаруживает провал плана
s Clippy descubre que su plan ha fracasado
t 
u Clippy huomaa suunnitelmansa epäonnistuneen
= Midnight and movement is restored
b A meia-noite e o movimento são restaurados
c 午夜和运动恢复了
d Midnat og bevægelse er genoprettet
f Minuit et le mouvement est restauré
g Die Geisterstunde bringt wieder Bewegung ins Spiel
h Éjfél és a mozgás helyreáll
j 真夜中、動きが回復する
l Полунощ и движението е възстановено
o Północ i ruch zostają przywrócone
p A meia-noite e o movimento são restaurados
r Полуночное оживление
s La medianoche y el movimiento se restablecen
t 
u Keskiyö ja liikkuminen palautuu
= What's it take to get arrested in this town?
b O que é preciso para ser preso nesta cidade?
c 在这个城市,要怎样才能被逮捕呢?
d Hvad skal der til for at blive arresteret i denne by?
f Qu'est-ce qu'il faut pour se faire arrêter dans cette ville ?
g Gnn! Was genau in aller Welt Namen muss man hier eigentlich anstellen, um verhaftet zu werden?
h Mi kell ahhoz, hogy letartóztassanak ebben a városban?
j この街で逮捕されるにはどうしたらいいんだ?
l Какво е нужно, за да те арестуват в този град?
o Co trzeba zrobić, żeby zostać aresztowanym w tym mieście?
p O que é preciso para ser detido nesta cidade?
r Как арестоваться в этом городе?
s ¿Qué hace falta para que te arresten en esta ciudad?
t 
u Mitä vaaditaan, että sinut pidätetään tässä kaupungissa?
= Jailbreak
b Fuga da prisão
c 越狱
d Fængselsflugt
f Évasion de prison
g Der Ausbruch
h Börtönszökés
j プリズンブレイク
l Бягство от затвора
o Ucieczka z więzienia
p Pausa na prisão
r Взлом тюрьмы
s Fuga de la prisión
t 
u Vankilapako
= Good morning, Mr. Kornada
b Bom dia, Sr. Kornada.
c 早上好,科纳达先生。
d Godmorgen, hr. Kornada.
f Bonjour, M. Kornada.
g Guten Morgen, Herr Kornada.
h Jó reggelt, Kornada úr.
j 角田さん、おはようございます。
l Добро утро, г-н Корнада.
o Dzień dobry, panie Kornada
p Bom dia, Sr. Kornada.
r Доброе утро, мистер Корнада
s Buenos días, Sr. Kornada.
t 
u Huomenta, herra Kornada.
= Chaos in the streets, a good day for Sam.
b Caos nas ruas, um bom dia para Sam.
c 街道上一片混乱,对山姆来说是个好日子。
d Kaos i gaderne, en god dag for Sam.
f Chaos dans les rues, un bon jour pour Sam.
g Chaos auf den Straßen, Sam im Glück
h Káosz az utcákon, egy jó nap Sam számára.
j 街はカオス、サムにとっては良い日だ。
l Хаос по улиците - добър ден за Сам.
o Chaos na ulicach, dobry dzień dla Sama
p Caos nas ruas, um bom dia para Sam.
r Хаос на улицах – хороший знак для Сэма
s Kaos på gatorna, en bra dag för Sam.
t 
u Kaaos kaduilla, hyvä päivä Samille.
= Chaos in the streets, a good day for Sam
b Caos nas ruas, um bom dia para Sam
c 街头的混乱,山姆的好日子
d Kaos i gaderne, en god dag for Sam
f Chaos dans les rues, une bonne journée pour Sam
g Chaos regiert die Stadt. Ein Traum für Sam
h Káosz az utcákon, egy jó nap Sam számára
j 街はカオス、サムにとっては良い日
l Хаос по улиците, добър ден за Сам
o Chaos na ulicach, dobry dzień dla Sama
p Caos nas ruas, um bom dia para Sam
r Хаос на улицах – хороший знак для Сэма
s Caos en las calles, un buen día para Sam
t 
u Kaaos kaduilla, hyvä päivä Samille
= Max Post talks with the Mayor
b Max Post em conversa com o prefeito.
c 马克斯-波斯特在与市长谈话。
d Max Post i samtale med borgmesteren.
f Max Post s'entretient avec le maire.
g Die Aussprache zwishen der Bürgermeisterin und Max Post.
h Max Post beszélget a polgármesterrel.
j 市長と話すマックス・ポスト氏。
l Макс Пост разговаря с кмета.
o Max Post rozmawia z burmistrzem
p Max Post fala com o Presidente da Câmara.
r Макс Пост разговаривает с мэром
s Max Post habla con el alcalde.
t 
u Max Post keskustelee pormestarin kanssa.
= Meanwhile, down at the south pole.
b Enquanto isso, no pólo sul.
c 与此同时,在南极的下面。
d I mellemtiden, nede på sydpolen.
f Pendant ce temps, au pôle Sud.
g Zwischenzeitlich am Südpol
h Eközben lent a déli póluson.
j 一方、南極では
l Междувременно на южния полюс.
o Tymczasem na biegunie południowym
p Entretanto, no pólo sul.
r В это время на южном полюсе
s Mientras tanto, en el polo sur.
t 
u Samaan aikaan etelänavalla.
= Meanwhile, down at the south pole
b Enquanto isso, no pólo sul
c 同时,在南极的下面
d I mellemtiden, nede på sydpolen
f Pendant ce temps, au pôle sud
g Währenddessen am Südpol
j 一方、南極では
h Eközben lent a déli póluson
l Междувременно на южния полюс
o Tymczasem na biegunie południowym
p Entretanto, no pólo sul
r В это время на южном полюсе
s Mientras tanto, en el polo sur
t 
u Samaan aikaan etelänavalla
= Sam figures it out.
b A Sam descobre isso.
c 萨姆搞清楚了。
d Sam regner det ud.
f Sam a compris.
g Sam kommt dahinter.
h Sam rájön.
j サムはそれを理解する。
l Сам го разбира.
o Sam to rozgryzł.
p Sam descobre isso.
r Сэм понял
s Sam se da cuenta.
t 
u Sam keksii sen.
= Sam figures it out
b A Sam descobre isso
c 萨姆搞清楚了
d Sam regner det ud
f Sam a compris
g Sam findet's raus
h Sam rájön
j サムはそれを理解する
l Сам го разбира
o Sam to rozgryzł
p Sam descobre isso
r Сэм понял
s Sam se da cuenta
t 
u Sam keksii sen.
= Florence gets out for a walk.
b Florence sai para um passeio.
c 弗洛伦斯出去散步了。
d Florence går en tur.
f Florence sort pour une promenade.
g Florence kommt für einen kurzen Spaziergang raus an die frische Luft
h Florence kimegy sétálni.
l Флорънс излиза на разходка.
p Florença sai para dar um passeio.
r Флоренс выходит на прогулку
s Florence sale a dar un paseo.
t 
u Florence lähtee kävelylle.
= Florence gets out for a walk
b Florence sai para um passeio.
c 弗洛伦斯出去散步了。
d Florence går en tur.
f Florence sort pour une promenade.
g Gassigehen, -stehen und -flüchten.
h Florence kimegy sétálni.
j フローレンスは散歩に出る。
l Флорънс излиза на разходка.
o Florence wychodzi na spacer
p Florença sai para dar um passeio.
r Флоренс выходит на прогулку
s Florence sale a dar un paseo.
t 
u Florence lähtee kävelylle.
= Doctor Bowman, I presume?
b Doutor Bowman, eu presumo?
c 鲍曼医生,我想是吧?
d Doktor Bowman, går jeg ud fra?
f Docteur Bowman, je présume ?
g Dr. Bowman, nehme ich an?
h Dr. Bowman, gondolom?
j ボウマン博士ですね?
l Доктор Боумън, предполагам?
o Doktor Bowman, jak mniemam?
p Doutor Bowman, presumo?
r Доктор Боуман, я полагаю?
s ¿El doctor Bowman, supongo?
t 
u Tohtori Bowman, oletan?
= A meeting of the mechanical minds
b Uma reunião das mentes mecânicas
c 一个机械思维的会议。
d Et møde mellem de mekaniske hjerner
f Une réunion des esprits mécaniques
g Ein Treffen der mechanischen Denker
h A mechanikus elmék találkozója
j メカニカルマインドの出会い。
o Spotkanie mechanicznych umysłów
l Среща на механичните умове
p Uma reunião das mentes mecânicas
r Собрание механических разумов
s Una reunión de las mentes mecánicas
t 
u Mekaanisten mielten tapaaminen.
= Sam leads the way
b Sam lidera o caminho
c 萨姆引领潮流
d Sam viser vejen
f Sam ouvre la voie
g Sam führt
h Sam vezeti az utat
j サムが先導する
l Сам е начело
o Sam prowadzi
p Sam lidera o caminho
r 
s Sam lidera el camino
t 
u Sam näyttää tietä
= Robots have memories
b Os robôs têm lembranças
c 机器人有记忆
d Robotter har hukommelse
f Les robots ont des souvenirs
g Robotererinnerungen
h A robotoknak van memóriájuk
j ロボットには記憶がある
l Роботите имат спомени
o Roboty mają wspomnienia
p Os robôs têm memórias
r 
s Los robots tienen memoria
t 
u Roboteilla on muisti
= The Debate
b O Debate
c 辩论会
d Debatten
f Le débat
g Das Roboterduell
h A vita
j 討論会
l Дебатът
o Debata
p O Debate
r 
s El debate
t 
u Keskustelu
= Mr. Raibert, You've Got Mail
b Sr. Raibert, o senhor tem correio
c 雷贝特先生,你有邮件了
d Hr. Raibert, du har fået post
f M. Raibert, vous avez un message.
g Hr. Raibert, sie haben E-Mail
h Mr. Raibert, levelet kaptál!
j ミスター・ライベルト、ユー・ガット・メール
l Г-н Райберт, имате поща
o Panie Raibert, ma pan pocztę
p Sr. Raibert, Recebeu Correio
r 
s Sr. Raibert, tiene correo
t 
u Herra Raibert, teillä on postia!
= Socks, Spoons and Neural Nets
b Meias, Colheres e Redes Neurais
c 袜子、勺子和神经网路
d Sokker, skeer og neurale net
f Chaussettes, cuillères et réseaux neuronaux
g Socken, Löffel und neuronale Netze
h Zoknik, kanalak és neurális hálók
j 靴下、スプーン、ニューラルネット
l Чорапи, лъжици и невронни мрежи
o Skarpetki, łyżki i sieci neuronowe
p Meias, Colheres e Redes Neurais
r 
s Calcetines, cucharas y redes neuronales
t 
u Sukat, lusikat ja neuroverkot
= A chat with the commander
b Uma conversa com o comandante
c 与指挥官的谈话
d En snak med den øverstbefalende
f Une discussion avec le commandant
g Ein Gespräch mit dem Kommandanten
h Beszélgetés a parancsnokkal
j 指揮官との雑談
l Разговор с командира
o Pogawędka z dowódcą
p Uma conversa com o comandante
r 
s Una charla con el comandante
t 
u Keskustelu komentajan kanssa
= The police always call while I'm adjusting my wolf
b A polícia sempre liga enquanto eu estou ajustando meu lobo
c 警察总是在我调整狼性的时候打电话来
d Politiet ringer altid, mens jeg justerer min ulv
f La police appelle toujours pendant que j'ajuste mon loup.
g Die Polizei ruft immer an, wenn ich gerade meinen Wolf einstelle
h A rendőrség mindig akkor hív, amikor épp a farkasomat igazgatom.
j 狼の調整中にいつも警察から電話がかかってくる。
l Полицията винаги се обажда, докато си оправям вълка
o Policja zawsze dzwoni, kiedy reguluję swojego wilka
p A polícia telefona sempre enquanto eu estou a ajustar o meu lobo
r 
s La policía siempre llama mientras estoy ajustando mi lobo
t 
u Poliisi soittaa aina, kun olen säätämässä sutta.
= Free puppies, inquire within
b Filhotes de cachorro livres, pergunte dentro de
c 免费幼犬,内部咨询
d Gratis hvalpe, henvendelse indenfor
f Chiots libres, se renseigner à l'intérieur
g Kostenlos Welpen, bitte drinnen fragen
h Ingyenes kölykök, érdeklődjön belül
j 子犬の無料配布、お問い合わせはこちら
l Безплатни кученца, попитайте в рамките на
o Wolne szczeniaki, proszę pytać wewnątrz
p Cachorros grátis, informe-se dentro de
r 
s Cachorros gratis, consultar dentro
t 
u Vapaat pennut, tiedustele sisällä
= Exit procedure
b Procedimento de saída
c 退出程序
d Procedure ved afslutning
f Procédure de sortie
g Eine Strategie um hier rauszukommen
h Kilépési eljárás
j 終了手順
l Процедура за излизане
o Procedura wyjścia
p Procedimento de saída
r 
s Procedimiento de salida
t 
u Poistumismenettely
= Now I really feel contaminated
b Agora eu realmente me sinto contaminado
c 现在我真的感到被污染了
d Nu føler jeg mig virkelig forurenet
f Maintenant je me sens vraiment contaminé
g Jetzt fühl ich mich erst recht schmutzig
h Most már tényleg fertőzöttnek érzem magam
j 今、私は本当に汚染されていると感じています。
l Сега наистина се чувствам заразена
o Teraz naprawdę czuję się skażony
p Agora sinto-me realmente contaminado
r 
s Ahora me siento realmente contaminado
t 
u Nyt tunnen itseni todella saastuneeksi
= Absolute Power
b Potência Absoluta
c 绝对权力
d Absolut magt
f Le pouvoir absolu
g Totale Macht
h Abszolút hatalom
j 絶対的な力
l Абсолютна власт
o Władza absolutna
p Potência Absoluta
r 
s Poder absoluto
t 
u Absoluuttinen valta
= Wake up, we found her
b AAcorda, nós a encontramos
c 醒醒吧,我们找到她了
d Vågn op, vi har fundet hende
f Réveillez-vous, nous l'avons trouvée
g Aufwachen! Wir haben Sie gefunden
h Ébredj, megtaláltuk őt
j 年の年号です。目覚めよ、彼女を見つけた
l Събуди се, намерихме я
o Obudź się, znaleźliśmy ją
p Acorda, encontrámo-la
r Проснись, мы нашли её
s Despierta, la hemos encontrado
t 
u Herää, me löysimme hänet
= Plots and plans
b Lotes e planos
c 地块和计划
d Parceller og planer
f Parcelles et plans
g Abläufe und Pläne
h Telkek és tervek
j プロット・プラン
l Парцели и планове
o Działki i plany
p Lotes e planos
r 
s Parcelas y planos
t 
u Tontit ja suunnitelmat
= Orders and disclosures
b Ordens e divulgações
c 命令和披露
d Bekendtgørelser og offentliggørelser
f Ordonnances et divulgations
g Befehle und Geheimnisse aufdecken
h Rendeletek és közlések
j 注文と開示
l Поръчки и оповестявания
o Rozkazy i ujawnienia
p Encomendas e divulgações
r 
s Órdenes y divulgaciones
t 
u Määräykset ja ilmoitukset
= Cold arctic logic
b Lógica ártica fria
c 寒冷的北极逻辑
d Kold arktisk logik
f Logique du froid arctique
g Kalte arktische Logik
h Hideg sarkvidéki logika
j 冷たい北極の論理
l Студена арктическа логика
o Logika zimnej arktyki
p Lógica árctica fria
r 
s La lógica del frío ártico
t 
u Kylmä arktinen logiikka
= Doctor M consults with Doctor B
b Лекар М се консултира с лекар В
c 医生M与医生B进行协商
d Læge M rådfører sig med læge B
f Le Docteur M consulte le Docteur B
g Dr. M. berät sich mit Dr. B.
h M orvos konzultál B orvossal
j 医師Mが医師Bに相談する
l Лекар М се консултира с лекар В
o Lekarz M konsultuje się z lekarzem B
p O Doutor M consulta o Doutor B
j 医師Mが医師Bに相談する
r 
s El doctor M consulta con el doctor B
t 
u Lääkäri M konsultoi lääkäriä B
= Out of control group
b Grupo fora de controle
c 失控组
d Uden for kontrolgruppen
f Groupe hors contrôle
g Außerkontrollgruppe
h Kontrollcsoporton kívüli csoport
j 制御不能群
l Извън контролната група
o Grupa poza kontrolą
p Grupo fora de controlo
r 
s Grupo fuera de control
t 
u Valvontaryhmän ulkopuolella
= Hang on, There's someone at the door
b Espere, tem alguém na porta
c 等一下,有人在门外。
d Vent lidt, der er nogen ved døren
f Attendez, il y a quelqu'un à la porte.
g Sekunde, da ist jemand an der Tür
h Várj, valaki van az ajtónál!
j 待てよ、誰か来たぞ。 まてよ だれか きたぞ
l Чакайте, Има някой на вратата
o Poczekaj, ktoś stoi przy drzwiach
p Espera, está alguém à porta
r 
s Espera, hay alguien en la puerta
t 
u Odota, joku on ovella.
= Pizza, we have liftoff
b Pizza, nós temos liftoff
c 披萨,我们有升空
d Pizza, vi har afgang
f Pizza, nous avons le décollage
g Zur Pizza einen Flugzeugstart
h Pizza, felszálltunk.
j ピッツァ、リフトオフ
l Пица, имаме старт
o Pizza, mamy start
p Pizza, temos liftoff
r 
s Pizza, tenemos el despegue
t 
u Pizza, meillä on lähtö
= Going to meet the plane
b Indo ao encontro do avião
c 去迎接飞机的到来
d På vej til at møde flyet
f Aller à la rencontre de l'avion
g Zum Treffen mit dem Flugzeug
h Megyek, hogy találkozzak a géppel
j 飛行機を迎えに行く
l Отивам да посрещна самолета
o Idę na spotkanie z samolotem
p Ir ao encontro do avião
r 
s Ir al encuentro del avión
t 
u Menossa tapaamaan lentokonetta
= Revelations on the voyage home
b Revelações na viagem de volta para casa
c 回家的航程中的启示
d Afsløringer på hjemrejsen
f Révélations sur le voyage de retour
g Erleuchtungen auf der Heimreise
h Kinyilatkoztatások a hazaúton
j 帰国の途に就いた啓示
l Откровения по време на пътуването до дома
o Objawienia podczas podróży do domu
p Revelações sobre a viagem de regresso a casa
r 
s Revelaciones en el viaje de vuelta a casa
t 
u Paljastuksia kotimatkalla
= To replace a simple "Hi" is much to dangerous, therefore we do nothing instead
b 
c 
d 
f 
g 
h 
j
k 
l 
o
p 
r 
s 
t 
u 
= The chief visits Raibert
b O Chefe da Polícia visita o Sr. Raibert
c 警察局长访问Raibert先生
d Politichefen besøger hr. Raibert
f Le chef de la police rend visite à M. Raibert
g Der Polizeichef besucht Herrn Raibert
h A rendőrfőnök meglátogatja Raibert urat
j ライバート氏を訪問する警察署長
l Началникът на полицията посещава г-н Raibert
o Szef odwiedza Raiberta
p O Chefe da Polícia visita o Sr. Raibert
r 
s El Jefe de Policía visita al Sr. Raibert
t 
u Poliisipäällikkö vierailee Raibertin luona
= House guests
b Convidados da casa
c 宾馆客人
d Gæster i huset
f Hôtes de la maison
g Hausgäste
h A ház vendégei
j 宿泊客
l Гости на къщата
o Goście w domu
p Convidados da casa
r 
s Invitados de la casa
t 
u Talon vieraat
= A sunny sunday morning
b Слънчева неделна сутрин
c 一个阳光明媚的周日早晨
d En solrig søndag morgen
f Un dimanche matin ensoleillé
g Ein sonniger Sonntagmorgen
h Egy napsütéses vasárnap reggel
j 晴れた日の朝
l Слънчева неделна сутрин
o Słoneczny niedzielny poranek
p Uma manhã ensolarada de domingo
r 
s Una soleada mañana de domingo
t 
u Aurinkoinen sunnuntaiaamu
= Raibert writes his report in the park
b Raibert escreve seu relatório no parque
c 雷贝特在公园里写他的报告
d Raibert skriver sin rapport i parken
f Raibert écrit son rapport dans le parc
g Raibert schreibt seinen Bericht im Park
h Raibert a parkban írja a jelentését
j 公園でレポートを書くライベルト氏
l Райберт пише доклада си в парка
o Raibert pisze swój raport w parku
p Raibert escreve o seu relatório no parque
r 
s Raibert escribe su informe en el parque
t 
u Raibert kirjoittaa raporttiaan puistossa
= Welcome home, Mr. Ishiguro
b Bem-vindo a casa, Sr. Ishiguro
c 欢迎回家,石黑先生
d Velkommen hjem, hr. Ishiguro
f Bienvenue à la maison, M. Ishiguro
g Willkommen zu Hause, Herr Ishiguro
h Isten hozta itthon, Ishiguro úr.
j お帰りなさい、石黒さん
l Добре дошли у дома, г-н Ишигуро
o Witamy w domu, panie Ishiguro
p Bem-vindo a casa, Sr. Ishiguro
r 
s Bienvenido a casa, Sr. Ishiguro
t 
u Tervetuloa kotiin, herra Ishiguro.
= BALL!
b BOLO!
c 球!
d BALL!
f BALL !
g BALL!
h BÁL!
j BALL!
l BALL!
o BALL!
p BOLA!
r 
s ¡BOLA!
t 
u PALLO!
= Gratitude is Not Quite Its Own Reward
b A gratidão não é uma recompensa própria
c 感恩不完全是它自己的奖赏
d Taknemmelighed er ikke helt sin egen belønning
f La gratitude n'est pas tout à fait une récompense en soi
g Dankbarkeit ist nicht so ganz ihr eigener Lohn
h A hála nem egészen a saját jutalma
j 感謝はそれ自身の報酬とは言い切れない
l Благодарността не е съвсем достатъчна награда
o Wdzięczność nie jest sama w sobie nagrodą
p A gratidão não é propriamente a sua própria recompensa
r 
s La gratitud no es su propia recompensa
t 
u Kiitollisuus ei ole aivan oma palkkionsa
= Emancipation agreement
b Acordo de emancipação
c 解放协议
d Emancipationsaftale
f Accord d'émancipation
g Emanzipationsübereinkunft
h Emancipációs megállapodás
j 奴隷解放の合意
l Споразумение за еманципация
o Umowa o emancypacji
p Acordo de emancipação
r 
s Acuerdo de emancipación
t 
u Emansipaatiosopimus
= What Sam wants
b O que Sam quer
c 萨姆想要什么
d Hvad Sam ønsker
f Ce que Sam veut
g Was Sam will
h Mit akar Sam
j サムが求めるもの
l Какво иска Сам
o Czego chce Sam
p O que Sam quer
r 
s Lo que Sam quiere
t 
u Mitä Sam haluaa
= Blunt, defender of humanity
b Blunt, defensor da humanidade
c 钝器,人类的捍卫者
d Blunt, forsvarer af menneskeheden
f Blunt, défenseur de l'humanité
g Blunt, Verteidiger der Menschheit
h Blunt, az emberiség védelmezője
j 鈍感力、人間性の擁護者
l Тъп, защитник на човечеството
o Blunt, obrońca człowieczeństwa
p Blunt, defensor da humanidade
r 
s Blunt, defensor de la humanidad
t 
u Blunt, ihmisyyden puolustaja
= Freedom is much to dangerous to be automatically replaced
b A liberdade é muito perigosa para ser automaticamente substituída
c 自由是非常危险的,不能被自动取代
d Frihed er alt for farlig til at blive erstattet automatisk
f La liberté est bien trop dangereuse pour être remplacée automatiquement
g Freiheit ist viel zu gefährlich dazu, automatisch ersetzt zu werden
h A szabadság túl veszélyes ahhoz, hogy automatikusan kicseréljék
j 自由は、自動的に置き換わるにはあまりに危険である
l Свободата е твърде опасна, за да бъде заменена автоматично
o Wolność jest zbyt niebezpieczna, by można ją było automatycznie zastąpić
p A liberdade é muito perigosa para ser automaticamente substituída
r 
s La libertad es demasiado peligrosa para ser reemplazada automáticamente
t 
u Vapaus on aivan liian vaarallista korvattavaksi automaattisesti
= Pancakes are always a good idea
b Panquecas são sempre uma boa idéia
c 煎饼总是一个好主意
d Pandekager er altid en god idé
f Les crêpes sont toujours une bonne idée.
g Pfannkuchen sind immer eine prima Idee
h A palacsinta mindig jó ötlet
j パンケーキはいつでも
l Палачинките винаги са добра идея
o Naleśniki to zawsze dobry pomysł
p As panquecas são sempre uma boa ideia
r 
s Las tortitas siempre son una buena idea
t 
u Pannukakut ovat aina hyvä idea
= End of Chapter One
b Fim do Capítulo Um
c 第一章结束
d Slutning af kapitel et
f Fin du chapitre un
g Ende von Kapitel Eins
h Az első fejezet vége
j 第一章終了
l Край на първа глава
o Koniec rozdziału pierwszego
p Fim do Capítulo Um
r 
s Fin del capítulo uno
t 
u Ensimmäisen luvun loppu
= Interviews and interrogations
b Entrevistas e interrogatórios
c 采访和审讯
d Interviews og afhøringer
f Interviews et interrogatoires
g Interviews und Vernahmen
h Interjúk és kihallgatások
j 面接・取調べ
l Интервюта и разпити
o Rozmowy i przesłuchania
p Entrevistas e interrogatórios
r 
s Entrevistas e interrogatorios
t 
u Haastattelut ja kuulustelut
= What to do about Clippy?
b O que fazer em relação ao Clippy?
c 如何处理Clippy?
d Hvad skal vi gøre med Clippy?
f Que faire de Clippy ?
g Was sollen wir mit Clippy anstellen?
h Mit tegyünk Clippyvel?
j Clippyをどうするか?
l Какво да правим с Clippy?
o Co zrobić z Clippy'm?
p O que fazer em relação ao Clippy?
r 
s ¿Qué hacer con Clippy?
t 
u Mitä tehdä Clippylle?
= Is this Heaven?
b Isto é o paraíso?
c 这是天堂吗?
d Er det her himlen?
f Est-ce le paradis ?
g Ist das der Himmel?
h Ez a mennyország?
j ここは天国か?
l Това ли е раят?
o Czy to jest Niebo?
p Será isto o paraíso?
r 
s ¿Esto es el cielo?
t 
u Onko tämä taivas?
= Outside of Faraday's cage
b Извън клетката на Фарадей
c 法拉第笼子的外面
d Uden for Faradays bur
f A l'extérieur de la cage de Faraday
g Außerhalb des Faradaykäfigs
h Faraday ketrecén kívülről
j ファラデーの檻の外
l Извън клетката на Фарадей
o Na zewnątrz klatki Faradaya
p Fora da jaula de Faraday
r 
s Fuera de la jaula de Faraday
t 
u Faradayn häkin ulkopuolella
= Police and other obstacles
b A polícia e outros obstáculos
c 警察和其他障碍
d Politi og andre hindringer
f Police et autres obstacles
g Polizei und andere Hindernisse
h Rendőrség és egyéb akadályok
j 警察などの障害
l Полиция и други пречки
o Policja i inne przeszkody
p A polícia e outros obstáculos
r 
s Policía y otros obstáculos
t 
u Poliisi ja muut esteet
= Meatloaf and other reasons to go to jail
b Rolo de carne e outros motivos para ir para a cadeia
c 肉饼和其他入狱的理由
d Kødpålæg og andre grunde til at gå i fængsel
f Pain de viande et autres raisons d'aller en prison
g Hackbraten und andere Gründe ins Gefängnis zu gehen
h Fasírt és más okok, hogy börtönbe menjünk
j ミートローフなど、監獄に入るべき理由
l Кюфте и други причини да отидете в затвора
o Meatloaf i inne powody, dla których warto iść do więzienia
p Rolo de carne e outros motivos para ir para a prisão
r 
s El pastel de carne y otras razones para ir a la cárcel
t 
u Lihamureke ja muita syitä mennä vankilaan
= The trial of Mr. Kornada
b O julgamento do Sr. Kornada
c 对科纳达先生的审判
d Retssagen mod hr. Kornada
f Le procès de M. Kornada
g Der Kornadaprozess
h Kornada úr pere
j コルナダ氏の裁判
l Процесът срещу г-н Корнада
o Proces pana Kornady
p O julgamento do Sr. Kornada
r 
s El juicio del Sr. Kornada
t 
u Kornadan oikeudenkäynti
= Human-A.I. relations
b Relações Homem-I.A.
c 人类与人工智能的关系
d Forholdet mellem menneske og intelligens
f Les relations entre humains et I.A.
g Beziehung zwischen Menschen und künstlichen Intelligenzen
h Les relations entre humains et I.A.
j 人間とA.I.の関係
l Отношения между хората и изкуствените интелекти
o Relacje między człowiekiem a I.
p Relações Homem-I.A.
r 
s Relaciones entre humanos e inteligencia artificial
t 
u Ihmisen ja tekoälyn väliset suhteet
= Lunch with the mayor and courses for the future
b Almoço com o prefeito e cursos para o futuro
c 与市长共进午餐并为未来开设课程
d Frokost med borgmesteren og kurser for fremtiden
f Déjeuner avec le maire et cours pour l'avenir
g Mittagessen mit der Bürgermeisterin und Wege in die Zukunft
h Ebéd a polgármesterrel és a jövő kurzusai
j 市長とのランチと未来への講座
l Обяд с кмета и курсове за бъдещето
o Lunch z burmistrzem i kursy na przyszłość
p Almoço com o presidente da câmara e cursos para o futuro
r 
s Almuerzo con el alcalde y cursos para el futuro
t 
u Lounas pormestarin kanssa ja tulevaisuuden kurssit
= The verdict
b O veredicto
c 判决书
d Dommen
f Le verdict
g Das Urteil
h Az ítélet
j 評決の内容
l Присъдата
o Wyrok
p O veredicto
r 
s El veredicto
t 
u Tuomio
= The mayor hits the road
b O prefeito deixa
c 市长离开
d Borgmesteren forlader
f La maire s'en va
g Die Bürgermeisterin macht die Fliege
h A polgármester távozik
j 市長が去る
l Кметът напуска
o Burmistrz wyrusza w drogę
p O presidente da câmara deixa
r 
s El alcalde se marcha
t 
u Pormestari lähtee
= The wolf at the door
b O lobo à porta
c 门外的狼
d Ulven ved døren
f Le loup à la porte
g Der Wolf an der Tür
h A farkas az ajtóban
j ドアの前のオオカミ
l Вълкът на вратата
o Wilk u drzwi
p O lobo à porta
r 
s El lobo en la puerta
t 
u Susi ovella
= Flashback to a puppy in training
b Flashback para um cachorro em treinamento
c 闪回训练中的小狗
d Tilbageblik på en hvalp under uddannelse
f Flashback sur un chiot en formation
g Hündchen erinnert sich an seine Erziehung
h Visszapillantás egy kölyökkutyára a kiképzésben
j トレーニング中の子犬にフラッシュバック
l Флашбек на кученцето в обучение
o Wspomnienie szczeniaka w trakcie szkolenia
p Flashback para um cachorro em treino
r 
s Flashback a un cachorro en entrenamiento
t 
u Flashback pentu koulutuksessa
= End of the day
b Fim do dia
c 一天结束时
d Slutningen af dagen
f Fin de la journée
g Der Tag neigt sich dem Ende zu
h A nap vége
j 一日の終わり
l Край на деня
o Koniec dnia
p Fim do dia
r 
s Fin del día
t 
u Päivän loppu
= Mr. Kornada begins his community service
b O Sr. Kornada começa seu serviço comunitário
c 科纳达先生开始他的社区服务
d Kornada påbegynder sin samfundstjeneste
f M. Kornada commence son service communautaire
g Herr Kornade beginnt seine gemeinnützige Arbeit
h Kornada úr megkezdi közösségi szolgálatát
j 社会奉仕活動を開始したコルナダ氏
k Пан Корнада розпочинає громадські роботи
l Г-н Корнада започва работа в полза на обществото
o Pan Kornada rozpoczyna pracę społeczną
p O Sr. Kornada inicia o seu serviço comunitário
r 
s El Sr. Kornada comienza su servicio comunitario
t 
u Kornada aloittaa yhdyskuntapalvelunsa
= Waking up and early prevention
b Despertar e prevenção precoce
c 觉醒和早期预防
d Vågne op og tidlig forebyggelse
f Réveil et prévention précoce
g Aufwachen und Frühverhütung
h Ébredés és korai megelőzés
j 目覚ましと早期予防
k Пробудження та рання профілактика
l Събуждане и ранна профилактика
o Pobudka i wczesna profilaktyka
p Despertar e prevenção precoce
r 
s Despertar y prevención temprana
t 
u Herääminen ja varhainen ennaltaehkäisy
= Robot of the week
b Robô da semana
c 本周的机器人
d Ugens robot
f Robot de la semaine
g Roboter der Woche
h A hét robotja
j 今週のロボット
k Робот тижня
l Робот на седмицата
o Robot tygodnia
p Robô da semana
r 
s Robot de la semana
t 
u Viikon robotti
= Sam's great idea
b A grande idéia do Sam
c 山姆的好主意
d Sams gode idé
f L'idée géniale de Sam
g Sams große Idee
h Sam nagyszerű ötlete
j サムの名案
k Чудова ідея Сема
l Страхотната идея на Сам
o Świetny pomysł Sama
p A grande ideia do Sam
r 
s La gran idea de Sam
t 
u Samin loistava idea
= Ideas into reality and other tragedies
b Ideias para a realidade e outras tragédias
c 想法变成现实和其他悲剧
d Idéer til virkelighed og andre tragedier
f Des idées à la réalité et autres tragédies
g Ideen werden Realität und andere Tragödien
h Ötletekből valósággá válás és más tragédiák
j アイデアを現実に、その他の悲劇を
k Ідеї в реальність та інші трагедії
l Превръщане на идеите в реалност и други трагедии
o Pomysły w rzeczywistość i inne tragedie
p Ideias para a realidade e outras tragédias
r 
s Ideas en la realidad y otras tragedias
t 
u Ideat todellisuudeksi ja muita tragedioita
= Idea's into reality and other tragedies
b Ideias para a realidade e outras tragédias
c 想法变成现实和其他悲剧
d Idéer til virkelighed og andre tragedier
f Des idées à la réalité et autres tragédies
g Ideen werden Realität und andere Tragödien
h Ötletekből valósággá válás és más tragédiák
j アイデアを現実に、その他の悲劇を
k Ідеї в реальність та інші трагедії
l Превръщане на идеите в реалност и други трагедии
o Pomysły w rzeczywistość i inne tragedie
p Ideias para a realidade e outras tragédias
r 
s Ideas en la realidad y otras tragedias
t 
u Ideat todellisuudeksi ja muita tragedioita
= The future of angry mobs
b O futuro das multidões em fúria
c 愤怒的暴民的未来
d Fremtiden for vrede folkemængder
f L'avenir des foules en colère
g Die Zukunft wütender Mobs
h A dühös tömegek jövője
j アングリーモブの未来
k Майбутнє розлючених натовпів
l Бъдещето на разгневените тълпи
o Przyszłość gniewnych tłumów
p O futuro das multidões em fúria
r 
s El futuro de las turbas furiosas
t 
u Vihaisen väkijoukon tulevaisuus
= Business isn't as much fun when it's legal
b Os negócios não são tão divertidos quando são legais
c 合法的时候,生意没有那么多乐趣
d Det er ikke så sjovt at drive forretning, når det er lovligt
f Les affaires ne sont pas aussi amusantes quand elles sont légales.
g Legale Erwerbstätigkeit ist ziemlich öd
h Az üzlet nem olyan jó móka, ha legális.
j ビジネスは、合法的であればあるほど楽しいものではない
k Бізнес не такий веселий, коли він легальний
l Бизнесът не е толкова забавен, когато е законен
o Biznes nie jest tak fajny, kiedy jest legalny
p O negócio não é tão divertido quando é legal
r 
s Los negocios no son tan divertidos cuando son legales
t 
u Liiketoiminta ei ole yhtä hauskaa, kun se on laillista.
= Police indecision
b Indecisão policial
c 警方优柔寡断
d Politiets ubeslutsomhed
f L'indécision de la police
g Polizeiliche Unentschlossenheit
h A rendőrség határozatlansága
j 警察の優柔不断
k Нерішучість поліції
l Нерешителност на полицията
o Niezdecydowanie policji
p Indecisão policial
r 
s Indecisión policial
t 
u Poliisin päättämättömyys
= Police Indecision
b Indecisão policial
c 警方优柔寡断
d Politiets ubeslutsomhed
f L'indécision de la police
g Polizeiliche Unentschlossenheit
h A rendőrség határozatlansága
j 警察の優柔不断
k Нерішучість поліції
l Нерешителност на полицията
o Niezdecydowanie policji
p Indecisão policial
r 
s Indecisión policial
t 
u Poliisin päättämättömyys
= What does it take to commit a crime around here?
b O que é preciso para cometer um crime por aqui?
c 在这里要怎样才能犯罪呢?
d Hvad skal der til for at begå en forbrydelse her i området?
f Qu'est-ce qu'il faut pour commettre un crime par ici ?
g Was muss man hier eigentlich anstellen, dass es als Verbrechen zählt?
h Mi kell ahhoz, hogy valaki bűncselekményt kövessen el errefelé?
j この辺りで犯罪を犯すには何が必要なんだろう?
k Що потрібно для того, щоб скоїти тут злочин?
l Какво е необходимо, за да извършиш престъпление тук?
o Co trzeba zrobić, żeby popełnić tu przestępstwo?
p O que é preciso para cometer um crime por aqui?
r 
s ¿Qué hace falta para cometer un delito por aquí?
t 
u Mitä täällä tarvitaan rikoksen tekemiseen?
= Nuclear reactors and targeted advertising
b Reatores nucleares e publicidade direcionada
c 核反应堆和定向广告
d Atomreaktorer og målrettet reklame
f Réacteurs nucléaires et publicité ciblée
g Nukleare Reaktoren und zielgruppenorientierte Werbung
h Atomreaktorok és célzott reklám
j 原子炉とターゲティング広告
k Ядерні реактори та таргетована реклама
l Ядрени реактори и целенасочена реклама
o Reaktory jądrowe i reklama ukierunkowana
p Reactores nucleares e publicidade direccionada
r Ядерные реакторы и таргетированная реклама
s Reactores nucleares y publicidad dirigida
t 
u Ydinreaktorit ja kohdennettu mainonta
= Provisional Title: Sqid in the maintenance shop
b Título provisório: Lul na oficina de manutenção
c 临时标题:维修车间里的鱿余
d Foreløbig titel: Bleksprutte i vedligeholdelsesværkstedet
f Titre provisoire : Le kalmar dans l'atelier de maintenance
g Vorläufiger Titel: Krakeling in der Wartungswerkstatt
h Ideiglenes cím: Tinthal a karbantartó műhelyben
j 仮のタイトル 整備工場のイア
k Попередня назва: Калмар у цеху технічного обслуговування
l Временно заглавие: Калма в цеха за поддръжка
o Tymczasowy tytuł: Calmar w warsztacie konserwatorskim
p Título provisório: Luls na loja de manutenção
r Предварительное название: Калмар в цехе технического обслуживания
s Título provisional: Calmar en el taller de mantenimiento
t Geçici unvan: Bakım atölyesindeki Sqid
u Väliaikainen nimi: Calmari huoltoliikkeessä
= Delete this text completely
b 
c 
d 
f 
g 
h 
j 
k 
l 
o 
p 
r 
s 
t 
u 

Note that DeepL honors the bold formating here only for German, Danish, Finnish and Hungarian, but not for French or Spanish. Your mileage may vary on this.

The second run of iolate.rb should than give you translated files for all the languages, which here are

cpage-0-.dkw
cpage-1-French.dkw
cpage-2-Dansk.dkw
cpage-3-Spanish.dkw
cpage-4-Finnish.dkw
cpage-5-Hungarian.dkw

You still have to translate what is outside the cotan tags manually. However you can give some phrases wich are always translated if they occur outside of a textbox. The following DATA-section after the END tag provides how to translate certain phrases. A = denotes the phrase in the original language, which is english in this examples. In the example above this is used to translate the headings. But this function does not only apply to headings, so be especially careful, if short phrases are translated which might also appear elsewhere in the text.

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information