[mupen64plus-qt] 01/05: Import Upstream version 1.9

Markus Koschany apo at moszumanska.debian.org
Sat Oct 21 16:15:16 UTC 2017


This is an automated email from the git hooks/post-receive script.

apo pushed a commit to branch master
in repository mupen64plus-qt.

commit 41cfcc963ff9f0f70bafba5ca10f1fac039d43f2
Author: Markus Koschany <apo at debian.org>
Date:   Sat Oct 21 18:12:03 2017 +0200

    Import Upstream version 1.9
---
 .travis.yml                                      |   40 +
 README.md                                        |  229 ++++-
 VERSION                                          |    1 +
 build-scripts/platform/linux.sh                  |   33 +
 build-scripts/platform/osx.sh                    |   56 ++
 build-scripts/platform/windows.sh                |   54 ++
 build-scripts/revision.sh                        |   10 +
 build-scripts/travis-ci.sh                       |   15 +
 dist/debian/compat                               |    1 +
 dist/debian/control                              |   17 +
 dist/debian/copyright                            |   27 +
 dist/debian/deb-build.sh                         |   19 +
 dist/debian/docs                                 |    1 +
 dist/debian/install                              |    4 +
 dist/debian/rules                                |   11 +
 dist/debian/source/format                        |    1 +
 {macosx => dist/macosx}/mupen64plus.icns         |  Bin
 dist/redhat/mupen64plus-qt.spec.in               |   46 +
 dist/redhat/rpm-build.sh                         |    8 +
 {windows => dist/windows}/icon.rc                |    0
 {windows => dist/windows}/mupen64plus.ico        |  Bin
 mupen64plus-qt.pro                               |   21 +-
 resources/README.txt                             |   12 +
 resources/locale/mupen64plus-qt_fr.qm            |  Bin 0 -> 15075 bytes
 resources/locale/mupen64plus-qt_fr.ts            | 1049 ++++++++++++++++++++++
 resources/{mupen64plus-qt.1 => mupen64plus-qt.6} |    8 +-
 resources/mupen64plusqt.qrc                      |    2 +
 resources/other/VERSION                          |    1 +
 src/aboutdialog.cpp                              |   13 +-
 src/aboutdialog.h                                |    9 +-
 src/clickablewidget.cpp                          |    2 +
 src/clickablewidget.h                            |    3 +-
 src/common.cpp                                   |   61 +-
 src/common.h                                     |   30 +-
 src/configeditor.cpp                             |   19 +-
 src/configeditor.h                               |   12 +-
 src/downloaddialog.cpp                           |    9 +-
 src/downloaddialog.h                             |   11 +-
 src/emulatorhandler.cpp                          |   44 +-
 src/emulatorhandler.h                            |    8 +-
 src/gamesettingsdialog.cpp                       |  146 +++
 src/{aboutdialog.h => gamesettingsdialog.h}      |   36 +-
 src/gamesettingsdialog.ui                        |  223 +++++
 src/global.h                                     |    4 +-
 src/logdialog.cpp                                |   20 +-
 src/logdialog.h                                  |    7 +-
 src/main.cpp                                     |   20 +-
 src/mainwindow.cpp                               |  168 +++-
 src/mainwindow.h                                 |   36 +-
 src/romcollection.cpp                            |   54 +-
 src/romcollection.h                              |   13 +-
 src/settingsdialog.cpp                           |  248 +++--
 src/settingsdialog.h                             |    9 +-
 src/settingsdialog.ui                            |   73 +-
 src/thegamesdbscrapper.cpp                       |   36 +-
 src/thegamesdbscrapper.h                         |    5 +-
 56 files changed, 2645 insertions(+), 340 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..f31f648
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,40 @@
+language: cpp
+sudo: required
+env:
+  matrix:
+  - BUILD=windows
+  - BUILD=native
+os:
+- linux
+- osx
+matrix:
+  exclude:
+  - os: osx
+    env: BUILD=windows
+install:
+- "./build-scripts/travis-ci.sh setup_qt"
+- "./build-scripts/travis-ci.sh get_quazip"
+script:
+- "./build-scripts/travis-ci.sh build"
+before_deploy:
+- "./build-scripts/travis-ci.sh package"
+deploy:
+- provider: s3
+  access_key_id:
+    secure: FLIdybRxjnMyhP7wfvWmQywYms61ZnX5yfABZs6cBE33MdDrJVnL9PqauBuyQ+1VZu81uz1VGvnVyQlnTYIncwlyxLGFPJ4Mi5yPsrVKh/OQ6kgiHHZHwLJB5S8RKF8Rtwp9p5DhxCBzuqCuuMKkaQmkefGGR0TRdEzcoxQx6uLhx+VCaCLoXEFJx7izV4lbDdBb8j3g1z+Se7kZSroMJRWB/ph//PpUQXiGHM3vsNDGXDtkn0s5gd40Ua89VL/kqfkQhNrmsmRlq3z5eUSzbRF5r1W1xBkaphVDTEmpFwv3HQZt1jbmPUckB1TSw1eG0kxqZ/zZPwgY3MwgXuS7dgxRN8sCfUmrWRyQjIv/pJ55clcKnt4Ql1kzKP2lkTWF2nInMl8DhHmFehgxLqLZg4+Ro6fHsrMZoM6nbGUfbR2eMDvbFVUz9yLaIp4mikcAYozdRQ1zlrD7226QzfjblLKuxfUlO8OF [...]
+  secret_access_key:
+    secure: WcQgb6f5iJWfoGKE9+URj62a7QvHekbE1RLIOaqXm0rQDnfkFcWc1I/oRLNmMel9yd+L4VwM+G4bTdwDYcdLU5KnEh808UK7Nq49K4zimHFeQdUyj0K1wSPMOP1jfImSCyTOU4e1x7JYNBlRrP0hGrVFDGqm3aoI7Qpcfj67jN5/psWoPZkOtQJ8Nse138v6x2OdlF7x+TmRKi7g7WD8eSIth+lJ5Tda7TMv7k42VgMr8z+RKUCfvOUEymSSYEODRPqUrulFYWugEM8pUlc+cyr2PgzBIYz4SYirbeRdIZLI3iRmGRqKq9Tz8szEsXnfJ/egvD3VmDHSal4EA6iFRp3/mDNJoupQP7dpKT71ti9ZhFm2Sfk6NE9wKYZG1NpAeobGCyysxhFVMQ1PA1x/GmmH9dWdUIjIAi10ud+T7L0g09uQe836MDhXexjU4dRx2/oXHfMC5RYLi+ebGUPlWmEreXIN0t2Y [...]
+  bucket: dh4
+  skip_cleanup: true
+  local_dir: build
+  upload-dir: mupen64plus-qt/latest
+  on:
+    branch: master
+- provider: releases
+  api_key:
+    secure: P/QbvYtOmGixPZLFozvpEHOrIFb0TisCN9kQOrhpXY3lA6hxdZK0wUDkvI/R8xQLZf8Z6s1D3WMJR6S5ifEciLo3bi+arNUOierYw4+WaLi5LT1Jbj9cEUiuKOnPFJU23H2LHruAk03L2m5D7uqWj9CFiBg8PDRf3Xd1Ek8sIqms4yAvoN5OtFnLgYSn2gYR7fnVAqY3SBw7NTgCr4aB0jqWhqQprXIPpsbp/ZkyFA0ej27fyi8NLTY0fmpqXU4CxgR3PxhY+v+n7HZVt5Dafrf2WyJptGC7pUA6a0TQos8UIeBXluyA6BgvIJrApwU0RxeXQyC6wLtlabSWDQSMkL0UnT6yFGJYKwufSKlVdKLKsB4p21/YasL60o0Xd5FwOX96nh3510VbWrGWWxtp5hpHgVEdc8Dty1wjTq1DinVlGyJywZ1trwIdYDa2J+FWYHJmgq1xxhhBkcFR0C9oa2d9pIuqG3Sr [...]
+  skip_cleanup: true
+  file_glob: true
+  file: build/mupen64plus-qt_*
+  on:
+    tags: true
diff --git a/README.md b/README.md
index f87e00d..0dfad56 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,63 @@
-# Mupen64Plus-Qt
+# Mupen64Plus-Qt [![Build Status](https://travis-ci.org/dh4/mupen64plus-qt.svg?branch=master)](https://travis-ci.org/dh4/mupen64plus-qt)
 
