fgo/0000755000175000017500000000000011444230667011214 5ustar robertrobertfgo/src/0000755000175000017500000000000011444230514011772 5ustar robertrobertfgo/docs/0000755000175000017500000000000011444225766012150 5ustar robertrobertfgo/src/locale/0000755000175000017500000000000011444230370013231 5ustar robertrobertfgo/src/pics/0000755000175000017500000000000011433336457012743 5ustar robertrobertfgo/src/help/0000755000175000017500000000000011435127726012734 5ustar robertrobertfgo/src/config/0000755000175000017500000000000011435130007013233 5ustar robertrobertfgo/src/locale/pl/0000755000175000017500000000000011417401165013646 5ustar robertrobertfgo/src/locale/en/0000755000175000017500000000000011417375712013645 5ustar robertrobertfgo/src/locale/nl/0000755000175000017500000000000011426401324013641 5ustar robertrobertfgo/src/locale/es/0000755000175000017500000000000011426401324013637 5ustar robertrobertfgo/src/locale/de/0000755000175000017500000000000011426401324013620 5ustar robertrobertfgo/src/locale/fr/0000755000175000017500000000000011417401404013636 5ustar robertrobertfgo/src/locale/pl/LC_MESSAGES/0000755000175000017500000000000011431576411015436 5ustar robertrobertfgo/src/locale/en/LC_MESSAGES/0000755000175000017500000000000011427420744015427 5ustar robertrobertfgo/src/locale/nl/LC_MESSAGES/0000755000175000017500000000000011427420744015436 5ustar robertrobertfgo/src/locale/es/LC_MESSAGES/0000755000175000017500000000000011432262122015422 5ustar robertrobertfgo/src/locale/de/LC_MESSAGES/0000755000175000017500000000000011433547204015413 5ustar robertrobertfgo/src/locale/fr/LC_MESSAGES/0000755000175000017500000000000011433443132015425 5ustar robertrobertfgo/fgo0000755000175000017500000000035611432424026011710 0ustar robertrobert#!/usr/bin/env python """It's a new, better way to start FGo! :)""" from sys import path from os.path import join from src import run SCRIPT_DIR = path[0] MAIN_DIR = 'src' WORKING_DIR = join(SCRIPT_DIR, MAIN_DIR) run(WORKING_DIR) fgo/src/__init__.py0000644000175000017500000000153211433172070014104 0ustar robertrobert#!/usr/bin/env python """FGo! - a simple GUI launcher for FlightGear Flight Simulator.""" from os import chdir from Tkinter import Tk from config import Config from gui import App def run(working_dir): """Initialize application.""" # Set current working dirrectory. chdir(working_dir) root = Tk() root.title('FGo!') # Initialize data object. data = Config() # Initialize main window. app = App(root, data) # Set window resolution. window_geometry = data.window_geometry.get() if window_geometry: root.geometry(window_geometry) # Override window close button, so TerraSync # can be stopped before closing the program. root.protocol("WM_DELETE_WINDOW", app.quit) root.mainloop() if __name__ == '__main__': from sys import path WORKING_DIR = path[0] run(WORKING_DIR) fgo/src/config.py0000644000175000017500000005010411444224026013612 0ustar robertrobert"""This module process data from ~/.fgo folder.""" import os import gzip import gettext import codecs from Tkinter import IntVar, StringVar from constants import * class Config: """Read/write and store all data from config files.""" def __init__(self): self.ai_path = '' # Path to FG_ROOT/AI directory. self.aircraft_dir = '' # Path to FG_ROOT/Aircraft directory. self.apt_path = '' # Path to FG_ROOT/Airports/apt.dat.gz file. self.metar_path = '' # Path to FG_ROOT/Airports/metar.dat.gz file. self.aircraft_list = [] # List of aircraft names. self.aircraft_path = [] # List of paths to each aircraft. self.airport_icao = [] # List of ICAO codes for each airport. self.airport_name = [] # List of airport names. self.airport_rwy = [] # List of runways present in each airport. self.scenario_list = [] # List of selected scenarios. # List of all aircraft carriers found in AI scenario folder. # Each entry format is: # ["ship's name", "parking position"... , "scenario's name"] self.carrier_list = [] self.settings = [] # List of all settings read from config file. self.text = '' # String to be shown in command line options window. self.aircraft = StringVar() self.airport = StringVar() self.apt_data_source = IntVar() self.carrier = StringVar() self.FG_bin = StringVar() self.FG_root = StringVar() self.FG_scenery = StringVar() self.FG_working_dir = StringVar() self.filtredAptList = IntVar() self.language = StringVar() self.park = StringVar() self.rwy = StringVar() self.scenario = StringVar() self.TS = IntVar() self.TS_bin = StringVar() self.TS_port = StringVar() self.TS_scenery = StringVar() self.window_geometry = StringVar() self.dictionary = {'--aircraft=' : self.aircraft, '--airport=' : self.airport, '--fg-root=' : self.FG_root, '--fg-scenery=' : self.FG_scenery, '--carrier=' : self.carrier, '--parkpos=' : self.park, '--runway=' : self.rwy, 'AI_SCENARIOS=' : self.scenario, 'APT_DATA_SOURCE=' : self.apt_data_source, 'FG_BIN=' : self.FG_bin, 'FG_WORKING_DIR=' : self.FG_working_dir, # Obsolete keyword, should be removed in the future. 'HOME_DIR=' : self.FG_working_dir, 'FILTER_APT_LIST=' : self.filtredAptList, 'LANG=' : self.language, 'TERRASYNC=' : self.TS, 'TERRASYNC_BIN=' : self.TS_bin, 'TERRASYNC_PORT=' : self.TS_port, 'TERRASYNC_SCENERY=': self.TS_scenery, 'WINDOW_GEOMETRY=' : self.window_geometry} self._createConfDirectory() self.update(first_run=True) def makeInstalledAptList(self): # if self.apt_data_source: # airports = self._findInstalledApt2() # else: # airports = self._findInstalledApt() airports = self._findInstalledApt() s = '\n'.join(airports) fout = open(INSTALLED_APT, 'w') fout.writelines(s) fout.close() def readCoord(self): """Read coordinates list (makes new one if non exists). Return dictionary of ICAO codes and its coordinates. """ try: # Make new file. if not os.path.exists(APT): self._makeApt() res = {} fin = open(APT) for line in fin: line = line.strip().split('=') icao = line[0] # Read coordinates. coords_line = line[-1].split(';') coords = (float(coords_line[0]), float(coords_line[1])) res[icao] = coords fin.close() return res except IOError: return None def readMetarDat(self): """Fetch METAR station list from metar.dat.gz file""" try: fin = gzip.open(self.metar_path) res = [] for line in fin: if not line.startswith('#'): line = line.strip() res.append(line) fin.close() return res except IOError: return ['IOError'] def rebuildApt(self): """Rebuild apt file.""" self._makeApt() def update(self, path=None, first_run=False): """Read config file and update variables. path is a path to different than default config file first_run specifies if TS_checkbutton and filtered airports list will be updated. """ del self.settings del self.text del self.aircraft_dir del self.apt_path del self.ai_path del self.metar_path del self.aircraft_list del self.aircraft_path del self.airport_icao del self.airport_name del self.airport_rwy del self.scenario_list del self.carrier_list self.aircraft.set(DEFAULT_AIRCRAFT) self.airport.set(DEFAULT_AIRPORT) self.apt_data_source.set(0) self.carrier.set('None') self.FG_bin.set('') self.FG_root.set('') self.FG_scenery.set('') self.FG_working_dir.set('') self.language.set('') self.park.set('None') self.rwy.set('Default') self.scenario.set('') self.TS_bin.set('') self.TS_port.set('') self.TS_scenery.set('') if first_run: self.TS.set(0) self.filtredAptList.set(0) self.settings = self._read(path) self.text = self._makeText() for line in self.settings: cut = line.find('=') + 1 if cut: name = line[:cut] value = line[cut:] if value: if name in self.dictionary: if name == 'FILTER_APT_LIST=' and not first_run: pass elif name == 'TERRASYNC=' and not first_run: pass else: var = self.dictionary[name] var.set(value) self.aircraft_dir = os.path.join(self.FG_root.get(), AIRCRAFT_DIR) self.apt_path = os.path.join(self.FG_root.get(), APT_DAT) self.ai_path = os.path.join(self.FG_root.get(), AI_DIR) self.metar_path = os.path.join(self.FG_root.get(), METAR_DAT) self.aircraft_list, self.aircraft_path = self._readAircraft() self.scenario_list, self.carrier_list = self._readScenarios() self.updateAptLists() self._setLanguage(self.language.get()) def updateAptLists(self): self.airport_icao, self.airport_name, self.airport_rwy = \ self._readApt() def write(self, text, path=None): """Write options to a file. text argument should be a content of text window path is a path to different than default config file. """ if not path: path = CONFIG options = [] keys = self.dictionary.keys() keys.sort() # Text processed_text = [] text = text.split('\n') for line in text: line = line.strip() cut = line.find('=') + 1 if cut: name = line[:cut] value = line[cut:] else: name = '' if name in keys: self.dictionary[name].set(value) else: if line != CUT_LINE: processed_text.append(line) processed_text = '\n'.join(processed_text) for k in keys: v = self.dictionary[k] if v.get() not in ('Default', 'None'): # Obsolete keyword, should be removed in the future. if k != 'HOME_DIR=': options.append(k + unicode(v.get())) s = '\n'.join(options) config_out = codecs.open(path, 'w', 'utf-8') config_out.write(s + '\n' + CUT_LINE + '\n') config_out.write(processed_text) config_out.close() # def _findInstalledApt(self): # """Walk thru all scenery, and find installed airports. # # Return names of btg.gz files that are shorter than five characters. # # """ # airport_dict = {} # sceneries = self.FG_scenery.get().split(':') # # for scenery in sceneries: # path = os.path.join(scenery, 'Terrain') # if os.path.exists(path): # tree = os.walk(path) # # for i in tree: # if i[2]: # for file in i[2]: # file = file.split('.') # try: # if len(file[0]) <= 4 and \ # file[1] == 'btg' and \ # file[2] == 'gz': # airport_dict[file[0]] = None # except IndexError: # pass # # res = airport_dict.keys() # res.sort() # # return res def _findInstalledApt(self): """Walk thru all scenery and find installed airports. Take geographic coordinates from directories names and compare them with airports coordinates in apt file. The result is a list of matching airports. """ coord_dict = {} sceneries = self.FG_scenery.get().split(':') for scenery in sceneries: path = os.path.join(scenery, 'Terrain') if os.path.exists(path): for dir in os.listdir(path): p = os.path.join(path, dir) for coords in os.listdir(p): converted = self._stringToCoordinates(coords) coord_dict[converted] = None apt_coords = self.readCoord() coords = coord_dict.keys() res = {} for k, v in apt_coords.items(): for c in coords: if v[0] > c[0][0] and v[0] < c[0][1] and \ v[1] > c[1][0] and v[1] < c[1][1]: res[k] = None res = res.keys() res.sort() return res def _calculateRange(self, coordinates): c = coordinates if c.startswith('s') or c.startswith('w'): c = int(c[1:]) * (-1) return c, c + 1 else: c = int(c[1:]) return c, c + 1 def _createConfDirectory(self): """Create config directory if non exists.""" if not os.path.exists(DATA_DIR): os.mkdir(DATA_DIR) def _makeApt(self): """Build apt database from apt.dat.gz""" if os.path.exists(self.apt_path): L = [] fin = gzip.open(self.apt_path) entry = '' lat, lon = 0.0, 0.0 runway_count = 0 for line in fin: # apt.dat is apparently using iso-8859-1 coding, # so we need to decode it to unicode. line = line.decode('iso-8859-1').encode('utf-8') code = line[:2] # Find ICAO and airport name. if code in ('1 ', '16', '17'): e = line.strip().split() name = [e[4], ' '.join(e[5:])] name = '='.join(name) entry = name # Find runways. elif code == '10': e = line.strip().split() if e[3] != 'xxx': rwy = e[3] if rwy.endswith('x'): rwy = rwy[:-1] entry += ('=' + rwy) if e[3] != 'xxx': lat += float(e[1]) lon += float(e[2]) runway_count += 1 if line == '\n' and entry: lat = lat / runway_count lon = lon / runway_count coords = ';'.join([str(lat), str(lon)]) entry = '='.join([entry, coords]) L.append(entry) lat, lon = 0.0, 0.0 runway_count = 0 fin.close() L.sort() fin = open(APT, 'w') for i in L: fin.write(str(i) + '\n') fin.close() def _makeText(self): """Filter config file entries to be shown in text window.""" L = [] for line in self.settings: cut = line.find('=') + 1 if cut: name = line[:cut] value = line[cut:] if name not in self.dictionary: L.append(name + value) else: L.append(line) return '\n'.join(L) def _read(self, path=None): """Read config file""" res = [] if not path: path = CONFIG # Use default config if no regular config exists. if not os.path.exists(path): # Find currently used language. try: lang_code = gettext.translation(MESSAGES, LOCALE_DIR).info()['language'] except IOError: lang_code = 'en' path = os.path.join(DEFAULT_CONFIG_DIR, lang_code) if not os.path.isfile(path): lang_code = 'en' path = os.path.join(DEFAULT_CONFIG_DIR, lang_code) # Load presets if exists. try: presets = codecs.open(PRESETS, encoding='utf-8') for line in presets: line = line.strip() if not line.startswith('#'): res.append(line) presets.close() except IOError: pass try: config_in = codecs.open(path, encoding='utf-8') for line in config_in: line = line.strip() if line != CUT_LINE: res.append(line) config_in.close() return res except IOError: return [''] def _readAircraft(self): """Walk through Aircraft directory and return two sorted lists: list of aircraft names and list of paths to them.""" try: n, p = [], [] for d in os.listdir(self.aircraft_dir): path = os.path.join(self.aircraft_dir, d) if os.path.isdir(path): for f in os.listdir(path): if f[-8:] == '-set.xml': # Dirty and ugly hack to prevent carrier-set.xml in # seahawk directory to be attached to the aircraft list. if path[-7:] == 'seahawk'\ and f == 'carrier-set.xml': pass else: name = f[:-8] n.append([name.lower(), name, path]) n.sort() for i in range(len(n)): p.append(n[i][2]) n[i] = n[i][1] return n, p except OSError: return [''], [] def _readApt(self): """Read apt list (makes new one if non exists). Return tuple of three lists: airports ICAO codes, airports names, airports runways Take a note that those lists are synchronized - each list holds information about the same airport at given index. """ try: # Make new file. if not os.path.exists(APT): self._makeApt() icao, name, rwy = [], [], [] fin = open(APT) if self.filtredAptList.get(): installed_apt = self._readInstalledAptList() for line in fin: line = line.strip().split('=') if line[0] in installed_apt: installed_apt.remove(line[0]) icao.append(line[0]) name.append(line[1]) # # Make runway list if "apt data source" # # is set to: Standard. # if not self.apt_data_source.get(): rwy_list = [] for i in line[2:-1]: rwy_list.append(i) rwy_list.sort() rwy.append(rwy_list) else: for line in fin: line = line.strip().split('=') icao.append(line[0]) name.append(line[1]) # # Make runway list if "apt data source" # # is set to: Standard. # if not self.apt_data_source.get(): rwy_list = [] for i in line[2:-1]: rwy_list.append(i) rwy_list.sort() rwy.append(rwy_list) fin.close() return icao, name, rwy except IOError: return [], [], [] def _readInstalledAptList(self): """Read locally installed airport list. Make new one if non exists. """ if not os.path.exists(INSTALLED_APT): self.makeInstalledAptList() res = [] fin = open(INSTALLED_APT) for line in fin: icao = line.strip() res.append(icao) fin.close() return res def _readScenarios(self): """Walk through AI scenarios and read carrier data. Return list of all scenarios and carrier data list """ try: carriers = [] scenarios = [] L = [] is_carrier = False for f in os.listdir(self.ai_path): path = os.path.join(self.ai_path, f) if os.path.isfile(path): if f.lower().endswith('xml'): scenarios.append(f[:-4]) fin = open(path) for line in fin: line = line.strip() if '' in line.lower(): typ = line[6:-7] if typ.lower() == 'carrier': is_carrier = True L = [] if '' in line.lower(): if L: L.append(f[:-4]) carriers.append(L) L = [] is_carrier = False if is_carrier: if '' in line.lower(): L.append(line[6:-7]) fin.close() carriers.sort() scenarios.sort() return scenarios, carriers except OSError: return [], [] def _setLanguage(self, lang): # Initialize provided language... try: L = gettext.translation(MESSAGES, LOCALE_DIR, languages=[lang]) L.install() # ...or fallback to system default. except: gettext.install(MESSAGES, LOCALE_DIR) def _stringToCoordinates(self, coordinates): """Convert geo coordinates to decimal format.""" lat = coordinates[4:] lon = coordinates[:4] lat_range = self._calculateRange(lat) lon_range = self._calculateRange(lon) return lat_range, lon_range fgo/src/gui.py0000644000175000017500000020244411435162335013143 0ustar robertrobert"""GUI related classes.""" import os import subprocess import gettext import codecs from socket import setdefaulttimeout, timeout from urllib2 import urlopen, URLError from thread import start_new_thread from Tkinter import * import tkFileDialog as fd from ScrolledText import ScrolledText from PIL import Image, ImageTk from constants import * setdefaulttimeout(5.0) class App: """Application's main window.""" def __init__(self, master, config): self.master = master self.config = config self.translatedPark = StringVar() self.translatedRwy = StringVar() self.translatedPark.set(_('None')) self.translatedRwy.set(_('Default')) #------ Menu ------------------------------------------------------------------ self.menubar = Menu(self.master) self.filemenu = Menu(self.menubar, tearoff=0) self.filemenu.add_command(label=_('Load'), command=self.configLoad) self.filemenu.add_command(label=_('Save as...'), command=self.configSave) self.filemenu.add_separator() self.filemenu.add_command(label=_('Save & Quit'), command=self.SaveAndQuit) self.filemenu.add_command(label=_('Quit'), command=self.quit) self.menubar.add_cascade(label=_('File'), menu=self.filemenu) self.settmenu = Menu(self.menubar, tearoff=0) self.settmenu.add_checkbutton(label=_('Show installed airports only'), variable=self.config.filtredAptList, command=self.filterAirports) self.settmenu.add_command(label=_('Update list of installed airports'), command=self.updateInstalledAptList) self.settmenu.add_separator() self.settmenu.add_command(label=_('Preferences'), command=self.showConfigWindow) self.menubar.add_cascade(label=_('Settings'), menu=self.settmenu) self.toolsmenu = Menu(self.menubar, tearoff=0) self.toolsmenu.add_command(label='METAR', command=self.showMETARWindow) self.menubar.add_cascade(label=_('Tools'), menu=self.toolsmenu) self.helpmenu = Menu(self.menubar, tearoff=0) self.helpmenu.add_command(label=_('Help'), command=self.showHelpWindow) self.helpmenu.add_separator() self.helpmenu.add_command(label=_('About'), command=self.about) self.menubar.add_cascade(label=_('Help'), menu=self.helpmenu) self.master.config(menu=self.menubar) self.frame = Frame(self.master) self.frame.pack(side='top', fill='both', expand=True) self.frame0 = Frame(self.frame, borderwidth=4) self.frame0.pack(side='top', fill='x') #------ Aircraft list --------------------------------------------------------- self.frame1 = Frame(self.frame0, borderwidth=8) self.frame1.pack(side='left', fill='both', expand=True) self.frame11 = Frame(self.frame1, borderwidth=1) self.frame11.pack(side='top', fill='both', expand=True) self.scrollbar = Scrollbar(self.frame11, orient='vertical') self.aircraftList = Listbox(self.frame11, bg=TEXT_BG_COL, exportselection=0, yscrollcommand=self.scrollbar.set, height=14) self.scrollbar.config(command=self.aircraftList.yview, takefocus=0) self.aircraftList.pack(side='left', fill='both', expand=True) self.scrollbar.pack(side='left', fill='y') self.aircraftList.see(self.getIndex('a')) self.aircraftList.bind('', self.focusAircraftList) self.frame12 = Frame(self.frame1, borderwidth=1) self.frame12.pack(side='top', fill='x') self.aircraftSearch = Entry(self.frame12, bg=TEXT_BG_COL) self.aircraftSearch.pack(side='left', fill='x', expand=True) self.aircraftSearch.bind('', self.searchAircrafts) self.aircraftSearch.bind('', self.searchAircrafts) self.aircraftSearchB = Button(self.frame12, text=_('Search'), command=self.searchAircrafts) self.aircraftSearchB.pack(side='left') #------ Middle panel ---------------------------------------------------------- self.frame2 = Frame(self.frame0, borderwidth=1, relief='sunken') self.frame2.pack(side='left', fill='both') # Aircraft self.frame21 = Frame(self.frame2, borderwidth=4) self.frame21.pack(side='top') self.aircraftLabel = Label(self.frame21, textvariable=self.config.aircraft) self.aircraftLabel.pack(side='top') self.thumbnail = Label(self.frame21, width=171, height=128) self.thumbnail.pack(side='top') self.image = self.getImage() self.thumbnail.config(image=self.image) # Airport, rwy and parking self.frame22 = Frame(self.frame2, borderwidth=4) self.frame22.pack(side='top', fill='x') # First column self.frame221 = Frame(self.frame22, borderwidth=4) self.frame221.pack(side='left', fill='x') self.airport_label = Label(self.frame221, text=_('Airport:')) self.airport_label.pack(side='top') self.rwy_label = Label(self.frame221, text=_('Rwy:')) self.rwy_label.pack(side='top') self.park_label = Label(self.frame221, text=_('Parking:')) self.park_label.pack(side='top') # Second column self.frame222 = Frame(self.frame22, borderwidth=4) self.frame222.pack(side='left', fill='x') self.airportLabel = Label(self.frame222, width=12, textvariable=self.config.airport, relief='groove', borderwidth=2) self.airportLabel.pack(side='top') self.airportLabel.bind('', self.popupCarrier) self.rwyLabel = Label(self.frame222, width=12, textvariable=self.translatedRwy, relief='groove', borderwidth=2) self.rwyLabel.pack(side='top') self.rwyLabel.bind('', self.popupRwy) self.parkLabel = Label(self.frame222, width=12, textvariable=self.translatedPark, relief='groove', borderwidth=2) self.parkLabel.pack(side='top') self.parkLabel.bind('', self.popupPark) # AI Scenarios self.frame23 = Frame(self.frame2) self.frame23.pack(side='top') self.scenarios = Label(self.frame23, text=_('Select Scenario'), relief='groove') self.scenarios.pack(side='left') self.scenarios.bind('', self.popupScenarios) self.frame24 = Frame(self.frame2) self.frame24.pack(side='top') self.scenariosLabel = Label(self.frame24, text=_('Selected Scenarios:')) self.scenariosLabel.pack(side='left') self.selectedScenarios = IntVar() self.countSelectedScenarios() self.scenariosCount = Label(self.frame24, textvariable=self.selectedScenarios) self.scenariosCount.pack(side='left') #------ Airport list ---------------------------------------------------------- self.frame3 = Frame(self.frame0, borderwidth=8) self.frame3.pack(side='left', fill='both', expand=True) self.frame31 = Frame(self.frame3, borderwidth=1) self.frame31.pack(side='top', fill='both', expand=True) self.sAirports = Scrollbar(self.frame31, orient='vertical') self.airportList = Listbox(self.frame31, bg=TEXT_BG_COL, exportselection=0, yscrollcommand=self.sAirports.set, height=14) self.sAirports.config(command=self.airportList.yview, takefocus=0) self.airportList.pack(side='left', fill='both', expand=True) self.sAirports.pack(side='left', fill='y') self.airportList.see(self.getIndex('p')) self.airportList.bind('', self.focusAirportList) self.frame32 = Frame(self.frame3, borderwidth=1) self.frame32.pack(side='top', fill='x') self.airportSearch = Entry(self.frame32, bg=TEXT_BG_COL) self.airportSearch.pack(side='left', fill='x', expand=True) self.airportSearch.bind('', self.searchAirports) self.airportSearch.bind('', self.searchAirports) self.airportSearchB = Button(self.frame32, text=_('Search'), command=self.searchAirports) self.airportSearchB.pack(side='left') #------ Buttons --------------------------------------------------------------- self.frame4 = Frame(self.frame, borderwidth=4) self.frame4.pack(side='top', fill='x') self.frame41 = Frame(self.frame4, borderwidth=4) self.frame41.pack(side='left', fill='x') # TerraSync self.ts = Checkbutton(self.frame4, text="TerraSync", variable=self.config.TS, command=self.runTS) self.ts.pack(side='left') self.frame42 = Frame(self.frame4, borderwidth=4) self.frame42.pack(side='right') # Buttons self.sq_button = Button(self.frame42, text=_('Save & Quit'), command=self.SaveAndQuit) self.sq_button.pack(side='left') self.reset_button = Button(self.frame42, text=_('Reset'), width=10, command=self.reset) self.reset_button.pack(side='left') self.run_button = Button(self.frame42, text=_('Run FG'), width=10, command=self.runFG) self.run_button.pack(side='left') #------ Text window ----------------------------------------------------------- self.frame5 = Frame(self.frame) self.frame5.pack(side='top', fill='both', expand=True) self.frame51 = Frame(self.frame5) self.frame51.pack(side='left', fill='both', expand=True) self.text = ScrolledText(self.frame51, bg=TEXT_BG_COL, wrap='none') self.text.pack(side='left', fill='both', expand=True) #------------------------------------------------------------------------------ self.default_fg = self.rwyLabel.cget('fg') self.default_bg = self.master.cget('bg') self.scenarioListOpen = False self.mainLoopIsRuning = False self.currentCarrier = [] self.old_rwy = self.config.rwy.get() self.old_park = self.config.park.get() self.reset(first_run=True) self.startLoops() self.runTS() def about(self): """Create 'About' window""" try: self.aboutWindow.destroy() except AttributeError: pass if _('Translation:') == 'Translation:': translator = '' else: translator = '\n\n\n' + _('Translation:') about_text = COPYRIGHT + translator self.aboutWindow = Toplevel(borderwidth=4) self.aboutWindow.title(_('About')) self.aboutWindow.resizable(width=False, height=False) self.aboutWindow.transient(self.master) self.aboutTitle = Label(self.aboutWindow, font='Helvetica 28 bold', text=NAME) self.aboutTitle.pack() self.aboutFrame1 = Frame(self.aboutWindow, borderwidth=1, relief='sunken', padx=8, pady=12) self.aboutFrame1.pack() self.aboutText = Label(self.aboutFrame1, text=about_text) self.aboutText.pack() self.aboutFrame2 = Frame(self.aboutWindow, borderwidth=12) self.aboutFrame2.pack() self.aboutLicense = Button(self.aboutFrame2, text=_('License'), command=self.aboutShowLicense) self.aboutLicense.pack(side='left') self.aboutClose = Button(self.aboutFrame2, text=_('Close'), command=self.aboutWindow.destroy) self.aboutClose.pack(side='left') def aboutShowLicense(self): self.aboutText.configure(text=LICENSE) self.aboutTitle.destroy() self.aboutLicense.destroy() def buildAircraftList(self): if self.aircraftList: self.aircraftList.delete(0, 'end') for i in self.config.aircraft_list: self.aircraftList.insert('end', i) def buildAirportList(self): L = zip(self.config.airport_icao, self.config.airport_name) if self.airportList: self.airportList.delete(0, 'end') for i in L: if len(i[0]) == 3: i = list(i) i[1] = ' ' + i[1] try: i = ' '.join(i) except TypeError: i = i[0] self.airportList.insert('end', i) def commentText(self): """Highlight comments in text window.""" t = self.text index = '1.0' used_index = [None] t.tag_delete('#') while index not in used_index: comment = t.search('#', index) comment = str(comment) if comment: endline = comment.split('.')[0] + '.end' t.tag_add('#', comment, endline) t.tag_config('#', foreground=COMMENT_COL) used_index.append(index) line = comment.split('.')[0] index = str(int(line) + 1) + '.0' else: index = None if self.mainLoopIsRuning: self.master.after(500, self.commentText) else: return def configLoad(self): p = fd.askopenfilename(initialdir=DATA_DIR, filetypes=[(_('Config Files'), '*.fgo')]) if p: text = self.text.get('0.0', 'end') self.reset(path=p) self.config.write(text=text) self.countSelectedScenarios() def configSave(self): asf = fd.asksaveasfilename p = asf(initialdir=DATA_DIR, filetypes=[(_('Config Files'), '*.fgo')]) if p: try: if p[-4:] != '.fgo': p += '.fgo' except TypeError: pass t = self.text.get('0.0', 'end') self.config.write(text=t, path=p) def countSelectedScenarios(self): if self.config.scenario.get(): s = self.config.scenario.get().split() self.selectedScenarios.set(len(s)) else: self.selectedScenarios.set(0) def filterAirports(self): """Update airportList. Apply filter to airportList if self.config.filtredAptList is True. """ self.config.updateAptLists() self.buildAirportList() self.airportList.see(self.getIndex('p')) self.airportList.select_set(self.getIndex('p')) def focusAircraftList(self, event): self.aircraftList.focus_set() def focusAirportList(self, event): self.airportList.focus_set() def getAircraft(self): """Get aircraftList current selection and return aircraft name.""" index = self.aircraftList.curselection() if index: return self.aircraftList.get(index) aircraft = self.aircraftList.get(ACTIVE) if not aircraft: aircraft = 'None' return aircraft def getAirport(self): """Get airportList current selection and return airport ICAO.""" index = self.airportList.curselection() if index: return self.airportList.get(index).split()[0] try: return self.airportList.get(ACTIVE).split()[0] except IndexError: return self.config.airport.get() def getImage(self): """Find thumbnail in aircraft directory.""" try: name = self.config.aircraft.get() index = self.config.aircraft_list.index(name) path = os.path.join(self.config.aircraft_path[index], 'thumbnail.jpg') image = ImageTk.PhotoImage(Image.open(path)) except: image = ImageTk.PhotoImage(Image.open(THUMBNAIL)) return image def getIndex(self, type_): """Get aircraft name ('a') or airport ICAO ('p') and return its index.""" if type_ == 'a': name = self.config.aircraft.get() try: return self.config.aircraft_list.index(name) except ValueError: try: return self.config.aircraft_list.index(DEFAULT_AIRCRAFT) except ValueError: return 0 if type_ == 'p': name = self.config.airport.get() try: return self.config.airport_icao.index(name) except ValueError: try: return self.config.airport_icao.index(DEFAULT_AIRPORT) except ValueError: return 0 def popupCarrier(self, event): """Make pop up menu.""" popup = Menu(tearoff=0) popup.add_command(label=_('None'), command=self.resetCarrier) for i in self.config.carrier_list: popup.add_command(label=i[0], command=lambda i=i: self.setCarrier(i)) popup.tk_popup(event.x_root, event.y_root, 0) def popupPark(self, event): """Make pop up menu.""" popup = Menu(tearoff=0) if self.config.airport.get() != 'None': popup.add_command(label=_('None'), command=lambda: self.config.park.set('None')) count = 1 for i in self.read_airport_data(self.config.airport.get(), 'park'): # Cut menu if count % 20: popup.add_command(label=i, command=lambda i=i: self.config.park.set(i)) else: popup.add_command(label=i, command=lambda i=i: self.config.park.set(i), columnbreak=1) count += 1 else: L = self.currentCarrier[1:-1] for i in L: popup.add_command(label=i, command=lambda i=i: self.config.park.set(i)) popup.tk_popup(event.x_root, event.y_root, 0) def popupRwy(self, event): """Make pop up menu.""" if self.config.airport.get() != 'None': popup = Menu(tearoff=0) popup.add_command(label=_('Default'), command=lambda: self.config.rwy.set('Default')) for i in self.read_airport_data(self.config.airport.get(), 'rwy'): popup.add_command(label=i, command=lambda i=i: self.config.rwy.set(i)) popup.tk_popup(event.x_root, event.y_root, 0) def popupScenarios(self, event): """Make pop up list.""" if not self.scenarioListOpen: self.scenarioListOpen = True self.scenarioList = Toplevel(borderwidth=1, relief='raised') self.scenarioList.overrideredirect(True) self.scenarioList.geometry('+%d+%d' % (event.x_root, event.y_root)) frame = Frame(self.scenarioList) frame.pack(side='top') popupScrollbar = Scrollbar(frame, orient='vertical') self.popup = Listbox(frame, bg=TEXT_BG_COL, exportselection=0, selectmode=MULTIPLE, yscrollcommand=popupScrollbar.set) popupScrollbar.config(command=self.popup.yview, takefocus=0) self.popup.pack(side='left') popupScrollbar.pack(side='left', fill='y') self.popup.bind('', self.scenarioDescription) self.popup.bind('', self.popupScenariosClose) frame1 = Frame(self.scenarioList) frame1.pack(side='top', fill='x') button = Button(frame1, text=_('OK'), command=self.popupScenariosClose) button.pack(fill='x') for i in self.config.scenario_list: self.popup.insert('end', i) self.popupScenariosSelect() def popupScenariosClose(self, event=None): try: self.descriptionWindow.destroy() except AttributeError: pass L = [] for i in self.popup.curselection(): L.append(self.config.scenario_list[int(i)]) self.config.scenario.set(' '.join(L)) self.scenarioList.destroy() self.countSelectedScenarios() self.scenarioListOpen = False def popupScenariosSelect(self): L = list(self.config.scenario.get().split()) for i in L: if i in self.config.scenario_list: self.popup.selection_set(self.config.scenario_list.index(i)) def quit(self): """Quit application.""" try: os.kill(self.TerraSync.pid, 9) except AttributeError: pass self.master.quit() # def read_airport_data(self, icao, type_): # """Get runway or parking names.""" # res = [] # # If airport data source is set to: From scenery... # if self.config.apt_data_source.get(): # paths = [] # L = self.config.FG_scenery.get().split(':') # for path in L: # paths.append(os.path.join(path, AIRPORTS_DIR)) # # for path in paths: # for i in range(3): # path = os.path.join(path, icao[i]) # if os.path.exists(path): # files = os.listdir(path) # # Runway # if type_ == 'rwy': # threshold = '.'.join([icao, 'threshold.xml']) # for f in files: # file_path = os.path.join(path, f) # if f == threshold and not res: # res = self.read_threshold(file_path) # # Parking # else: # parking = '.'.join([icao, 'parking.xml']) # groundnet = '.'.join([icao, 'groundnet.xml']) # for f in files: # file_path = os.path.join(path, f) # if f == parking or f == groundnet and not res: # res = self.read_parking(file_path) # # If airport data source is set to: Standard... # else: # path = os.path.join(self.config.ai_path, AIRPORTS_DIR) # if os.path.exists(path): # # Runway # if type_ == 'rwy': # index = self.getIndex('p') # rwy = self.config.airport_rwy[index] # for i in rwy: # res.append(i) # # Compute other end of the runway. # if not i.startswith('H'): # number = int(i[:2]) # if number <= 36 and number > 18: # prefix = str(number - 18) # elif number > 0 and number <= 18: # prefix = str(number + 18) # suffix = '' # if i.endswith('L'): # suffix = 'R' # elif i.endswith('R'): # suffix = 'L' # elif i.endswith('C'): # suffix = 'C' # res.append(prefix + suffix) # # Parking # else: # dirs = os.listdir(path) # if icao in dirs: # path = os.path.join(path, icao) # file_path = os.path.join(path, 'parking.xml') # if os.path.exists(file_path): # res = self.read_parking(file_path) # # return res def read_airport_data(self, icao, type_): """Get runway or parking names. type_ should be: 'rwy' or 'park' """ res = [] if type_ == 'rwy': path = os.path.join(self.config.ai_path, AIRPORTS_DIR) if os.path.exists(path): # Runway if type_ == 'rwy': index = self.getIndex('p') rwy = self.config.airport_rwy[index] for i in rwy: res.append(i) # Compute other end of the runway. if not i.startswith('H'): number = int(i[:2]) if number <= 36 and number > 18: prefix = str(number - 18) elif number > 0 and number <= 18: prefix = str(number + 18) suffix = '' if i.endswith('L'): suffix = 'R' elif i.endswith('R'): suffix = 'L' elif i.endswith('C'): suffix = 'C' res.append(prefix + suffix) else: # If airport data source is set to: From scenery... if self.config.apt_data_source.get(): paths = [] L = self.config.FG_scenery.get().split(':') for path in L: paths.append(os.path.join(path, AIRPORTS_DIR)) for path in paths: for i in range(3): path = os.path.join(path, icao[i]) if os.path.exists(path): files = os.listdir(path) parking = '.'.join([icao, 'parking.xml']) groundnet = '.'.join([icao, 'groundnet.xml']) for f in files: file_path = os.path.join(path, f) if f == parking or f == groundnet and not res: res = self.read_parking(file_path) # If airport data source is set to: Standard... else: path = os.path.join(self.config.ai_path, AIRPORTS_DIR) if os.path.exists(path): dirs = os.listdir(path) if icao in dirs: path = os.path.join(path, icao) file_path = os.path.join(path, 'parking.xml') if os.path.exists(file_path): res = self.read_parking(file_path) return res def read_parking(self, xml_file): """Read parking positions from XML file.""" res = [] fin = open(xml_file) for line in fin: s_line = line.strip().split() if s_line: data = s_line[0] if data.lower() == '': fin.close() # Remove doubles. res = list(set(res)) res.sort() return res if 'name=' in data.lower(): name = line.split('"') entry = name[1] elif 'number=' in data.lower(): data = data.split('"') if data[1]: entry = ''.join([entry, data[1]]) res.append(entry) fin.close() # Remove doubles. res = list(set(res)) res.sort() return res def read_scenario(self, scenario): """Read description from given scenario.""" L = [] flag = False file_name = scenario + '.xml' path = os.path.join(self.config.ai_path, file_name) fin = codecs.open(path, encoding='utf-8') for line in fin: line = line.strip() if '' in line.lower(): L.append(line[13:]) flag = True elif '' in line.lower(): L.append(line[:-14]) flag = False elif flag: L.append(line) return '\n'.join(L) # def read_threshold(self, xml_file): # """Read runway information from XML file.""" # res = [] # fin = open(xml_file) # # for line in fin: # line = line.strip() # if '' in line.lower(): # line = line[5:-6] # res.append(line) # # fin.close() # return res def reset(self, event=None, path=None, first_run=False): """Reset data""" # Don't call config.update() at application's initialization # as config object is updated at its creation anyway. if not first_run: self.config.update(path) self.buildAircraftList() self.buildAirportList() self.aircraftSearch.delete(0, 'end') self.airportSearch.delete(0, 'end') self.airportList.see(self.getIndex('p')) self.airportList.select_set(self.getIndex('p')) self.aircraftList.see(self.getIndex('a')) self.aircraftList.select_set(self.getIndex('a')) self.image = self.getImage() self.thumbnail.config(image=self.image) self.resetText() # Update selected carrier if self.config.carrier.get() != 'None': for i in range(len(self.config.carrier_list)): if self.config.carrier.get() == self.config.carrier_list[i][0]: self.currentCarrier = self.config.carrier_list[i] self.setCarrier(self.currentCarrier) else: self.resetCarrier() def resetCarrier(self): if self.config.carrier.get() != 'None': self.config.park.set('None') self.config.carrier.set('None') self.airport_label.config(text=_('Airport:')) self.airportLabel.config(textvariable=self.config.airport, bg=self.default_bg) self.rwy_label.config(fg=self.default_fg) self.rwyLabel.config(fg=self.default_fg) self.config.airport.set(self.getAirport()) self.image = self.getImage() self.thumbnail.config(image=self.image) try: c = self.config.scenario.get().split() if self.currentCarrier[-1] in c: c.pop(c.index(self.currentCarrier[-1])) self.config.scenario.set(' '.join(c)) except IndexError: pass self.countSelectedScenarios() def resetText(self): t = self.text t.delete('1.0', 'end') t.insert('end', self.config.text) def runFG(self): t = self.text.get('0.0', 'end') self.config.write(text=t) path = self.config.FG_bin.get() options = [path] FG_working_dir = HOME_DIR # Add TerraSync protocol. if self.config.TS.get(): arg = ('--atlas=socket,out,5,localhost,%s,udp' % self.config.TS_port.get()) options.append(arg) config_in = open(CONFIG) # Parse config file. for line in config_in: line = line.strip() if line.startswith('--'): options.append(line) if line.startswith('AI_SCENARIOS='): L = line[13:].split() for scenario in L: options.append('--ai-scenario=' + scenario) # Obsolete keyword, should be removed in the future. elif line[:9] == 'HOME_DIR=': if os.path.exists(line[9:]): FG_working_dir = line[9:] elif line[:15] == 'FG_WORKING_DIR=': if os.path.exists(line[15:]): FG_working_dir = line[15:] elif line[:7] == 'FG_BIN=': options[0] = line[7:] config_in.close() print '\n' + '=' * 80 + '\n' print _('Starting %s with following options:') % options[0] for i in options[1:]: print '\t%s' % i print '\n' + '-' * 80 + '\n' try: launcher = FGLauncher(self.master, options, FG_working_dir) self.stopLoops() self.frame.wait_window(launcher.top) self.startLoops() except OSError: self.runFGErrorMessage() def runFGErrorMessage(self): error = Toplevel(borderwidth=12) error.transient(self.master) error.title(_('Error')) title = Label(error, font=('Helvetica', 18, 'bold'), text=_('Unable to run FlightGear!')) title.pack(fill='x') msg = Label(error, text=_('Please make sure that paths: FG_BIN ' 'and FG_ROOT\nin "Preferences" window are ' 'pointing to right directories.') + '\n') msg.pack(fill='x') button = Button(error, text=_('Close'), command=error.destroy) button.pack() def runTS(self): if self.config.TS_port.get()\ and self.config.TS_scenery.get()\ and os.path.exists(self.config.TS_bin.get()): self.ts.configure(state='normal') else: self.ts.configure(state='disabled') if self.config.TS.get() and self.ts.cget('state') == 'normal': options = '%s -p %s -S -d %s' % (self.config.TS_bin.get(), self.config.TS_port.get(), self.config.TS_scenery.get()) self.TerraSync = subprocess.Popen(options.split()) self.TerraSync.poll() print '-' * 80 print _('Starting TerraSync with following command:') print options print '-' * 80 else: try: os.kill(self.TerraSync.pid, 15) print '-' * 80 print _('Stopping TerraSync') print '-' * 80 except AttributeError: return def SaveAndQuit(self): """Save options to file and quit.""" try: os.kill(self.TerraSync.pid, 9) except AttributeError: pass # Save window resolution. geometry = self.master.geometry().split('+')[0] self.config.window_geometry.set(geometry) t = self.text.get('0.0', 'end') self.config.write(text=t) self.master.quit() def scenarioDescription(self, event): """Make pop up window showing AI scenario description.""" index = self.popup.nearest(event.y) try: name = self.config.scenario_list[index] except IndexError: return text = self.read_scenario(name) try: self.descriptionWindow.destroy() except AttributeError: pass if text: text = name.center(80) + '\n' + ('-' * 80) + '\n' + text pos = self.master.geometry().split('+') self.descriptionWindow = Toplevel(borderwidth=1, relief='raised') self.descriptionWindow.overrideredirect(True) self.descriptionWindow.geometry('+%d+%d' % (int(pos[1]) + 10, int(pos[2]) + 30)) self.descriptionText = Label(self.descriptionWindow, justify=LEFT, text=text, bg=MESSAGE_BG_COL) self.descriptionText.pack() self.descriptionText.bind('', self.scenarioDescriptionClose) def scenarioDescriptionClose(self, event): self.descriptionWindow.destroy() def searchAircrafts(self, event=None): entry = self.aircraftSearch.get().lower() if entry != '': self.buildAircraftList() L = [] for i in range(self.aircraftList.size()): if entry in self.aircraftList.get(i).lower(): L.append(self.aircraftList.get(i)) self.aircraftList.delete(0, 'end') for i in L: self.aircraftList.insert('end', i) else: self.buildAircraftList() if self.aircraftList.get(0): self.currentAircraft = ('0', ) def searchAirports(self, event=None): entry = self.airportSearch.get() if entry != '': self.buildAirportList() L = [] if entry.isupper(): for i in range(self.airportList.size()): if entry == self.airportList.get(i)[:len(entry)]: L.append(self.airportList.get(i)) else: entry = entry.lower() for i in range(self.airportList.size()): if entry in self.airportList.get(i).lower(): L.append(self.airportList.get(i)) self.airportList.delete(0, 'end') for i in L: self.airportList.insert('end', i) else: self.buildAirportList() if self.airportList.get(0): self.currentAirport = ('0', ) def setCarrier(self, L): old_scenario = '' if self.currentCarrier: old_scenario = self.currentCarrier[-1] if self.config.carrier.get() != L[0]: self.config.park.set('None') self.config.carrier.set(L[0]) self.currentCarrier = L self.airport_label.config(text=_('Carrier:')) self.airportLabel.config(textvariable=self.config.carrier, bg=CARRIER_COL) self.rwy_label.config(fg=GRAYED_OUT_COL) self.rwyLabel.config(fg=GRAYED_OUT_COL) self.config.rwy.set('Default') self.config.airport.set('None') scenario = self.currentCarrier[-1] if scenario not in self.config.scenario.get().split(): if old_scenario: L = self.config.scenario.get().split() if old_scenario in L: L.pop(L.index(old_scenario)) self.config.scenario.set(' '.join(L)) c = (self.config.scenario.get(), scenario) self.config.scenario.set(' '.join(c)) self.countSelectedScenarios() def showConfigWindow(self): text = self.text.get('0.0', 'end') self.configWindow = ConfigWindow(self.master, self.config, text) # Wait for window to close and reset data if Save&Quit button was used. self.frame.wait_window(self.configWindow.top) if self.configWindow.reset_flag: self.reset() def showHelpWindow(self): """Display help window.""" try: self.helpWindow.destroy() except AttributeError: pass # Find currently used language. language = self.config.language.get() if language: lang_code = language else: lang_code = gettext.translation(MESSAGES, LOCALE_DIR).info()['language'] path = os.path.join(HELP_DIR, lang_code) if not os.path.isfile(path): lang_code = 'en' path = os.path.join(HELP_DIR, lang_code) readme_in = codecs.open(path, encoding='utf-8') text = readme_in.read() readme_in.close() self.helpWindow = Toplevel(self.master) self.helpWindow.title(_('Help')) self.helpWindow.transient(self.master) self.helpText = ScrolledText(self.helpWindow, bg=TEXT_BG_COL) self.helpText.pack(side='left', fill='both', expand=True) self.helpText.insert('end', text) self.helpText.configure(state='disabled') def showMETARWindow(self, event=None): try: self.metar.quit() except AttributeError: pass self.metar = Metar(self.master, self.config, MESSAGE_BG_COL) def startLoops(self): """Activate all loops.""" self.mainLoopIsRuning = True self.commentText() self.updateAircraft() self.updateAirport() # print '***** LOOPS ACTIVATED *****' def stopLoops(self): """Stop all loops.""" self.mainLoopIsRuning = False # print '***** LOOPS DEACTIVATED *****' def updateAircraft(self): """Update aircraft selection.""" now = self.getAircraft() if now != self.config.aircraft.get(): self.config.aircraft.set(now) self.image = self.getImage() self.thumbnail.config(image=self.image) if self.mainLoopIsRuning: self.master.after(100, self.updateAircraft) else: return def updateAirport(self): """Update airport selection.""" if self.config.airport.get() != 'None': selected_apt = self.getAirport() if selected_apt != self.config.airport.get(): self.config.park.set('None') self.config.rwy.set('Default') self.config.airport.set(selected_apt) # Let user select only one option: rwy or park position. if self.config.rwy.get() != 'Default': if self.config.rwy.get() != self.old_rwy: self.old_rwy = self.config.rwy.get() self.config.park.set('None') if self.config.park.get() != 'None': if self.config.park.get() != self.old_park: self.old_park = self.config.park.get() self.config.rwy.set('Default') else: self.old_park = self.config.park.get() self.old_rwy = self.config.rwy.get() if self.old_rwy != 'Default' and self.old_park != 'None': self.old_rwy = 'Default' # Translate rwy and park buttons self.translatedPark.set(_(self.config.park.get())) self.translatedRwy.set(_(self.config.rwy.get())) if self.mainLoopIsRuning: self.master.after(250, self.updateAirport) else: return def updateInstalledAptList(self): """Rebuild installed airports list.""" if self.config.filtredAptList.get(): self.config.makeInstalledAptList() self.filterAirports() class ConfigWindow: """Display preferences window.""" def __init__(self, master, config, text): self.master = master self.config = config self.text = text self.apt_data_source = StringVar() self.FG_bin = StringVar() self.FG_root = StringVar() self.FG_scenery = StringVar() self.FG_working_dir = StringVar() self.language = StringVar() self.TS_bin = StringVar() self.TS_port = StringVar() self.TS_scenery = StringVar() if self.config.apt_data_source.get(): self.apt_data_source.set(_('Scenery')) else: self.apt_data_source.set(_('Default')) self.FG_bin.set(self.config.FG_bin.get()) self.FG_root.set(self.config.FG_root.get()) self.FG_scenery.set(self.config.FG_scenery.get()) self.FG_working_dir.set(self.config.FG_working_dir.get()) if self.config.language.get(): self.language.set(self.config.language.get()) else: self.language.set('-') self.TS_bin.set(self.config.TS_bin.get()) if self.config.TS_port.get(): self.TS_port.set(self.config.TS_port.get()) else: self.defaultPort() self.TS_scenery.set(self.config.TS_scenery.get()) self.reset_flag = False # ----------------------------------------------------------------------------- self.top = Toplevel(self.master) self.top.grab_set() # Focus input on that window. self.top.title(_('Preferences')) self.top.resizable(width=False, height=False) self.top.transient(self.master) self.main = Frame(self.top, borderwidth=0) self.main.pack(side='top', padx=12) self.frame = Frame(self.main, borderwidth=1, relief='sunken') self.frame.pack(side='top') # ----- Tabs ------------------------------------------------------------------ self.tabs = Frame(self.frame) self.tabs.pack(side='top', fill='x') self.tabFG = Button(self.tabs, text=_('FlightGear settings'), borderwidth=1, relief='ridge', command=self.showFGSettings) self.tabFG.pack(side='left') self.tabTS = Button(self.tabs, text=_('TerraSync settings'), borderwidth=1, relief='ridge', command=self.showTSSettings) self.tabTS.pack(side='left') self.tabMisc = Button(self.tabs, text=_('Miscellaneous'), borderwidth=1, relief='ridge', command=self.showMiscSettings) self.tabMisc.pack(side='left') # ----- Main content ---------------------------------------------------------- # Here is placed content from: widgetFG, widgetTS, and widgetMics. self.frame = Frame(self.frame, borderwidth=1, relief='raised') self.frame.pack(side='top', fill='x') # ----- Buttons --------------------------------------------------------------- self.frame_Buttons = Frame(self.main, borderwidth=12) self.frame_Buttons.pack(side='bottom') self.frame_save_button = Frame(self.frame_Buttons, borderwidth=4) self.frame_save_button.pack(side='left') self.save = Button(self.frame_save_button, text=_('Save settings'), command=self.saveAndQuit) self.save.pack(side='left') self.frame_close_button = Frame(self.frame_Buttons, borderwidth=4) self.frame_close_button.pack(side='right') self.close = Button(self.frame_close_button, text=_('Cancel'), command=self.quit) self.close.pack(side='left') # ----------------------------------------------------------------------------- # Show FG settings tab by default. self.showFGSettings() def cleanUpWidgets(self): """Destroy active widget.""" try: self.frame_FG.destroy() except AttributeError: pass try: self.frame_TS.destroy() except AttributeError: pass try: self.frame_misc.destroy() except AttributeError: pass def defaultPort(self): self.TS_port.set('5501') def findFG_bin(self): try: p = fd.askopenfilename(parent=self.top, initialdir=HOME_DIR, title=_('Path to executable file:')) if p: self.FG_bin.set(p) except TclError: return def findFG_root(self): try: p = fd.askdirectory(parent=self.top, initialdir=HOME_DIR, title='FG_ROOT:') if p: self.FG_root.set(p) except TclError: return def findFG_scenery(self): try: p = fd.askdirectory(parent=self.top, initialdir=HOME_DIR, title='FG_SCENERY:') if p: self.FG_scenery.set(p) except TclError: return def findFgWorkingDir(self): try: p = fd.askdirectory(parent=self.top, initialdir=HOME_DIR, title=_('Working directory (optional):')) if p: self.FG_working_dir.set(p) except TclError: return def findTS_bin(self): try: p = fd.askopenfilename(parent=self.top, initialdir=HOME_DIR, title=_('Path to executable file:')) if p: self.TS_bin.set(p) except TclError: return def findTS_scenery(self): try: p = fd.askdirectory(parent=self.top, initialdir=HOME_DIR, title=_('Scenery path:')) if p: self.TS_scenery.set(p) except TclError: return def getLanguages(self): """Walk through locale directory and return list of supported languages based on directory names.""" res = [] for d in os.listdir(LOCALE_DIR): if os.path.isdir(os.path.join(LOCALE_DIR, d)): res.append(d) res.sort() res = ['-'] + res return res def quit(self): """Quit without saving.""" self.top.destroy() def resetTabs(self): """Reset tabs.""" self.tabFG.configure(borderwidth=2, relief='ridge') self.tabTS.configure(borderwidth=2, relief='ridge') self.tabMisc.configure(borderwidth=2, relief='ridge') def saveAndQuit(self): if self.apt_data_source.get() == _('Scenery').decode('utf-8'): self.config.apt_data_source.set(1) else: self.config.apt_data_source.set(0) self.config.FG_bin.set(self.FG_bin.get()) self.config.FG_root.set(self.FG_root.get()) self.config.FG_scenery.set(self.FG_scenery.get()) self.config.FG_working_dir.set(self.FG_working_dir.get()) if self.language.get() == '-': self.config.language.set('') else: self.config.language.set(self.language.get()) self.config.TS_bin.set(self.TS_bin.get()) self.config.TS_port.set(self.TS_port.get()) self.config.TS_scenery.set(self.TS_scenery.get()) self.config.write(text=self.text) self.reset_flag = True self.top.destroy() def showFGSettings(self): if self.tabFG.cget('relief') != 'raised': self.resetTabs() self.tabFG.configure(borderwidth=1, relief='raised') self.cleanUpWidgets() self.widgetFG() def showTSSettings(self): if self.tabTS.cget('relief') != 'raised': self.resetTabs() self.tabTS.configure(borderwidth=1, relief='raised') self.cleanUpWidgets() self.widgetTS() def showMiscSettings(self): if self.tabMisc.cget('relief') != 'raised': self.resetTabs() self.tabMisc.configure(borderwidth=1, relief='raised') self.cleanUpWidgets() self.widgetMisc() def widgetFG(self): """FlightGear settings widget.""" self.frame_FG = Frame(self.frame, borderwidth=8) self.frame_FG.pack(side='top') self.FG_label = Label(self.frame_FG, text=_('FlightGear settings')) self.FG_label.pack(side='top') # FG_BIN self.frame_FG_1 = Frame(self.frame_FG, borderwidth=4) self.frame_FG_1.pack(side='top') self.frame_FG_11 = Frame(self.frame_FG_1) self.frame_FG_11.pack(side='top', fill='x') self.FG_binLabel = Label(self.frame_FG_11, text=_('Path to executable file:')) self.FG_binLabel.pack(side='left') self.frame_FG_12 = Frame(self.frame_FG_1) self.frame_FG_12.pack(side='top') self.FG_binEntry = Entry(self.frame_FG_12, bg=TEXT_BG_COL, width=50, textvariable=self.FG_bin) self.FG_binEntry.pack(side='left') self.FG_binFind = Button(self.frame_FG_12, text=_('Find'), command=self.findFG_bin) self.FG_binFind.pack(side='left') # FG_ROOT self.frame_FG_2 = Frame(self.frame_FG, borderwidth=4) self.frame_FG_2.pack(side='top') self.frame_FG_21 = Frame(self.frame_FG_2) self.frame_FG_21.pack(side='top', fill='x') self.FG_rootLabel = Label(self.frame_FG_21, text='FG_ROOT:') self.FG_rootLabel.pack(side='left') self.frame_FG_22 = Frame(self.frame_FG_2) self.frame_FG_22.pack(side='top') self.FG_rootEntry = Entry(self.frame_FG_22, bg=TEXT_BG_COL, width=50, textvariable=self.FG_root) self.FG_rootEntry.pack(side='left') self.FG_rootFind = Button(self.frame_FG_22, text=_('Find'), command=self.findFG_root) self.FG_rootFind.pack(side='left') # FG_SCENERY self.frame_FG_3 = Frame(self.frame_FG, borderwidth=4) self.frame_FG_3.pack(side='top') self.frame_FG_31 = Frame(self.frame_FG_3) self.frame_FG_31.pack(side='top', fill='x') self.FG_sceneryLabel = Label(self.frame_FG_31, text='FG_SCENERY:') self.FG_sceneryLabel.pack(side='left') self.frame_FG_32 = Frame(self.frame_FG_3) self.frame_FG_32.pack(side='top') self.FG_sceneryEntry = Entry(self.frame_FG_32, bg=TEXT_BG_COL, width=50, textvariable=self.FG_scenery) self.FG_sceneryEntry.pack(side='left') self.FG_sceneryFind = Button(self.frame_FG_32, text=_('Find'), command=self.findFG_scenery) self.FG_sceneryFind.pack(side='left') # FG working directory self.frame_FG_4 = Frame(self.frame_FG, borderwidth=4) self.frame_FG_4.pack(side='top') self.frame_FG_41 = Frame(self.frame_FG_4) self.frame_FG_41.pack(side='top', fill='x') self.FG_working_dirLabel = Label(self.frame_FG_41, text=_('Working directory (optional):')) self.FG_working_dirLabel.pack(side='left') self.frame_FG_42 = Frame(self.frame_FG_4) self.frame_FG_42.pack(side='top') self.FG_working_dirEntry = Entry(self.frame_FG_42, bg=TEXT_BG_COL, width=50, textvariable=self.FG_working_dir) self.FG_working_dirEntry.pack(side='left') self.FG_working_dirFind = Button(self.frame_FG_42, text=_('Find'), command=self.findFgWorkingDir) self.FG_working_dirFind.pack(side='left') def widgetTS(self): """TerraSync settings widget.""" self.frame_TS = Frame(self.frame, borderwidth=8) self.frame_TS.pack(side='top') self.TS_label = Label(self.frame_TS, text=_('TerraSync settings')) self.TS_label.pack(side='top') # TS_BIN self.frame_TS_1 = Frame(self.frame_TS, borderwidth=4) self.frame_TS_1.pack(side='top') self.frame_TS_11 = Frame(self.frame_TS_1) self.frame_TS_11.pack(side='top', fill='x') self.TS_binLabel = Label(self.frame_TS_11, text=_('Path to executable file:')) self.TS_binLabel.pack(side='left') self.frame_TS_12 = Frame(self.frame_TS_1) self.frame_TS_12.pack(side='top') self.TS_binEntry = Entry(self.frame_TS_12, bg=TEXT_BG_COL, width=50, textvariable=self.TS_bin) self.TS_binEntry.pack(side='left') self.TS_binFind = Button(self.frame_TS_12, text=_('Find'), command=self.findTS_bin) self.TS_binFind.pack(side='left') # TS scenery self.frame_TS_2 = Frame(self.frame_TS, borderwidth=4) self.frame_TS_2.pack(side='top') self.frame_TS_21 = Frame(self.frame_TS_2) self.frame_TS_21.pack(side='top', fill='x') self.TS_sceneryLabel = Label(self.frame_TS_21, text=_('Scenery path:')) self.TS_sceneryLabel.pack(side='left') self.frame_TS_22 = Frame(self.frame_TS_2) self.frame_TS_22.pack(side='top') self.TS_sceneryEntry = Entry(self.frame_TS_22, bg=TEXT_BG_COL, width=50, textvariable=self.TS_scenery) self.TS_sceneryEntry.pack(side='left') self.TS_sceneryFind = Button(self.frame_TS_22, text=_('Find'), command=self.findTS_scenery) self.TS_sceneryFind.pack(side='left') # TS port self.frame_TS_3 = Frame(self.frame_TS, borderwidth=4) self.frame_TS_3.pack(side='top', fill='x') self.frame_TS_31 = Frame(self.frame_TS_3) self.frame_TS_31.pack(side='top', fill='x') self.TS_portLabel = Label(self.frame_TS_31, text=_('Port:')) self.TS_portLabel.pack(side='left') self.frame_TS_32 = Frame(self.frame_TS_3) self.frame_TS_32.pack(side='top', fill='x') self.TS_portEntry = Entry(self.frame_TS_32, bg=TEXT_BG_COL, width=6, textvariable=self.TS_port) self.TS_portEntry.pack(side='left') self.TS_portDefault = Button(self.frame_TS_32, text=_('Default'), command=self.defaultPort) self.TS_portDefault.pack(side='left') def widgetMisc(self): """Miscellaneous settings widget.""" self.frame_misc = Frame(self.frame, borderwidth=8) self.frame_misc.pack(side='top', fill='x') self.misc_label = Label(self.frame_misc, text=_('Miscellaneous')) self.misc_label.pack(side='top', fill='x') # Language menu self.frame_misc_1 = Frame(self.frame_misc, borderwidth=4) self.frame_misc_1.pack(side='top', fill='x') self.frame_misc_11 = Frame(self.frame_misc_1) self.frame_misc_11.pack(side='left', fill='x') self.lang_label = Label(self.frame_misc_11, text=_('Change language:')) self.lang_label.pack(side='left') self.langMenu = OptionMenu(self.frame_misc_11, self.language, *self.getLanguages()) self.langMenu.pack(side='left') # Apt source menu self.frame_misc_12 = Frame(self.frame_misc_1) self.frame_misc_12.pack(side='right', fill='x') self.apt_label = Label(self.frame_misc_12, text=_('Airport data source:')) self.apt_label.pack(side='left') self.aptMenu = OptionMenu(self.frame_misc_12, self.apt_data_source, *(_('Default'), _('Scenery'))) self.aptMenu.pack(side='left') # Rebuild apt button self.frame_misc_2 = Frame(self.frame_misc, borderwidth=4) self.frame_misc_2.pack(side='top', fill='x') self.frame_misc_21 = Frame(self.frame_misc_2) self.frame_misc_21.pack(side='top', fill='x') self.rebuildApt = Button(self.frame_misc_21, text=_('Rebuild Airport Database'), command=self.config.rebuildApt) self.rebuildApt.pack(side='top', fill='x') class FGLauncher: """Launch FG and create new window that indicates that FG is running.""" def __init__(self, master, options, FG_working_dir): self.master = master self.options = options self.FG_working_dir = FG_working_dir self._window() self.master.update() self._runFG() def quit(self): """Clean up data and destroy the window.""" del self.master del self.options self.top.destroy() def _doNotQuit(self): """Dumb method to override window's close button.""" return def _checkIfFGHasQuit(self): if self.process.poll() is None: self.master.after(1000, self._checkIfFGHasQuit) else: self.quit() def _runFG(self): self.process = subprocess.Popen(self.options, cwd=self.FG_working_dir) self._checkIfFGHasQuit() def _window(self): message = _('FlightGear is running...') self.top = Toplevel(self.master) self.top.protocol("WM_DELETE_WINDOW", self._doNotQuit) self.top.resizable(width=False, height=False) self.top.grab_set() # Focus input on that window. self.top.transient(self.master) self.label = Label(self.top, borderwidth=20, text=message, font='Helvetica 16') self.label.pack() class Metar: """Simple widget to display METAR reports from weather.noaa.gov/.""" def __init__(self, master, config, background): self.master = master self.background = background self.icao = config.airport self.apt_path = config.apt_path self.metar_path = config.metar_path self.decoded = IntVar() self.nearest_station = StringVar() self.report = StringVar() self.decoded.set(0) self.nearest_station.set('') self.report.set('') self.metar_list = config.readMetarDat() self.apt_dict = config.readCoord() #------- Main Window ---------------------------------------------------------- self.top = Toplevel(self.master, borderwidth=4) self.top.transient(self.master) self.top.resizable(width=False, height=False) # Override window close button. self.top.protocol("WM_DELETE_WINDOW", self.quit) self.top.title('METAR') self.frame1 = Frame(self.top) self.frame1.pack(side='top', fill='x') #------ Decoded check button -------------------------------------------------- self.decoded_cb = Checkbutton(self.frame1, text=_('Decoded'), variable=self.decoded) self.decoded_cb.pack(side='left') self.frame2 = Frame(self.top, borderwidth=2, relief='sunken') self.frame2.pack(side='top') #------ Report window --------------------------------------------------------- self.text = Label(self.frame2, width=0, height=0, bg=self.background, textvariable=self.report) self.text.pack(side='top') self.text.bind('', self.fetch) #------------------------------------------------------------------------------ self._welcomeMessage() def fetch(self, event=None): """Fetch METAR report.""" self.text.unbind('') self.report.set(_('Fetching report...')) # Wait until text is updated. self.master.update() start_new_thread(self._fetch, ()) def quit(self): """Clean up data and destroy this window.""" del self.metar_list del self.apt_path del self.metar_path del self.icao del self.master del self.background del self.apt_dict self.top.destroy() def _bindButton(self): try: self.text.bind('', self.fetch) except TclError: return def _compare_pos(self, a, b): lat = (abs(a[0] - b[0])) lon = (abs(a[1] - b[1])) return lat + lon def _fetch(self): """Fetch METAR report.""" if self.nearest_station.get() and \ self.nearest_station.get() == self._nearestMetar(self.icao.get()): icao = self.nearest_station.get() else: icao = self.icao.get() if icao == 'None': return self.nearest_station.set('') if self._isOnMetarList(icao): if self.decoded.get(): decoded = 'decoded' else: decoded = 'stations' url = \ ('http://weather.noaa.gov/pub/data/observations/metar/%s/%s.TXT' % (decoded, icao)) try: report = urlopen(url).read() # print ' DOWNLOAD HAS BEEN COMPLETED! '.center(40, '*') report = report.strip() # FIXME # The timeout exception seems not to be caught on my machine (with # Debian Squeeze and Python 2.5 or 2.6) if internet connection is # disabled. Have no idea what is wrong?! except timeout: report = _('Unable to download data.') except URLError: report = _('Unable to download data.') self.report.set(report) self._setLabelSize() else: self.nearest_station.set(self._nearestMetar(icao)) self.fetch() # Bind button to text widget after some delay to avoid double clicking. self.master.after(1000, self._bindButton) def _isOnMetarList(self, icao): """Return True if selected airport is on METAR station list.""" if icao in self.metar_list: return True def _nearestMetar(self, icao): """Find nearest METAR station""" nearest_metar = '' nearest_dist = 999 try: airport_pos = self.apt_dict[icao] except KeyError: return '' for icao in self.metar_list: try: metar_pos = self.apt_dict[icao] distance = self._compare_pos(airport_pos, metar_pos) if distance < nearest_dist: nearest_metar = icao nearest_dist = distance except KeyError: pass return nearest_metar def _setLabelSize(self): """Adjust label dimensions according to text size.""" report = self.report.get() report = report.split('\n') width = -1 for line in report: if len(line) > width: width = len(line) height = len(report) + 2 try: self.text.configure(width=width, height=height) except TclError: pass def _welcomeMessage(self): """Show message at widget's initialization""" # Disable widget in case of IOError. if self.metar_list[0] == 'IOError': self.text.unbind('') message = ' ' * 30 else: message = _('Click here to download the METAR report\n' 'for selected (or nearest) airport.') self.report.set(message) self._setLabelSize() fgo/src/constants.py0000644000175000017500000000422011444224426014363 0ustar robertrobert"""Here are defined all global constants.""" from os.path import expanduser, join # FGo! related constants. NAME = 'FGo! 1.3.1' COPYRIGHT = "Copyright 2009-2010 by\nRobert 'erobo' Leda " LICENSE = \ """This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more details. """ HOME_DIR = expanduser('~') # User's home directory. DATA_DIR = join(HOME_DIR, '.fgo') # Default directory for all configuration files. APT = join(DATA_DIR, 'apt') # Path to airport data file. INSTALLED_APT = join(DATA_DIR, 'apt_installed') # Path to locally installed airport list. CONFIG = join(DATA_DIR, 'config') # Path to config file. DEFAULT_CONFIG_DIR = 'config' # Name of default config directory. PRESETS = join(DEFAULT_CONFIG_DIR, 'presets') # Path to config file with predefined settings. HELP_DIR = 'help' # Name of help directory. LOCALE_DIR = 'locale' # Name of directory where localization files are stored. MESSAGES = 'messages' # Name of localization file. THUMBNAIL = join('pics', 'thumbnail.jpg') # Path to substitutionary thumbnail. CUT_LINE = ' INTERNAL OPTIONS ABOVE. EDIT CAREFULLY! '.center(80, 'x') DEFAULT_AIRCRAFT = 'c172p' DEFAULT_AIRPORT = 'KSFO' # Custom colors. CARRIER_COL = '#98afd9' # Color to highlight background for carrier name in the main window. COMMENT_COL = '#0014a7' # Color to highlight comments in text window. GRAYED_OUT_COL = '#b2b2b2' # Color to apply to rwy button when inactive. MESSAGE_BG_COL = '#fffe98' # Background color for various messages. TEXT_BG_COL = '#ffffff' # Background color for various text windows. # FG related constants. AI_DIR = 'AI' # FG_DATA/AI directory name. AIRCRAFT_DIR = 'Aircraft' # FG_DATA/Aircraft directory name. AIRPORTS_DIR = 'Airports' # FG_DATA(or FG_SCENERY)/Airports directory name. APT_DAT = join('Airports', 'apt.dat.gz') # FG_DATA/Airports/apt.dat.gz file path. METAR_DAT = join('Airports', 'metar.dat.gz') # FG_DATA/Airports/apt.dat.gz file path. fgo/docs/A WORD TO TRANSLATORS0000644000175000017500000001300211435145610015070 0ustar robertrobertFGo! is using gettext library to localize its interface. Translations (with some exceptions) are stored in "src/locale" directory. You are very welcome to update/improve existing one, or add translation to new language if you wish. Even smallest contribution will be appreciated. Here are some helpful (I hope) tips: IF YOU ARE FAMILIAR WITH GETTEXT AND WOULD LIKE TO CONTRIBUTE A NEW, OR MODIFY AN EXISTING TRANSLATION: You should have no trouble with the task. Translating FGo! is no different than translating any other application. Except maybe some additional files, see SOME ADDITIONAL TEXT TO TRANSLATE section for more information. When translation is ready, please send me "messages.po", and/or other files at mail address provided at the end of this document. I'll be happy to include you translation in next release of FGo! IF YOU LIKE TO MODIFY EXISTING TRANSLATION BUT NEVER TRANSLATED AN APPLICATION BEFORE: Don't worry, it is quite simple. All you need to do is to edit a "messages.po" file located in "src/locale/LANGUAGE_CODE/LC_MESSAGES" directory. You can do this by using any text editor. But using dedicated software (e.g. Poedit, Virtaal, or Emacs) is more convenient and less error-prone way to edit a PO file. Translation process itself is straightforward and you should have no trouble with the task at all. One thing to remember however, is to include in your translation all "%s" formatting characters from original text. It is a placeholder for some values to be displayed onscreen, e.g. it is used to display path to executable file for FlightGear in console message, and its absence can lead to crash of the application. When you're happy with the changes you made to PO file, one last thing to do, is to generate new "messages.mo" file, which is actually used by the program to show translated messages. To do this, open console, navigate to folder containing "messages.po" file and run this command: msgfmt messages.po Now you can inspect if changes you have made are properly included in FGo! If you're happy with the result, please send me "messages.po" file at mail address provided at the end of this document. I'll be happy to include you translation in next release of FGo! See section SOME ADDITIONAL TEXT TO TRANSLATE for some more information. IF YOU LIKE TO ADD NEW TRANSLATION BUT NEVER TRANSLATED AN APPLICATION BEFORE: First you need to create a new folder in "src/locale" directory. This new folder should have the same name as language code for your language. Some of most common examples of language codes can be found here: http://www.gnu.org/software/hello/manual/gettext/Usual-Language-Codes.html Next, navigate to this newly created directory and create "LC_MESSAGES" folder. Rest of the translation process is the same as described in section IF YOU LIKE TO MODIFY EXISTING TRANSLATION BUT NEVER TRANSLATED AN APPLICATION BEFORE. With one exception: you should edit "messages.pot" file in "src/locale" directory, and then save it as "messages.po" into "src/locale/LANGUAGE_CODE/LC_MESSAGES" folder. After you have created "messages.po" file you may open it with simple text editor and edit some comments: * At first line, replace word LANGUAGE with actual name of your language. * At fourth line, provide your personal data (if you wish of course) as you are first author of this translation. See next section for some more information. SOME ADDITIONAL TEXT TO TRANSLATE: Additionally, you can also translate files in the "src/config/" and "src/help/". Content from the first directory is shown in Command Line Options Window (the text window at the bottom of the application) at first run of FGo!, and content from the second directory is displayed in the help window. If no file with your language code is present, open file "en", and save it at the same name as the directory with your translation (in "src/locale") is called. Please take a note that no line in those files should have more than 79 characters. In case of the help file it is mandatory to stay within that 79 characters limit, while in case of the config it is only a general advice and can be exceeded slightly if appropriate. In many text editors, you can enable right margin line which can help you to not exceed this limit. I understand that translating help file can be a major task. Due to its length, and not the best style, not to mention my poor English proficiency, or fact, that this file is subject to change in the future I actually encouraged you to not translate this file literally if you only find it appropriate. In fact, you may write your help from scratch if you wish. I encouraged you however to include information that can be found in: MINIMUM REQUIREMENTS, INSTALLATION, RUNNING, and CONFIGURATION sections, as I personally considering these chapters as most important for new users. TESTING YOUR TRANSLATION: When your translation is ready, you can test if all text is properly displayed in the application. Navigate to "~/.fgo" directory, and move out, or rename temporarily file called "config". It will simulate a situation when FGo! is run first time. After running the program, it should automatically pick up translation based on you system settings. If no proper translation is found, it should revert to default, English language. If you approach any troubles at this point, please contact me at the address that can be found at the end of this file. I will be happy to help you. Thank you for your effort, Robert 'erobo' Leda fgo/docs/COPYING0000644000175000017500000000074411431353422013173 0ustar robertrobert DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. fgo/docs/README0000644000175000017500000000022011434430455013012 0ustar robertrobertYou can access readme file in fgo/src/help directory. Alternatively, you can view it in application's help window under Menu ==> Help ==> Help. fgo/docs/CHANGE_LOG0000644000175000017500000001360511444225766013526 0ustar robertrobert0.9 24.09.2009 First public release. 0.91 [BUGFIX] Fixed bug in App.colorText(); all comments in text window should be colored now. [FEATUE] Search can now be started also using Enter key placed in numpad. [BUGFIX] Added clear statement in README file that the program needs PIL library to run. 1.0 [FEATUE] Added a little style to console output; FGo!'s messages are now better distinguished from the rest of the text. [BUGFIX] Kill signal for TerraSync process in App.SaveAndQuit() changed from 15 to 9. [FEATUE] Added better visual feedback when in "carrier mode". [BUGFIX] Fixed bug in App.colorText(); colored text should be displayed properly now with newer Tcl/Tk versions. [FEATUE] Application's window is now resizable. Current window resolution is saved to the config file when "Save&Quit" button is clicked. [FEATUE] "Rebuild Airport Database" button added in preferences window. [FEATUE] FGo! will look for data/.config-base file if standard config is not found. ...and many more minor fixes. 1.1 [FEATUE] Translation system has been completely rebuilt. All translations are now stored in "locale" directory. [FEATUE] German translation has been added (thanks to chris_blues). [BUGFIX] "HOME_DIR=" keyword in config file has been replaced by (more appropriate) "FG_WORKING_DIR=" keyword. [FEATUE] To be able to use TerraSync, path to its executable file needs now to be specified in Preferences window. Corresponding "TERRASYNC_BIN=" keyword has been introduced into config file. [FEATUE] TerraSync's default port has been changed to 5001. [BUGFIX] FGo! should not crash anymore if certain keywords with corresponding values are not present in config file. ...some more minor changes and fixes. 1.11 [FEATUE] Spanish translation has been added (thanks to Canseco). [BUGFIX] Wrong "Selected Scenarios" count has been fixed [BUGFIX] Fixed bug in "Save as..." dialog box. File ".fgo" will no longer be generated in main application's directory if "Save as" window is closed without actually saving the config. 1.2 [FEATUE] Dutch translation has been added (thanks to snipey). [BUGFIX] FGo! should now correctly read names of parking positions containing white spaces. [FEATUE] Added new "Airport data source" menu (in Preferences window) where data source for runway or parking positions can be selected. Corresponding "APT_DATA_SOURCE=" keyword introduced into config file. ...and (as usual :) ) some more minor changes and fixes. 1.3.0 [FEATUE] French translation has been added (thanks to Olivier Faivre). [FEATUE] Program structure has been changed: source code, as well as pictures and locale directory has been moved into src folder. [FEATUE] METAR widget added. [FEATUE] Preferences window redesigned. Tabs (well, sort of) are now used to group its content. [FEATUE] Preferences, About and Error window behavior improved. All windows stays on top of main window all the time and main window does not accept input if preferences are open. What's more, it is not possible now to open multiple instances of Preferences and About windows. [BUGFIX] FGo! should not crash anymore if non Latin characters were entered in the paths in Preferences window or in command line options window. [BUGFIX] Airports with non Latin characters in their names should now be visible on the list. This applies to airports: SBGL and TFFC. [FEATUE] All generated by the program data is now stored in "~/.fgo" directory. [FEATUE] ".config-base" file in "data" directory has been moved to "src/config" folder, and renamed to "en". Different variants of the same file are now available for different languages. [FEATUE] A new "presets" file added to "src/config" directory. It can hold predefined settings with which the program will be started if "~/.fgo/config" can't be find. [BUGFIX] "Reset" button will no longer affect "TerraSync" checkbutton state. It could in the past lead to erroneous indications on whether TerraSync is actually enabled or not. [FEATUE] It is now possible for airport list to display installed airports only. Appropriate controls have been added to Menu ==> Settings. [BUGFIX] Information about runways is now taken from ~/.fgo/apt database, not from scenery itself even if airport data source is set to "Scenery". Apparently, FlightGear is not reading threshold information from scenery even if property: /sim/paths/use-custom-scenery-data is set to true. [FEATUE] A new window is shown to indicate that FlightGear is running. [FEATUE] Help window was added. It is available at Menu ==> Help ==> Help. As a result, old readme file was moved into "src/help" directory, and renamed to "en". Different variants of help file are now available for different languages. [FEATUE] FGo! can now be run from outside its main directory. Symbolic link to fgo file, or command like e.g. "python ~/fgo_main_folder/fgo" can now be used to launch the program from any location. [FEATUE] Starting from now, version indication has been standardized. Every release is now marked with three digit number separated by dots. First two digits describes the version number, when last digit, describes the status of this version: Zero means that such release incorporates important new features, or major source code changes. Any other digit means that this is bug fixing release, or a small update, and it incorporates only small changes to source code, or changes to other files (e.g. translations). ...and (yes, you guessed it right! :D) many more minor changes and fixes. 1.3.1 [BUGFIX] FGo! should not crash if the system language is not supported by the program. fgo/src/locale/messages.pot0000644000175000017500000001013211427420724015566 0ustar robertrobert# LANGUAGE translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "" #: gui.py:37 msgid "Load" msgstr "" #: gui.py:38 msgid "Save as..." msgstr "" #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "" #: gui.py:43 msgid "Quit" msgstr "" #: gui.py:44 msgid "File" msgstr "" #: gui.py:47 msgid "Show installed airports only" msgstr "" #: gui.py:50 msgid "Update list of installed airports" msgstr "" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "" #: gui.py:55 msgid "Settings" msgstr "" #: gui.py:60 msgid "Tools" msgstr "" #: gui.py:63 gui.py:266 msgid "About" msgstr "" #: gui.py:64 msgid "Help" msgstr "" #: gui.py:99 gui.py:200 msgid "Search" msgstr "" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "" #: gui.py:127 msgid "Rwy:" msgstr "" #: gui.py:130 msgid "Parking:" msgstr "" #: gui.py:157 msgid "Select Scenario" msgstr "" #: gui.py:166 msgid "Selected Scenarios:" msgstr "" #: gui.py:221 msgid "Reset" msgstr "" #: gui.py:225 msgid "Run FG" msgstr "" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "" #: gui.py:279 msgid "License" msgstr "" #: gui.py:282 gui.py:871 msgid "Close" msgstr "" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "" #: gui.py:508 msgid "OK" msgstr "" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "" #: gui.py:860 msgid "Error" msgstr "" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "" #: gui.py:897 msgid "Stopping TerraSync" msgstr "" #: gui.py:1003 msgid "Carrier:" msgstr "" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "" #: gui.py:1193 msgid "Save settings" msgstr "" #: gui.py:1200 msgid "Cancel" msgstr "" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "" #: gui.py:1503 msgid "Port:" msgstr "" #: gui.py:1532 msgid "Change language:" msgstr "" #: gui.py:1543 msgid "Airport data source:" msgstr "" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "" #: gui.py:1597 msgid "FlightGear is running..." msgstr "" #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "" #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "" #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" fgo/src/pics/thumbnail.jpg0000644000175000017500000001201411356555552015431 0ustar robertrobertJFIFHHC  !"$"$C"L  !1AQ"q2a#BRb$36CTcrSdu!1AQa ?袊((((((((((+RMNN*]t&Rϕ{WVDwOCױqOУY>~UsW-t~ U4^{UibbT#7*C|=G})-A[}jJA=Ei\:U!yT'#uƎ4mRGrqĴ(G ~[!7 Z2ZTNГۆԗ"?%QS\dBK"逗xiaWÉe')OPHj$R-K%ACܯ/V,- i;9ر~2[YVL$º©x07FRwg EVTQE{m98ke^ .t&' M^qV Hh;AQS8Qb(*ll PP(ǗkI4x,^/f֛FBh`$љ4E68a <"f@SWl iQx-A=k+jb[]T*,ү\jnN^ô>(Q~TEyT mܜ{\P1DZۛ9>B|L}ZD q^kbfhy^Ϊʅwղ֔y`P}Yr~ѧ#!ͩp'8 ʸJ| c'?8\?IT'g69q8Uc; nlǽB#A'"^dm:nF&wc8+1N“~孲sI! [¿$_>u\'=į%M觲!0 AUз`[BUw_mj=bn$yIRVkaBڮbDHq#E$u ϭ9Qig8\Ld/Fݥ%$dKҦݟ l eخ= [.3! 8Pl7q؅iPL4+j3T]tZPaڊHӟ]+5$/R9s>wOYFmM-rv ]yqQe) .H~[nI9wHhic%'+Jz.'ӷf-"%Ck^ӜvN`l7{,d'6q}*\J)EJo$%=K71!>2 Eh4c%DT$i>/yl5V{*7+5Q.mJH s3m«99jN!,3cF5 DI1Q!%)G*]BUjvˑ0J\nROprd '9Cksj= )*Ak::<n,+pZ4 le\zWSZ}A\`Tʂʺtt{=I?_%h*jZ]jJ!꭭Saꮛc}PӂTk8I$r懺+vZBއNvj Tݻ?1ڶ99q o/~ݫJdgWh t{T.~3ĥ^ݹ?*?uwMSJ<8BBb}Rgl+v3wLw8gf| >[ SoYj \e+O+]ME8HPsԨQ DB^LIœ ܕ-ç_ S%om)=pQǻ"+2Yx6j .oF+ZJpSݮl~V4/łByY?pB5HZy'9=i,֯f9OŨܙY4K} )s/(!ߺ6-ʗNRygiVØzKә3@RoC%KXX'h7 ۮLKzjچJR=׭ei/GG0v%1pdU0PԡO4k9 $%*\#zҬ6BoY 4T==4#$gv)>74iL)n$`h t!^ݹĝ5w7oRYx} Tޯ'\[^qEKrOrIQ4pz~k'27JxҼN[dcFLl۷aJ9>1Tca&?؞eUhxlȇϒRPn=i.+8j蛃woB߆Om -;Vn 5\GZkFl3ۑڳ]Iċkثb{a4Th)%'tO7,b}А R3#􈯖R▲TOsVMk>gPz!Z>7IxQt$Zө=Rq>}GΪ8^zw67?SUk@qf;?0]lrbsRqp3P~U}5f^J_jhZH 3ӭaL򴲡?'UNѧ8oOd>D|Ks:zye#\Z2:B\,sMRJqԠ JA'_6RHP9ydO^JtҿA4Vn%iҦxh$xHnKsc(@ >ץ{|H'. %/6pX|ҿU[m&,[[ΩTV,ZSnRK,N,jFN>Cn# 6.֓xvŵaۋ#ϖ_hZľ(iۼqrin8 u,Fn,ۑq[TBRI|W͇= I  #[iWF^:W%>`ձms,N|+g%UvTMd-,,D䨅o)03zQ4kmnId.n=?-:apjT%eFJTzPaښ4&5uͰPJ^H I H'P?XZKKI-]I^:!|Uj~LU+ lG$>5_ kJg(K#wSAUbp5[-bNRgҜxnɵFd)%9QM|ߖyè { O\/\v\d+-B@dc?3ne͌V^;r:c;w5Įj{< a'=vd(gPhK$m֨-@>dcH_F tg-VatWi͕Q[[K#ߴUt"vXjw8GEtϩTh-nmq-|MI,>.\BU٬q  Rm~gQqWz?5T@܋cIJs6zeGDIվi?k\3ܬh\7+a'=vd{:ȲLfj,-= F>4nHjUDuXh*l4O*@jڭwrGO &#>(ءsS1ubK7"[I8.gzl%y)^?DWY~=k] Ih1! /.!$5R56S-0PuE#QAϴGrtFe06(S5w鵤}YuNLG%u!}A݄QZQW摪gŖ_/੗l:M`ٰ$4Jg%, ; ɡ2{дcQ ,98…Cבx YΉORzaKjWZ2,ִ~ϊ4-ۅz4_iC-{Puw)4.!B::F: US];б xR`ۭ{}4 w>!kކ=qTO@ij{ lRٰP4h 9PlB3|qGޠS<ޜϲ-"Ս| 眎Ɲk1'L HAw(B(ݴ)[ܢTBSBqZuMTLlڰ 5eU?svzpUf-h UrsMٲaK ۲!YBT(BE{i`ݳo9%qzEe4|PT6nؒLQ5mo X 6j DpST/9uUTՕ|[vʌ U$'̜E Kţ`BڒM˄knniW+W'~z [//_|=;v"GU`Ωcp3P[7N)板f]ЊmTD"s4 b_ 1ư ˥h flotKKhHea"GWsyf&۶TM%˅X'BJƌ f> y-k`0Ba)^x>x#yDW8 h#.g 44o@ 5~=u5lX=O mIc>~[e=)o7g,$m#kϜ@WMA<%Us9Hɯȋ NB5P rBR*v6 ۴aI ݍyysz` x)hݳkiEa/)w g>,}0 $T@*p_:#5donw}֫~$CgݩҰZU5sK3q3cw X2_% 0}LM˲yf,z.'Na3^i9X{ׅX1<ܳX@g?_]Yr*\:Kgt{}ծf:p?g!>x#024zz~@ן@.2x2s.`(x0 4Mi%`@ :[waC; b03Ŀb\v ՍT4e%_\ _T+& nC`HXp`];-s'ϼΚZbU3&5V/ʪ(mz0>0ɈQ=] `T45rjwdx*ڣӐ|25U()+EiEj H_T$b(A{zڲyUcՉ ?}xFziukr\TtC61tp-'"!`wצԟ)ҲLpڄ4t0?|eKUܸ;ʐ`YJ%v >mͺuTYaٗmdXѝsfǏ<R0F6arZ`N'GF8 nton}q ̻x{eB ٳ@رY@`YD:i3Z|THE /( |߀iCH☝EN(MDHp@/#k0+qǼ+7 xw'@,4sⴧMd͐T&g(׆K51# =W;+gFQϱo^|o](Pl´҈)`6TxXRͻJ]X菼f =9KIv6]8\r0%e *Gblr5v.`GC}jCk:l:H.XҵKo: lЩ *Ȓ Mf(#NdJb Q$1TTK+1hc>1i*MS$ IaiI0?0EV/# LP5m-ަg@= Xw(Sƹ!X,`H$18±2z{pu@A 꿩N#N>Ê;vbBD}jf`4™$g~-~ܸDEqLwx>L.Qu*s_Myﴣ2#[B6S$,!$L Tdxg>іF;n9zU~U@oށ@_wSX64o!~q"pו3龇G_[J\4zQU7.dW43hΩ'zJs6- V6KVʀPR̬iQ:e?gb޽"?J6_xi粻6@`[Pc[:pUPst2r lЗWHŅrK+pIgi~<׎%[g_*($b$l 2mYB&;(!b1h߽;M|٬oꞿ;s}/WȞj1eI~gG});Ǝ1 Xs?"NGW϶MUf"p{k(N F"v %il/fzNlo+D28]5=]Z4pҝp&C"p(,PPu+O}Mt~䏮 WM T8y,Bb۞#tm"By HS"KT "EJEOPTp_yyw#k^N& A[+}jhںy/1ҹgSߥh./՟~\R0\y]z]P@锊1B`,[gBU8,dV} Ս28PPX{=q+4#gҒg9h_|Ϣ_ߑN}qkǛCǀo|GAUh)v:EF8TW26HF8^i EfMH[BZ< Bo+kNȚS?Zл=<&[Giuup W").IaJ;eD+r;973F'i:~rIENDB`fgo/src/help/pl0000644000175000017500000002341211434544073013271 0ustar robertrobertFGo! 1.3.0 Prosty program do uruchamiania FlightGear-a. ------------------------------------------------------------------------------- WYMAGANIA MINIMALNE System operacyjny GNU/Linux FlightGear Python 2.5.2 * TKinter Python Imaging Library (PIL) 1.1.6 (with ImageTk module) Tcl/Tk 8.4 * FGo! jest kompatybilne tylko z Pythonem z serii 2.x. ------------------------------------------------------------------------------- INSTALACJA Program nie wymaga instalacji, lecz przed pierwszym uruchomieniem należy upewnić się, że w systemie zostały zainstalowane następujące elementy: interpretator Pythona (z modułami Tkinter i PIL) oraz biblioteki Tcl/Tk. Wszystkie one powinny być dostępne w repozytoriach. W dystrybucjach opartych na Debianie, wymagane są następujące pakiety: python, python-tk, python-imaging, python-imaging-tk, tcl8.x i tk8.x. W menadżerze pakietów wystarczy wybrać pakiet python-imaging-tk, reszta zależności powinna zostać zainstalowana automatycznie razem z nim. ------------------------------------------------------------------------------- URUCHAMIANIE FGo! nie posiada własnego okna wyświetlającego komunikaty FlightGear-a, dlatego najlepiej uruchamiać program z linii poleceń. Otwórz terminal, przejdź do katalogu do którego rozpakowałeś aplikację i uruchom FGo! komendą "python fgo", albo "./fgo". W tym ostatnim przypadku upewnij się, że plik "fgo" jest plikiem wykonywalnym. Jeżeli Twój manager plików oferuje taką możliwość, możesz też po prostu kliknąć na ikonie "fgo" i w oknie dialogowym wybrać opcję: Uruchom w terminalu. Począwszy od wersji 1.3.0, nie trzeba już przed uruchomieniem programu przechodzić do jego katalogu głównego. Można teraz stworzyć symboliczne dowiązanie do pliku "fgo" i umieścić je w wygodnym miejscu, albo można też uruchomić program z każdego położenia komendą w stylu: python ~/katalog_główny_fgo/fgo. ------------------------------------------------------------------------------- KONFIGURACJA Zanim będziesz mógł korzystać z programu, powinieneś go skonfigurować. Otwórz okno preferencji (Menu Ustawienia => Preferencje) i wypełnij puste pola. Ustawienia FlightGear-a: Ścieżka do pliku wykonywalnego - podaj ścieżkę do pliku "fgfs", albo jeśli używasz skryptu download_and_compile.sh, do pliku "run_fgfs.sh". FG_ROOT - ścieżka do katalogu głównego FlightGear-a. FG_SCENERY - ścieżka do scenerii. Możesz podać więcej niż jedną ścieżkę, (rozdzieloną dwukropkiem) w kolejności od najwyższej, do najniższej warstwy. Katalog roboczy - opcjonalny parametr określający katalog roboczy FlightGear-a. To tam będą zapisywane logi czy screenshoty. Jeżeli pozostawiony pusty, katalogiem roboczym będzie katalog domowy użytkownika. Ustawienia TerraSync-a: Ścieżka do pliku wykonywalnego - podaj ścieżkę do pliku "terrasync", albo jeśli używasz skryptu download_and_compile.sh, do pliku "run_terrasync.sh". Ścieżka do scenerii - katalog, w którym program TerraSync zapisuje pobraną scenerię. Port - numer portu używanego przez TerraSync. Różne: Zmień język - wybierz inny język. Jeżeli język nie został wybrany, program postara się wybrać język systemowy. Źródło danych o lotniskach - wybierz źródło danych, z którego program będzie czerpał dane o pasach startowych i pozycjach parkingowych. Są dwie opcje: Domyślne - FGo! będzie pokazywać dane o pasach startowych w oparciu o informacje zgromadzone w pliku ~/.fgo/apt, który został wygenerowany na podstawie informacji pochodzących z pliku FG_ROOT/Airports/apt.dat.gz. Informacje o parkingach zostaną pobrane z katalogu: FG_ROOT/AI/Airports. Sceneria - FGo! będzie pokazywać dane o pasach startowych w oparciu o informacje zgromadzone w pliku ~/.fgo/apt, który został wygenerowany na podstawie informacji pochodzących z pliku FG_ROOT/Airports/apt.dat.gz. Informacje o parkingach, zostaną pobrane z katalogu: FG_SCENERY/Airports - lub katalogów, jeśli zostały podane ścieżki do wielu scenerii. Podsumowując... Gdy zostanie wybrana opcja "Domyślne", program będzie korzystał z tych samych danych, z których domyślnie korzysta FlightGear. Tymczasem, gdy zostanie wybrana opcja "Sceneria", FGo! będzie szukało tych informacji bezpośrednio w scenerii. W tym ostatnim przypadku, można w oknie linii poleceń dodać opcję: --prop:/sim/paths/use-custom-scenery-data=true, aby upewnić się, że FlightGear także będzie pobierał informacje bezpośrednio ze scenerii. Jeśli nie jesteś pewny którą opcję wybrać, najlepiej pozostaw ustawienia domyślne. Przebuduj Bazę Lotnisk - zbuduj nową bazę lotnisk na podstawie danych z pliku: FG_ROOT/Airports/apt.dat.gz. Przycisk ten powinien zostać użyty, jeśli baza danych apt.dat.gz uległa zmianie. Do poprawnego działania programu potrzebne jest wypełnienie pierwszych trzech pól. Reszta ustawień jest opcjonalna. Po ustawieniu tego co trzeba, kliknij przycisk "Zapisz ustawienia". Po paru chwilach, w oknie głównym powinny pojawić listy dostępnych samolotów i lotnisk. Zmiany ustawień dotyczących FlightGear-a są uwzględniane przez FGo! natychmiast po kliknięciu przycisku "Zapisz ustawienia". Zmiany pozostałych ustawień mogą wymagać ponownego uruchomienia programu. ------------------------------------------------------------------------------- ELEMENTY GŁÓWNEGO MENU Plik: Wczytaj - wczytaj zapisany wcześniej plik konfiguracyjny. Zapisz jako... - zapisz aktualne ustawienia do pliku. Zapisz i Wyjdź - zapisz ustawienia i zamknij program. Zakończ - zamknij program. Ustawienia: Pokaż tylko zainstalowane lotniska - na liście lotnisk będą pokazywane tylko lotniska zainstalowane na twardym dysku. Odśwież listę zainstalowanych lotnisk - przeskanuj twardy dysk w poszukiwaniu zainstalowanej scenerii i odśwież listę lotnisk. Opcja ta działa tylko w przypadku, gdy opcja "Pokaż tylko zainstalowane lotniska" jest aktywna. Preferencje - otwórz okno preferencji. Narzędzia: METAR - pokaż raport pogodowy dla wybranego (lub pobliskiego) lotniska. Raporty te są pobierana ze strony http://weather.noaa.gov/ Pomoc: Pomoc - otwórz okno pomocy. O programie - otwórz okno z informacjami o programie. ------------------------------------------------------------------------------- OKNO LINII POLECEŃ W oknie tekstowym umieszczonym na dole głównego okna aplikacji można wpisywać opcje, z którymi zostanie uruchomiony FlifhtGear. Parę opcji jest tam umieszczonych już przy pierwszym starcie programu. Więcej przykładów można znaleźć w dokumentacji FlightGear-a, lub na wiki, pod adresem: http://wiki.flightgear.org/index.php/Command_Line_Options ------------------------------------------------------------------------------- TIPS&TRICKS * Jeżeli źródłem danych o lotniskach jest sceneria, to informacje o pozycjach parkingowych mogą być niedostępne dla wybranego lotniska do czasu zainstalowania odpowiedniej scenerii. * Jeżeli w polu wyszukiwania lotnisk zostaną wpisane *tylko* wielkie litery, program wyszuka tylko kody ICAO zaczynające się od tych liter. Dla przykładu, gdy wpisane zostaną litery "EP", wyświetlona zostanie lista (prawie) wyłącznie lotnisk znajdujących się na terenie Polski. * Możesz wystartować na pokładzie lotniskowca. Kliknij na kodzie lotniska znajdującym się na środkowym panelu (zaraz pod obrazkiem przedstawiającym wybrany samolot) i wybierz któryś z dostępnych okrętów. Kod lotniska zostanie zastąpiony nazwą wybranej jednostki i zmieni kolor na niebieski, by zaznaczyć, że program znajduje się teraz w trybie wyboru lotniskowca. Dodatkowo, FGo! automatycznie wybierze odpowiedni dla danego okrętu scenariusz. Aby móc z powrotem startować z lotnisk, należy kliknąć nazwę lotniskowca i z listy która się ukaże, wybrać opcję "Żaden". * Na liście scenariuszy można kliknąć prawym przyciskiem myszki na każdym z nich, aby zobaczyć jego opis (o ile opis ten jest dostępny). * Lista scenariuszy może zostać zamknięta środkowym przyciskiem myszki. * Gdy zostanie użyta opcja "Zapisz i Wyjdź", FGo! zapamięta rozmiar swojego okna. * Jeżeli pliki apt.dat.gz uległy zmianie (jeśli dla przykładu zainstalowano nową wersję FlightGeara), należy użyć przycisku "Przebuduj Bazę Lotnisk". * W katalogu "src/pics" znajduje się plik "icon.png", którego można użyć jako ikony dla pliku uruchamiającego program. ------------------------------------------------------------------------------- ZNANE BŁĘDY I OGRANICZENIA * FGo! nie śledzi czy sesja TerraSync-a została zakończona. Gdy TerraSync zostanie w krótkim odstępie czasu wyłączony i ponownie wyłączony, w konsoli może pojawić się następujący komunikat: error binding to port 5501. Wskazuje on na to, że nowa sesja TerraSync-a nie może zostać uruchomiona ponieważ poprzednia sesja nie zakończyła jeszcze ściągania scenerii z internetu. W takiej sytuacji należy poczekać, aż download dobiegnie końca i ponownie zaznaczyć pole TerraSync. * Długie nazwy pozycji parkingowych nie mieszczą się w przycisku Parking. ------------------------------------------------------------------------------- Dziękuję za używanie tego programu, Robert 'erobo' Leda fgo/src/help/en0000644000175000017500000002056711433414271013263 0ustar robertrobertFGo! 1.3.0 A simple GUI launcher for FlightGear. ------------------------------------------------------------------------------- MINIMUM REQUIREMENTS Operating system GNU/Linux FlightGear Python 2.5.2 * TKinter Python Imaging Library (PIL) 1.1.6 (with ImageTk module) Tcl/Tk 8.4 * FGo! is compatible only with Python 2.x series. ------------------------------------------------------------------------------- INSTALLATION This program requires no installation, but Python (with Tkinter and PIL modules) and Tcl/Tk library need to be installed prior FGo!'s first run. All of them should be available in the repositories. In Debian based distributions you may be required to install these packages: python, python-tk, python-imaging, python-imaging-tk, tcl8.x and tk8.x. You may simply choose python-imaging-tk, and your manager should automatically install all other required dependencies. ------------------------------------------------------------------------------- RUNNING FGo! does not provide its own window to print FlightGear's messages, that's why the best method to run the application is to run it from command line. Open a terminal, navigate to directory where the FGo! was unpacked and run it using "python fgo" or "./fgo" command, or if your system offers this feature, you can simply click on the fgo icon and choose in dialog option: Run in terminal. In the last two cases, make sure that fgo file is an executable. Starting from version 1.3.0, you don't need to navigate to its main directory before starting it. You can now simply create symbolic link to "fgo" file, and place it whatever you want, or run it from any location with command like: python ~/fgo_main_folder/fgo . ------------------------------------------------------------------------------- CONFIGURATION In order to use FGo! you need to first set it up. Open preferences window (in menu choose: Settings => Preferences) and fill in empty entry fields. FlightGear settings: Path to executable file - enter the path to "fgfs" file, or "run_fgfs.sh", if you are using download_and_compile.sh scripts. FG_ROOT - path to FlightGear's main directory. FG_SCENERY - path to scenery. You can specify more than one path (separated by a colon) in order from highest to lowest layer. Working directory - optional parameter specifying FlightGear's working directory. That is the directory where logs or screen-shots will be saved. If left blank, the working directory is the user's home directory. TerraSync settings: Path to executable file - enter the path to "terrasync" file, or "run_terrasync.sh", if you are using download_and_compile.sh scripts. Scenery path - directory where TerraSync saves downloaded scenery. Port - a port address used by TerraSync. Miscellaneous: Change language - choose another language. If language not selected, FGo! will try to choose the system language. Airport data source - select data source where FGo! will be looking for information about runways or parking positions. There are two options: Default - FGo! will show runway numbers based on ~/.fgo/apt file, which is generated from FG_ROOT/Airports/apt.dat.gz database. Parking names will be taken from FG_ROOT/AI/Airports directory. Scenery - FGo! will show runway numbers based on ~/.fgo/apt file, which is generated from FG_ROOT/Airports/apt.dat.gz database. Parking names will be taken from FG_SCENERY/Airports folder - or folders - if multiple scenery paths are provided. Generally speaking: "Default" option will tell FGo! to show the same data that FlightGear uses by default when selecting starting location, while "Scenery" option will tell FGo! to look for that data directly in scenery folder. In that latter case, you may add --prop:/sim/paths/use-custom-scenery-data=true argument into command line options window to tell FlightGear to use the same data. If not sure which option you should choose, the best is to stick with the default setting. Rebuild Airport Database - build new airport database from current FG_ROOT/Airports/apt.dat.gz. Useful in case when apt.dat.gz file has been updated. Filling the first three entries is necessary for proper operation of the program - the rest is optional. When you are done with configuration, click "Save Settings" button. After a few moments, in the main window should appear a list of available aircraft and airports. Changes in FlightGear's settings are applied immediately after clicking on "Save Settings" button, however changes in TerraSync and language settings may require restarting FGo!. ------------------------------------------------------------------------------- MAIN MENU ITEMS File: Load - load specified config file. Save as... - save settings to specified config file. Save & Quit - save settings and quit the application. Quit - quit the application. Settings: Show installed airports only - only airports present in scenery actually installed on the hard drive will be shown on the airport list. Update list of installed airports - scan hard drive for installed scenery and update the airport list. It works only if "Show installed airports only" is selected. Preferences - open preferences window. Tools: METAR - show METAR report for selected (or nearest) airport. These reports are downloaded from http://weather.noaa.gov/ Help: Help - open "Help" window. About - open "About" window. ------------------------------------------------------------------------------- COMMAND LINE OPTIONS WINDOW In text window at the bottom, you can write command line options that will be passed to FlifhtGear. Few options are provided by default, for more examples consult FlightGear documentation or check Wiki at: http://wiki.flightgear.org/index.php/Command_Line_Options ------------------------------------------------------------------------------- TIPS&TRICKS * If airport data source was set to "Scenery", then information about airport's park positions may not be available until corresponding scenery is installed. * If you type in airport search box *only* capital letters, program will search only ICAO codes starting from that letters. For example: if you type capital letters "ED", the result will be the list of (almost) only German airports. * You can start a flight from an aircraft carrier. In a middle panel click on current airport ICAO code (right under aircraft picture) and choose one from available ships. ICAO code will then change to selected ship's name, and will be highlighted blue to indicate that you're now in "carrier mode". Corresponding scenario will be selected automatically. To be able to choose airports again, you need to click on carrier name, and from popup list select "None". * In "Select Scenario" list, you can right click on any scenario to see its description (if available). * "Select Scenario" list can be closed using middle mouse button. * Window resolution is saved when "Save&Quit" button is clicked. * If apt.dat.gz file has been changed (for example, if you installed a new version of FlightGear), then "Rebuild Airport Database" button located in Preferences window need to be used in order to apply any changes in airport database into FGo!. * If you would like to distinguish FGo! launcher from other files, you can replace its default icon with picture called "icon.png" located in "src/pics" directory. ------------------------------------------------------------------------------- KNOWN BUGS AND LIMITATIONS * FGo! does not track if TerraSync has been actually closed before starting a new instance of it. If "TerraSync" checkbutton is unchecked and checked again in short period of time, "error binding to port 5501" message may be shown in a console. It indicates that old instance of TerraSync does not finished downloading data yet. In that case, wait until download is finished and check "TerraSync" checkbutton again. * Very long parking places names does not fit in parking button. ------------------------------------------------------------------------------- Thank you for using this software, Robert 'erobo' Leda fgo/src/help/es0000644000175000017500000002061511435012450013255 0ustar robertrobertFGo! 1.3.0 Un simple GUI lanzador para FlightGear. ------------------------------------------------------------------------------- REQUISITOS MÍNIMOS Sistema Operativo: GNU/Linux FlightGear Python 2.5.2 * TKinter Python Imaging Library (PIL) 1.1.6 (con el modulo ImageTk) Tcl/Tk 8.4 * FGo! solo es compatible con Python 2.x. ------------------------------------------------------------------------------- INSTALACIÓN Este programa no precisa instalación, pero Python (con los módulos Tkinter y PIL) y las librerías Tcl/Tk deben ser instalados antes de ejecutar por primera vez Fgo!. En distribuciones basadas en Debian los paquetes necesarios serian: python, python-tk, python-imaging, python-imaging-tk, tcl8.x and tk8.x. Puedes simplemente seleccionar python-imaging-tk y el gestor de paquetes instalará el resto de dependencias requeridas. ------------------------------------------------------------------------------- EJECUCION FGo! no dispone de una consola de debug para imprimir los mensajes de FlightGear. El mejor método para ejecutar la aplicación es hacerlo a través de una terminal. Navega al directorio donde FGo! fue descomprimido y escribe "python fgo" o "./fgo" o a través del gestor de archivos, clic derecho en el icono de fgo, Propiedades, Ejecutar en terminal. Asegurate que el archivo es un ejecutable. Cambien es posible crear un icono de acceso directo, indicando como Ruta de Trabajo el directorio donde se encuentra el ejecutable. ------------------------------------------------------------------------------- CONFIGURACIÓN Para poder usar FGo! primero necesitas configurarlo. Selecciona Ajustes->Preferencias y rellena los campos vacíos: Ajustes de FlightGear: Ruta al fichero ejecutable - introduce la ruta al fichero "fgfs" o "run_fgfs.sh" si estas usando el script download_and_compile.sh FG_ROOT - ruta al directorio principal de FlightGear. FG_SCENERY - ruta para los escenarios. Puedes especificar mas de una ruta, separado por una coma. Ruta de trabajo - Este es el directorio donde los logs y capturas de pantalla serán guardados. Si se deja en blanco, la ruta de trabajo sera el directorio home de tu usuario. Ajustes de TerraSync: Ruta al fichero ejecutable - introduce la ruta al fichero "terrasync" o "run_terrasync.sh" si estas usando el script download_and_compile.sh Ruta a los escenarios - directorio donde TerraSync guardas los escenarios descargados. Puerto - Puerto usado por TerraSync. Miscelaneo: Cambiar Idioma - Si el idioma no es seleccionado, FGo! intentara usar el idioma del sistema. Origen de datos de Aeropuertos - selecciona el origen de datos donde FGo! buscara para encontrar la información acerca de las pistas o las posiciones de parking. Ahí dos opciones: Por Defecto - FGo! mostrara los números de las pistas basado en el fichero ~/.fgo/apt, que es generado a partir de la base de datos FG_ROOT/Airports/apt.dat.gz. Los nombres de Parking se extraerán del directorio FG_ROOT/AI/Airports. Escenarios - FGo! mostrara los números de las pistas basado en el fichero ~/.fgo/apt, que es generado a partir de la base de datos FG_ROOT/Airports/apt.dat.gz. Los nombres de Parking se extraerán del directorio FG_SCENERY/Airports - o directorios - si varias rutas fueron configuradas. En pocas palabras: La opción "Por Defecto" le indica a FGo! que debe mostrar los mismos datos que FlightGear usa por defecto cuando se selecciona la localización inicial, mientras que "Escenarios" le indica que debe buscar esos datos en el directorio scenery. En este último caso, deberías añadir el argumento --prop:/sim/paths/use-custom-scenery-data=true en la ventana de linea de comandos para que FlightGear use los mismos datos. Si no estas seguro de cual opción escoger, los mejor es dejarlo por defecto. Reconstruir base de datos de Aeropuertos - genera una nueva base de datos de aeropuertos usando FG_ROOT/Airports/apt.dat.gz Útil si el fichero apt.dat.gz ha sido actualizado. Rellenar las tres primeras entradas es necesario para el correcto funcionamiento del programa - el resto es opcional. Cuando acabes de configurarlo, pulsa el botón, Guardas Cambios. En pocos segundos, aparecerá en la ventana principal la lista de aviones y aeropuertos disponibles. Los cambios en los ajustes de FlightGear son inmediatamente aplicados después de pulsar "Guardar Cambios", pero los cambios en TerraSync e Idioma, pueden requerir cerrar y abrir de nuevo FGo!. ------------------------------------------------------------------------------- OPCIONES DEL MENU PRINCIPAL Archivo: Cargar - cargar fichero de configuración. Guardar como... - guardas ajustes en un fichero especifico. Guardar y Salir - guarda los ajustes y cierra el programa. Salir - salir de la aplicación. Ajustes: Muestra solo aeropuertos instalados - solo aeropuertos presentes en el directorio scenery actualmente instalados en el disco duro, se mostraran en la lista de aeropuertos. Actualizar lista de aeropuertos instalados - escanea el disco duro en busca de escenarios instalados y actualiza la lista. Solo funciona si "Mostrar aeropuertos instalados" es seleccionado. Preferencias - Abre la ventana preferencias. Herramientas: METAR - muestra el reporte METAR para el aeropuerto (o el mas cercano) seleccionado. Estos reportes se descargan desde http://weather.noaa.gov/ Ayuda: Ayuda - Abre la ventana "Ayuda". Acerca de - Abre la ventana "Acerca de". ------------------------------------------------------------------------------- VENTANA DE LINEA DE COMANDOS En la ventana de texto puedes escribir lineas de comando que serán ejecutadas por FlifhtGear. Hay pocas opciones provistas por defecto, para encontrar mas ejemplos, consulta la documentación de FlightGear o visita la Wiki en: http://wiki.flightgear.org/index.php/Command_Line_Options ------------------------------------------------------------------------------- TRUCOS Y CONSEJOS * Si el origen de datos de aeropuertos fue configurado como "Escenarios", la información acerca de las posiciones de parking no estarán disponibles hasta que el correspondiente escenario sea instalado * Si escribes en el cuadro de búsqueda en mayúsculas, el programa solo buscara códigos ICAO que comiencen con esos caracteres. Por ejemplo: Si escribes en mayúsculas los caracteres "ED", el resultado mostrara solo aeropuertos Alemanes. * Puedes empezar a volar desde un portaaviones. Pulsa la opción que esta debajo de la imagen del avión seleccionado y escoge uno de los portaaviones disponibles. El código ICAO cambiara el nombre del portaaviones y aparecerá de color azul para indicar que estas en "Modo Portaaviones". El escenario correspondiente sera selecciona automáticamente. Para poder elegir un aeropuerto de nuevo, necesitas pulsar en el nombre del portaaviones y seleccionar "Ninguno". * En la lista "Seleccionar Escenario" puedes pulsar el botón derecho para ver la descripción. * "Seleccionar Escenario" puedo ser cerrado usando el botón central del ratón. * La resolución se guarda cuando usas la opción "Guardar y Salir". * Si el fichero apt.dat.gz ha sido actualizado (por ejemplo si has instalado una nueva versión de FlightGear), la opción "Reconstruir base de datos de Aeropuertos" ubicada en la ventana Preferencias debe ser usada para aplicar cualquier cambio en la base de datos de aeropuertos en FGo!. * Si quieres distinguir el lanzador FGo! de otros ficheros, puedes reemplazar el icono por defecto con la imagen "icon.png" que se encuentra en el directorio "src/pics". ------------------------------------------------------------------------------- ERRORES CONOCIDOS Y LIMITACIONES * FGo! no vigila si TerraSync ha sido cerrado antes de empezar una nueva sesión. Si la casilla de verificación "TerraSync" no esta seleccionada y se vuelva a seleccionar en un corto espacio de tiempo, el mensaje "error binding to port 5501" aparecerá en la terminal. Indica que la instancia anterior de TerraSync no acabo de descargar los datos. En este caso, espera a que acabe de descargar y selecciona "Terrasync" de nuevo. * Nombres de parking demasiados largos no caben en el botón parking. ------------------------------------------------------------------------------- Gracias por usar este programa, Robert 'erobo' Leda fgo/src/help/de0000644000175000017500000002342411433565702013252 0ustar robertrobertFGo! 1.3.0 Ein einfacher GUI Starter für FlightGear. ------------------------------------------------------------------------------- MINIMALE SYSTEMVORAUSSETZUNGEN Betriebssystem GNU/Linux FlightGear Python 2.5.2 * TKinter Python Imaging Library (PIL) 1.1.6 (mit ImageTk Modul) Tcl/Tk 8.4 * FGo! ist nur mit Python Serie 2.x kompatibel. ------------------------------------------------------------------------------- INSTALLATION FGo! braucht nicht installiert zu werden, allerdings muss Python (mit Tkinter- und PIL-Modulen) installiert sein, bevor FGo! das erste Mal gestartet werden kann. Alle Pakete sollten in den Repositories vorhanden sein. In Debian-basierten Distributionen sollten folgende Pakete installiert werden: python, python-tk, python-imaging, python-imaging-tk, tcl8.x und tk8.x. Es sollte reichen einfach python-imaging-tk zum Installieren vorzumerken. Die übrigen Abhängigkeiten sollten vom Paket-Manager automatisch mit installiert werden. ------------------------------------------------------------------------------- GESTARTET FGo! bringt von Hause aus kein eigenes Terminal-Fenster mit, um Meldungen von FlightGear anzuzeigen. Deshalb ist die beste Vorgehensweise FGo! aus der Kommandozeile zu starten. Öffnen Sie ein Terminal, navigieren Sie zum Ordner, in dem FGo! entpackt wurde, und starten Sie mit "python fgo" oder "./fgo". Oder, falls das System die Möglichkeit bietet, klicken Sie einfach auf das fgo-Symbol und wählen Sie: "Im Terminal ausführen". Bei beiden Möglichkeiten müssen Sie sicherstellen, dass die fgo-Datei "ausführbar" ist. Benutzt man FGo! erst seit Version 1.3.0, braucht man nicht mehr in das Hauptverzeichnis zu wechseln um es zu starten. Man erstellt nur eine symbolische Verknüpfung zur fgo-Datei, und legt sie irgendwo ab, oder man startet es an jeder Position mit einem Kommando wie diesem: python ~/FGo!_Haupt_Verzeichnis/fgo ------------------------------------------------------------------------------- KONFIGURATION Um FGo! benutzen zu können, muss man es erst einrichten. Öffnen Sie das Einstellungsfenster (im Menü: Einstellungen => Eigenschaften) und füllen Sie die leeren Felder aus. FlightGear Einstellungen: Pfad zur ausführbaren Datei - Geben Sie den Ort an, wo sich die Datei "fgfs" oder, falls Sie Download_und_Kompilier-Skripte nutzen, "run_fgfs.sh" befindet. FG_ROOT - Pfad zu FlightGear's Hauptverzeichnis. z.Bsp.: /usr/share/games/FlightGear/fgdata FG_SCENERY - Pfad zur Szenerie. Man kann mehrere Pfade angeben (mit Doppelpunkten getrennt). In der Reihenfolge von der höchsten zur niedrigsten Priorität. Arbeitsverzeichnis - optionaler Parameter, der das Arbeitsverzeichnis von FlightGear benennt. In diesem Verzeichnis werden Bildschirmfotos und Log-Dateien abgespeichert. Bleibt dieses Feld leer, wird das Home- Verzeichnis des Benutzers benutzt. TerraSync Einstellungen: Pfad zur ausführbaren Datei - Geben Sie den Ort an, wo sich die Datei "terrasync" oder, falls Sie Download_und_Kompilier-Skripte nutzen, "run_terrasync.sh" befindet. Szenerie Pfad - Verzeichnis, wohin TerraSync die Szenerien herunterlädt. Port - eine Port-Addresse, die TerraSync benutzt. Verschiedenes: Sprache ändern - Wählen Sie eine andere Sprache. Falls keine Sprache ausgewählt ist wird FGo! versuchen die System-Sprache zu erkennen. Flughafen-Datenquelle - Wählen Sie die Datenquelle, wo FGo! nach Informationen über Rollbahnen oder Parkpositionen suchen soll. Es gibt zwei Möglichkeiten: Standard - FGo! zeigt Rollbahnbezeichnungen aus der ~/.fgo/apt- Datei. Diese wird generiert aus der FG_ROOT/Airports/apt.dat.gz Datenbank. Parkplatznamen werden aus FG_ROOT/AI/Airports geholt. Szenerie - FGo! zeigt Rollbahnbezeichnungen aus der ~/.fgo/apt- Datei. Diese wird generiert aus der FG_ROOT/Airports/apt.dat.gz Datenbank. Parkplatznamen werden aus FG_SCENERY/Airports bzw. den angegeben Szenerie-Verzeichnissen geholt. Generell gesehen: Die Einstellung "Standard" veranlasst FGo! die selben Daten zu zeigen, die FlightGear normalerweise benutzt, wenn man die Startposition angibt, während die Option "Szenerie" FGo! veranlasst, direkt im angegebenen Szenerie-Verzeichnis nachzusehen. Im letzteren Fall könnten sie noch --prop:/sim/paths/use-custom-scenery-data=true im Kommandozeilen- fenster angeben, um FlightGear anzuzeigen, daß es die selben Daten benutzen soll. Sollten Sie sich unsicher sein, welche Option Sie benutzen sollten, ist es wahrscheinlich am Besten, wenn Sie die Standard-Option wählen. Flughafen-Datenbank neu laden - baut eine neue Flughafen-Datenbank aus FG_ROOT/Airports/apt.dat.gz. Das ist z.Bsp. sinnvoll wenn die Datei apt.dat.gz upgedatet wurde. Das Ausfüllen der ersten drei Felder ist notwendig für die korrekte Ausführung des Programmes - der Rest ist optional. Wenn Sie die Konfiguration abgeschlossen haben klicken Sie auf "Einstellungen speichern". Nach wenigen Augenblicken sollte im Hauptfenster eine Auflistung der verfügbaren Flugzeuge und Flughäfen erscheinen. Veränderungen in den Einstellungen werden nach "Einstellungen speichern" sofort angewendet, allerdings benötigen Veränderungen in den TerraSync- Einstellungen und Spracheinstellungen einen Neustart von FGo!. ------------------------------------------------------------------------------- HAUPTMENÜ EINTRÄGE Datei: Laden - Lade eine vorhandene Konfigurations-Datei Speichern unter... - Speichere Einstellungen in eine Konfigurations-Datei Speichern und beenden - Speichere Einstellungen und beende die Anwendung Beenden - Beende die Anwendung ohne zu speichern Einstellungen: Nur installierte Flughäfen anzeigen - Es werden nur die tatsächlich auf der Festplatte vorhandene Flughäfen angezeigt. Liste der Flughäfen auffrischen - Durchsuche die Festplatte nach installierter Szenerie und baue eine neue Flughafen-Liste. Das funktioniert nur wenn "Nur installierte Flughäfen anzeigen" angewählt ist. Eigenschaften - öffne das Eigenschaften-Fenster. Werkzeuge: METAR - zeige METAR Report für den gewählten (oder nahesten) Flughafen. Dieser wird von http://weather.noaa.gov/ heruntergeladen. Hilfe: Hilfe - Öffne dieses Hilfe-Fenster. Über - Öffne das "Über"-Fenster. ------------------------------------------------------------------------------- KOMMANDOZEILEN OPTIONEN FENSTER Im Text-Fenster am unteren Ende des FGo!-Fensters kann man Kommandozeilen- Optionen angeben, die an FlightGear weitergereicht werden. Es werden vorerst nur wenige Optionen angezeigt. Für mehr Informationen und Beispiele bemühen Sie bitte die FlightGear-Dokumentation, prüfen Sie im Terminal "fgfs --help --verbose" oder sehen Sie im Wiki nach: http://wiki.flightgear.org/index.php/Command_Line_Options ------------------------------------------------------------------------------- TIPS&TRICKS * Wenn die Flughafen-Datenquelle auf "Szenerie" gesetzt ist, können Informationen über Parkpositionen solange nicht verfügbar sein, bis die entsprechende Szenerie installiert ist. * Wenn *nur* Großbuchstaben in die Flughafen-Suchbox eigegeben werden, wird das Programm nur nach ICAO-Codes mit den entsprechenden Anfangsbuchstaben suchen. Zum Beispiel: Für die Großbuchstaben "ED" werden als Ergebnis (fast) nur deutsche Flughäfen angezeigt. * Man kann auch von einem Flugzeugträger starten. Klicken Sie im mittleren Abschnitt auf den ICAO-Code des zuletzt gewählten Flughafens (direkt unter dem Flugzeugbild) und wählen Sie eins der verfügbaren Schiffe. Der ICAO-Code wird daraufhin durch den Namen des gewählten Flugzeugträgers ersetzt und blau hervorgehoben, um anzuzeigen dass Sie sich jetzt im "Flugzeugträger- Modus" befinden. Das entsprechende Szenario wird automatisch gewählt. Um wieder auf die Flughäfen zugreifen zu können müssen Sie nur auf den Flugzeugträgernamen klicken und "keine" auswählen. * In der Liste "Szenario auswählen" können Sie sich, mit einem Rechtsklick auf ein Szenario, die Beschreibung dessen ansehen (falls verfügbar). * Die Liste "Szenario auswählen" kann mit einem Klick aufs Mausrad bzw. mittlere Taste geschlossen werden. * Die Fenstergröße wird gespeichert, wenn "Speichern und beenden" betätigt wird. * Falls die Datei apt.dat.gz verändert wurde (z.Bsp. wenn eine neue Version von FlightGear installiert wurde), muß der Knopf "Flughafen-Datenbank neu laden" im Einstellungsfenster betätigt werden, um alle Änderungen in FGo! zu integrieren. * Um den FGo! Starter besser von anderen Dateien unterscheiden zu können, können Sie das Standard-Symbol durch das Bild "icon.png" ersetzen. Diese Datei finden Sie im FGo!-Verzeichnis /fgo/src/pics. ------------------------------------------------------------------------------- BEKANNTE FEHLER UND GRENZEN * FGo! weiß nicht, ob TerraSync tatsächlich beendet wurde, bevor eine neue Instanz gestartet wird. Wenn das "TerraSync" Ankreuzfeld geleert und gleich wieder angekreuzt wird, kann die Meldung "error binding to port 5501" im Terminalfenster erscheinen. Dies zeigt an, dass eine alte Instanz von TerraSync noch nicht fertig ist mit dem Herunterladen der Daten. Warten Sie in diesem Fall bis das Herunterladen beendet wurde und kreuzen Sie das "TerraSync"-Feld danach wieder an. * Sehr lange Parkplatznamen passen nicht in den Parkplatz-Knopf. ------------------------------------------------------------------------------- Vielen Dank, dass Sie diese Software benutzen, Robert 'erobo' Leda fgo/src/config/en0000644000175000017500000000234511434426530013574 0ustar robertrobert## List of command line options. Enable options you want to use by removing ## pound/hash symbol at the beginning of appropriate line. ## NETWORK OPTIONS ## Start FlightGear with multiplayer enabled. Replace MPSERVER_ADDRESS with ## valid server address. For list of available servers and more information ## about the subject, check: http://wiki.flightgear.org/index.php/Multiplayer # --multiplay=out,10,MPSERVER_ADDRESS,5000 ## Enter your callsign. Note that it's currently limited to seven characters. ## Check this page: http://fgfs.i-net.hu/modules/fgtracker/ to see whether ## your callsign is already in use or not. # --callsign= ## ENVIRONMENT OPTIONS ## Fetch weather information from the web. # --enable-real-weather-fetch ## RENDERING OPTIONS ## Specify FlightGear's window geometry. # --geometry=800x600 ## Enable fullscreen mode. # --enable-fullscreen ## OTHER ## Limit fps to specified number. # --prop:/sim/frame-rate-throttle-hz=35 ## Use custom scenery data. Useful if e.g. airport data source is set to scenery. # --prop:/sim/paths/use-custom-scenery-data=true ## More information about command line options ## can be found in the FlightGear documentation, or at: ## http://wiki.flightgear.org/index.php/Command_Line_Options fgo/src/config/pl0000644000175000017500000000273011434416273013606 0ustar robertrobert## Lista przykładowych opcji wiersza poleceń. Aby aktywować wybraną opcję, ## usuń "płotek" (znak hash) na początku odpowiedniej linii. ## OPCJE SIECI ## Uruchom FlightGear z włączonym trybem multiplayer. Zamień MPSERVER_ADDRESS ## na prawidłowy adres serwera z którym chcesz się połączyć. Więcej informacji ## na temat trybu multiplayer oraz listę serwerów, można znaleźć pod adresem: ## http://wiki.flightgear.org/index.php/Multiplayer # --multiplay=out,10,MPSERVER_ADDRESS,5000 ## Twój znak wywoławczy. Uwaga! Callsign nie powinien mieć więcej niż ## siedemiu znaków. Zajrzyj na tę stronie: http://fgfs.i-net.hu/modules/fgtracker/ ## aby sprawdzić czy twój callsign nie jest już używany przez kogoś innego. # --callsign= ## OPCJE ŚRODOWISKA ## Pobieraj informacje o pogodzie z internetu. # --enable-real-weather-fetch ## OPCJE WYŚWIETLANIA ## Podaj rozmiar okna FlightGear-a. # --geometry=800x600 ## Uruchom program w trybie pełnoekranowym. # --enable-fullscreen ## INNE ## Ogranicz maksymalną prędkość odświeżania (fps) do podanej wartości. # --prop:/sim/frame-rate-throttle-hz=35 ## Użyj danych ze scenerii. Użyj tej opcji jeżeli źródłem danych o lotniskach ## dla FGo! została wybrana sceneria. # --prop:/sim/paths/use-custom-scenery-data=true ## Więcej informacji na temat opcji wiersza poleceń ## można znaleźć w dokumentacji FlightGear-a lub też na stronie: ## http://wiki.flightgear.org/index.php/Command_Line_Options fgo/src/config/es0000644000175000017500000000266111435011507013575 0ustar robertrobert## Lista de opciones de comandos en línea. Activa las opciones que quieras usar ## quitando o poniendo el símbolo al principio de la línea correspondiente. ## OPCIONES MULTIJUGADOR ## Ejecuta FlightGear con multijugador habilitado. Reemplaza MPSERVER_ADDRESS con ## una dirección de servidor válida. Una lista de los servidores disponibles y más ## información en: http://wiki.flightgear.org/index.php/Multiplayer ## Aviso: El servidor mpserver02 está saturado y en Hong Kong. Intenta seleccionar ## el servidor más cercano geográficamente. # --multiplay=out,10,MPSERVER_ADDRESS,5000 ## Escribe tu apodo. Limitado a siete carácteres. ## Visita: http://fgfs.i-net.hu/modules/fgtracker/ para saber si tu apodo está en ## uso o no. # --callsign= ## OPCIONES METEOROLÓGICAS ## Extraer información meteorológica de la web. # --enable-real-weather-fetch ## OPCIONES DE RENDERIZADO ## Especifica la resolución para FlightGear. # --geometry=800x600 ## Activa la pantalla completa. # --enable-fullscreen ## OTROS ## Limita los fps a un número específico. # --prop:/sim/frame-rate-throttle-hz=35 ## Usar datos de escenarios personalizados. Útil si, por ejemplo, la fuente de datos de ## aeropuertos esta definida como Escenario. # --prop:/sim/paths/use-custom-scenery-data=true ## Más información sobre opciones de comandos en línea ## en los documentos de FlightGear, o en: ## http://wiki.flightgear.org/index.php/Command_Line_Options fgo/src/config/de0000644000175000017500000000251211433605271013556 0ustar robertrobert## Liste der Kommandozeilen-Optionen. Man aktiviert die Optionen indem man ## das Raute-Zeichen (#) am Anfang der Zeile entfernt. ## NETZWERK-OPTIONEN ## Startet FlightGear mit aktiviertem MultiPlayer-Modus. MPSERVER_ADDRESS muss ## mit gültiger Server-Addresse erstzt werden. Eine Liste der verfügbaren ## Server und mehr Informationen findet man unter: ## http://wiki.flightgear.org/index.php/Multiplayer # --multiplay=out,10,MPSERVER_ADDRESS,5000 ## Geben Sie ihr Rufzeichen an. Bis jetzt ist es auf 7 Zeichen begrenzt. ## Sehen Sie im Web nach, ob ihr Rufzeichen schon in Benutzung ist: ## http://fgfs.i-net.hu/modules/fgtracker/ # --callsign= ## UMWELT OPTIONEN ## Hole die aktuellen Wetter-Daten aus dem Web. # --enable-real-weather-fetch ## DARSTELLUNGS OPTIONEN ## Die Fenstergröße von FlightGear angeben. # --geometry=800x600 ## FlightGear im Vollbild-Modus benutzen. # --enable-fullscreen ## ANDERES ## Begrenze fps auf angegebene Anzahl. # --prop:/sim/frame-rate-throttle-hz=35 ## Benutze eine spezielle Szenerie-Datenquelle. Sinnvoll, falls z.Bsp. ## die Flughafen-Datenquelle auf Szenerie gesetzt ist. # --prop:/sim/paths/use-custom-scenery-data=true ## Mehr Informationen über die Kommandozeilen-Optionen ## findet man in der FlightGear-Dokumentation oder im Web: ## http://wiki.flightgear.org/index.php/Command_Line_Options fgo/src/config/presets0000644000175000017500000000100411432267566014660 0ustar robertrobert## Put here any accepted by FGo! keyword with corresponding value that will be ## passed to application if ~/.fgo/config can't be found. Accepted keywords are ## those that can be found in standard config above the line: ## xxxxxxxxxxxxxxxxxxx INTERNAL OPTIONS ABOVE. EDIT CAREFULLY! xxxxxxxxxxxxxxxxxxxx ## ## Example entries can look like these (remove hash character to uncomment them): ## # --fg-root=/usr/local/FlightGear/fgdata # --fg-scenery=/usr/local/FlightGear/fgdata/Scenery # FG_BIN=/usr/locale/bin/fgfs fgo/src/locale/pl/LC_MESSAGES/messages.po0000644000175000017500000001233411431576411017610 0ustar robertrobert# Polish translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # Robert 'erobo' Leda , 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-08-05 01:59+0200\n" "Last-Translator: Robert 'erobo' Leda \n" "Language-Team: LANGUAGE \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "Żaden" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Domyślny" #: gui.py:37 msgid "Load" msgstr "Wczytaj" #: gui.py:38 msgid "Save as..." msgstr "Zapisz jako..." #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Zapisz i Wyjdź" #: gui.py:43 msgid "Quit" msgstr "Zakończ" #: gui.py:44 msgid "File" msgstr "Plik" #: gui.py:47 msgid "Show installed airports only" msgstr "Pokaż tylko zainstalowane lotniska" #: gui.py:50 msgid "Update list of installed airports" msgstr "Odśwież listę zainstalowanych lotnisk" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Preferencje" #: gui.py:55 msgid "Settings" msgstr "Ustawienia" #: gui.py:60 msgid "Tools" msgstr "Narzędzia" #: gui.py:63 gui.py:266 msgid "About" msgstr "O programie" #: gui.py:64 msgid "Help" msgstr "Pomoc" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Znajdź" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Lotnisko:" #: gui.py:127 msgid "Rwy:" msgstr "Pas:" #: gui.py:130 msgid "Parking:" msgstr "Parking:" #: gui.py:157 msgid "Select Scenario" msgstr "Wybierz Scenariusz" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Wybrano Scenariuszy:" #: gui.py:221 msgid "Reset" msgstr "Zresetuj" #: gui.py:225 msgid "Run FG" msgstr "Uruchom FG" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "" #: gui.py:279 msgid "License" msgstr "Licencja" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Zamknij" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "Pliki Konfiguracyjne" #: gui.py:508 msgid "OK" msgstr "OK" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "Uruchamiam %s z następującymi opcjami:" #: gui.py:860 msgid "Error" msgstr "Błąd" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "Nie można uruchomić FlightGear-a!" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Upewnij się, że ścieżki: FG_BIN i FG_ROOT\n" "w oknie \"Preferencje\" wskazują właściwe katalogi." #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "Uruchamiam TerraSync następującą komendą:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "Zatrzymuję TerraSync" #: gui.py:1003 msgid "Carrier:" msgstr "Lot-wiec:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Sceneria" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "Ustawienia FlightGear-a" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "Ustawienia TerraSync-a" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Różne" #: gui.py:1193 msgid "Save settings" msgstr "Zapisz ustawienia" #: gui.py:1200 msgid "Cancel" msgstr "Anuluj" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Ścieżka do pliku wykonywalnego:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Katalog roboczy (opcjonalnie):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Ścieżka do scenerii:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Znajdź" #: gui.py:1503 msgid "Port:" msgstr "Port:" #: gui.py:1532 msgid "Change language:" msgstr "Zmień język:" #: gui.py:1543 msgid "Airport data source:" msgstr "Źródło danych o lotniskach:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Przebuduj Bazę Lotnisk" #: gui.py:1597 msgid "FlightGear is running..." msgstr "FlightGear został uruchomiony..." #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "Rozkodowany" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "Pobieranie raportu..." #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "Nie można pobrać danych." #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" "Kliknij tu, aby pobrać raport pogodowy\n" "z wybranego (lub najbliższego) lotniska." fgo/src/locale/pl/LC_MESSAGES/messages.mo0000644000175000017500000000672711431576441017621 0ustar robertrobert5GlJ ,4<BUZ_x jA GSXqw~    #*3^q!    Q% w      !     % - 4 7 !@ bb        ! 0 B K b j } # ( -  . E P #k (  0/42('  *!3 1-+$5)",&.%#  AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseConfig FilesDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsUnable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-08-04 21:15+CEST PO-Revision-Date: 2010-08-05 01:59+0200 Last-Translator: Robert 'erobo' Leda Language-Team: LANGUAGE Language: pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 O programieŹródło danych o lotniskach:Lotnisko:AnulujLot-wiec:Zmień język:Kliknij tu, aby pobrać raport pogodowy z wybranego (lub najbliższego) lotniska.ZamknijPliki KonfiguracyjneRozkodowanyDomyślnyBłądPobieranie raportu...PlikZnajdźFlightGear został uruchomiony...Ustawienia FlightGear-aPomocLicencjaWczytajRóżneŻadenOKParking:Ścieżka do pliku wykonywalnego:Upewnij się, że ścieżki: FG_BIN i FG_ROOT w oknie "Preferencje" wskazują właściwe katalogi.Port:PreferencjeZakończPrzebuduj Bazę LotniskZresetujUruchom FGPas:Zapisz i WyjdźZapisz jako...Zapisz ustawieniaSceneriaŚcieżka do scenerii:ZnajdźWybierz ScenariuszWybrano Scenariuszy:UstawieniaPokaż tylko zainstalowane lotniskaUruchamiam %s z następującymi opcjami:Uruchamiam TerraSync następującą komendą:Zatrzymuję TerraSyncUstawienia TerraSync-aNarzędziaNie można pobrać danych.Nie można uruchomić FlightGear-a!Odśwież listę zainstalowanych lotniskKatalog roboczy (opcjonalnie):fgo/src/locale/en/LC_MESSAGES/messages.po0000644000175000017500000001201511427420737017577 0ustar robertrobert# English translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # Robert 'erobo' Leda , 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-07-14 20:00+0200\n" "Last-Translator: Robert 'erobo' Leda \n" "Language-Team: LANGUAGE \n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "None" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Default" #: gui.py:37 msgid "Load" msgstr "Load" #: gui.py:38 msgid "Save as..." msgstr "Save as..." #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Save & Quit" #: gui.py:43 msgid "Quit" msgstr "Quit" #: gui.py:44 msgid "File" msgstr "File" #: gui.py:47 msgid "Show installed airports only" msgstr "Show installed airports only" #: gui.py:50 msgid "Update list of installed airports" msgstr "Update list of installed airports" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Preferences" #: gui.py:55 msgid "Settings" msgstr "Settings" #: gui.py:60 msgid "Tools" msgstr "Tools" #: gui.py:63 gui.py:266 msgid "About" msgstr "About" #: gui.py:64 msgid "Help" msgstr "Help" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Search" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Airport:" #: gui.py:127 msgid "Rwy:" msgstr "Rwy:" #: gui.py:130 msgid "Parking:" msgstr "Parking:" #: gui.py:157 msgid "Select Scenario" msgstr "Select Scenario" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Selected Scenarios:" #: gui.py:221 msgid "Reset" msgstr "Reset" #: gui.py:225 msgid "Run FG" msgstr "Run FG" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "" #: gui.py:279 msgid "License" msgstr "License" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Close" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "Config Files" #: gui.py:508 msgid "OK" msgstr "OK" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "Starting %s with following options:" #: gui.py:860 msgid "Error" msgstr "Error" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "Unable to run FlightGear!" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "Starting TerraSync with following command:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "Stopping TerraSync" #: gui.py:1003 msgid "Carrier:" msgstr "Carrier:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Scenery" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "FlightGear settings" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "TerraSync settings" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Miscellaneous" #: gui.py:1193 msgid "Save settings" msgstr "Save settings" #: gui.py:1200 msgid "Cancel" msgstr "Cancel" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Path to executable file:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Working directory (optional):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Scenery path:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Find" #: gui.py:1503 msgid "Port:" msgstr "Port:" #: gui.py:1532 msgid "Change language:" msgstr "Change language:" #: gui.py:1543 msgid "Airport data source:" msgstr "Airport data source:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Rebuild Airport Database" #: gui.py:1597 msgid "FlightGear is running..." msgstr "FlightGear is running..." #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "Decoded" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "Fetching report..." #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "Unable to download data." #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" "Click here to download the METAR report\n" "for selected (or nearest) airport." fgo/src/locale/en/LC_MESSAGES/messages.mo0000644000175000017500000000641211426400557017575 0ustar robertrobert5GlJ ,4<BUZ_x jA GSXqw~    #*3^q!      J & , 9 A I O b g l         j N T ` e ~         # *@ k ~    !  0/42('  *!3 1-+$5)",&.%#  AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseConfig FilesDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsUnable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-08-04 21:15+CEST PO-Revision-Date: 2010-07-14 20:00+0200 Last-Translator: Robert 'erobo' Leda Language-Team: LANGUAGE Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseConfig FilesDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsUnable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):fgo/src/locale/nl/LC_MESSAGES/messages.po0000644000175000017500000001145411427420737017614 0ustar robertrobert# Dutch translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # snipey, 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-05-23 23:35+0200\n" "Last-Translator: snipey\n" "Language-Team:\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "Geen" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Standaard" #: gui.py:37 msgid "Load" msgstr "Openen" #: gui.py:38 msgid "Save as..." msgstr "Opslaan als..." #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Opslaan & Sluiten" #: gui.py:43 msgid "Quit" msgstr "Afsluiten" #: gui.py:44 msgid "File" msgstr "Bestand" #: gui.py:47 msgid "Show installed airports only" msgstr "" #: gui.py:50 msgid "Update list of installed airports" msgstr "" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Voorkeuren" #: gui.py:55 msgid "Settings" msgstr "Instellingen" #: gui.py:60 msgid "Tools" msgstr "" #: gui.py:63 gui.py:266 msgid "About" msgstr "Over" #: gui.py:64 msgid "Help" msgstr "Help" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Zoeken" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Vliegveld:" #: gui.py:127 msgid "Rwy:" msgstr "Startbaan:" #: gui.py:130 msgid "Parking:" msgstr "Parkeerplaats:" #: gui.py:157 msgid "Select Scenario" msgstr "Selecteer Scenario" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Geselecteerde Scenario's:" #: gui.py:221 msgid "Reset" msgstr "Reset" #: gui.py:225 msgid "Run FG" msgstr "FG Starten" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "" #: gui.py:279 msgid "License" msgstr "Licentie" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Sluiten" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "" #: gui.py:508 msgid "OK" msgstr "OK" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "%s wordt gestart met de volgende opties" #: gui.py:860 msgid "Error" msgstr "Fout" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "Kan FlightGear niet starten" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Controleer AUB of de paden: FG_BIN en FG_ROOT\n" "in het \"Preferences\" scherm naar de juiste mappen wijzen." #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "TerraSync wordt gestart met volgende commando's:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "TerraSync Stoppen" #: gui.py:1003 msgid "Carrier:" msgstr "Vliegdekschip:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Landschap" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "FlightGear instellingen" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "TerraSync instellingen" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Overig" #: gui.py:1193 msgid "Save settings" msgstr "Instellingen opslaan" #: gui.py:1200 msgid "Cancel" msgstr "Annuleren" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Pad naar uitvoerbaar bestand:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Actieve map (optioneel):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Scenery pad:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Bladeren" #: gui.py:1503 msgid "Port:" msgstr "Poort:" #: gui.py:1532 msgid "Change language:" msgstr "Kies taal:" #: gui.py:1543 msgid "Airport data source:" msgstr "Vliegveld gegevens:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Maak Vliegveld Database Opnieuw" #: gui.py:1597 msgid "FlightGear is running..." msgstr "" #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "" #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "" #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" fgo/src/locale/nl/LC_MESSAGES/messages.mo0000644000175000017500000000523211402211527017572 0ustar robertrobert,|;"',@EM R`ehqj  %+2 7 C N\ dry#*5hS    #,DIRY`ehwg    9 ? J U g v    ' 0 < N e  ,(*!) & +"%#'  $ AboutAirport data source:Airport:CancelCarrier:Change language:CloseDefaultErrorFileFindFlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsUnable to run FlightGear!Working directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-05-23 23:22+CEST PO-Revision-Date: 2010-05-23 23:35+0200 Last-Translator: snipey Language-Team: Language: nl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 OverVliegveld gegevens:Vliegveld:AnnulerenVliegdekschip:Kies taal:SluitenStandaardFoutBestandBladerenFlightGear instellingenHelpLicentieOpenenOverigGeenOKParkeerplaats:Pad naar uitvoerbaar bestand:Controleer AUB of de paden: FG_BIN en FG_ROOT in het "Preferences" scherm naar de juiste mappen wijzen.Poort:VoorkeurenAfsluitenMaak Vliegveld Database OpnieuwResetFG StartenStartbaan:Opslaan & SluitenOpslaan als...Instellingen opslaanLandschapScenery pad:ZoekenSelecteer ScenarioGeselecteerde Scenario's:Instellingen%s wordt gestart met de volgende optiesTerraSync wordt gestart met volgende commando's:TerraSync StoppenTerraSync instellingenKan FlightGear niet startenActieve map (optioneel):fgo/src/locale/es/LC_MESSAGES/messages.po0000644000175000017500000001232511432262122017574 0ustar robertrobert# Spanish translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # Canseco , 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-05-23 23:35+0200\n" "Last-Translator: Canseco \n" "Language-Team:\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "Ninguno" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Por Defecto" #: gui.py:37 msgid "Load" msgstr "Cargar" #: gui.py:38 msgid "Save as..." msgstr "Guardar como..." #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Guardar y Salir" #: gui.py:43 msgid "Quit" msgstr "Salir" #: gui.py:44 msgid "File" msgstr "Archivo" #: gui.py:47 msgid "Show installed airports only" msgstr "Mostrar aeropuertos instalados" #: gui.py:50 msgid "Update list of installed airports" msgstr "Actualizar lista de aeropuertos instalados" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Preferencias" #: gui.py:55 msgid "Settings" msgstr "Ajustes" #: gui.py:60 msgid "Tools" msgstr "Herramientas" #: gui.py:63 gui.py:266 msgid "About" msgstr "Acerca de" #: gui.py:64 msgid "Help" msgstr "Ayuda" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Busqueda" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Aeropuerto:" #: gui.py:127 msgid "Rwy:" msgstr "Pista:" #: gui.py:130 msgid "Parking:" msgstr "Parking:" #: gui.py:157 msgid "Select Scenario" msgstr "Elegir Escenario" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Escenarios Seleccionados:" #: gui.py:221 msgid "Reset" msgstr "Reiniciar" #: gui.py:225 msgid "Run FG" msgstr "Ejecutar FG" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "Traducido por:\n" "Canseco" #: gui.py:279 msgid "License" msgstr "Licencia" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Cerrar" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "" #: gui.py:508 msgid "OK" msgstr "OK" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "Ejecutando %s con las siguientes opciones:" #: gui.py:860 msgid "Error" msgstr "Error" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "No se puede ejecutar FlightGear!" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Por favor, asegurate que las rutas: FG_BIN and FG_ROOT\n" "en el submenu \"Preferencias\" apuntan a los directorios correctos." #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "Ejecutando TerraSync con los siguientes comandos:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "Parando TerraSync" #: gui.py:1003 msgid "Carrier:" msgstr "Portaaviones:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Escenario" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "Ajustes de FlightGear" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "Ajustes de TerraSync" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Miscelaneo" #: gui.py:1193 msgid "Save settings" msgstr "Guardar ajustes" #: gui.py:1200 msgid "Cancel" msgstr "Cancelar" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Ruta al archivo ejecutable:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Directorio de trabajo (opcional):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Ruta a los Escenarios:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Buscar" #: gui.py:1503 msgid "Port:" msgstr "Puerto:" #: gui.py:1532 msgid "Change language:" msgstr "Cambiar Idioma:" #: gui.py:1543 msgid "Airport data source:" msgstr "Fuente de datos de aeropuertos:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Reconstruir Base de Datos de Aeropuertos" #: gui.py:1597 msgid "FlightGear is running..." msgstr "FlightGear esta ejecutandose..." #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "Descodificado" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "Obteniendo reporte..." #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "No ha sido posible descargar los datos." #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" "Haz click aquí para descargar el reporte METAR\n" "para el aeropuerto seleccionado (o mas cercano)." fgo/src/locale/es/LC_MESSAGES/messages.mo0000644000175000017500000000672211432262144017601 0ustar robertrobert5GlJ'/5HMRk j4 :FKdjq v   #*&Qdw }! }    ` ; B P \ b x           x   (      " 9 B S m u * 1    % '< d * ! /.2'& 0) 3 4,*#15(!+%-$"  AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsTranslation:Unable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-08-04 21:15+CEST PO-Revision-Date: 2010-05-23 23:35+0200 Last-Translator: Canseco Language-Team: Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 Acerca deFuente de datos de aeropuertos:Aeropuerto:CancelarPortaaviones:Cambiar Idioma:Haz click aquí para descargar el reporte METAR para el aeropuerto seleccionado (o mas cercano).CerrarDescodificadoPor DefectoErrorObteniendo reporte...ArchivoBuscarFlightGear esta ejecutandose...Ajustes de FlightGearAyudaLicenciaCargarMiscelaneoNingunoOKParking:Ruta al archivo ejecutable:Por favor, asegurate que las rutas: FG_BIN and FG_ROOT en el submenu "Preferencias" apuntan a los directorios correctos.Puerto:PreferenciasSalirReconstruir Base de Datos de AeropuertosReiniciarEjecutar FGPista:Guardar y SalirGuardar como...Guardar ajustesEscenarioRuta a los Escenarios:BusquedaElegir EscenarioEscenarios Seleccionados:AjustesMostrar aeropuertos instaladosEjecutando %s con las siguientes opciones:Ejecutando TerraSync con los siguientes comandos:Parando TerraSyncAjustes de TerraSyncHerramientasTraducido por: CansecoNo ha sido posible descargar los datos.No se puede ejecutar FlightGear!Actualizar lista de aeropuertos instaladosDirectorio de trabajo (opcional):fgo/src/locale/de/LC_MESSAGES/messages.mo0000644000175000017500000000703711433547204017566 0ustar robertrobert6I|J1 7DLTZmrw jY _kp     #'*Kv !"    ] e p                =       2 F ^ g v }  $ ! ( $ 5 M 8W /  ,%$  (/!'0+4#"&-253 6. )* 1AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseConfig FilesDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsTranslation:Unable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-08-04 21:15+CEST PO-Revision-Date: 2010-05-24 00:32+0200 Last-Translator: chris_blues Language-Team: LANGUAGE Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 ÜberFlughafen-Datenquelle:Flughafen:AbbrechenTräger:Sprache ändern:Hier klicken, um METAR Bericht für den gewählten (oder nahesten) Flughafen herunterzuladen.SchließenConfig DateienDekodiertStandardFehlerHole Wetterbericht...DateiFindenFlightgear läuft...FlightGear EinstellungenHilfeLizenzLadenVerschiedenesKeineOKParkplatz:Pfad zur ausführbaren Datei:Bitte stellen sie sicher, daß die Pfade FG_BIN und FG_ROOT im "Eigenschaften"-Fenster auf die richtigen Verzeichnisse verweisen.Port:EigenschaftenBeendenFlughafen-Datenbank neu ladenZurücksetzenFG startenRollbahn:Speichern und beendenSpeichern unter ...Einstellungen speichernSzenerieSzenerie Pfad:SuchenSzenario wählenAusgewählte Szenarios:EinstellungenNur installierte Flughäfen anzeigenStarte %s mit folgenden Optionen:Starte TerraSync mit folgendem Kommando:Stoppe TerraSyncTerraSync EinstellungenWerkzeugedeutsche Übersetzung: chris_blues Die Daten können nicht heruntergeladen werden.Kann FlightGear nicht starten!Liste der Flughäfen auffrischenArbeitsverzeichnis (optional):fgo/src/locale/de/LC_MESSAGES/messages.po0000644000175000017500000001237611433503131017562 0ustar robertrobert# German translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # chris_blues , 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-05-24 00:32+0200\n" "Last-Translator: chris_blues \n" "Language-Team: LANGUAGE \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "Keine" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Standard" #: gui.py:37 msgid "Load" msgstr "Laden" #: gui.py:38 msgid "Save as..." msgstr "Speichern unter ..." #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Speichern und beenden" #: gui.py:43 msgid "Quit" msgstr "Beenden" #: gui.py:44 msgid "File" msgstr "Datei" #: gui.py:47 msgid "Show installed airports only" msgstr "Nur installierte Flughäfen anzeigen" #: gui.py:50 msgid "Update list of installed airports" msgstr "Liste der Flughäfen auffrischen" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Eigenschaften" #: gui.py:55 msgid "Settings" msgstr "Einstellungen" #: gui.py:60 msgid "Tools" msgstr "Werkzeuge" #: gui.py:63 gui.py:266 msgid "About" msgstr "Über" #: gui.py:64 msgid "Help" msgstr "Hilfe" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Suchen" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Flughafen:" #: gui.py:127 msgid "Rwy:" msgstr "Rollbahn:" #: gui.py:130 msgid "Parking:" msgstr "Parkplatz:" #: gui.py:157 msgid "Select Scenario" msgstr "Szenario wählen" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Ausgewählte Szenarios:" #: gui.py:221 msgid "Reset" msgstr "Zurücksetzen" #: gui.py:225 msgid "Run FG" msgstr "FG starten" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don' edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "deutsche Übersetzung:\n" "chris_blues " #: gui.py:279 msgid "License" msgstr "Lizenz" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Schließen" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "Config Dateien" #: gui.py:508 msgid "OK" msgstr "OK" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "Starte %s mit folgenden Optionen:" #: gui.py:860 msgid "Error" msgstr "Fehler" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "Kann FlightGear nicht starten!" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Bitte stellen sie sicher, daß die Pfade FG_BIN und FG_ROOT\n" "im \"Eigenschaften\"-Fenster auf die richtigen Verzeichnisse verweisen." #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "Starte TerraSync mit folgendem Kommando:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "Stoppe TerraSync" #: gui.py:1003 msgid "Carrier:" msgstr "Träger:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Szenerie" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "FlightGear Einstellungen" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "TerraSync Einstellungen" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Verschiedenes" #: gui.py:1193 msgid "Save settings" msgstr "Einstellungen speichern" #: gui.py:1200 msgid "Cancel" msgstr "Abbrechen" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Pfad zur ausführbaren Datei:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Arbeitsverzeichnis (optional):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Szenerie Pfad:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Finden" #: gui.py:1503 msgid "Port:" msgstr "Port:" #: gui.py:1532 msgid "Change language:" msgstr "Sprache ändern:" #: gui.py:1543 msgid "Airport data source:" msgstr "Flughafen-Datenquelle:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Flughafen-Datenbank neu laden" #: gui.py:1597 msgid "FlightGear is running..." msgstr "Flightgear läuft..." #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "Dekodiert" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "Hole Wetterbericht..." #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "Die Daten können nicht heruntergeladen werden." #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" "Hier klicken, um METAR Bericht für den\n" "gewählten (oder nahesten) Flughafen herunterzuladen." fgo/src/locale/fr/LC_MESSAGES/messages.mo0000644000175000017500000000677611433443146017616 0ustar robertrobert5GlJ ,4<BUZ_x jA GSXqw~    #*3^q!    Z V ] u ~              % X9   .    " < D ] g  - ' . + = Q )X $ 2 # 0/42('  *!3 1-+$5)",&.%#  AboutAirport data source:Airport:CancelCarrier:Change language:Click here to download the METAR report for selected (or nearest) airport.CloseConfig FilesDecodedDefaultErrorFetching report...FileFindFlightGear is running...FlightGear settingsHelpLicenseLoadMiscellaneousNoneOKParking:Path to executable file:Please make sure that paths: FG_BIN and FG_ROOT in "Preferences" window are pointing to right directories.Port:PreferencesQuitRebuild Airport DatabaseResetRun FGRwy:Save & QuitSave as...Save settingsSceneryScenery path:SearchSelect ScenarioSelected Scenarios:SettingsShow installed airports onlyStarting %s with following options:Starting TerraSync with following command:Stopping TerraSyncTerraSync settingsToolsUnable to download data.Unable to run FlightGear!Update list of installed airportsWorking directory (optional):Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2010-08-04 21:15+CEST PO-Revision-Date: 2010-08-08 17:41+0100 Last-Translator: Olivier Faivre Language-Team: LANGUAGE Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); X-Generator: Virtaal 0.5.2 Generated-By: pygettext.py 1.5 A proposSource des données aéroport:Aéroport:AnnulerPorte-avions:Changer la langue:Cliquer ici pour télécharger le METAR pour l'aéroport sélectionné (ou le plus proche)FermerConfigurer les fichiersDécodéDéfautErreurRécupérer le rapport...FichierTrouverFlightGear est lancé...Réglages FlightGearAideLicenseChargerDiversAucunOkParking:Chemin vers les fichiers exécutable:Vérifiez que le chemin : FG_BIN and FG_ROOT in "Preferences" pointe sur le bon dossierPort:PréférencesQuitterReconstruire la base de donnée des aéroportsRedémarrerLancer FGPiste:Enregistrer et quitterEnregistrer sousEnregistrer les réglagesScènesChemin vers les scènes:RechercheSéléctionner un scénarioScénario séléctionnéRéglagesMontrer uniquement les aéroports installésDémarrer %s avec les options suivantesDémarrer TerraSync avec la commande suivante:Stopper TerraSyncRéglages TerraSyncOutilsImpossible de télécharger les données.Impossible de démarrer FlightGear !Mise à jour de la liste des Aéroports installésRépertoire de travail (optionnel):fgo/src/locale/fr/LC_MESSAGES/messages.po0000644000175000017500000001241211433443132017574 0ustar robertrobert# French translations for FGo! package. # Copyright (C) 2010 THE Fgo!'s COPYRIGHT HOLDER # This file is distributed under the same license as the FGo! package. # Olivier Faivre , 2010. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2010-08-04 21:15+CEST\n" "PO-Revision-Date: 2010-08-08 17:41+0100\n" "Last-Translator: Olivier Faivre \n" "Language-Team: LANGUAGE \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.5.2\n" "Generated-By: pygettext.py 1.5\n" #: gui.py:31 gui.py:442 gui.py:452 msgid "None" msgstr "Aucun" #: gui.py:32 gui.py:477 gui.py:1133 gui.py:1513 gui.py:1547 msgid "Default" msgstr "Défaut" #: gui.py:37 msgid "Load" msgstr "Charger" #: gui.py:38 msgid "Save as..." msgstr "Enregistrer sous" #: gui.py:41 gui.py:217 msgid "Save & Quit" msgstr "Enregistrer et quitter" #: gui.py:43 msgid "Quit" msgstr "Quitter" #: gui.py:44 msgid "File" msgstr "Fichier" #: gui.py:47 msgid "Show installed airports only" msgstr "Montrer uniquement les aéroports installés" #: gui.py:50 msgid "Update list of installed airports" msgstr "Mise à jour de la liste des Aéroports installés" #: gui.py:53 gui.py:1155 msgid "Preferences" msgstr "Préférences" #: gui.py:55 msgid "Settings" msgstr "Réglages" #: gui.py:60 msgid "Tools" msgstr "Outils" #: gui.py:63 gui.py:266 msgid "About" msgstr "A propos" #: gui.py:64 msgid "Help" msgstr "Aide" #: gui.py:99 gui.py:200 msgid "Search" msgstr "Recherche" #: gui.py:124 gui.py:775 msgid "Airport:" msgstr "Aéroport:" #: gui.py:127 msgid "Rwy:" msgstr "Piste:" #: gui.py:130 msgid "Parking:" msgstr "Parking:" #: gui.py:157 msgid "Select Scenario" msgstr "Séléctionner un scénario" #: gui.py:166 msgid "Selected Scenarios:" msgstr "Scénario séléctionné" #: gui.py:221 msgid "Reset" msgstr "Redémarrer" #: gui.py:225 msgid "Run FG" msgstr "Lancer FG" #. A list of translators that will be displayed in "About" window. #. Suggested format for this entry is: #. #. Translation: #. Name or nickname of first translator #. Name or nickname of second translator #. etc. #. #. This entry is optional. Don't edit it if you prefer to stay anonymous. #: gui.py:259 gui.py:262 msgid "Translation:" msgstr "" #: gui.py:279 msgid "License" msgstr "License" #: gui.py:282 gui.py:871 msgid "Close" msgstr "Fermer" #: gui.py:340 gui.py:350 msgid "Config Files" msgstr "Configurer les fichiers" #: gui.py:508 msgid "OK" msgstr "Ok" #. Console message saying that fgfs executable is starting. #: gui.py:835 msgid "Starting %s with following options:" msgstr "Démarrer %s avec les options suivantes" #: gui.py:860 msgid "Error" msgstr "Erreur" #: gui.py:863 msgid "Unable to run FlightGear!" msgstr "Impossible de démarrer FlightGear !" #: gui.py:866 msgid "" "Please make sure that paths: FG_BIN and FG_ROOT\n" "in \"Preferences\" window are pointing to right directories." msgstr "" "Vérifiez que le chemin : FG_BIN and FG_ROOT\n" "in \"Preferences\" pointe sur le bon dossier" #: gui.py:890 msgid "Starting TerraSync with following command:" msgstr "Démarrer TerraSync avec la commande suivante:" #: gui.py:897 msgid "Stopping TerraSync" msgstr "Stopper TerraSync" #: gui.py:1003 msgid "Carrier:" msgstr "Porte-avions:" #: gui.py:1131 gui.py:1314 gui.py:1547 msgid "Scenery" msgstr "Scènes" #: gui.py:1168 gui.py:1360 msgid "FlightGear settings" msgstr "Réglages FlightGear" #: gui.py:1173 gui.py:1452 msgid "TerraSync settings" msgstr "Réglages TerraSync" #: gui.py:1178 gui.py:1522 msgid "Miscellaneous" msgstr "Divers" #: gui.py:1193 msgid "Save settings" msgstr "Enregistrer les réglages" #: gui.py:1200 msgid "Cancel" msgstr "Annuler" #: gui.py:1229 gui.py:1273 gui.py:1371 gui.py:1463 msgid "Path to executable file:" msgstr "Chemin vers les fichiers exécutable:" #: gui.py:1262 gui.py:1433 msgid "Working directory (optional):" msgstr "Répertoire de travail (optionnel):" #: gui.py:1284 gui.py:1483 msgid "Scenery path:" msgstr "Chemin vers les scènes:" #: gui.py:1381 gui.py:1401 gui.py:1421 gui.py:1443 gui.py:1473 gui.py:1493 msgid "Find" msgstr "Trouver" #: gui.py:1503 msgid "Port:" msgstr "Port:" #: gui.py:1532 msgid "Change language:" msgstr "Changer la langue:" #: gui.py:1543 msgid "Airport data source:" msgstr "Source des données aéroport:" #: gui.py:1557 msgid "Rebuild Airport Database" msgstr "Reconstruire la base de donnée des aéroports" #: gui.py:1597 msgid "FlightGear is running..." msgstr "FlightGear est lancé..." #. METAR window. Decoded means that downloaded METAR will be decoded to #. more readable for average person format. #: gui.py:1643 msgid "Decoded" msgstr "Décodé" #. METAR window. Message displayed when download is in progress. #: gui.py:1660 msgid "Fetching report..." msgstr "Récupérer le rapport..." #. METAR window. Error message. #: gui.py:1715 msgid "Unable to download data." msgstr "Impossible de télécharger les données." #. Welcome message in METAR window. #: gui.py:1767 msgid "" "Click here to download the METAR report\n" "for selected (or nearest) airport." msgstr "" "Cliquer ici pour télécharger le METAR\n" "pour l'aéroport sélectionné (ou le plus proche)"