-A basic cross-platform launcher. This was adapted from CEN64-Qt to work with Mupen64Plus.
+A basic cross-platform launcher. This was adapted from CEN64-Qt to work with [Mupen64Plus](http://mupen64plus.org/).
 
-A discussion thread as well as links to binary downloads can be found [here](http://www.emutalk.net/threads/54976-Mupen64Plus-Qt).
+A discussion thread can be found [here](http://www.emutalk.net/threads/54976-Mupen64Plus-Qt).
 
-## Building
+![Mupen64Plus-Qt](https://dl.dropboxusercontent.com/u/232085155/mupen64plus-qt/github.jpg)
 
-### Linux
+
+## Table of Contents
+
+* [Getting Mupen64Plus-Qt](#getting-mupen64plus-qt)
+    * [Stable Builds](#stable-builds)
+    * [Development Builds](#development-builds)
+    * [Building (Linux)](#building-linux)
+* [First Launch and Setup](#first-launch-and-setup)
+    * [Linux](#linux)
+    * [Windows](#windows)
+    * [OSX](#osx)
+* [ROM Collection](#rom-collection)
+    * [Views](#views)
+* [Game Information from TheGamesDB](#game-information-from-thegamesdb)
+    * [Updating Game Information](#updating-game-information)
+    * [Deleting Game Information](#deleting-game-information)
+    * [Manually Updating Information](#manually-updating-information)
+* [Editor For mupen64plus.cfg](#editor-for-mupen64pluscfg)
+* [Mupen64Plus Log Viewer](#mupen64plus-log-viewer)
+* [Configuration File](#configuration-file)
+* [Comparison to Console UI](#comparison-to-console-ui)
+    * [Additional Parameters (Cheat Support)](#additional-parameters-cheat-support)
+* [Linux: GLideN64 Workaround](#linux-gliden64-workaround)
+
+
+## Getting Mupen64Plus-Qt
+
+### Stable Builds
+
+Stable releases for Linux, Windows and OSX can be found on the [releases](https://github.com/dh4/mupen64plus-qt/releases) page.
+
+Note the Linux release is just a tar.gz archive containing an executable. It's a 64-bit executable that is linked to Qt4, so you'll need Qt4 installed to run it. If you have issues with it, see the section below on building.
+
+##### Linux Distributions
+_Debian/Ubuntu:_ See the section below on [creating a .deb package](#creating-a-deb-package-debianubuntu).  
+_Arch Linux:_ [https://aur.archlinux.org/packages/mupen64plus-qt/](https://aur.archlinux.org/packages/mupen64plus-qt/)  
+_Redhat/Fedora:_ See the section below on [creating a .rpm package](#creating-a-rpm-package-redhatfedora).
+
+
+### Development Builds
+
+Automatic builds of the latest git commit can be downloaded here:  
+Linux: [mupen64plus-qt_linux_git-latest.tar.gz](https://s3.amazonaws.com/dh4/mupen64plus-qt/latest/mupen64plus-qt_linux_git-latest.tar.gz)  
+Windows: [mupen64plus-qt_win_git-latest.zip](https://s3.amazonaws.com/dh4/mupen64plus-qt/latest/mupen64plus-qt_win_git-latest.zip)  
+OSX: [mupen64plus-qt_osx_git-latest.dmg](https://s3.amazonaws.com/dh4/mupen64plus-qt/latest/mupen64plus-qt_osx_git-latest.dmg)
+
+Be aware that these may contain bugs not present in the stable releases.
+
+
+### Building (Linux)
+
+First, obtain the source code for Mupen64Plus-Qt. You can either clone the repository with git or download an archive of the source code for a specific release from the [releases](https://github.com/dh4/mupen64plus-qt/releases) page.
 
 You'll need to make sure you have qmake, g++, the Qt development libraries and the QuaZIP development files installed. On Debian/Ubuntu, this can be accomplished by:
 
@@ -14,7 +65,7 @@ You'll need to make sure you have qmake, g++, the Qt development libraries and t
 # apt-get install qt5-qmake g++ qtbase5-dev libquazip-qt5-dev libqt5sql5-sqlite
 ```
 
-Once the needed packages are installed, create the Makefile with qmake and then build with make:
+Once the needed packages are installed, create the Makefile with qmake and then build with make. Run the following commands from the directory that contains mupen64plus-qt.pro:
 
 ```
 $ qmake
@@ -23,7 +74,7 @@ $ make
 
 If qmake returns "qmake: could not find a Qt installation of ''", you can try running `QT_SELECT=qt5 qmake` or `/usr/lib/x86_64-linux-gnu/qt5/bin/qmake`. Some distributions also contain a `qmake-qt5` symlink.
 
-#### Building with Qt4
+##### Building with Qt4
 
 Install the Qt4 dependencies instead. On Debian/Ubuntu:
 
@@ -31,62 +82,98 @@ Install the Qt4 dependencies instead. On Debian/Ubuntu:
 # apt-get install qt4-qmake g++ libqt4-dev libquazip-dev libqt4-sql-sqlite
 ```
 
-Then create the Makefile with qmake and build with make:
+Then create the Makefile with qmake and build with make. Run the following commands from the directory that contains mupen64plus-qt.pro:
 
 ```
 $ qmake-qt4
 $ make
 ```
 
+##### Compiling QuaZIP statically
 
-## Usage
+You also have the option to compile QuaZIP statically. Download the QuaZIP sources from Sourceforge. Place the contents of `quazip-<version>/quazip/` in `quazip/` within the project directory. Then run:
 
-Mupen64Plus-Qt utilizes the console UI to launch games. It contains support for most of the command line parameters. These can be viewed by running Mupen64Plus from a terminal with the --help parameter or [here](https://code.google.com/p/mupen64plus/wiki/UIConsoleUsage).
+```
+$ qmake CONFIG+=linux_quazip_static
+$ make
+```
 
-### --noosd/--osd
+You will see warnings after the qmake step if the QuaZIP sources are in the wrong place.
 
-One or the other is sent to Mupen64Plus based on whether the "On Screen Display" checkbox is checked under the graphics tab.
+#### Creating a .deb package (Debian/Ubuntu)
 
-### --fullscreen/--windowed
+You can build and install a debian package using the files found in dist/debian:
 
-Similarly, one or the other is sent based on the "Fullscreen" checkbox underneath the graphics tab.
+```
+$ sudo apt-get install build-essential devscripts debhelper qt5-qmake qtbase5-dev libquazip-qt5-dev libqt5sql5-sqlite
+$ ./dist/debian/deb-build.sh
+$ sudo dpkg -i mupen64plus-qt_<VERSION>-1.<ARCH>.deb
+```
 
-### --resolution
+#### Creating a .rpm package (Redhat/Fedora)
 
-This can be configured with the "Resolution" combo box underneath the graphics tab. The list is generated based on common resolutions smaller than your current desktop resolution. If you require a resolution not in the list, just set the "default" option which will not send the --resolution parameter to Mupen64Plus (Mupen64Plus will read from whatever setting is within it's configuration file in this case).
+You can build and install an RPM package using the spec file found in dist/redhat:
+```
+$ sudo dnf install rpmdevtools qt5-qtbase-devel quazip-qt5-devel gcc-c++
+$ ./dist/redhat/rpm-build.sh
+$ sudo rpm -i ~/rpmbuild/RPMS/<ARCH>/mupen64plus-qt-rpm-<VERSION>.<ARCH>.rpm
+```
+Note the resulting package is named mupen64plus-qt-rpm to avoid conflicts with some third-party mupen64plus RPMs.
 
-### --configdir
 
-This is configured under the paths tab. This is entirely optional, but allows you to specific a different directory to load the mupen64plus.cfg file from (useful if you want to say, load different input settings at different times).
+## First Launch and Setup
 
-### --datadir
+Mupen64Plus-Qt contains code that attempts to auto-detect a Mupen64Plus installation. These settings are located at Settings->Configure->Paths. See below for a per-OS description of this and what to do if Mupen64Plus is not auto-detected.
 
-This is set underneath the paths tab. Mupen64Plus-Qt will also make use of the data directory setting to load the GoodName text and other information from the mupen64plus.ini file, so make sure this directory contains that file. It's usually /usr/share/mupen64plus on Linux or the same directory as the executable on Windows. 
+#### Linux
 
-### --plugindir
+Mupen64Plus-Qt looks within common locations distributions place the mupen64plus binary, plugin libraries and data files. If any of these aren't found, obtain the Mupen64Plus package for you distribution and peek inside to see where the files are placed (or use a utility such as find or mlocate).
 
-The plugin directory is usually /usr/lib/mupen64plus or within the same directory as the executable on Windows. Mupen64Plus-Qt also makes use of this directory setting to populate the options on the plugins tab (you must click Ok first before they will populate).
+The plugin directory should contain mupen64plus-video-rice.so, mupen64plus-video-glide64mk2.so, etc. The data directory should contain mupen64plus.ini. You should be able to find the executable by running `which mupen64plus`.
 
-### --gfx/--audio/--input/--rsp
+#### Windows
 
-These are configured under the plugins tab once the plugin directory has been set.
+It's best to place mupen64plus-qt.exe within the same folder as mupen64plus-ui-console.exe (mupen64plus.exe before version 2.5) as Mupen64Plus-Qt looks in the same directory it's running from to try and find the executable, plugins and data files.
 
-### ---emumode
+If you place it somewhere else, set the plugin directory and data directory to the same folder containing mupen64plus-ui-console.exe.
 
-This is configured under the emulation tab.
+#### OSX
 
-### --saveoptions/--nosaveoptions
+Mupen64Plus-Qt looks for mupen64plus.app within the same directory where Mupen64Plus-Qt.app is placed.
 
-One or the other is sent to Mupen64Plus based on the "Save Options" checkbox underneath the other tab. If --saveoptions is set, then Mupen64Plus will save whatever settings are passed to it into its configuration file (mupen64plus.cfg)
+If you place it somewhere else, simply select mupen64plus.app as the executable and it will autofill the plugin and data directory settings for you (these are within mupen64plus.app).
+
+
+## ROM Collection
+
+You can specify ROM directories under Settings->Configure->Paths. Mupen64Plus-Qt will search for any .z64, .v64 or .n64 files within these directories and also check within .zip files and subdirectories (one level deep). After adding or removing directories to this list, it will automatically refresh your ROM list. You can manually refresh your list with File->Refresh List.
+
+#### Views
 
+Mupen64Plus-Qt contains three options for displaying your ROMs: a table view, grid view and list view. The view can be changed under Settings->Layout. These can be configured under Settings->Configure.
 
-## Game Information
+<img src="https://dl.dropboxusercontent.com/u/232085155/mupen64plus-qt/table-view.jpg" alt="Table View" height="150" />
+<img src="https://dl.dropboxusercontent.com/u/232085155/mupen64plus-qt/grid-view.jpg" alt="Grid View" height="150" />
+<img src="https://dl.dropboxusercontent.com/u/232085155/mupen64plus-qt/list-view.jpg" alt="List View" height="150" />
 
-Mupen64Plus-Qt supports downloading game information and cover images from [thegamesdb.net](http://thegamesdb.net/). This can be enabled under the Other tab. It's recommended you have the data directory set (under Paths) before using this. Once enabled, you'll need to refresh your ROMs list to download the information. Afterwards, images and other information about the game can be added to the layouts.
+In each of the views, you can simply double click a game to launch it, or single click to select it and use Emulation->Start.
 
-### Updating Game Information
 
-If a game is not found or is incorrect, Mupen64Plus-Qt supports refreshing information for a single ROM. Just select the rom and go to File->Download/Update Info. From here you can enter a different search or the specific ID of the game (from the URL of the game on thegamesdb.net).
+## Game Information from TheGamesDB
+
+Mupen64Plus-Qt supports downloading game information and cover images from [thegamesdb.net](http://thegamesdb.net/). This can be enabled under Settings->Configure->Other. It's recommended you have the data directory set (under Paths) before using this. Once enabled, you'll need to refresh your ROMs list to download the information. Afterwards, images and other information about the game can be added to the views.
+
+#### Updating Game Information
+
+If a game is not found or is incorrect, Mupen64Plus-Qt supports refreshing information for a single ROM. Just select the ROM and go to File->Download/Update Info. From here you can enter a different search or the specific ID of the game (from the URL of the game on thegamesdb.net).
+
+
+#### Deleting Game Information
+
+You can delete the game information fetched from TheGamesDB by using File->Delete Current Info. Note that if you are deleting a game's information because the game doesn't exist on TheGamesDB and Mupen64Plus-Qt pulled the information for different game, it's better to create an account on TheGamesDB and add the game so other users can benefit as well.
+
+This will cause Mupen64Plus-Qt to not update the information for this game until you force it with File->Download/Update Info
+
 
 #### Manually Updating Information
 
@@ -94,22 +181,18 @@ If desired, you can also manually update the information from TheGamesDB. Note t
 
 The information cache can be found here:
 
-Linux: ~/.local/share/mupen64plus-qt/cache/\<MD5 of game\>/  
+Linux: /home/\<user\>/.local/share/mupen64plus-qt/cache/\<MD5 of game\>/  
 Windows: cache folder in same directory as executable -> MD5 of game  
-OSX: ~/Library/Application Support/mupen64plus-qt/cache/\<MD5 of game\>/
+OSX: /Users/\<user\>/Library/Application Support/mupen64plus-qt/cache/\<MD5 of game\>/
 
 You can find the MD5 of a game by using the table or list view and adding "MD5" to the current information.
 
 Edit data.xml with a text editor and replace any information you want to change. You can also replace boxart-front.{jpg,png} with an image of your choosing.
 
-### Deleting Game Information
 
-You can delete the game information fetched from TheGamesDB by using File->Delete Current Info. Note that if you are deleting a game's information because the game doesn't exist on TheGamesDB and Mupen64Plus-Qt pulled the information for different game, it's better to create an account on TheGamesDB and add the game so other users can benefit as well.
+## Editor For mupen64plus.cfg
 
-This will cause Mupen64Plus-Qt to not update the information for this game until you force it with "Download/Update Info..."
-
-
-## Mupen64Plus Config Editor
+<img src="https://dl.dropboxusercontent.com/u/232085155/mupen64plus-qt/config-editor.jpg" alt="Table View" height="200" />
 
 Mupen64Plus-Qt contains an editor with syntax highlighting for mupen64plus.cfg. To use it, make sure you have your config directory set under Settings->Configure->Paths. Mupen64Plus-Qt should auto-detect this setting for you. If it doesn't, the default location is:
 
@@ -118,6 +201,72 @@ Windows: C:/Users/\<user\>/AppData/Roaming/Mupen64Plus/
 OSX: /Users/\<user\>/.config/mupen64plus/
 
 
+## Mupen64Plus Log Viewer
+
+Mupen64Plus-Qt allows you to view the output from the Mupen64Plus console UI. Select Emulation->View Log after Mupen64Plus has quit to see the output from the last run.
+
+
+## Configuration File
+
+Mupen64Plus-Qt saves its settings to a text file. If for some reason you would like to modify this, it's contained at the following locations:  
+Linux: /home/\<user\>/.config/mupen64plus/mupen64plus-qt.conf  
+Windows: mupen64plus-qt.ini within the same directory as the executable  
+OSX: /Users/\<user\>/Library/Preferences/com.mupen64plus.mupen64plus-qt.plist
+
+
+## Comparison to Console UI
+
+Mupen64Plus-Qt utilizes the console UI to launch games. It contains support for most of the command line parameters. These can be viewed by running Mupen64Plus from a terminal with the --help parameter or [here](http://mupen64plus.org/wiki/index.php?title=UIConsoleUsage).
+
+See below for how each parameter is used within Mupen64Plus-Qt:
+
+##### --noosd/--osd
+
+One or the other is sent to Mupen64Plus based on whether the "On Screen Display" checkbox is checked under the graphics tab.
+
+##### --fullscreen/--windowed
+
+Similarly, one or the other is sent based on the "Fullscreen" checkbox underneath the graphics tab.
+
+##### --resolution
+
+This can be configured with the "Resolution" combo box underneath the graphics tab. The list is generated based on common resolutions smaller than your current desktop resolution. If you require a resolution not in the list, just set the "default" option which will not send the --resolution parameter to Mupen64Plus (Mupen64Plus will read from whatever setting is within its configuration file in this case).
+
+##### --configdir
+
+This is configured under the paths tab. It's entirely optional, but allows you to specify a different directory to load the mupen64plus.cfg file from (useful if you want to say, load different input settings at different times).
+
+You can also specify the config directory on a per-game basis under Settings->Configure Game.
+
+##### --datadir
+
+This is set underneath the paths tab. Mupen64Plus-Qt will also make use of the data directory setting to load the GoodName text and other information from the mupen64plus.ini file, so make sure this directory contains that file. It's usually /usr/share/mupen64plus on Linux or the same directory as the executable on Windows.
+
+##### --plugindir
+
+The plugin directory is usually /usr/lib/mupen64plus or within the same directory as the executable on Windows. Mupen64Plus-Qt also makes use of this directory setting to populate the options on the plugins tab (you must click Ok first before they will populate).
+
+##### --gfx/--audio/--input/--rsp
+
+These are configured under the plugins tab once the plugin directory has been set. You can also configure plugins on a per-game basis under Settings->Configure Game.
+
+##### --emumode
+
+This is configured under the emulation tab.
+
+##### --saveoptions/--nosaveoptions
+
+One or the other is sent to Mupen64Plus based on the "Save Options" checkbox underneath the other tab. If --saveoptions is set, then Mupen64Plus will save whatever settings are passed to it into its configuration file (mupen64plus.cfg)
+
+#### Additional Parameters (Cheat Support)
+
+Mupen64Plus-Qt also supports specifying additional parameters both globally under Settings->Configure->Other->Additional Parameters and on a per-game basis under Settings->Configure Game->Other Parameters. You can specify any other parameters that the console UI supports here.
+
+The main use of this is specifying cheats. For example, filling this with `--cheats 'list'` will allow you to double click on a ROM and then view the log for a list of cheats for that game (remove it to be able to launch the game again). You can then specify what cheats you want with `--cheats 1,2-1,3`, etc.
+
+Be aware that if this contains anything that Mupen64Plus doesn't support, the emulator will not be able to launch.
+
+
 ## Linux: GLideN64 Workaround
 
 Mupen64Plus-Qt contains support for [this](https://github.com/gonetz/GLideN64/issues/454#issuecomment-126853972) workaround for GLideN64 on Linux. There is no graphical option for this as it's more of a hack and should be fixed on GLideN64's end. Edit your configuration file at ~/.config/mupen64plus/mupen64plus-qt.conf and add "forcegl33=true" under [Other].
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..2e0e38c
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.9
diff --git a/build-scripts/platform/linux.sh b/build-scripts/platform/linux.sh
new file mode 100755
index 0000000..bf00568
--- /dev/null
+++ b/build-scripts/platform/linux.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+[[ -z $WORKING_DIR ]] && WORKING_DIR=$(pwd)
+[[ -z $VERSION ]] && VERSION=$(git log --oneline -n 1 | awk '{print $1}')
+
+
+case "$1" in
+
+    'setup_qt')
+        sudo apt-get update -qq
+        sudo apt-get -y install qt4-qmake libqt4-dev libqt4-sql-sqlite
+    ;;
+
+    'get_quazip')
+        wget http://downloads.sourceforge.net/quazip/quazip-0.7.1.tar.gz
+        tar -xvzf quazip-0.7.1.tar.gz > /dev/null
+        mv quazip-0.7.1/quazip .
+    ;;
+
+    'build')
+        ./build-scripts/revision.sh
+        qmake-qt4 CONFIG+=linux_quazip_static
+        make
+    ;;
+
+    'package')
+        mkdir build
+
+        mv resources/README.txt .
+        tar -cvzpf build/mupen64plus-qt_linux_$VERSION.tar.gz mupen64plus-qt README.txt
+    ;;
+
+esac
diff --git a/build-scripts/platform/osx.sh b/build-scripts/platform/osx.sh
new file mode 100755
index 0000000..e6ae2d4
--- /dev/null
+++ b/build-scripts/platform/osx.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+[[ -z $WORKING_DIR ]] && WORKING_DIR=$(pwd)
+[[ -z $VERSION ]] && VERSION=$(git log --oneline -n 1 | awk '{print $1}')
+
+
+case "$1" in
+
+    'setup_qt')
+        mkdir $WORKING_DIR/../osx
+        cd $WORKING_DIR/../osx
+
+        if [[ $BUILD_OSX_QT ]]; then
+            # Build Qt
+            git clone --branch v5.5.0 --depth 1 https://code.qt.io/qt/qtbase.git
+            cd qtbase
+            ./configure -release -static -qt-sql-sqlite -opensource -confirm-license
+            make sub-src
+        else
+            # Fetch pre-build Qt
+            wget https://www.dropbox.com/s/mfw6qwfir62fy9p/macosx-qt5.tar.gz
+            tar -xvzf macosx-qt5.tar.gz >& /dev/null
+        fi
+
+        cd $WORKING_DIR/mupen64plus-qt
+    ;;
+
+    'get_quazip')
+        wget http://downloads.sourceforge.net/quazip/quazip-0.7.1.tar.gz
+        tar -xvzf quazip-0.7.1.tar.gz >& /dev/null
+        mv quazip-0.7.1/quazip .
+    ;;
+
+    'build')
+        ./build-scripts/revision.sh
+        $WORKING_DIR/../osx/qtbase/bin/qmake -config release LIBS+="-dead_strip"
+        make
+    ;;
+
+    'package')
+        mkdir build
+
+        hdiutil create -megabytes 20 -fs HFS+ -volname Mupen64Plus-Qt mupen64plus-qt_osx_$VERSION
+        hdiutil attach mupen64plus-qt_osx_$VERSION.dmg
+
+        cp -r Mupen64Plus-Qt.app /Volumes/Mupen64Plus-Qt/Mupen64Plus-Qt.app
+        cp resources/README.txt /Volumes/Mupen64Plus-Qt/README.txt
+
+        hdiutil detach /Volumes/Mupen64Plus-Qt
+        hdiutil convert -format UDZO -o mupen64plus-qt_osx_$VERSION.dmg \
+                        -ov mupen64plus-qt_osx_$VERSION.dmg
+
+        mv mupen64plus-qt_osx_$VERSION.dmg build/
+    ;;
+
+esac
diff --git a/build-scripts/platform/windows.sh b/build-scripts/platform/windows.sh
new file mode 100755
index 0000000..8177928
--- /dev/null
+++ b/build-scripts/platform/windows.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+[[ -z $WORKING_DIR ]] && WORKING_DIR=$(pwd)
+[[ -z $VERSION ]] && VERSION=$(git log --oneline -n 1 | awk '{print $1}')
+
+
+case "$1" in
+
+    'setup_qt')
+        cd $WORKING_DIR/../
+
+        if [[ $BUILD_MXE_QT ]]; then
+            # Build Qt with mxe
+            sudo apt-get update -qq
+            sudo apt-get install \
+                autoconf automake autopoint bash bison bzip2 cmake flex \
+                gettext git g++ gperf intltool libffi-dev libtool \
+                libltdl-dev libssl-dev libxml-parser-perl make openssl \
+                p7zip-full patch perl pkg-config python ruby scons sed \
+                unzip wget xz-utils
+            git clone https://github.com/mxe/mxe.git
+            cd mxe
+            make qtbase
+        else
+            # Fetch pre-built mxe Qt
+            wget https://www.dropbox.com/s/jr6l4lnixizqtln/travis-mxe-qt5.tar.gz
+            tar -xvzf travis-mxe-qt5.tar.gz > /dev/null
+        fi
+
+        cd $WORKING_DIR/mupen64plus-qt
+    ;;
+
+    'get_quazip')
+        wget http://downloads.sourceforge.net/quazip/quazip-0.7.1.tar.gz
+        tar -xvzf quazip-0.7.1.tar.gz > /dev/null
+        mv quazip-0.7.1/quazip .
+    ;;
+
+    'build')
+        export PATH=$PATH:$WORKING_DIR/../mxe/usr/bin
+
+        ./build-scripts/revision.sh
+        i686-w64-mingw32.static-qmake-qt5
+        make
+    ;;
+
+    'package')
+        mkdir build
+
+        mv release/mupen64plus-qt.exe resources/README.txt .
+        zip build/mupen64plus-qt_win_$VERSION.zip mupen64plus-qt.exe README.txt
+    ;;
+
+esac
diff --git a/build-scripts/revision.sh b/build-scripts/revision.sh
new file mode 100755
index 0000000..07c0b7d
--- /dev/null
+++ b/build-scripts/revision.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+git show-ref --tags | grep "`git log -n 1 --pretty='%H'`" > /dev/null 2>&1
+
+if [[ $? == 1 ]]; then
+    REVISION=$(git log -n 1 --pretty='%h' 2> /dev/null)
+    [[ $REVISION ]] && sed -i -e "s/\([0-9.]*\)/\1~git:$REVISION/g" VERSION
+fi
+
+cat VERSION
diff --git a/build-scripts/travis-ci.sh b/build-scripts/travis-ci.sh
new file mode 100755
index 0000000..2ad59d0
--- /dev/null
+++ b/build-scripts/travis-ci.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+export WORKING_DIR=$HOME/build/dh4
+
+if [[ $1 == 'package' ]]; then
+    VERSION=$(echo $TRAVIS_TAG | sed -e 's/v//g')
+    [[ -z $VERSION ]] && VERSION='git-latest'
+    export VERSION=$VERSION
+fi
+
+case "$TRAVIS_OS_NAME-$BUILD" in
+    'linux-windows') ./build-scripts/platform/windows.sh $1 ;;
+    'linux-native')  ./build-scripts/platform/linux.sh $1   ;;
+    'osx-native')    ./build-scripts/platform/osx.sh $1     ;;
+esac
diff --git a/dist/debian/compat b/dist/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/dist/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/dist/debian/control b/dist/debian/control
new file mode 100644
index 0000000..a9c173a
--- /dev/null
+++ b/dist/debian/control
@@ -0,0 +1,17 @@
+Source: mupen64plus-qt
+Section: games
+Priority: optional
+Maintainer: Dan Hasting <dan at hasting.info>
+Homepage: https://github.com/dh4/mupen64plus-qt
+Standards-Version: 3.9.6
+Build-Depends: debhelper (>=9), qt5-qmake, qtbase5-dev, libquazip-qt5-dev, libqt5sql5-sqlite
+
+Package: mupen64plus-qt
+Architecture: any-i386 any-amd64
+Depends: ${shlibs:Depends}, ${misc:Depends}, mupen64plus
+Description: A basic launcher for Mupen64Plus
+ Mupen64Plus-Qt is a basic launcher for the mupen64plus-ui-console frontend.
+ It was adapted from CEN64-Qt to work with Mupen64Plus.
+ .
+ See the README at https://www.github.com/dh4/mupen64plus-qt for a detailed
+ description of itsfeatures and usage.
diff --git a/dist/debian/copyright b/dist/debian/copyright
new file mode 100644
index 0000000..4068104
--- /dev/null
+++ b/dist/debian/copyright
@@ -0,0 +1,27 @@
+Copyright (c) 2013, Dan Hasting
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the organization nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/dist/debian/deb-build.sh b/dist/debian/deb-build.sh
new file mode 100755
index 0000000..42c6bd5
--- /dev/null
+++ b/dist/debian/deb-build.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+cd `dirname $0`/../../
+
+VERSION=`cat VERSION`
+
+mkdir deb-build
+cd deb-build
+
+wget https://github.com/dh4/mupen64plus-qt/archive/$VERSION.tar.gz
+
+if [[ $? == 0 ]]; then
+    tar -xvzf $VERSION.tar.gz
+    cp -r ../dist/debian mupen64plus-qt-$VERSION
+    cd mupen64plus-qt-$VERSION
+    debchange --create -v $VERSION-1 --package mupen64plus-qt "Version $VERSION"
+    debuild -i -us -uc -b
+    mv ../mupen64plus-qt_$VERSION*.deb ../..
+fi
\ No newline at end of file
diff --git a/dist/debian/docs b/dist/debian/docs
new file mode 100644
index 0000000..b43bf86
--- /dev/null
+++ b/dist/debian/docs
@@ -0,0 +1 @@
+README.md
diff --git a/dist/debian/install b/dist/debian/install
new file mode 100644
index 0000000..22d27bd
--- /dev/null
+++ b/dist/debian/install
@@ -0,0 +1,4 @@
+mupen64plus-qt                      usr/games
+resources/mupen64plus-qt.desktop    usr/share/applications
+resources/mupen64plus-qt.1          usr/share/man/man1
+resources/images/mupen64plus.png    usr/share/icons/hicolor/128x128/apps/mupen64plus-qt.png
diff --git a/dist/debian/rules b/dist/debian/rules
new file mode 100755
index 0000000..5605122
--- /dev/null
+++ b/dist/debian/rules
@@ -0,0 +1,11 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+%:
+	dh $@
+
+override_dh_auto_configure:
+	QT_SELECT=qt5 dh_auto_configure
diff --git a/dist/debian/source/format b/dist/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/dist/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/macosx/mupen64plus.icns b/dist/macosx/mupen64plus.icns
similarity index 100%
rename from macosx/mupen64plus.icns
rename to dist/macosx/mupen64plus.icns
diff --git a/dist/redhat/mupen64plus-qt.spec.in b/dist/redhat/mupen64plus-qt.spec.in
new file mode 100644
index 0000000..a1f66f9
--- /dev/null
+++ b/dist/redhat/mupen64plus-qt.spec.in
@@ -0,0 +1,46 @@
+%define _name   mupen64plus-qt
+
+Name:           mupen64plus-qt-rpm
+Version:        @@VERSION@@
+Release:        1
+Summary:        A basic launcher for Mupen64Plus
+Group:          Applications/Emulators
+License:        BSD
+URL:            https://github.com/dh4/mupen64plus-qt
+Source0:        https://github.com/dh4/%{_name}/archive/%{version}.tar.gz
+BuildRequires:  qt5-qtbase-devel, quazip-qt5-devel, gcc-c++
+Requires:       qt5-qtbase, quazip-qt5
+
+%description
+Mupen64Plus-Qt is a basic launcher for the mupen64plus-ui-console frontend. It
+was adapted from CEN64-Qt to work with Mupen64Plus.
+
+See the README at https://www.github.com/dh4/mupen64plus-qt for a detailed
+description of its features and usage.
+
+%prep
+%autosetup -n %{_name}-%{version}
+
+%build
+sed -i 's#include <quazip/#include <quazip5/#g' src/common.h
+
+qmake-qt5
+make %{?_smp_mflags}
+
+%install
+install -Dm755 "mupen64plus-qt"                     "%{buildroot}%{_bindir}/mupen64plus-qt"
+install -Dm644 "resources/mupen64plus-qt.desktop"   "%{buildroot}%{_datadir}/applications/mupen64plus-qt.desktop"
+install -Dm644 "resources/images/mupen64plus.png"   "%{buildroot}%{_datadir}/icons/hicolor/128x128/apps/mupen64plus-qt.png"
+install -Dm644 "resources/mupen64plus-qt.1"         "%{buildroot}%{_mandir}/man1/mupen64plus-qt.1"
+
+%files
+%license LICENSE
+%doc README.md
+%{_bindir}/mupen64plus-qt
+%{_datadir}/applications/mupen64plus-qt.desktop
+%{_datadir}/icons/hicolor/128x128/apps/mupen64plus-qt.png
+%{_mandir}/man1/mupen64plus-qt.1*
+
+%changelog
+* Tue Oct 06 2015 Dan Hasting
+- initial spec file
diff --git a/dist/redhat/rpm-build.sh b/dist/redhat/rpm-build.sh
new file mode 100755
index 0000000..37957c3
--- /dev/null
+++ b/dist/redhat/rpm-build.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+cd `dirname $0`
+
+VERSION=`cat ../../VERSION`
+sed "s/@@VERSION@@/$VERSION/g" mupen64plus-qt.spec.in > mupen64plus-qt.spec
+spectool -g -R mupen64plus-qt.spec
+rpmbuild -ba mupen64plus-qt.spec
diff --git a/windows/icon.rc b/dist/windows/icon.rc
similarity index 100%
rename from windows/icon.rc
rename to dist/windows/icon.rc
diff --git a/windows/mupen64plus.ico b/dist/windows/mupen64plus.ico
similarity index 100%
rename from windows/mupen64plus.ico
rename to dist/windows/mupen64plus.ico
diff --git a/mupen64plus-qt.pro b/mupen64plus-qt.pro
index 5ab4f0a..dd1bd8d 100644
--- a/mupen64plus-qt.pro
+++ b/mupen64plus-qt.pro
@@ -13,8 +13,8 @@ macx {
 }
 
 TEMPLATE = app
-macx:ICON = macosx/mupen64plus.icns
-win32:RC_FILE = windows/icon.rc
+macx:ICON = dist/macosx/mupen64plus.icns
+win32:RC_FILE = dist/windows/icon.rc
 
 
 SOURCES += src/main.cpp \
@@ -22,6 +22,7 @@ SOURCES += src/main.cpp \
     src/mainwindow.cpp \
     src/aboutdialog.cpp \
     src/settingsdialog.cpp \
+    src/gamesettingsdialog.cpp \
     src/treewidgetitem.cpp \
     src/clickablewidget.cpp \
     src/configeditor.cpp \
@@ -36,6 +37,7 @@ HEADERS += src/global.h \
     src/mainwindow.h \
     src/aboutdialog.h \
     src/settingsdialog.h \
+    src/gamesettingsdialog.h \
     src/treewidgetitem.h \
     src/clickablewidget.h \
     src/configeditor.h \
@@ -47,9 +49,12 @@ HEADERS += src/global.h \
 
 RESOURCES += resources/mupen64plusqt.qrc
 
-FORMS += src/settingsdialog.ui
+FORMS += src/settingsdialog.ui \
+    src/gamesettingsdialog.ui
 
-win32|macx {
+TRANSLATIONS += resources/locale/mupen64plus-qt_fr.ts
+
+win32|macx|linux_quazip_static {
     CONFIG += staticlib
     DEFINES += QUAZIP_STATIC
 
@@ -62,8 +67,12 @@ win32|macx {
         LIBS += -lquazip
     } else {
         # Debian distributions use a different library name for Qt5 quazip
-        system("uname -a | grep -E 'Debian|Ubuntu' > /dev/null") {
-            LIBS += -lquazip-qt5
+        system("which dpkg > /dev/null 2>&1") {
+            system("dpkg -l | grep libquazip5-dev | grep ^ii > /dev/null") {
+                LIBS += -lquazip5
+            } else {
+                LIBS += -lquazip-qt5
+            }
         } else {
             LIBS += -lquazip5
         }
diff --git a/resources/README.txt b/resources/README.txt
new file mode 100644
index 0000000..8d9d337
--- /dev/null
+++ b/resources/README.txt
@@ -0,0 +1,12 @@
+Github Repository:
+https://www.github.com/dh4/mupen64plus-qt
+
+Qt is licensed under the LGPL v2.1:
+https://www.gnu.org/licenses/lgpl-2.1.html
+
+Qt's source code can be viewed here:
+https://qt.gitorious.org/qt
+
+
+See the README at https://www.github.com/dh4/mupen64plus-qt for a detailed
+description of Mupen64Plus-Qt's features and usage.
diff --git a/resources/locale/mupen64plus-qt_fr.qm b/resources/locale/mupen64plus-qt_fr.qm
new file mode 100644
index 0000000..ed43d45
Binary files /dev/null and b/resources/locale/mupen64plus-qt_fr.qm differ
diff --git a/resources/locale/mupen64plus-qt_fr.ts b/resources/locale/mupen64plus-qt_fr.ts
new file mode 100644
index 0000000..14cef1a
--- /dev/null
+++ b/resources/locale/mupen64plus-qt_fr.ts
@@ -0,0 +1,1049 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../../src/aboutdialog.cpp" line="44"/>
+        <source>About Mupen64Plus-Qt</source>
+        <translation>À propos de Mupen64Plus-Qt</translation>
+    </message>
+    <message>
+        <location filename="../../src/aboutdialog.cpp" line="58"/>
+        <source>Version</source>
+        <translation>Version</translation>
+    </message>
+    <message>
+        <location filename="../../src/aboutdialog.cpp" line="59"/>
+        <source>A basic launcher for Mupen64Plus using Qt.</source>
+        <translation>Une interface graphique simple et élémentaire pour Mupen64Plus.</translation>
+    </message>
+    <message>
+        <location filename="../../src/aboutdialog.cpp" line="60"/>
+        <source>Mupen64Plus website</source>
+        <translation>Site web de Mupen64Plus</translation>
+    </message>
+    <message>
+        <location filename="../../src/aboutdialog.cpp" line="61"/>
+        <source>GitHub repository</source>
+        <translation>Dépôt GitHub</translation>
+    </message>
+</context>
+<context>
+    <name>ConfigEditor</name>
+    <message>
+        <location filename="../../src/configeditor.cpp" line="48"/>
+        <source>Mupen64Plus Config Editor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/configeditor.cpp" line="72"/>
+        <source>Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadDialog</name>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="48"/>
+        <source>Search Game Information</source>
+        <translation>Chercher des informations sur le jeu</translation>
+    </message>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="52"/>
+        <source>File</source>
+        <translation>Fichier</translation>
+    </message>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="54"/>
+        <source>Name of Game:</source>
+        <translation>Nom du jeu :</translation>
+    </message>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="55"/>
+        <source>or Game ID:</source>
+        <translation>ou identifiant du jeu :</translation>
+    </message>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="61"/>
+        <source>From thegamesdb.net URL of game</source>
+        <translation>URL du jeu sur thegamesdb.net</translation>
+    </message>
+    <message>
+        <location filename="../../src/downloaddialog.cpp" line="64"/>
+        <source>Search</source>
+        <translation>Chercher</translation>
+    </message>
+</context>
+<context>
+    <name>EmulatorHandler</name>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="56"/>
+        <location filename="../../src/emulatorhandler.cpp" line="183"/>
+        <location filename="../../src/emulatorhandler.cpp" line="189"/>
+        <location filename="../../src/emulatorhandler.cpp" line="199"/>
+        <source>Warning</source>
+        <translation>Attention</translation>
+    </message>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="57"/>
+        <source>Mupen64Plus quit unexpectedly. Check the log for more information.</source>
+        <translation>Mupen64Plus a quitté de manière inattendue. Consultez les journaux pour plus d'informations.</translation>
+    </message>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="60"/>
+        <source>View Log...</source>
+        <translation>Consulter les journaux...</translation>
+    </message>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="199"/>
+        <source>Not a valid ROM File.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="183"/>
+        <source>Mupen64Plus executable not found.</source>
+        <translation>Executable Mupen64Plus non trouvé.</translation>
+    </message>
+    <message>
+        <location filename="../../src/emulatorhandler.cpp" line="189"/>
+        <source>ROM file not found.</source>
+        <translation>Fichier ROM manquant.</translation>
+    </message>
+</context>
+<context>
+    <name>GameSettingsDialog</name>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="20"/>
+        <source>Game Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="26"/>
+        <source>Game settings for: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="33"/>
+        <source>These settings will override any global settings. If there's a setting you want to modify for this game, but it doesn't appear here, add the parameter for it to "Other Parameters."</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="43"/>
+        <source>Plugins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="57"/>
+        <source>Audio Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="64"/>
+        <source>Input Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="71"/>
+        <source>RSP Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="78"/>
+        <source>Video Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="86"/>
+        <location filename="../../src/gamesettingsdialog.ui" line="95"/>
+        <location filename="../../src/gamesettingsdialog.ui" line="104"/>
+        <location filename="../../src/gamesettingsdialog.ui" line="113"/>
+        <source>default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="126"/>
+        <source>Additional Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="137"/>
+        <source>Config Directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="144"/>
+        <source>Other Parameters:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.ui" line="151"/>
+        <source>Browse...</source>
+        <translation>Naviguer...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gamesettingsdialog.cpp" line="106"/>
+        <source>Config Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LogDialog</name>
+    <message>
+        <location filename="../../src/logdialog.cpp" line="46"/>
+        <source>Mupen64Plus Log</source>
+        <translation>Journaux Mupen64Plus</translation>
+    </message>
+    <message>
+        <location filename="../../src/logdialog.cpp" line="66"/>
+        <source>Close</source>
+        <translation>Fermer</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="69"/>
+        <source>Mupen64Plus-Qt</source>
+        <translation>Mupen64Plus-Qt</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="517"/>
+        <source>&File</source>
+        <translation>&Fichier</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="518"/>
+        <source>&Open ROM...</source>
+        <translation>&Ouvrir une ROM...</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="520"/>
+        <source>&Refresh List</source>
+        <translation>&Recharger la liste</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="521"/>
+        <source>&Download/Update Info...</source>
+        <translation>&Télécharger/Mettre à jour les infos...</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="522"/>
+        <source>D&elete Current Info...</source>
+        <translation>&Effacer les infos actuelles...</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="526"/>
+        <source>&Quit</source>
+        <translation>&Quitter</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="538"/>
+        <source>&Emulation</source>
+        <translation>&Émulation</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="539"/>
+        <source>&Start</source>
+        <translation>&Démarrer</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="540"/>
+        <source>St&op</source>
+        <translation>&Arrêter</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="542"/>
+        <source>View Log...</source>
+        <translation>Consulter les journaux...</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="553"/>
+        <source>&Settings</source>
+        <translation>&Paramètres</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="579"/>
+        <source>Edit mupen64plus.cfg...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="581"/>
+        <source>Configure &Game...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="585"/>
+        <source>&Configure...</source>
+        <translation>&Configurer...</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="554"/>
+        <source>&Layout</source>
+        <translation>&Disposition</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="558"/>
+        <source>None</source>
+        <translation>Aucune</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="559"/>
+        <source>Table View</source>
+        <translation>Vue en tableau</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="560"/>
+        <source>Grid View</source>
+        <translation>Vue en vignettes</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="561"/>
+        <source>List View</source>
+        <translation>Vue en liste</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="593"/>
+        <source>&Help</source>
+        <translation>&Aide</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="594"/>
+        <source>&About</source>
+        <translation>À &propos</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="944"/>
+        <source>Not Found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="944"/>
+        <source>Editor requires config directory to be </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="945"/>
+        <source>set to a directory with mupen64plus.cfg.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="946"/>
+        <source>See here for the default config location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="975"/>
+        <source>No Output</source>
+        <translation>Pas de sortie</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="976"/>
+        <source>There is no log. Either Mupen64Plus has not yet run or there was no output from the last run.</source>
+        <translation>Il n'y a pas de journaux. Soit Mupen64Plus n’a pas encore été lancé, soit il n’y a pas de données concernant le dernier démarrage. </translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1026"/>
+        <source>All Files</source>
+        <translation>Tous les fichiers</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1028"/>
+        <source>Open ROM File</source>
+        <translation>Ouvrir un fichier ROM</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1046"/>
+        <source>No ROMs</source>
+        <translation>Aucune ROM</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1046"/>
+        <source>No ROMs found in ZIP file.</source>
+        <translation>Aucune ROM trouvée dans le fichier ZIP.</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1061"/>
+        <source>Select ROM</source>
+        <translation>Choisir une ROM</translation>
+    </message>
+    <message>
+        <location filename="../../src/mainwindow.cpp" line="1078"/>
+        <source>Launch</source>
+        <translation>Lancer</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../../src/common.cpp" line="277"/>
+        <source>GoodName</source>
+        <translatorcomment>me</translatorcomment>
+        <translation>GoodName</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="278"/>
+        <source>Filename</source>
+        <translation>Nom du fichier</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="279"/>
+        <source>Filename (extension)</source>
+        <translation>Nom du fichier (extension)</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="280"/>
+        <source>Zip File</source>
+        <translation>Fichier Zip</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="281"/>
+        <source>Internal Name</source>
+        <translation>Nom interne</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="282"/>
+        <source>Size</source>
+        <translation>Taille</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="283"/>
+        <source>MD5</source>
+        <translation>MD5</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="284"/>
+        <source>CRC1</source>
+        <translation>CRC1</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="285"/>
+        <source>CRC2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="286"/>
+        <source>Players</source>
+        <translation>Joueurs</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="287"/>
+        <source>Rumble</source>
+        <translation>Rumble</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="288"/>
+        <source>Save Type</source>
+        <translation>Type de sauvegarde</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="289"/>
+        <source>Game Title</source>
+        <translation>Titre du jeu</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="290"/>
+        <source>Release Date</source>
+        <translation>Date de sortie</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="291"/>
+        <source>Overview</source>
+        <translation>Aperçu</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="292"/>
+        <source>ESRB</source>
+        <translation>ESRB</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="293"/>
+        <source>Genre</source>
+        <translation>Genre</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="294"/>
+        <source>Publisher</source>
+        <translation>Éditeur</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="295"/>
+        <source>Developer</source>
+        <translation>Développeur</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="296"/>
+        <source>Rating</source>
+        <translation>Certification</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="297"/>
+        <source>Unknown ROM</source>
+        <translation>ROM inconnue</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="298"/>
+        <source>Requires catalog file</source>
+        <translation>Fichier catalogue demandé</translation>
+    </message>
+    <message>
+        <location filename="../../src/common.cpp" line="299"/>
+        <source>Not found</source>
+        <translation>Non trouvé</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="296"/>
+        <source>%1 MB</source>
+        <translation>%1 - MB</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="166"/>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="203"/>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="248"/>
+        <source>Game Information Download</source>
+        <translation>Télécharger des informations sur le jeu</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="199"/>
+        <source>No results found.</source>
+        <translation>Aucun résultat.</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="201"/>
+        <source>No more results found.</source>
+        <translation>Pas d'autre résultat.</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="249"/>
+        <source>Download Complete!</source>
+        <translation>Téléchargement terminé !</translation>
+    </message>
+</context>
+<context>
+    <name>RomCollection</name>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="171"/>
+        <location filename="../../src/romcollection.cpp" line="178"/>
+        <source>Warning</source>
+        <translation>Attention</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="171"/>
+        <source>No ROMs found in </source>
+        <translation>Aucune ROM trouvée dans</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="178"/>
+        <source>No ROMs found.</source>
+        <translation>Aucune ROM trouvée.</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="424"/>
+        <source>Database Not Loaded</source>
+        <translation>Base de données non chargée</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="425"/>
+        <source>Could not connect to Sqlite database. Application may misbehave.</source>
+        <translation>Impossible de se connecter à la base de données Sqlite. L'application peut dysfonctionner.</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="453"/>
+        <source>Loading ROMs...</source>
+        <translation>Chargement des ROMS...</translation>
+    </message>
+    <message>
+        <location filename="../../src/romcollection.cpp" line="453"/>
+        <source>Cancel</source>
+        <translation>Annuler</translation>
+    </message>
+</context>
+<context>
+    <name>SettingsDialog</name>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="20"/>
+        <source>Settings</source>
+        <translation>Paramètres</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="43"/>
+        <source>Paths</source>
+        <translation>Chemins</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="60"/>
+        <location filename="../../src/settingsdialog.ui" line="67"/>
+        <location filename="../../src/settingsdialog.ui" line="87"/>
+        <location filename="../../src/settingsdialog.ui" line="101"/>
+        <location filename="../../src/settingsdialog.ui" line="712"/>
+        <source>Browse...</source>
+        <translation>Naviguer...</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="49"/>
+        <source>Mupen64Plus Files</source>
+        <translation>Fichier Mupen64Plus</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="108"/>
+        <source>Mupen64Plus executable: </source>
+        <translation>Exécutable Mupen64Plus :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="149"/>
+        <source>ROM Directories</source>
+        <translation>Dossier des ROMS</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="191"/>
+        <source>Add...</source>
+        <translation>Ajouter...</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="198"/>
+        <source>Remove</source>
+        <translation>Supprimer</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="214"/>
+        <source>Emulation</source>
+        <translation>Émulation</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="80"/>
+        <source>Config directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="94"/>
+        <source>Plugins directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="118"/>
+        <source>Data directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="175"/>
+        <source>Mupen64Plus-Qt will search for all .z64, .v64, .n64, and .zip files in these directories</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="225"/>
+        <source>Cached Interpreter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="232"/>
+        <source>Pure Interpreter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="239"/>
+        <source>Dynamic Recompiler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="275"/>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="286"/>
+        <source>On Screen Display:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="293"/>
+        <source>Fullscreen:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="300"/>
+        <source>Resolution:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="360"/>
+        <source>Plugins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="368"/>
+        <source>Video Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="375"/>
+        <source>Audio Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="382"/>
+        <source>Input Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="389"/>
+        <source>RSP Plugin:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="424"/>
+        <source>Table</source>
+        <translation>Tableau</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="438"/>
+        <source>Image:</source>
+        <translation>Image :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="475"/>
+        <location filename="../../src/settingsdialog.ui" line="485"/>
+        <location filename="../../src/settingsdialog.ui" line="527"/>
+        <location filename="../../src/settingsdialog.ui" line="537"/>
+        <location filename="../../src/settingsdialog.ui" line="939"/>
+        <location filename="../../src/settingsdialog.ui" line="949"/>
+        <location filename="../../src/settingsdialog.ui" line="985"/>
+        <location filename="../../src/settingsdialog.ui" line="995"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="552"/>
+        <source>Current Columns:</source>
+        <translation>Colonnes utilisées :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="559"/>
+        <source>Stretch First Column</source>
+        <translation>Étendre la première colonne</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="566"/>
+        <source>Available Columns:</source>
+        <translation>Colonnes disponibles :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="615"/>
+        <source>Grid</source>
+        <translation>Vignettes</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="621"/>
+        <source>ROM Label</source>
+        <translation>Intitulé de la ROM</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="632"/>
+        <source>Show Label:</source>
+        <translation>Montrer l'intitulé :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="655"/>
+        <source>Label Text:</source>
+        <translation>Texte de l'intitulé :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="669"/>
+        <source>Label Color:</source>
+        <translation>Couleur de l'intitulé :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="704"/>
+        <location filename="../../src/settingsdialog.ui" line="1097"/>
+        <source>Other</source>
+        <translation>Autre</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="719"/>
+        <source>Custom Background:</source>
+        <translation>Choisir un arrière-plan :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="726"/>
+        <location filename="../../src/settingsdialog.ui" line="1051"/>
+        <source>Sorting:</source>
+        <translation>Classement :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="736"/>
+        <location filename="../../src/settingsdialog.ui" line="1044"/>
+        <source>Descending</source>
+        <translation>Descendant</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="758"/>
+        <source>ROM Image</source>
+        <translation>Images des ROMS</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="791"/>
+        <source>Shadow Inactive Color:</source>
+        <translation>Couleur de l’ombre des vignettes inactives :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="798"/>
+        <source>Shadow Active Color:</source>
+        <translation>Couleur de l’ombre de la vignette active : </translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="805"/>
+        <source>Columns:</source>
+        <translation>Nombre de colonnes :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="812"/>
+        <location filename="../../src/settingsdialog.ui" line="1037"/>
+        <source>Image Size:</source>
+        <translation>Taille des images :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="887"/>
+        <source>List</source>
+        <translation>Liste</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="914"/>
+        <source>First Item as Header</source>
+        <translation>Premier intitulé comme en-tête</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="921"/>
+        <source>Current Items:</source>
+        <translation>Intitulé actuel :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1020"/>
+        <source>Available Items:</source>
+        <translation>Intitulés disponibles :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1030"/>
+        <source>Display Cover Image</source>
+        <translation>Afficher les vignettes</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1131"/>
+        <source>Additional Parameters:</source>
+        <translation>Paramètres supplémentaires : </translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1151"/>
+        <source>Save Options:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1144"/>
+        <source>Download Game Information (thegamesdb.net):</source>
+        <translation>Télécharger les informations sur les jeux (thegamesdb.net) :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1158"/>
+        <source>Language:</source>
+        <translation>Langue :</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1168"/>
+        <source><html><head/><body><p>Use to pass additional parameters to Mupen64Plus (cheats, etc.). See <a href="https://code.google.com/p/mupen64plus/wiki/UIConsoleUsage"><span style=" text-decoration: underline; color:#0057ae;">https://code.google.com/p/mupen64plus/wiki/UIConsoleUsage</span></a> for more information.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.ui" line="1203"/>
+        <source><b>Note:</b> Language changes will not take place until application restart.</source>
+        <translation><b>Remarque : </b>Le changement de langue ne prendra effet qu'après le redémarrage du programme.</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="178"/>
+        <source>Extra Small</source>
+        <translation>Très petite</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="179"/>
+        <source>Small</source>
+        <translation>Petite</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="180"/>
+        <source>Medium</source>
+        <translation>Moyenne</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="181"/>
+        <source>Large</source>
+        <translation>Grande</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="182"/>
+        <source>Extra Large</source>
+        <translation>Très grande</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="214"/>
+        <source>Black</source>
+        <translation>Noir</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="215"/>
+        <source>White</source>
+        <translation>Blanc</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="216"/>
+        <source>Light Gray</source>
+        <translation>Gris clair</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="217"/>
+        <source>Dark Gray</source>
+        <translation>Gris foncé</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="218"/>
+        <source>Green</source>
+        <translation>Vert</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="219"/>
+        <source>Cyan</source>
+        <translation>Cyan</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="220"/>
+        <source>Blue</source>
+        <translation>Bleu</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="221"/>
+        <source>Purple</source>
+        <translation>Violet</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="222"/>
+        <source>Red</source>
+        <translation>Rouge</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="223"/>
+        <source>Pink</source>
+        <translation>Rose</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="224"/>
+        <source>Orange</source>
+        <translation>Orange</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="225"/>
+        <source>Yellow</source>
+        <translation>Jaune</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="226"/>
+        <source>Brown</source>
+        <translation>Marron</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="375"/>
+        <source>ROM Directory</source>
+        <translation>Dossiers des ROMS</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="416"/>
+        <source>Plugin Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="425"/>
+        <source>Data Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="433"/>
+        <source>Config Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="391"/>
+        <source>Background Image</source>
+        <translation>Image d'arrière-plan</translation>
+    </message>
+    <message>
+        <location filename="../../src/settingsdialog.cpp" line="399"/>
+        <source>Mupen64Plus Executable</source>
+        <translation>Fichier exécutable Mupen64Plus</translation>
+    </message>
+</context>
+<context>
+    <name>TheGamesDBScrapper</name>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="60"/>
+        <source><b>NOTE:</b> If you are deleting this game's information because the game doesn't </source>
+        <translation><b>Remarque :</b> Si vous effacez les informations de ce jeu parce que le jeu</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="61"/>
+        <source>exist on TheGamesDB and Mupen64Plus-Qt pulled the information for different game, it's </source>
+        <translation>n’est pas dans TheGamesDB et que Mupen64PlusQt vous propose des informations pour un autre jeu,</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="62"/>
+        <source>better to create an account on</source>
+        <translation>il est préférable de créer un compte</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="63"/>
+        <source>and add the game so other users can benefit as well.</source>
+        <translation>et d’ajouter le jeu afin d’en faire profiter également les autres utilisateurs.</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="65"/>
+        <source>This will cause Mupen64Plus-Qt to not update the information for this game until you </source>
+        <translation>Mupen64Plus-QT ne mettra pas à jour les informations jusqu'à ce que vous</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="66"/>
+        <source>force it with "Download/Update Info..."</source>
+        <translation>relanciez le téléchargement/la mise à jour des informations...</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="68"/>
+        <source>Delete the current information for</source>
+        <translation>Effacer les informations actuelles pour</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="70"/>
+        <source>Delete Game Information</source>
+        <translation>Effacer les informations du jeu</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="163"/>
+        <source>Released on: </source>
+        <translation>Publié le :</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="164"/>
+        <source>Does this look correct?</source>
+        <translation>Ces informations vous semblent-elles correctes ?</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="283"/>
+        <source>Request timed out. Check your network settings.</source>
+        <translation>Temps dépassé. Vérifier vos paramètres de connexion.</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="291"/>
+        <source>Continue scraping information?</source>
+        <translation>Continuer à récolter des informations ?</translation>
+    </message>
+    <message>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="294"/>
+        <location filename="../../src/thegamesdbscrapper.cpp" line="296"/>
+        <source>Network Error</source>
+        <translatorcomment>Erreur réseau</translatorcomment>
+        <translation></translation>
+    </message>
+</context>
+</TS>
diff --git a/resources/mupen64plus-qt.1 b/resources/mupen64plus-qt.6
similarity index 72%
rename from resources/mupen64plus-qt.1
rename to resources/mupen64plus-qt.6
index fdadff2..65e2fa8 100644
--- a/resources/mupen64plus-qt.1
+++ b/resources/mupen64plus-qt.6
@@ -12,7 +12,7 @@
 .\"   the documentation and/or other materials provided with the
 .\"   distribution.
 .\" * Neither the name of the organization nor the names of its
-.\"   contributors may be used to endorse or promote products derived 
+.\"   contributors may be used to endorse or promote products derived
 .\"   from this software without specific prior written permission.
 .\"
 .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
@@ -28,7 +28,7 @@
 .\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 .\" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\" %%%LICENSE_END
-.TH "Mupen64Plus-Qt" "1" "May 2015" "Mupen64Plus-Qt" "User Commands"
+.TH "Mupen64Plus-Qt" "6" "September 2015" "Mupen64Plus-Qt" "User Manual"
 .SH "NAME"
 Mupen64Plus-Qt \- a basic launcher for Mupen64Plus
 .SH "SYNOPSIS"
@@ -36,6 +36,4 @@ Mupen64Plus-Qt \- a basic launcher for Mupen64Plus
 .SH "DESCRIPTION"
 \fBMupen64Plus-Qt\fR is a basic launcher for the mupen64plus-ui-console frontend. It was adapted from CEN64-Qt to work with Mupen64Plus.
 .TP
-Mupen64Plus-Qt supports downloading game information and cover images from thegamesdb.net. This can be enabled under the Other tab. It's recommended you have the data directory set (under Paths) before using this. Once enabled, you'll need to refresh your ROMs list to download the information. Afterwards, images and other information about the game can be added to the layouts.
-.TP
-If a game is not found, Mupen64Plus-Qt supports refreshing information for a single ROM. Just select the rom and go to File->Download/Update Info. From here you can enter a different search or the specific ID of the game (from the URL of the game on thegamesdb.net).
+See the README at https://www.github.com/dh4/mupen64plus-qt for a detailed description of its features and usage.
diff --git a/resources/mupen64plusqt.qrc b/resources/mupen64plusqt.qrc
index 87d7901..4b85990 100644
--- a/resources/mupen64plusqt.qrc
+++ b/resources/mupen64plusqt.qrc
@@ -3,5 +3,7 @@
         <file>images/mupen64plus.png</file>
         <file>other/LICENSE</file>
         <file>images/not-found.png</file>
+        <file>other/VERSION</file>
+        <file>locale/mupen64plus-qt_fr.qm</file>
     </qresource>
 </RCC>
diff --git a/resources/other/VERSION b/resources/other/VERSION
new file mode 120000
index 0000000..558194c
--- /dev/null
+++ b/resources/other/VERSION
@@ -0,0 +1 @@
+../../VERSION
\ No newline at end of file
diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp
index ba62b39..7255ec6 100644
--- a/src/aboutdialog.cpp
+++ b/src/aboutdialog.cpp
@@ -30,6 +30,13 @@
  ***/
 
 #include "aboutdialog.h"
+#include "common.h"
+#include "global.h"
+
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QLabel>
+#include <QPlainTextEdit>
 
 
 AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent)
@@ -48,10 +55,10 @@ AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent)
     license->setReadOnly(true);
     licenseFile.close();
 
-    QString description = "<b>Mupen64Plus-Qt</b><br />Version " + Version + "<br /><br />";
+    QString description = "<b>Mupen64Plus-Qt</b><br />" + tr("Version") + " " + getVersion() + "<br /><br />";
     description += tr("A basic launcher for Mupen64Plus using Qt.");
-    QString mupen64 = "<a href=\"http://www.mupen64plus.org/\">Mupen64Plus website</a>";
-    QString github = "<a href=\"https://github.com/dh4/mupen64plus-qt\">Github repository</a>";
+    QString mupen64 = "<a href=\"http://www.mupen64plus.org/\">" + tr("Mupen64Plus website") + "</a>";
+    QString github = "<a href=\"https://github.com/dh4/mupen64plus-qt\">" + tr("GitHub repository") + "</a>";
 
     descriptionLabel = new QLabel(description, this);
     mupen64Link = new QLabel(mupen64, this);
diff --git a/src/aboutdialog.h b/src/aboutdialog.h
index 5030199..74684f0 100644
--- a/src/aboutdialog.h
+++ b/src/aboutdialog.h
@@ -33,12 +33,11 @@
 #define ABOUTDIALOG_H
 
 #include <QDialog>
-#include <QDialogButtonBox>
-#include <QGridLayout>
-#include <QLabel>
-#include <QPlainTextEdit>
 
-#include "global.h"
+class QDialogButtonBox;
+class QGridLayout;
+class QLabel;
+class QPlainTextEdit;
 
 
 class AboutDialog : public QDialog
diff --git a/src/clickablewidget.cpp b/src/clickablewidget.cpp
index 069cee8..71cde07 100644
--- a/src/clickablewidget.cpp
+++ b/src/clickablewidget.cpp
@@ -31,6 +31,8 @@
 
 #include "clickablewidget.h"
 
+#include <QMouseEvent>
+
 
 ClickableWidget::ClickableWidget(QWidget *parent) : QWidget(parent)
 {
diff --git a/src/clickablewidget.h b/src/clickablewidget.h
index 2b05f2d..7576965 100644
--- a/src/clickablewidget.h
+++ b/src/clickablewidget.h
@@ -32,9 +32,10 @@
 #ifndef CLICKABLEWIDGET_H
 #define CLICKABLEWIDGET_H
 
-#include <QMouseEvent>
 #include <QWidget>
 
+class QMouseEvent;
+
 
 class ClickableWidget : public QWidget
 {
diff --git a/src/common.cpp b/src/common.cpp
index ff2a838..1b7eb5b 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -30,6 +30,22 @@
  ***/
 
 #include "common.h"
+#include "global.h"
+
+#include <QColor>
+#include <QDir>
+#include <QEventLoop>
+#include <QFile>
+#include <QSize>
+
+#include <quazip/quazip.h>
+#include <quazip/quazipfile.h>
+
+#ifdef Q_OS_WIN
+#include <QCoreApplication>
+#else
+#include <QDesktopServices>
+#endif
 
 
 QByteArray byteswap(QByteArray romData)
@@ -226,7 +242,9 @@ QString getRomInfo(QString identifier, const Rom *rom, bool removeWarn, bool sor
 
     if (!removeWarn)
         return text;
-    else if (text == "Unknown ROM" || text == "Requires catalog file" || text == "Not found") {
+    else if (text == getTranslation("Unknown ROM") ||
+             text == getTranslation("Requires catalog file") ||
+             text == getTranslation("Not found")) {
         if (sort)
             return "ZZZ"; //Sort warnings at the end
         else
@@ -254,6 +272,47 @@ QGraphicsDropShadowEffect *getShadow(bool active)
 }
 
 
+QString getTranslation(QString text)
+{
+    if (text == "GoodName")                     return QObject::tr("GoodName");
+    else if (text == "Filename")                return QObject::tr("Filename");
+    else if (text == "Filename (extension)")    return QObject::tr("Filename (extension)");
+    else if (text == "Zip File")                return QObject::tr("Zip File");
+    else if (text == "Internal Name")           return QObject::tr("Internal Name");
+    else if (text == "Size")                    return QObject::tr("Size");
+    else if (text == "MD5")                     return QObject::tr("MD5");
+    else if (text == "CRC1")                    return QObject::tr("CRC1");
+    else if (text == "CRC2")                    return QObject::tr("CRC2");
+    else if (text == "Players")                 return QObject::tr("Players");
+    else if (text == "Rumble")                  return QObject::tr("Rumble");
+    else if (text == "Save Type")               return QObject::tr("Save Type");
+    else if (text == "Game Title")              return QObject::tr("Game Title");
+    else if (text == "Release Date")            return QObject::tr("Release Date");
+    else if (text == "Overview")                return QObject::tr("Overview");
+    else if (text == "ESRB")                    return QObject::tr("ESRB");
+    else if (text == "Genre")                   return QObject::tr("Genre");
+    else if (text == "Publisher")               return QObject::tr("Publisher");
+    else if (text == "Developer")               return QObject::tr("Developer");
+    else if (text == "Rating")                  return QObject::tr("Rating");
+    else if (text == "Unknown ROM")             return QObject::tr("Unknown ROM");
+    else if (text == "Requires catalog file")   return QObject::tr("Requires catalog file");
+    else if (text == "Not found")               return QObject::tr("Not found");
+
+    return text;
+}
+
+
+QString getVersion()
+{
+    QFile versionFile(":/other/VERSION");
+    versionFile.open(QIODevice::ReadOnly);
+    QString version = versionFile.readAll();
+    versionFile.close();
+
+    return version;
+}
+
+
 QStringList getZippedFiles(QString completeFileName)
 {
     QuaZip zipFile(completeFileName);
diff --git a/src/common.h b/src/common.h
index 76266a1..c690cba 100644
--- a/src/common.h
+++ b/src/common.h
@@ -32,33 +32,15 @@
 #ifndef COMMON_H
 #define COMMON_H
 
-#include <QColor>
-#include <QCoreApplication>
-#include <QDesktopServices>
-#include <QDir>
-#include <QEventLoop>
-#include <QFile>
 #include <QGraphicsDropShadowEffect>
-#include <QMessageBox>
-#include <QObject>
-#include <QSize>
 #include <QString>
-#include <QTextStream>
-#include <QTimer>
-#include <QUrl>
+#include <QPixmap>
 
-#include <QtNetwork/QNetworkAccessManager>
-#include <QtNetwork/QNetworkRequest>
-#include <QtNetwork/QNetworkReply>
-#include <QtXml/QDomDocument>
+class QColor;
+class QSize;
 
-#include <quazip/quazip.h>
-#include <quazip/quazipfile.h>
 
-#include "global.h"
-
-
-typedef struct {
+struct Rom {
     QString fileName;
     QString directory;
     QString romMD5;
@@ -90,7 +72,7 @@ typedef struct {
 
     int count;
     bool imageExists;
-} Rom;
+};
 
 bool romSorter(const Rom &firstRom, const Rom &lastRom);
 int getDefaultWidth(QString id, int imageWidth);
@@ -100,9 +82,11 @@ QByteArray byteswap(QByteArray romData);
 QStringList getZippedFiles(QString completeFileName);
 QByteArray *getZippedRom(QString romFileName, QString zipFile);
 QColor getColor(QString color, int transparency = 255);
+QString getTranslation(QString text);
 QGraphicsDropShadowEffect *getShadow(bool active);
 QSize getImageSize(QString view);
 QString getDataLocation();
 QString getRomInfo(QString identifier, const Rom *rom, bool removeWarn = false, bool sort = false);
+QString getVersion();
 
 #endif // COMMON_H
diff --git a/src/configeditor.cpp b/src/configeditor.cpp
index 416e850..f302355 100644
--- a/src/configeditor.cpp
+++ b/src/configeditor.cpp
@@ -32,6 +32,14 @@
 #include "configeditor.h"
 #include "global.h"
 
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QTextEdit>
+
+#if QT_VERSION >= 0x050200
+#include <QFontDatabase>
+#endif
+
 
 ConfigEditor::ConfigEditor(QString configFile, QWidget *parent) : QDialog(parent)
 {
@@ -46,15 +54,12 @@ ConfigEditor::ConfigEditor(QString configFile, QWidget *parent) : QDialog(parent
     editorArea = new QTextEdit(this);
     editorArea->setWordWrapMode(QTextOption::NoWrap);
 
-    QFont font;
-#ifdef Q_OS_LINUX
-    font.setFamily("Monospace");
-    font.setPointSize(9);
+#if QT_VERSION >= 0x050200
+    QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
 #else
-    font.setFamily("Courier");
-    font.setPointSize(10);
+    QFont font("Monospace");
+    font.setStyleHint(QFont::TypeWriter);
 #endif
-    font.setFixedPitch(true);
     editorArea->setFont(font);
 
     highlighter = new ConfigHighlighter(editorArea->document());
diff --git a/src/configeditor.h b/src/configeditor.h
index a4ef1af..4b8a6fd 100644
--- a/src/configeditor.h
+++ b/src/configeditor.h
@@ -33,13 +33,13 @@
 #define CONFIGEDITOR_H
 
 #include <QDialog>
-#include <QDialogButtonBox>
-#include <QDir>
-#include <QGridLayout>
-#include <QMessageBox>
-#include <QSettings>
+#include <QFile>
 #include <QSyntaxHighlighter>
-#include <QTextEdit>
+
+class QDialogButtonBox;
+class QGridLayout;
+class QTextCharFormat;
+class QTextEdit;
 
 
 class ConfigHighlighter : public QSyntaxHighlighter
diff --git a/src/downloaddialog.cpp b/src/downloaddialog.cpp
index ead16a9..e5ed54e 100644
--- a/src/downloaddialog.cpp
+++ b/src/downloaddialog.cpp
@@ -30,6 +30,13 @@
  ***/
 
 #include "downloaddialog.h"
+#include "common.h"
+#include "thegamesdbscrapper.h"
+
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QLabel>
+#include <QLineEdit>
 
 
 DownloadDialog::DownloadDialog(QString fileText, QString defaultText, QString romMD5, QWidget *parent)
@@ -42,7 +49,7 @@ DownloadDialog::DownloadDialog(QString fileText, QString defaultText, QString ro
 
     downloadLayout = new QGridLayout(this);
 
-    fileLabel = new QLabel(tr("<b>File:</b> ") + fileText, this);
+    fileLabel = new QLabel("<b>" + tr("File") + ":</b> " + fileText, this);
 
     gameNameLabel = new QLabel(tr("Name of Game:"), this);
     gameIDLabel = new QLabel(tr("or Game ID:"), this);
diff --git a/src/downloaddialog.h b/src/downloaddialog.h
index 49c4528..cbebb7f 100644
--- a/src/downloaddialog.h
+++ b/src/downloaddialog.h
@@ -33,13 +33,12 @@
 #define DOWNLOADDIALOG_H
 
 #include <QDialog>
-#include <QDialogButtonBox>
-#include <QGridLayout>
-#include <QLabel>
-#include <QLineEdit>
 
-#include "common.h"
-#include "thegamesdbscrapper.h"
+class QDialogButtonBox;
+class QGridLayout;
+class QLabel;
+class QLineEdit;
+class TheGamesDBScrapper;
 
 
 class DownloadDialog : public QDialog
diff --git a/src/emulatorhandler.cpp b/src/emulatorhandler.cpp
index dd1b781..86c13b1 100644
--- a/src/emulatorhandler.cpp
+++ b/src/emulatorhandler.cpp
@@ -30,6 +30,16 @@
  ***/
 
 #include "emulatorhandler.h"
+#include "common.h"
+#include "global.h"
+
+#include <QDir>
+#include <QFile>
+#include <QMessageBox>
+#include <QProcess>
+
+#include <quazip/quazip.h>
+#include <quazip/quazipfile.h>
 
 
 EmulatorHandler::EmulatorHandler(QWidget *parent) : QObject(parent)
@@ -47,7 +57,7 @@ void EmulatorHandler::checkStatus(int status)
         exitDialog.setText(tr("Mupen64Plus quit unexpectedly. Check the log for more information."));
         exitDialog.setIcon(QMessageBox::Warning);
         exitDialog.addButton(QMessageBox::Ok);
-        exitDialog.addButton("View Log...", QMessageBox::HelpRole);
+        exitDialog.addButton(tr("View Log..."), QMessageBox::HelpRole);
 
         int ret = exitDialog.exec();
         if (ret == 0) emit showLog();
@@ -159,6 +169,14 @@ void EmulatorHandler::startEmulator(QDir romDir, QString romFileName, QString zi
     QFile mupen64File(mupen64Path);
     QFile romFile(completeRomPath);
 
+    QString gameVideoPlugin = SETTINGS.value(romFileName+"/video", "").toString();
+    QString gameAudioPlugin = SETTINGS.value(romFileName+"/audio", "").toString();
+    QString gameInputPlugin = SETTINGS.value(romFileName+"/input", "").toString();
+    QString gameRSPPlugin = SETTINGS.value(romFileName+"/rsp", "").toString();
+
+    QString gameConfigPath = SETTINGS.value(romFileName+"/config", "").toString();
+    QDir gameConfigDir(gameConfigPath);
+
 
     //Sanity checks
     if(!mupen64File.exists() || QFileInfo(mupen64File).isDir() || !QFileInfo(mupen64File).isExecutable()) {
@@ -193,7 +211,9 @@ void EmulatorHandler::startEmulator(QDir romDir, QString romFileName, QString zi
 
     if (dataPath != "" && dataDir.exists())
         args << "--datadir" << dataPath;
-    if (configPath != "" && configDir.exists())
+    if (gameConfigPath != "" && gameConfigDir.exists())
+        args << "--configdir" << gameConfigPath;
+    else if (configPath != "" && configDir.exists())
         args << "--configdir" << configPath;
     if (pluginPath != "" && pluginDir.exists())
         args << "--plugindir" << pluginPath;
@@ -214,19 +234,31 @@ void EmulatorHandler::startEmulator(QDir romDir, QString romFileName, QString zi
     if (resolution != "")
         args << "--resolution" << resolution;
 
-    if (videoPlugin != "")
+    if (gameVideoPlugin != "")
+        args << "--gfx" << gameVideoPlugin;
+    else if (videoPlugin != "")
         args << "--gfx" << videoPlugin;
-    if (audioPlugin != "")
+    if (gameAudioPlugin != "")
+        args << "--audio" << gameAudioPlugin;
+    else if (audioPlugin != "")
         args << "--audio" << audioPlugin;
-    if (inputPlugin != "")
+    if (gameInputPlugin != "")
+        args << "--input" << gameInputPlugin;
+    else if (inputPlugin != "")
         args << "--input" << inputPlugin;
-    if (rspPlugin != "")
+    if (gameRSPPlugin != "")
+        args << "--rsp" << gameRSPPlugin;
+    else if (rspPlugin != "")
         args << "--rsp" << rspPlugin;
 
     QString otherParameters = SETTINGS.value("Other/parameters", "").toString();
     if (otherParameters != "")
         args.append(parseArgString(otherParameters));
 
+    QString gameParameters = SETTINGS.value(romFileName+"/parameters").toString();
+    if (gameParameters != "")
+        args.append(parseArgString(gameParameters));
+
     args << completeRomPath;
 
     emulatorProc = new QProcess(this);
diff --git a/src/emulatorhandler.h b/src/emulatorhandler.h
index c2484db..243fd54 100644
--- a/src/emulatorhandler.h
+++ b/src/emulatorhandler.h
@@ -32,14 +32,10 @@
 #ifndef EMULATORHANDLER_H
 #define EMULATORHANDLER_H
 
-#include <QCryptographicHash>
-#include <QFile>
-#include <QDir>
-#include <QMessageBox>
 #include <QObject>
-#include <QProcess>
 
-#include "common.h"
+class QDir;
+class QProcess;
 
 
 class EmulatorHandler : public QObject
diff --git a/src/gamesettingsdialog.cpp b/src/gamesettingsdialog.cpp
new file mode 100644
index 0000000..b5f9fa2
--- /dev/null
+++ b/src/gamesettingsdialog.cpp
@@ -0,0 +1,146 @@
+/***
+ * Copyright (c) 2013, Dan Hasting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the organization nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ***/
+
+#include "gamesettingsdialog.h"
+#include "ui_gamesettingsdialog.h"
+#include "global.h"
+
+#include <QFileDialog>
+
+
+GameSettingsDialog::GameSettingsDialog(QString fileName, QWidget *parent)
+    : QDialog(parent), ui(new Ui::GameSettingsDialog)
+{
+    this->fileName = fileName;
+    ui->setupUi(this);
+
+    QString labelText = ui->gameLabel->text();
+    labelText.append("<b>"+fileName+"</b>");
+    ui->gameLabel->setText(labelText);
+
+
+    QStringList audioPlugins, inputPlugins, rspPlugins, videoPlugins;
+    pluginsDir = QDir(SETTINGS.value("Paths/plugins", "").toString());
+
+    if (pluginsDir.exists()) {
+        QStringList files = pluginsDir.entryList(QStringList() << "*", QDir::Files);
+
+        if (files.size() > 0) {
+            foreach (QString fileName, files)
+            {
+                QString baseName = QFileInfo(fileName).completeBaseName();
+
+                if (fileName.contains("-audio-"))
+                    audioPlugins << baseName;
+                else if (fileName.contains("-input-"))
+                    inputPlugins << baseName;
+                else if (fileName.contains("-rsp-"))
+                    rspPlugins << baseName;
+                else if (fileName.contains("-video-"))
+                    videoPlugins << baseName;
+            }
+        }
+    }
+
+    ui->videoBox->insertItems(1, videoPlugins);
+    ui->audioBox->insertItems(1, audioPlugins);
+    ui->inputBox->insertItems(1, inputPlugins);
+    ui->rspBox->insertItems(1, rspPlugins);
+
+    int videoIndex = videoPlugins.indexOf(SETTINGS.value(fileName+"/video","").toString());
+    int audioIndex = audioPlugins.indexOf(SETTINGS.value(fileName+"/audio","").toString());
+    int inputIndex = inputPlugins.indexOf(SETTINGS.value(fileName+"/input","").toString());
+    int rspIndex = rspPlugins.indexOf(SETTINGS.value(fileName+"/rsp","").toString());
+
+    if (videoIndex >= 0) ui->videoBox->setCurrentIndex(videoIndex + 1);
+    if (audioIndex >= 0) ui->audioBox->setCurrentIndex(audioIndex + 1);
+    if (inputIndex >= 0) ui->inputBox->setCurrentIndex(inputIndex + 1);
+    if (rspIndex >= 0) ui->rspBox->setCurrentIndex(rspIndex + 1);
+
+    ui->configPath->setText(SETTINGS.value(fileName+"/config", "").toString());
+    ui->parameters->setText(SETTINGS.value(fileName+"/parameters", "").toString());
+
+    connect(ui->configButton, SIGNAL(clicked()), this, SLOT(browseConfig()));
+
+    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(editGameSettings()));
+    connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
+}
+
+
+GameSettingsDialog::~GameSettingsDialog()
+{
+    delete ui;
+}
+
+
+void GameSettingsDialog::browseConfig()
+{
+    QString path = QFileDialog::getExistingDirectory(this, tr("Config Directory"));
+    if (path != "")
+        ui->configPath->setText(path);
+}
+
+
+void GameSettingsDialog::editGameSettings()
+{
+    if (ui->videoBox->currentText() != "default")
+        SETTINGS.setValue(fileName+"/video", ui->videoBox->currentText());
+    else
+        SETTINGS.setValue(fileName+"/video", "");
+
+    if (ui->audioBox->currentText() != "default")
+        SETTINGS.setValue(fileName+"/audio", ui->audioBox->currentText());
+    else
+        SETTINGS.setValue(fileName+"/audio", "");
+
+    if (ui->inputBox->currentText() != "default")
+        SETTINGS.setValue(fileName+"/input", ui->inputBox->currentText());
+    else
+        SETTINGS.setValue(fileName+"/input", "");
+
+    if (ui->rspBox->currentText() != "default")
+        SETTINGS.setValue(fileName+"/rsp", ui->rspBox->currentText());
+    else
+        SETTINGS.setValue(fileName+"/rsp", "");
+
+    SETTINGS.setValue(fileName+"/config", ui->configPath->text());
+    SETTINGS.setValue(fileName+"/parameters", ui->parameters->text());
+
+
+    // Clean up game settings if they are empty
+    bool emptyCheck = true;
+    foreach (QString key, SETTINGS.allKeys())
+        if (key.startsWith(fileName) && SETTINGS.value(key, "") != "")
+            emptyCheck = false;
+
+    if (emptyCheck)
+        SETTINGS.remove(fileName);
+}
diff --git a/src/aboutdialog.h b/src/gamesettingsdialog.h
similarity index 78%
copy from src/aboutdialog.h
copy to src/gamesettingsdialog.h
index 5030199..9c5a27d 100644
--- a/src/aboutdialog.h
+++ b/src/gamesettingsdialog.h
@@ -29,33 +29,35 @@
  *
  ***/
 
-#ifndef ABOUTDIALOG_H
-#define ABOUTDIALOG_H
+#ifndef GAMESETTINGSDIALOG_H
+#define GAMESETTINGSDIALOG_H
 
 #include <QDialog>
-#include <QDialogButtonBox>
-#include <QGridLayout>
-#include <QLabel>
-#include <QPlainTextEdit>
+#include <QDir>
 
-#include "global.h"
 
+namespace Ui {
+    class GameSettingsDialog;
+}
 
-class AboutDialog : public QDialog
+class GameSettingsDialog : public QDialog
 {
     Q_OBJECT
 
 public:
-    explicit AboutDialog(QWidget *parent = 0);
+    explicit GameSettingsDialog(QString fileName, QWidget *parent = 0);
+    ~GameSettingsDialog();
 
 private:
-    QDialogButtonBox *buttonBox;
-    QGridLayout *aboutLayout;
-    QLabel *descriptionLabel;
-    QLabel *githubLink;
-    QLabel *mupen64Link;
-    QLabel *icon;
-    QPlainTextEdit *license;
+    Ui::GameSettingsDialog *ui;
+
+    QDir pluginsDir;
+    QString fileName;
+    QWidget *parent;
+
+private slots:
+    void browseConfig();
+    void editGameSettings();
 };
 
-#endif // ABOUTDIALOG_H
+#endif // GAMESETTINGSDIALOG_H
diff --git a/src/gamesettingsdialog.ui b/src/gamesettingsdialog.ui
new file mode 100644
index 0000000..283098e
--- /dev/null
+++ b/src/gamesettingsdialog.ui
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GameSettingsDialog</class>
+ <widget class="QDialog" name="GameSettingsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>450</width>
+    <height>450</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>450</width>
+    <height>450</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Game Settings</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="gameLabel">
+     <property name="text">
+      <string>Game settings for: </string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="helpLabel">
+     <property name="text">
+      <string>These settings will override any global settings. If there's a setting you want to modify for this game, but it doesn't appear here, add the parameter for it to "Other Parameters."</string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="plugins">
+     <property name="title">
+      <string>Plugins</string>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+     <property name="checkable">
+      <bool>false</bool>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <layout class="QGridLayout" name="pluginsLayout" columnstretch="0,1" columnminimumwidth="120,0">
+        <item row="1" column="0">
+         <widget class="QLabel" name="audioLabel">
+          <property name="text">
+           <string>Audio Plugin:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0">
+         <widget class="QLabel" name="inputLabel">
+          <property name="text">
+           <string>Input Plugin:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0">
+         <widget class="QLabel" name="rspLabel">
+          <property name="text">
+           <string>RSP Plugin:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0">
+         <widget class="QLabel" name="videoLabel">
+          <property name="text">
+           <string>Video Plugin:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QComboBox" name="videoBox">
+          <item>
+           <property name="text">
+            <string>default</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QComboBox" name="audioBox">
+          <item>
+           <property name="text">
+            <string>default</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QComboBox" name="inputBox">
+          <item>
+           <property name="text">
+            <string>default</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="3" column="1">
+         <widget class="QComboBox" name="rspBox">
+          <item>
+           <property name="text">
+            <string>default</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="other">
+     <property name="title">
+      <string>Additional Settings</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_4">
+      <item row="0" column="0">
+       <layout class="QGridLayout" name="otherLayout">
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="configPath"/>
+        </item>
+        <item row="0" column="0">
+         <widget class="QLabel" name="configLabel">
+          <property name="text">
+           <string>Config Directory:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="parametersLabel">
+          <property name="text">
+           <string>Other Parameters:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="2">
+         <widget class="QPushButton" name="configButton">
+          <property name="text">
+           <string>Browse...</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1" colspan="2">
+         <widget class="QLineEdit" name="parameters"/>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>GameSettingsDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>GameSettingsDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/global.h b/src/global.h
index 063397b..1f0bb6e 100644
--- a/src/global.h
+++ b/src/global.h
@@ -35,7 +35,9 @@
 #include <QSettings>
 
 
-const QString Version = "1.8";
+#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD)
+    #define OS_LINUX_OR_BSD
+#endif
 
 #ifdef Q_OS_WIN
     #define SETTINGS QSettings("mupen64plus-qt.ini", QSettings::IniFormat)
diff --git a/src/logdialog.cpp b/src/logdialog.cpp
index 2197157..78bf29a 100644
--- a/src/logdialog.cpp
+++ b/src/logdialog.cpp
@@ -30,6 +30,15 @@
  ***/
 
 #include "logdialog.h"
+#include "global.h"
+
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QTextEdit>
+
+#if QT_VERSION >= 0x050200
+#include <QFontDatabase>
+#endif
 
 
 LogDialog::LogDialog(QString lastOutput, QWidget *parent) : QDialog(parent)
@@ -43,15 +52,12 @@ LogDialog::LogDialog(QString lastOutput, QWidget *parent) : QDialog(parent)
     logArea = new QTextEdit(this);
     logArea->setWordWrapMode(QTextOption::NoWrap);
 
-    QFont font;
-#ifdef Q_OS_LINUX
-    font.setFamily("Monospace");
-    font.setPointSize(9);
+#if QT_VERSION >= 0x050200
+    QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
 #else
-    font.setFamily("Courier");
-    font.setPointSize(10);
+    QFont font("Monospace");
+    font.setStyleHint(QFont::TypeWriter);
 #endif
-    font.setFixedPitch(true);
     logArea->setFont(font);
 
     logArea->setPlainText(lastOutput);
diff --git a/src/logdialog.h b/src/logdialog.h
index 051f460..263c984 100644
--- a/src/logdialog.h
+++ b/src/logdialog.h
@@ -33,9 +33,10 @@
 #define LOGDIALOG_H
 
 #include <QDialog>
-#include <QDialogButtonBox>
-#include <QGridLayout>
-#include <QTextEdit>
+
+class QDialogButtonBox;
+class QGridLayout;
+class QTextEdit;
 
 
 class LogDialog : public QDialog
diff --git a/src/main.cpp b/src/main.cpp
index f6c4751..ea24ef1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -29,18 +29,30 @@
  *
  ***/
 
-#include <QApplication>
-#include <QDesktopWidget>
-#include <QSettings>
-
 #include "global.h"
 #include "mainwindow.h"
 
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QFileInfo>
+#include <QTranslator>
+
 
 int main(int argc, char *argv[])
 {
     QApplication application(argc, argv);
 
+    QTranslator translator;
+    QString language = SETTINGS.value("language", "EN").toString();
+
+    if (language != "EN") {
+        QString resource = ":/locale/mupen64plus-qt_"+language.toLower()+".qm";
+        if (QFileInfo(resource).exists()) {
+            translator.load(resource);
+            application.installTranslator(&translator);
+        }
+    }
+
     QCoreApplication::setOrganizationName("Mupen64Plus");
     QCoreApplication::setApplicationName("Mupen64Plus-Qt");
 
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index b0154b2..a26851f 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -30,6 +30,38 @@
  ***/
 
 #include "mainwindow.h"
+#include "aboutdialog.h"
+#include "clickablewidget.h"
+#include "common.h"
+#include "configeditor.h"
+#include "downloaddialog.h"
+#include "emulatorhandler.h"
+#include "gamesettingsdialog.h"
+#include "global.h"
+#include "logdialog.h"
+#include "romcollection.h"
+#include "settingsdialog.h"
+#include "thegamesdbscrapper.h"
+#include "treewidgetitem.h"
+
+#include <QCloseEvent>
+#include <QDesktopServices>
+#include <QDialogButtonBox>
+#include <QFileDialog>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QListWidget>
+#include <QMenuBar>
+#include <QMessageBox>
+#include <QScrollArea>
+#include <QScrollBar>
+#include <QTimer>
+#include <QVBoxLayout>
+
+#if defined(Q_OS_WIN) || defined(Q_OS_OSX)
+#include <QCoreApplication>
+#endif
 
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
@@ -82,11 +114,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
 
 void MainWindow::addToView(Rom *currentRom, int count)
 {
-    if (SETTINGS.value("View/layout", "None") == "Table View")
+    if (SETTINGS.value("View/layout", "none") == "table")
         addToTableView(currentRom);
-    else if (SETTINGS.value("View/layout", "None") == "Grid View")
+    else if (SETTINGS.value("View/layout", "none") == "grid")
         addToGridView(currentRom, count);
-    else if (SETTINGS.value("View/layout", "None") == "List View")
+    else if (SETTINGS.value("View/layout", "none") == "list")
         addToListView(currentRom, count);
 }
 
@@ -101,7 +133,8 @@ void MainWindow::addToGridView(Rom *currentRom, int count)
     //Assign ROM data to widget for use in click events
     gameGridItem->setProperty("fileName", currentRom->fileName);
     gameGridItem->setProperty("directory", currentRom->directory);
-    if (currentRom->goodName == "Unknown ROM" || currentRom->goodName == "Requires catalog file")
+    if (currentRom->goodName == getTranslation("Unknown ROM") ||
+        currentRom->goodName == getTranslation("Requires catalog file"))
         gameGridItem->setProperty("search", currentRom->internalName);
     else
         gameGridItem->setProperty("search", currentRom->goodName);
@@ -188,7 +221,8 @@ void MainWindow::addToListView(Rom *currentRom, int count)
     //Assign ROM data to widget for use in click events
     gameListItem->setProperty("fileName", currentRom->fileName);
     gameListItem->setProperty("directory", currentRom->directory);
-    if (currentRom->goodName == "Unknown ROM" || currentRom->goodName == "Requires catalog file")
+    if (currentRom->goodName == getTranslation("Unknown ROM") ||
+        currentRom->goodName == getTranslation("Requires catalog file"))
         gameListItem->setProperty("search", currentRom->internalName);
     else
         gameListItem->setProperty("search", currentRom->goodName);
@@ -286,7 +320,8 @@ void MainWindow::addToTableView(Rom *currentRom)
     fileItem->setText(1, currentRom->directory);
 
     //GoodName or Internal Name for searching
-    if (currentRom->goodName == "Unknown ROM" || currentRom->goodName == "Requires catalog file")
+    if (currentRom->goodName == getTranslation("Unknown ROM") ||
+        currentRom->goodName == getTranslation("Requires catalog file"))
         fileItem->setText(2, currentRom->internalName);
     else
         fileItem->setText(2, currentRom->goodName);
@@ -306,7 +341,9 @@ void MainWindow::addToTableView(Rom *currentRom)
         fileItem->setText(i, text);
 
         if (current == "GoodName" || current == "Game Title") {
-            if (text == "Unknown ROM" || text == "Requires catalog file" || text == "Not found") {
+            if (text == getTranslation("Unknown ROM") ||
+                text == getTranslation("Requires catalog file") ||
+                text == getTranslation("Not found")) {
                 fileItem->setForeground(i, QBrush(Qt::gray));
                 fileItem->setData(i, Qt::UserRole, "ZZZ"); //end of sorting
             } else
@@ -370,20 +407,25 @@ void MainWindow::autoloadSettings()
     QString pluginPath = SETTINGS.value("Paths/plugins", "").toString();
 
     if (mupen64Path == "" && dataPath == "" && pluginPath == "") {
-#ifdef Q_OS_LINUX
+#ifdef OS_LINUX_OR_BSD
         //If user has not entered any settings, check common locations for them
         QStringList mupen64Check, dataCheck, pluginCheck;
 
-        mupen64Check << "/usr/games/mupen64plus"
-                     << "/usr/bin/mupen64plus";
+        mupen64Check << "/usr/bin/mupen64plus"
+                     << "/usr/games/mupen64plus"
+                     << "/usr/local/bin/mupen64plus";
 
         pluginCheck  << "/usr/lib/mupen64plus"
+                     << "/usr/lib64/mupen64plus"
                      << "/usr/lib/x86_64-linux-gnu/mupen64plus"
                      << "/usr/lib/i386-linux-gnu/mupen64plus"
-                     << "/usr/lib/mupen64plus/mupen64plus";
+                     << "/usr/lib/mupen64plus/mupen64plus"
+                     << "/usr/lib64/mupen64plus/mupen64plus/"
+                     << "/usr/local/lib/mupen64plus";
 
         dataCheck    << "/usr/share/mupen64plus"
-                     << "/usr/share/games/mupen64plus";
+                     << "/usr/share/games/mupen64plus"
+                     << "/usr/local/share/mupen64plus";
 
 
         foreach (QString check, mupen64Check)
@@ -512,32 +554,39 @@ void MainWindow::createMenu()
     layoutMenu = settingsMenu->addMenu(tr("&Layout"));
     layoutGroup = new QActionGroup(this);
 
-    QStringList layouts;
-    layouts << "None" << "Table View" << "Grid View" << "List View";
+    QList<QStringList> layouts;
+    layouts << (QStringList() << tr("None")       << "none")
+            << (QStringList() << tr("Table View") << "table")
+            << (QStringList() << tr("Grid View")  << "grid")
+            << (QStringList() << tr("List View")  << "list");
 
-    QString layoutValue = SETTINGS.value("View/layout", "None").toString();
+    QString layoutValue = SETTINGS.value("View/layout", "none").toString();
 
-    foreach (QString layoutName, layouts)
+    foreach (QStringList layoutName, layouts)
     {
-        QAction *layoutItem = layoutMenu->addAction(layoutName);
-        layoutItem->setData(layoutName);
+        QAction *layoutItem = layoutMenu->addAction(layoutName.at(0));
+        layoutItem->setData(layoutName.at(1));
         layoutItem->setCheckable(true);
         layoutGroup->addAction(layoutItem);
 
         //Only enable layout changes when Mupen64Plus is not running
         menuEnable << layoutItem;
 
-        if(layoutValue == layoutName)
+        if(layoutValue == layoutName.at(1))
             layoutItem->setChecked(true);
     }
 
     editorAction = settingsMenu->addAction(tr("Edit mupen64plus.cfg..."));
+    settingsMenu->addSeparator();
+    configureGameAction = settingsMenu->addAction(tr("Configure &Game..."));
 #ifndef Q_OS_OSX //OSX does not show the configure action so the separator is unneeded
     settingsMenu->addSeparator();
 #endif
     configureAction = settingsMenu->addAction(tr("&Configure..."));
     configureAction->setIcon(QIcon::fromTheme("preferences-other"));
 
+    configureGameAction->setEnabled(false);
+
     menuBar->addMenu(settingsMenu);
 
 
@@ -555,6 +604,7 @@ void MainWindow::createMenu()
                << downloadAction
                << deleteAction
                << configureAction
+               << configureGameAction
                << editorAction
                << quitAction;
 
@@ -570,6 +620,7 @@ void MainWindow::createMenu()
     connect(stopAction, SIGNAL(triggered()), this, SLOT(stopEmulator()));
     connect(logAction, SIGNAL(triggered()), this, SLOT(openLog()));
     connect(configureAction, SIGNAL(triggered()), this, SLOT(openSettings()));
+    connect(configureGameAction, SIGNAL(triggered()), this, SLOT(openGameSettings()));
     connect(editorAction, SIGNAL(triggered()), this, SLOT(openEditor()));
     connect(aboutAction, SIGNAL(triggered()), this, SLOT(openAbout()));
     connect(layoutGroup, SIGNAL(triggered(QAction*)), this, SLOT(updateLayoutSetting()));
@@ -658,13 +709,13 @@ void MainWindow::createRomView()
     currentListRom = 0;
 
 
-    QString visibleLayout = SETTINGS.value("View/layout", "None").toString();
+    QString visibleLayout = SETTINGS.value("View/layout", "none").toString();
 
-    if (visibleLayout == "Table View")
+    if (visibleLayout == "table")
         tableView->setHidden(false);
-    else if (visibleLayout == "Grid View")
+    else if (visibleLayout == "grid")
         gridView->setHidden(false);
-    else if (visibleLayout == "List View")
+    else if (visibleLayout == "list")
         listView->setHidden(false);
     else
         emptyView->setHidden(false);
@@ -692,6 +743,7 @@ void MainWindow::disableViews(bool imageUpdated)
     tableView->setEnabled(false);
     gridView->setEnabled(false);
     listView->setEnabled(false);
+    configureGameAction->setEnabled(false);
     downloadAction->setEnabled(false);
     deleteAction->setEnabled(false);
     startAction->setEnabled(false);
@@ -701,13 +753,13 @@ void MainWindow::disableViews(bool imageUpdated)
     positionx = 0;
     positiony = 0;
 
-    if (SETTINGS.value("View/layout", "None") == "Table View") {
+    if (SETTINGS.value("View/layout", "none") == "table") {
         positionx = tableView->horizontalScrollBar()->value();
         positiony = tableView->verticalScrollBar()->value();
-    } else if (SETTINGS.value("View/layout", "None") == "Grid View") {
+    } else if (SETTINGS.value("View/layout", "none") == "grid") {
         positionx = gridView->horizontalScrollBar()->value();
         positiony = gridView->verticalScrollBar()->value();
-    } else if (SETTINGS.value("View/layout", "None") == "List View") {
+    } else if (SETTINGS.value("View/layout", "none") == "list") {
         positionx = listView->horizontalScrollBar()->value();
         positiony = listView->verticalScrollBar()->value();
     }
@@ -737,11 +789,11 @@ void MainWindow::enableViews(int romCount, bool cached)
             timer->setInterval(0);
             timer->start();
 
-            if (SETTINGS.value("View/layout", "None") == "Table View")
+            if (SETTINGS.value("View/layout", "none") == "table")
                 connect(timer, SIGNAL(timeout()), this, SLOT(setTablePosition()));
-            else if (SETTINGS.value("View/layout", "None") == "Grid View")
+            else if (SETTINGS.value("View/layout", "none") == "grid")
                 connect(timer, SIGNAL(timeout()), this, SLOT(setGridPosition()));
-            else if (SETTINGS.value("View/layout", "None") == "List View")
+            else if (SETTINGS.value("View/layout", "none") == "list")
                 connect(timer, SIGNAL(timeout()), this, SLOT(setListPosition()));
         }
     }
@@ -761,13 +813,13 @@ QString MainWindow::getCurrentRomInfo(int index)
             default: infoChar = "";         table = 0; break;
         }
 
-        QString visibleLayout = SETTINGS.value("View/layout", "None").toString();
+        QString visibleLayout = SETTINGS.value("View/layout", "none").toString();
 
-        if (visibleLayout == "Table View")
+        if (visibleLayout == "table")
             return tableView->currentItem()->data(table, 0).toString();
-        else if (visibleLayout == "Grid View" && gridCurrent)
+        else if (visibleLayout == "grid" && gridCurrent)
             return gridLayout->itemAt(currentGridRom)->widget()->property(infoChar).toString();
-        else if (visibleLayout == "List View" && listCurrent)
+        else if (visibleLayout == "list" && listCurrent)
             return listLayout->itemAt(currentListRom)->widget()->property(infoChar).toString();
     }
 
@@ -819,11 +871,11 @@ void MainWindow::launchRomFromMenu()
 {
     QString visibleLayout = layoutGroup->checkedAction()->data().toString();
 
-    if (visibleLayout == "Table View")
+    if (visibleLayout == "table")
         launchRomFromTable();
-    else if (visibleLayout == "Grid View" && gridCurrent)
+    else if (visibleLayout == "grid" && gridCurrent)
         launchRomFromWidget(gridLayout->itemAt(currentGridRom)->widget());
-    else if (visibleLayout == "List View" && listCurrent)
+    else if (visibleLayout == "list" && listCurrent)
         launchRomFromWidget(listLayout->itemAt(currentListRom)->widget());
 }
 
@@ -889,9 +941,9 @@ void MainWindow::openEditor()
     QFile config(configFile);
 
     if (configPath == "" || !config.exists()) {
-        QMessageBox::information(this, "Not Found", QString("Editor requires config directory to be ")
-                                 + "set to a directory with mupen64plus.cfg.\n\n"
-                                 + "See here for the default config location:\n"
+        QMessageBox::information(this, tr("Not Found"), QString(tr("Editor requires config directory to be "))
+                                 + tr("set to a directory with mupen64plus.cfg.") + "\n\n"
+                                 + tr("See here for the default config location:") + "\n"
                                  + "https://code.google.com/p/mupen64plus/wiki/FileLocations");
     } else {
         ConfigEditor configEditor(configFile, this);
@@ -900,11 +952,28 @@ void MainWindow::openEditor()
 }
 
 
+void MainWindow::openGameSettings()
+{
+    QString romFileName;
+    QString visibleLayout = layoutGroup->checkedAction()->data().toString();
+
+    if (visibleLayout == "table")
+        romFileName = QVariant(tableView->currentItem()->data(0, 0)).toString();
+    else if (visibleLayout == "grid" && gridCurrent)
+        romFileName = gridLayout->itemAt(currentGridRom)->widget()->property("fileName").toString();
+    else if (visibleLayout == "list" && listCurrent)
+        romFileName = listLayout->itemAt(currentListRom)->widget()->property("fileName").toString();
+
+    GameSettingsDialog gameSettingsDialog(romFileName, this);
+    gameSettingsDialog.exec();
+}
+
+
 void MainWindow::openLog()
 {
     if (emulation->lastOutput == "") {
-        QMessageBox::information(this, "No Output", QString("There is no log. Either Mupen64Plus has not ")
-                                 + "yet run or there was no output from the last run.");
+        QMessageBox::information(this, tr("No Output"),
+            tr("There is no log. Either Mupen64Plus has not yet run or there was no output from the last run."));
     } else {
         LogDialog logDialog(emulation->lastOutput, this);
         logDialog.exec();
@@ -954,7 +1023,7 @@ void MainWindow::openRom()
 {
     QString filter = "N64 ROMs (";
     foreach (QString type, romCollection->getFileTypes(true)) filter += type + " ";
-    filter += ");;All Files (*)";
+    filter += ");;" + tr("All Files") + " (*)";
 
     openPath = QFileDialog::getOpenFileName(this, tr("Open ROM File"), romCollection->romPaths.at(0), filter);
     if (openPath != "") {
@@ -1026,17 +1095,20 @@ void MainWindow::resetLayouts(bool imageUpdated)
 {
     QStringList tableVisible = SETTINGS.value("Table/columns", "Filename|Size").toString().split("|");
 
+    QStringList translations;
+    foreach (QString header, tableVisible) translations << getTranslation(header);
+
     int hidden = 5;
 
     saveColumnWidths();
     QStringList widths = SETTINGS.value("Table/width", "").toString().split("|");
 
     headerLabels.clear();
-    headerLabels << "" << "" << "" << "" << "" << tableVisible; //First 5 blank for hidden columns
+    headerLabels << "" << "" << "" << "" << "" << translations; //First 5 blank for hidden columns
 
     //Remove Game Cover title for aesthetics
     for (int i = 0; i < headerLabels.size(); i++)
-        if (headerLabels.at(i) == "Game Cover") headerLabels.replace(i, "");
+        if (headerLabels.at(i) == getTranslation("Game Cover")) headerLabels.replace(i, "");
 
     tableView->setColumnCount(headerLabels.size());
     tableView->setHeaderLabels(headerLabels);
@@ -1210,6 +1282,7 @@ void MainWindow::toggleMenus(bool active)
     listView->setEnabled(active);
 
     if (tableView->currentItem() == NULL && !gridCurrent && !listCurrent) {
+        configureGameAction->setEnabled(false);
         downloadAction->setEnabled(false);
         deleteAction->setEnabled(false);
         startAction->setEnabled(false);
@@ -1233,16 +1306,17 @@ void MainWindow::updateLayoutSetting()
 
     romCollection->cachedRoms();
 
-    if (visibleLayout == "Table View")
+    if (visibleLayout == "table")
         tableView->setHidden(false);
-    else if (visibleLayout == "Grid View")
+    else if (visibleLayout == "grid")
         gridView->setHidden(false);
-    else if (visibleLayout == "List View")
+    else if (visibleLayout == "list")
         listView->setHidden(false);
     else
         emptyView->setHidden(false);
 
     startAction->setEnabled(false);
+    configureGameAction->setEnabled(false);
     downloadAction->setEnabled(false);
     deleteAction->setEnabled(false);
 }
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 5e40ecc..2e2175c 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -32,24 +32,24 @@
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
-#include <QHeaderView>
+
 #include <QMainWindow>
-#include <QMenuBar>
-#include <QScrollArea>
-#include <QScrollBar>
-#include <QStatusBar>
-
-#include "aboutdialog.h"
-#include "clickablewidget.h"
-#include "common.h"
-#include "configeditor.h"
-#include "downloaddialog.h"
-#include "emulatorhandler.h"
-#include "global.h"
-#include "logdialog.h"
-#include "romcollection.h"
-#include "settingsdialog.h"
-#include "treewidgetitem.h"
+
+class QActionGroup;
+class QDialogButtonBox;
+class QHeaderView;
+class QGridLayout;
+class QLabel;
+class QListWidget;
+class QMenuBar;
+class QScrollArea;
+class QTreeWidget;
+class QVBoxLayout;
+class EmulatorHandler;
+class RomCollection;
+class TheGamesDBScrapper;
+class TreeWidgetItem;
+struct Rom;
 
 
 class MainWindow : public QMainWindow
@@ -88,6 +88,7 @@ private:
 
     QAction *aboutAction;
     QAction *configureAction;
+    QAction *configureGameAction;
     QAction *deleteAction;
     QAction *downloadAction;
     QAction *editorAction;
@@ -145,6 +146,7 @@ private slots:
     void openDeleteDialog();
     void openDownloader();
     void openEditor();
+    void openGameSettings();
     void openLog();
     void openSettings();
     void openRom();
diff --git a/src/romcollection.cpp b/src/romcollection.cpp
index 6533044..26fd703 100644
--- a/src/romcollection.cpp
+++ b/src/romcollection.cpp
@@ -30,6 +30,19 @@
  ***/
 
 #include "romcollection.h"
+#include "common.h"
+#include "global.h"
+#include "thegamesdbscrapper.h"
+
+#include <QCoreApplication>
+#include <QCryptographicHash>
+#include <QDir>
+#include <QMessageBox>
+#include <QProgressDialog>
+#include <QTime>
+
+#include <QtSql/QSqlQuery>
+#include <QtXml/QDomDocument>
 
 
 RomCollection::RomCollection(QStringList fileTypes, QStringList romPaths, QWidget *parent) : QObject(parent)
@@ -81,7 +94,7 @@ void RomCollection::addRoms()
         QDir romDir(romPath);
 
         if (romDir.exists()) {
-            QStringList files = romDir.entryList(fileTypes, QDir::Files | QDir::NoSymLinks);
+            QStringList files = scanDirectory(romDir);
             totalCount += files.size();
         }
     }
@@ -103,7 +116,7 @@ void RomCollection::addRoms()
         foreach (QString romPath, romPaths)
         {
             QDir romDir(romPath);
-            QStringList files = romDir.entryList(fileTypes, QDir::Files | QDir::NoSymLinks);
+            QStringList files = scanDirectory(romDir);
 
             int romCount = 0;
 
@@ -155,14 +168,14 @@ void RomCollection::addRoms()
             }
 
             if (romCount == 0)
-                QMessageBox::warning(parent, "Warning", "No ROMs found in " + romPath + ".");
+                QMessageBox::warning(parent, tr("Warning"), tr("No ROMs found in ") + romPath + ".");
         }
 
         delete scrapper;
         database.close();
         progress->close();
     } else if (romPaths.size() != 0) {
-        QMessageBox::warning(parent, "Warning", "No ROMs found.");
+        QMessageBox::warning(parent, tr("Warning"), tr("No ROMs found."));
     }
 
     qSort(roms.begin(), roms.end(), romSorter);
@@ -267,7 +280,7 @@ void RomCollection::initializeRom(Rom *currentRom, bool cached)
     QDir romDir(currentRom->directory);
 
     //Default text for GoodName to notify user
-    currentRom->goodName = "Requires catalog file";
+    currentRom->goodName = getTranslation("Requires catalog file");
     currentRom->imageExists = false;
 
     bool getGoodName = false;
@@ -284,8 +297,8 @@ void RomCollection::initializeRom(Rom *currentRom, bool cached)
 
     if (getGoodName) {
         //Join GoodName on ", ", otherwise entries with a comma won't show
-        QVariant goodNameVariant = romCatalog->value(currentRom->romMD5+"/GoodName","Unknown ROM");
-        currentRom->goodName = goodNameVariant.toStringList().join(", ");
+        QVariant gNameRaw = romCatalog->value(currentRom->romMD5+"/GoodName",getTranslation("Unknown ROM"));
+        currentRom->goodName = gNameRaw.toStringList().join(", ");
 
         QStringList CRC = romCatalog->value(currentRom->romMD5+"/CRC","").toString().split(" ");
 
@@ -304,7 +317,8 @@ void RomCollection::initializeRom(Rom *currentRom, bool cached)
     }
 
     if (!cached && SETTINGS.value("Other/downloadinfo", "").toString() == "true") {
-        if (currentRom->goodName != "Unknown ROM" && currentRom->goodName != "Requires catalog file") {
+        if (currentRom->goodName != getTranslation("Unknown ROM") &&
+            currentRom->goodName != getTranslation("Requires catalog file")) {
             scrapper->downloadGameInfo(currentRom->romMD5, currentRom->goodName);
         } else {
             //tweak internal name by adding spaces to get better results
@@ -334,7 +348,7 @@ void RomCollection::initializeRom(Rom *currentRom, bool cached)
         QString regex = "[^A-Za-z 0-9 \\.,\\?'""!@#\\$%\\^&\\*\\(\\)-_=\\+;:<>\\/\\\\|\\}\\{\\[\\]`~]*";
 
         currentRom->gameTitle = game.firstChildElement("GameTitle").text().remove(QRegExp(regex));
-        if (currentRom->gameTitle == "") currentRom->gameTitle = "Not found";
+        if (currentRom->gameTitle == "") currentRom->gameTitle = getTranslation("Not found");
 
         currentRom->releaseDate = game.firstChildElement("ReleaseDate").text();
 
@@ -381,6 +395,22 @@ void RomCollection::initializeRom(Rom *currentRom, bool cached)
 }
 
 
+QStringList RomCollection::scanDirectory(QDir romDir)
+{
+    QStringList files = romDir.entryList(fileTypes, QDir::Files | QDir::NoSymLinks);
+
+    QStringList dirs = romDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
+    foreach (QString dir, dirs)
+    {
+        QString subDir = romDir.absolutePath() + "/" + dir;
+        QStringList subFiles = QDir(subDir).entryList(fileTypes, QDir::Files | QDir::NoSymLinks);
+        foreach (QString subFile, subFiles) files << dir + "/" + subFile;
+    }
+
+    return files;
+}
+
+
 void RomCollection::setupDatabase()
 {
     // Bump this when updating rom_collection structure
@@ -391,8 +421,8 @@ void RomCollection::setupDatabase()
     database.setDatabaseName(getDataLocation() + "/mupen64plus-qt.sqlite");
 
     if (!database.open())
-        QMessageBox::warning(parent, "Database Not Loaded",
-                             "Could not connect to Sqlite database. Application may misbehave.");
+        QMessageBox::warning(parent, tr("Database Not Loaded"),
+                             tr("Could not connect to Sqlite database. Application may misbehave."));
 
     QSqlQuery version = database.exec("PRAGMA user_version");
     version.next();
@@ -420,7 +450,7 @@ void RomCollection::setupDatabase()
 
 void RomCollection::setupProgressDialog(int size)
 {
-    progress = new QProgressDialog("Loading ROMs...", "Cancel", 0, size, parent);
+    progress = new QProgressDialog(tr("Loading ROMs..."), tr("Cancel"), 0, size, parent);
 #if QT_VERSION >= 0x050000
     progress->setWindowFlags(progress->windowFlags() & ~Qt::WindowCloseButtonHint);
     progress->setWindowFlags(progress->windowFlags() & ~Qt::WindowMinimizeButtonHint);
diff --git a/src/romcollection.h b/src/romcollection.h
index 2a87d2d..f193320 100644
--- a/src/romcollection.h
+++ b/src/romcollection.h
@@ -32,16 +32,14 @@
 #ifndef ROMCOLLECTION_H
 #define ROMCOLLECTION_H
 
-#include <QCryptographicHash>
 #include <QObject>
-#include <QProgressDialog>
-
+#include <QStringList>
 #include <QtSql/QSqlDatabase>
-#include <QtSql/QSqlQuery>
 
-#include "common.h"
-#include "global.h"
-#include "thegamesdbscrapper.h"
+class QDir;
+class QProgressDialog;
+class TheGamesDBScrapper;
+struct Rom;
 
 
 class RomCollection : public QObject
@@ -71,6 +69,7 @@ private:
     Rom addRom(QByteArray *romData, QString fileName, QString directory, QString zipFile, QSqlQuery query);
 
     QStringList fileTypes;
+    QStringList scanDirectory(QDir romDir);
 
     QWidget *parent;
     QProgressDialog *progress;
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 16b7a0c..c3f7261 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -31,6 +31,13 @@
 
 #include "settingsdialog.h"
 #include "ui_settingsdialog.h"
+#include "common.h"
+#include "global.h"
+
+#include <QDesktopWidget>
+#include <QFileDialog>
+#include <QListWidget>
+#include <QTranslator>
 
 
 SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent), ui(new Ui::SettingsDialog)
@@ -164,12 +171,15 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
 
 
     //Populate Table tab
-    QStringList sizes;
-    sizes << "Extra Small"
-          << "Small"
-          << "Medium"
-          << "Large"
-          << "Extra Large";
+    int tableSizeIndex = 0;
+    QString currentTableSize = SETTINGS.value("Table/imagesize","Medium").toString();
+
+    QList<QStringList> sizes;
+    sizes << (QStringList() << tr("Extra Small") << "Extra Small")
+          << (QStringList() << tr("Small")       << "Small")
+          << (QStringList() << tr("Medium")      << "Medium")
+          << (QStringList() << tr("Large")       << "Large")
+          << (QStringList() << tr("Extra Large") << "Extra Large");
 
     if (SETTINGS.value("Other/downloadinfo", "").toString() == "true")
         populateTableAndListTab(true);
@@ -179,8 +189,12 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
     if (SETTINGS.value("Table/stretchfirstcolumn", "true").toString() == "true")
         ui->tableStretchOption->setChecked(true);
 
-    ui->tableSizeBox->insertItems(0, sizes);
-    int tableSizeIndex = sizes.indexOf(SETTINGS.value("Table/imagesize","Medium").toString());
+    for (int i = 0; i < sizes.length(); i++)
+    {
+        ui->tableSizeBox->insertItem(i, sizes.at(i).at(0), sizes.at(i).at(1));
+        if (currentTableSize == sizes.at(i).at(1))
+            tableSizeIndex = i;
+    }
     if (tableSizeIndex >= 0) ui->tableSizeBox->setCurrentIndex(tableSizeIndex);
 
     connect(ui->tableAddButton, SIGNAL(clicked()), this, SLOT(tableAddColumn()));
@@ -190,35 +204,55 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
 
 
     //Populate Grid tab
-    QStringList colors;
-    colors << "Black"
-           << "White"
-           << "Light Gray"
-           << "Dark Gray"
-           << "Green"
-           << "Cyan"
-           << "Blue"
-           << "Purple"
-           << "Red"
-           << "Pink"
-           << "Orange"
-           << "Yellow"
-           << "Brown";
-
-    ui->gridSizeBox->insertItems(0, sizes);
-    int gridSizeIndex = sizes.indexOf(SETTINGS.value("Grid/imagesize","Medium").toString());
+    int gridSizeIndex = 0, activeIndex = 0, inactiveIndex = 0, labelColorIndex = 0;
+    QString currentGridSize = SETTINGS.value("Grid/imagesize","Medium").toString();
+    QString currentActiveColor = SETTINGS.value("Grid/activecolor","Cyan").toString();
+    QString currentInactiveColor = SETTINGS.value("Grid/inactivecolor","Black").toString();
+    QString currentLabelColor = SETTINGS.value("Grid/labelcolor","White").toString();
+
+    QList<QStringList> colors;
+    colors << (QStringList() << tr("Black")      << "Black")
+           << (QStringList() << tr("White")      << "White")
+           << (QStringList() << tr("Light Gray") << "Light Gray")
+           << (QStringList() << tr("Dark Gray")  << "Dark Gray")
+           << (QStringList() << tr("Green")      << "Green")
+           << (QStringList() << tr("Cyan")       << "Cyan")
+           << (QStringList() << tr("Blue")       << "Blue")
+           << (QStringList() << tr("Purple")     << "Purple")
+           << (QStringList() << tr("Red")        << "Red")
+           << (QStringList() << tr("Pink")       << "Pink")
+           << (QStringList() << tr("Orange")     << "Orange")
+           << (QStringList() << tr("Yellow")     << "Yellow")
+           << (QStringList() << tr("Brown")      << "Brown");
+
+    for (int i = 0; i < sizes.length(); i++)
+    {
+        ui->gridSizeBox->insertItem(i, sizes.at(i).at(0), sizes.at(i).at(1));
+        if (currentGridSize == sizes.at(i).at(1))
+            gridSizeIndex = i;
+    }
     if (gridSizeIndex >= 0) ui->gridSizeBox->setCurrentIndex(gridSizeIndex);
 
     int gridColumnCount = SETTINGS.value("Grid/columncount","4").toInt();
     ui->columnCountBox->setValue(gridColumnCount);
 
-    ui->shadowActiveBox->insertItems(0, colors);
-    int activeIndex = colors.indexOf(SETTINGS.value("Grid/activecolor","Cyan").toString());
-    if (activeIndex >= 0) ui->shadowActiveBox->setCurrentIndex(activeIndex);
+    for (int i = 0; i < colors.length(); i++)
+    {
+        ui->shadowActiveBox->insertItem(i, colors.at(i).at(0), colors.at(i).at(1));
+        if (currentActiveColor == colors.at(i).at(1))
+            activeIndex = i;
+
+        ui->shadowInactiveBox->insertItem(i, colors.at(i).at(0), colors.at(i).at(1));
+        if (currentInactiveColor == colors.at(i).at(1))
+            inactiveIndex = i;
 
-    ui->shadowInactiveBox->insertItems(0, colors);
-    int inactiveIndex = colors.indexOf(SETTINGS.value("Grid/inactivecolor","Black").toString());
+        ui->labelColorBox->insertItem(i, colors.at(i).at(0), colors.at(i).at(1));
+        if (currentLabelColor == colors.at(i).at(1))
+            labelColorIndex = i;
+    }
+    if (activeIndex >= 0) ui->shadowActiveBox->setCurrentIndex(activeIndex);
     if (inactiveIndex >= 0) ui->shadowInactiveBox->setCurrentIndex(inactiveIndex);
+    if (labelColorIndex >= 0) ui->labelColorBox->setCurrentIndex(labelColorIndex);
 
     //Widgets to enable when label active
     labelEnable << ui->labelTextLabel
@@ -232,10 +266,6 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
     } else
         toggleLabel(false);
 
-    ui->labelColorBox->insertItems(0, colors);
-    int labelColorIndex = colors.indexOf(SETTINGS.value("Grid/labelcolor","White").toString());
-    if (labelColorIndex >= 0) ui->labelColorBox->setCurrentIndex(labelColorIndex);
-
     ui->backgroundPath->setText(SETTINGS.value("Grid/background", "").toString());
 
     if (SETTINGS.value("Grid/sortdirection", "ascending").toString() == "descending")
@@ -246,6 +276,9 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
 
 
     //Populate List tab
+    int listSizeIndex = 0;
+    QString currentListSize = SETTINGS.value("List/imagesize","Medium").toString();
+
     listCoverEnable << ui->listSizeLabel
                     << ui->listSizeBox;
 
@@ -258,8 +291,12 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
     if (SETTINGS.value("List/firstitemheader", "true").toString() == "true")
         ui->listHeaderOption->setChecked(true);
 
-    ui->listSizeBox->insertItems(0, sizes);
-    int listSizeIndex = sizes.indexOf(SETTINGS.value("List/imagesize","Medium").toString());
+    for (int i = 0; i < sizes.length(); i++)
+    {
+        ui->listSizeBox->insertItem(i, sizes.at(i).at(0), sizes.at(i).at(1));
+        if (currentListSize == sizes.at(i).at(1))
+            listSizeIndex = i;
+    }
     if (listSizeIndex >= 0) ui->listSizeBox->setCurrentIndex(listSizeIndex);
 
     if (SETTINGS.value("List/sortdirection", "ascending").toString() == "descending")
@@ -274,6 +311,13 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
 
 
     //Populate Other tab
+    int languageIndex = 0;
+    QString currentLanguage = SETTINGS.value("language", "EN").toString();
+
+    QList<QStringList> languages;
+    languages << (QStringList() << QString::fromUtf8("English")  << "EN")
+              << (QStringList() << QString::fromUtf8("Français") << "FR");
+
     downloadEnable << ui->tableSizeLabel
                    << ui->tableSizeBox
                    << ui->listCoverOption
@@ -291,8 +335,19 @@ SettingsDialog::SettingsDialog(QWidget *parent, int activeTab) : QDialog(parent)
 
     ui->parametersLine->setText(SETTINGS.value("Other/parameters", "").toString());
 
+    for (int i = 0; i < languages.length(); i++)
+    {
+        ui->languageBox->insertItem(i, languages.at(i).at(0), languages.at(i).at(1));
+        if (currentLanguage == languages.at(i).at(1))
+            languageIndex = i;
+    }
+    ui->languageBox->setCurrentIndex(languageIndex);
+
+    ui->languageInfoLabel->setHidden(true);
+
     connect(ui->downloadOption, SIGNAL(toggled(bool)), this, SLOT(toggleDownload(bool)));
     connect(ui->downloadOption, SIGNAL(toggled(bool)), this, SLOT(populateTableAndListTab(bool)));
+    connect(ui->languageBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateLanguageInfo()));
 
 
     connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(editSettings()));
@@ -310,10 +365,8 @@ void SettingsDialog::addColumn(QListWidget *currentList, QListWidget *availableL
 {
     int row = availableList->currentRow();
 
-    if (row >= 0) {
-        currentList->addItem(availableList->currentItem()->text());
-        delete availableList->takeItem(row);
-    }
+    if (row >= 0)
+        currentList->addItem(availableList->takeItem(row));
 }
 
 
@@ -444,8 +497,8 @@ void SettingsDialog::editSettings()
     //Table tab
     QStringList tableVisibleItems;
     foreach (QListWidgetItem *item, ui->tableCurrentList->findItems("*", Qt::MatchWildcard))
-        if (available.contains(item->text()))
-            tableVisibleItems << item->text();
+        if (available.contains(item->data(Qt::UserRole).toString()))
+            tableVisibleItems << item->data(Qt::UserRole).toString();
 
     SETTINGS.setValue("Table/columns", tableVisibleItems.join("|"));
 
@@ -454,14 +507,14 @@ void SettingsDialog::editSettings()
     else
         SETTINGS.setValue("Table/stretchfirstcolumn", "");
 
-    SETTINGS.setValue("Table/imagesize", ui->tableSizeBox->currentText());
+    SETTINGS.setValue("Table/imagesize", ui->tableSizeBox->itemData(ui->tableSizeBox->currentIndex()));
 
 
     //Grid tab
-    SETTINGS.setValue("Grid/imagesize", ui->gridSizeBox->currentText());
+    SETTINGS.setValue("Grid/imagesize", ui->gridSizeBox->itemData(ui->gridSizeBox->currentIndex()));
     SETTINGS.setValue("Grid/columncount", ui->columnCountBox->value());
-    SETTINGS.setValue("Grid/inactivecolor", ui->shadowInactiveBox->currentText());
-    SETTINGS.setValue("Grid/activecolor", ui->shadowActiveBox->currentText());
+    SETTINGS.setValue("Grid/inactivecolor", ui->shadowInactiveBox->itemData(ui->shadowInactiveBox->currentIndex()));
+    SETTINGS.setValue("Grid/activecolor", ui->shadowActiveBox->itemData(ui->shadowActiveBox->currentIndex()));
     SETTINGS.setValue("Grid/background", ui->backgroundPath->text());
 
     if (ui->labelOption->isChecked())
@@ -469,9 +522,9 @@ void SettingsDialog::editSettings()
     else
         SETTINGS.setValue("Grid/label", "");
 
-    SETTINGS.setValue("Grid/labeltext", ui->labelTextBox->currentText());
-    SETTINGS.setValue("Grid/labelcolor", ui->labelColorBox->currentText());
-    SETTINGS.setValue("Grid/sort", ui->gridSortBox->currentText());
+    SETTINGS.setValue("Grid/labeltext", ui->labelTextBox->itemData(ui->labelTextBox->currentIndex()));
+    SETTINGS.setValue("Grid/labelcolor", ui->labelColorBox->itemData(ui->labelColorBox->currentIndex()));
+    SETTINGS.setValue("Grid/sort", ui->gridSortBox->itemData(ui->gridSortBox->currentIndex()));
 
     if (ui->gridDescendingOption->isChecked())
         SETTINGS.setValue("Grid/sortdirection", "descending");
@@ -482,8 +535,8 @@ void SettingsDialog::editSettings()
     //List tab
     QStringList listVisibleItems;
     foreach (QListWidgetItem *item, ui->listCurrentList->findItems("*", Qt::MatchWildcard))
-        if (available.contains(item->text()))
-            listVisibleItems << item->text();
+        if (available.contains(item->data(Qt::UserRole).toString()))
+            listVisibleItems << item->data(Qt::UserRole).toString();
 
     SETTINGS.setValue("List/columns", listVisibleItems.join("|"));
 
@@ -497,8 +550,8 @@ void SettingsDialog::editSettings()
     else
         SETTINGS.setValue("List/displaycover", "");
 
-    SETTINGS.setValue("List/imagesize", ui->listSizeBox->currentText());
-    SETTINGS.setValue("List/sort", ui->listSortBox->currentText());
+    SETTINGS.setValue("List/imagesize", ui->listSizeBox->itemData(ui->listSizeBox->currentIndex()));
+    SETTINGS.setValue("List/sort", ui->listSortBox->itemData(ui->listSortBox->currentIndex()));
 
     if (ui->listDescendingOption->isChecked())
         SETTINGS.setValue("List/sortdirection", "descending");
@@ -513,6 +566,7 @@ void SettingsDialog::editSettings()
         SETTINGS.setValue("saveoptions", "");
 
     SETTINGS.setValue("Other/parameters", ui->parametersLine->text());
+    SETTINGS.setValue("language", ui->languageBox->itemData(ui->languageBox->currentIndex()));
 
     close();
 }
@@ -617,22 +671,48 @@ void SettingsDialog::populateTableAndListTab(bool downloadItems)
     }
 
     ui->tableAvailableList->clear();
-    ui->tableAvailableList->addItems(tableAvailable);
+    foreach (QString listItem, tableAvailable)
+    {
+        QListWidgetItem *item = new QListWidgetItem;
+        item->setText(getTranslation(listItem));
+        item->setData(Qt::UserRole, listItem);
+
+        ui->tableAvailableList->addItem(item);
+    }
     ui->tableAvailableList->sortItems();
 
     ui->tableCurrentList->clear();
-    ui->tableCurrentList->addItems(tableCurrent);
+    foreach (QString listItem, tableCurrent)
+    {
+        QListWidgetItem *item = new QListWidgetItem;
+        item->setText(getTranslation(listItem));
+        item->setData(Qt::UserRole, listItem);
+
+        ui->tableCurrentList->addItem(item);
+    }
 
 
     //Grid sort field and label text
+    int labelTextIndex = 0, gridSortIndex = 0;
+    QString currentLabelText = SETTINGS.value("Grid/labeltext","Filename").toString();
+    QString currentGridSort = SETTINGS.value("Grid/sort","Filename").toString();
+
     ui->labelTextBox->clear();
-    ui->labelTextBox->insertItems(0, labelOptions);
-    int labelTextIndex = labelOptions.indexOf(SETTINGS.value("Grid/labeltext","Filename").toString());
+    for (int i = 0; i < labelOptions.length(); i++)
+    {
+        ui->labelTextBox->insertItem(i, getTranslation(labelOptions.at(i)), labelOptions.at(i));
+        if (currentLabelText == labelOptions.at(i))
+            labelTextIndex = i;
+    }
     if (labelTextIndex >= 0) ui->labelTextBox->setCurrentIndex(labelTextIndex);
 
     ui->gridSortBox->clear();
-    ui->gridSortBox->insertItems(0, sortOptions);
-    int gridSortIndex = sortOptions.indexOf(SETTINGS.value("Grid/sort","Filename").toString());
+    for (int i = 0; i < sortOptions.length(); i++)
+    {
+        ui->gridSortBox->insertItem(i, getTranslation(sortOptions.at(i)), sortOptions.at(i));
+        if (currentGridSort == sortOptions.at(i))
+            gridSortIndex = i;
+    }
     if (gridSortIndex >= 0) ui->gridSortBox->setCurrentIndex(gridSortIndex);
 
 
@@ -651,15 +731,36 @@ void SettingsDialog::populateTableAndListTab(bool downloadItems)
     }
 
     ui->listAvailableList->clear();
-    ui->listAvailableList->addItems(listAvailable);
+    foreach (QString listItem, listAvailable)
+    {
+        QListWidgetItem *item = new QListWidgetItem;
+        item->setText(getTranslation(listItem));
+        item->setData(Qt::UserRole, listItem);
+
+        ui->listAvailableList->addItem(item);
+    }
     ui->listAvailableList->sortItems();
 
     ui->listCurrentList->clear();
-    ui->listCurrentList->addItems(listCurrent);
+    foreach (QString listItem, listCurrent)
+    {
+        QListWidgetItem *item = new QListWidgetItem;
+        item->setText(getTranslation(listItem));
+        item->setData(Qt::UserRole, listItem);
+
+        ui->listCurrentList->addItem(item);
+    }
+
+    int listSortIndex = 0;
+    QString currentListSort = SETTINGS.value("List/sort","Filename").toString();
 
     ui->listSortBox->clear();
-    ui->listSortBox->insertItems(0, sortOptions);
-    int listSortIndex = sortOptions.indexOf(SETTINGS.value("List/sort","Filename").toString());
+    for (int i = 0; i < sortOptions.length(); i++)
+    {
+        ui->listSortBox->insertItem(i, getTranslation(sortOptions.at(i)), sortOptions.at(i));
+        if (currentListSort == sortOptions.at(i))
+            listSortIndex = i;
+    }
     if (listSortIndex >= 0) ui->listSortBox->setCurrentIndex(listSortIndex);
 }
 
@@ -669,9 +770,7 @@ void SettingsDialog::removeColumn(QListWidget *currentList, QListWidget *availab
     int row = currentList->currentRow();
 
     if (row >= 0) {
-        availableList->addItem(currentList->currentItem()->text());
-        delete currentList->takeItem(row);
-
+        availableList->addItem(currentList->takeItem(row));
         availableList->sortItems();
     }
 }
@@ -757,3 +856,20 @@ void SettingsDialog::toggleListCover(bool active)
     foreach (QWidget *next, listCoverEnable)
         next->setEnabled(active);
 }
+
+
+void SettingsDialog::updateLanguageInfo()
+{
+    ui->languageInfoLabel->setHidden(false);
+
+    const char *sourceText = "<b>Note:</b> Language changes will not take place until application restart.";
+
+    QTranslator translator;
+    QString language = ui->languageBox->itemData(ui->languageBox->currentIndex()).toString().toLower();
+    QString resource = ":/locale/mupen64plus-qt_"+language+".qm";
+    if (QFileInfo(resource).exists()) {
+        translator.load(resource);
+        ui->languageInfoLabel->setText(translator.translate("SettingsDialog", sourceText));
+    } else
+        ui->languageInfoLabel->setText(sourceText);
+}
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 86d29d4..b50b567 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -32,11 +32,11 @@
 #ifndef SETTINGSDIALOG_H
 #define SETTINGSDIALOG_H
 
-#include <QDesktopWidget>
-#include <QFileDialog>
-#include <QListWidget>
+#include <QDialog>
+#include <QDir>
 
-#include "global.h"
+class QDesktopWidget;
+class QListWidget;
 
 
 namespace Ui {
@@ -90,6 +90,7 @@ private slots:
     void toggleDownload(bool active);
     void toggleLabel(bool active);
     void toggleListCover(bool active);
+    void updateLanguageInfo();
 };
 
 #endif // SETTINGSDIALOG_H
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index 89aea9b..4a2037e 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -36,7 +36,7 @@
       <enum>QTabWidget::Rounded</enum>
      </property>
      <property name="currentIndex">
-      <number>0</number>
+      <number>4</number>
      </property>
      <widget class="QWidget" name="pathsWidget">
       <attribute name="title">
@@ -553,17 +553,17 @@
            </property>
           </widget>
          </item>
-         <item row="2" column="3">
-          <widget class="QCheckBox" name="tableStretchOption">
+         <item row="0" column="0" colspan="2">
+          <widget class="QLabel" name="tableAvailableLabel">
            <property name="text">
-            <string>Stretch First Column</string>
+            <string>Available Columns:</string>
            </property>
           </widget>
          </item>
-         <item row="0" column="0" colspan="2">
-          <widget class="QLabel" name="tableAvailableLabel">
+         <item row="2" column="3" colspan="2">
+          <widget class="QCheckBox" name="tableStretchOption">
            <property name="text">
-            <string>Available Columns:</string>
+            <string>Stretch First Column</string>
            </property>
           </widget>
          </item>
@@ -908,13 +908,6 @@
          <property name="topMargin">
           <number>0</number>
          </property>
-         <item row="2" column="3">
-          <widget class="QCheckBox" name="listHeaderOption">
-           <property name="text">
-            <string>First Item as Header</string>
-           </property>
-          </widget>
-         </item>
          <item row="0" column="3">
           <widget class="QLabel" name="listCurrentLabel">
            <property name="text">
@@ -1021,16 +1014,6 @@
            </property>
           </widget>
          </item>
-         <item row="3" column="1">
-          <widget class="QComboBox" name="listSizeBox"/>
-         </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QCheckBox" name="listCoverOption">
-           <property name="text">
-            <string>Display Cover Image</string>
-           </property>
-          </widget>
-         </item>
          <item row="3" column="0">
           <widget class="QLabel" name="listSizeLabel">
            <property name="text">
@@ -1062,6 +1045,23 @@
            </property>
           </widget>
          </item>
+         <item row="2" column="3" colspan="2">
+          <widget class="QCheckBox" name="listHeaderOption">
+           <property name="text">
+            <string>First Item as Header</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0" colspan="3">
+          <widget class="QCheckBox" name="listCoverOption">
+           <property name="text">
+            <string>Display Cover Image</string>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1" colspan="2">
+          <widget class="QComboBox" name="listSizeBox"/>
+         </item>
         </layout>
        </item>
        <item row="0" column="0">
@@ -1152,6 +1152,16 @@
            </property>
           </widget>
          </item>
+         <item row="3" column="0">
+          <widget class="QLabel" name="languageLabel">
+           <property name="text">
+            <string>Language:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1" colspan="2">
+          <widget class="QComboBox" name="languageBox"/>
+         </item>
          <item row="2" column="1" colspan="2">
           <widget class="QLineEdit" name="parametersLine">
            <property name="toolTip">
@@ -1161,7 +1171,7 @@
          </item>
         </layout>
        </item>
-       <item row="1" column="0">
+       <item row="2" column="0">
         <spacer name="otherVSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
@@ -1187,6 +1197,19 @@
          </property>
         </spacer>
        </item>
+       <item row="1" column="0" colspan="2">
+        <widget class="QLabel" name="languageInfoLabel">
+         <property name="text">
+          <string><b>Note:</b> Language changes will not take place until application restart.</string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <property name="indent">
+          <number>10</number>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
     </widget>
diff --git a/src/thegamesdbscrapper.cpp b/src/thegamesdbscrapper.cpp
index 4830452..bb666a6 100644
--- a/src/thegamesdbscrapper.cpp
+++ b/src/thegamesdbscrapper.cpp
@@ -30,6 +30,20 @@
  ***/
 
 #include "thegamesdbscrapper.h"
+#include "common.h"
+#include "global.h"
+
+#include <QDir>
+#include <QEventLoop>
+#include <QMessageBox>
+#include <QTextStream>
+#include <QTimer>
+#include <QUrl>
+
+#include <QtNetwork/QNetworkAccessManager>
+#include <QtNetwork/QNetworkReply>
+#include <QtNetwork/QNetworkRequest>
+#include <QtXml/QDomDocument>
 
 
 TheGamesDBScrapper::TheGamesDBScrapper(QWidget *parent, bool force) : QObject(parent)
@@ -43,15 +57,15 @@ TheGamesDBScrapper::TheGamesDBScrapper(QWidget *parent, bool force) : QObject(pa
 void TheGamesDBScrapper::deleteGameInfo(QString fileName, QString identifier)
 {
     QString text;
-    text = QString("<b>NOTE:</b> If you are deleting this game's information because the game doesn't exist ")
-                 + "on TheGamesDB and Mupen64Plus-Qt pulled the information for different game, it's better "
-                 + "to create an account on <a href=\"http://thegamesdb.net/\">TheGamesDB</a> and add the "
-                 + "game so other users can benefit as well."
+    text = QString(tr("<b>NOTE:</b> If you are deleting this game's information because the game doesn't "))
+                 + tr("exist on TheGamesDB and Mupen64Plus-Qt pulled the information for different game, it's ")
+                 + tr("better to create an account on")+" <a href=\"http://thegamesdb.net/\">TheGamesDB</a> "
+                 + tr("and add the game so other users can benefit as well.")
                  + "<br /><br />"
-                 + "This will cause Mupen64Plus-Qt to not update the information for this game until you "
-                 + "force it with \"Download/Update Info...\""
+                 + tr("This will cause Mupen64Plus-Qt to not update the information for this game until you ")
+                 + tr("force it with \"Download/Update Info...\"")
                  + "<br /><br />"
-                 + "Delete the current information for <b>" + fileName + "</b>?";
+                 + tr("Delete the current information for") + " <b>" + fileName + "</b>?";
 
     int answer = QMessageBox::question(parent, tr("Delete Game Information"), text,
                                        QMessageBox::Yes | QMessageBox::No);
@@ -146,8 +160,8 @@ void TheGamesDBScrapper::downloadGameInfo(QString identifier, QString searchName
                     QString check = "Game: " + element.text();
                     check.remove(QRegExp(QString("[^A-Za-z 0-9 \\.,\\?'""!@#\\$%\\^&\\*\\")
                                          + "(\\)-_=\\+;:<>\\/\\\\|\\}\\{\\[\\]`~]*"));
-                    if (date.text() != "") check += "\nReleased on: " + date.text();
-                    check += "\n\nDoes this look correct?";
+                    if (date.text() != "") check += "\n" + tr("Released on: ") + date.text();
+                    check += "\n\n" + tr("Does this look correct?");
 
                     int answer = QMessageBox::question(parent, QObject::tr("Game Information Download"),
                                                        check, QMessageBox::Yes | QMessageBox::No);
@@ -266,7 +280,7 @@ QByteArray TheGamesDBScrapper::getUrlContents(QUrl url)
             return reply->readAll();
 
     } else //Request timed out
-        showError("Request timed out. Check your network settings.");
+        showError(tr("Request timed out. Check your network settings."));
 
     return QByteArray();
 }
@@ -274,7 +288,7 @@ QByteArray TheGamesDBScrapper::getUrlContents(QUrl url)
 
 void TheGamesDBScrapper::showError(QString error)
 {
-    QString question = "\n\nContinue scraping information?";
+    QString question = "\n\n" + tr("Continue scraping information?");
 
     if (force)
         QMessageBox::information(parent, tr("Network Error"), error);
diff --git a/src/thegamesdbscrapper.h b/src/thegamesdbscrapper.h
index 388ec6c..938255d 100644
--- a/src/thegamesdbscrapper.h
+++ b/src/thegamesdbscrapper.h
@@ -32,10 +32,9 @@
 #ifndef THEGAMESDBSCRAPPER_H
 #define THEGAMESDBSCRAPPER_H
 
-#include <QObject>
+#include <QWidget>
 
-#include "common.h"
-#include "global.h"
+class QUrl;
 
 
 class TheGamesDBScrapper : public QObject

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/mupen64plus-qt.git



More information about the Pkg-games-commits mailing list