aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroldmud0 <oldmud0@users.noreply.github.com>2018-05-29 19:21:49 -0500
committerstonedDiscord <stoned@derpymail.org>2019-07-28 19:00:34 +0200
commit762702aff852701c44eb0f07ee02c0fdfd1fd85b (patch)
treec88c3e6d0c7ea48cdc039339adbd63d95e83662f
parent319cb0adee1b8a65d1daf78aa903d6ffd2952c9c (diff)
Make all strings translatable
-rw-r--r--include/discord_rich_presence.h4
-rw-r--r--include/networkmanager.h2
-rw-r--r--src/aoapplication.cpp6
-rw-r--r--src/debug_functions.cpp9
-rw-r--r--src/discord_rich_presence.cpp18
-rw-r--r--src/evidence.cpp4
-rw-r--r--src/lobby.cpp10
-rw-r--r--src/main.cpp17
-rw-r--r--src/packet_distribution.cpp25
-rw-r--r--translations/ao_en.pot330
-rw-r--r--translations/ao_en.ts326
-rw-r--r--translations/ao_ja.pot330
-rw-r--r--translations/ao_ja.ts326
-rw-r--r--translations/ja.mobin0 -> 990 bytes
-rw-r--r--translations/ja.po337
15 files changed, 1710 insertions, 34 deletions
diff --git a/include/discord_rich_presence.h b/include/discord_rich_presence.h
index e7ecc6ef..4115b516 100644
--- a/include/discord_rich_presence.h
+++ b/include/discord_rich_presence.h
@@ -5,6 +5,8 @@
#include <ctime>
#include <QDebug>
#include <string>
+#include <QCoreApplication>
+
#include <discord-rpc.h>
#include <cstring>
@@ -16,6 +18,8 @@ namespace AttorneyOnline {
class Discord
{
+ Q_DECLARE_TR_FUNCTIONS(Discord)
+
private:
const char* APPLICATION_ID = "399779271737868288";
std::string server_name, server_id;
diff --git a/include/networkmanager.h b/include/networkmanager.h
index 08b10db8..7584b69c 100644
--- a/include/networkmanager.h
+++ b/include/networkmanager.h
@@ -14,6 +14,8 @@
#undef MS_FAILOVER_SUPPORTED
#endif
+#undef MS_FAILOVER_SUPPORTED
+
#include "aopacket.h"
#include "aoapplication.h"
diff --git a/src/aoapplication.cpp b/src/aoapplication.cpp
index 4ef1edd3..c47f3507 100644
--- a/src/aoapplication.cpp
+++ b/src/aoapplication.cpp
@@ -135,7 +135,7 @@ void AOApplication::server_disconnected()
{
if (courtroom_constructed)
{
- call_notice("Disconnected from server.");
+ call_notice(tr("Disconnected from server."));
construct_lobby();
destruct_courtroom();
}
@@ -165,11 +165,11 @@ void AOApplication::ms_connect_finished(bool connected, bool will_retry)
}
else
{
- call_error("There was an error connecting to the master server.\n"
+ call_error(tr("There was an error connecting to the master server.\n"
"We deploy multiple master servers to mitigate any possible downtime, "
"but the client appears to have exhausted all possible methods of finding "
"and connecting to one.\n"
- "Please check your Internet connection and firewall, and please try again.");
+ "Please check your Internet connection and firewall, and please try again."));
}
}
}
diff --git a/src/debug_functions.cpp b/src/debug_functions.cpp
index 77f2f35a..a790610d 100644
--- a/src/debug_functions.cpp
+++ b/src/debug_functions.cpp
@@ -1,11 +1,14 @@
+#include <QMessageBox>
+#include <QCoreApplication>
+
#include "debug_functions.h"
void call_error(QString p_message)
{
QMessageBox *msgBox = new QMessageBox;
- msgBox->setText("Error: " + p_message);
- msgBox->setWindowTitle("Error");
+ msgBox->setText(QCoreApplication::translate("debug_functions", "Error: %1").arg(p_message));
+ msgBox->setWindowTitle(QCoreApplication::translate("debug_functions", "Error"));
//msgBox->setWindowModality(Qt::NonModal);
@@ -17,7 +20,7 @@ void call_notice(QString p_message)
QMessageBox *msgBox = new QMessageBox;
msgBox->setText(p_message);
- msgBox->setWindowTitle("Notice");
+ msgBox->setWindowTitle(QCoreApplication::translate("debug_functions", "Notice"));
//msgBox->setWindowModality(Qt::NonModal);
diff --git a/src/discord_rich_presence.cpp b/src/discord_rich_presence.cpp
index 95a824a1..17a649f2 100644
--- a/src/discord_rich_presence.cpp
+++ b/src/discord_rich_presence.cpp
@@ -31,11 +31,11 @@ void Discord::state_lobby()
DiscordRichPresence presence;
std::memset(&presence, 0, sizeof(presence));
presence.largeImageKey = "ao2-logo";
- presence.largeImageText = "Objection!";
+ presence.largeImageText = tr("Objection!");
presence.instance = 1;
- presence.state = "In Lobby";
- presence.details = "Idle";
+ presence.state = tr("In Lobby");
+ presence.details = tr("Idle");
Discord_UpdatePresence(&presence);
}
@@ -46,12 +46,12 @@ void Discord::state_server(std::string name, std::string server_id)
DiscordRichPresence presence;
std::memset(&presence, 0, sizeof(presence));
presence.largeImageKey = "ao2-logo";
- presence.largeImageText = "Objection!";
+ presence.largeImageText = tr("Objection!");
presence.instance = 1;
auto timestamp = static_cast<int64_t>(std::time(nullptr));
- presence.state = "In a Server";
+ presence.state = tr("In a Server");
presence.details = name.c_str();
presence.matchSecret = server_id.c_str();
presence.startTimestamp = this->timestamp;
@@ -66,13 +66,13 @@ void Discord::state_character(std::string name)
{
auto name_internal = QString(name.c_str()).toLower().replace(' ', '_').toStdString();
auto name_friendly = QString(name.c_str()).replace('_', ' ').toStdString();
- const std::string playing_as = "Playing as " + name_friendly;
+ const std::string playing_as = tr("Playing as %1").arg(name_friendly);
qDebug() << "Discord RPC: Setting character state (" << playing_as.c_str() << ")";
DiscordRichPresence presence;
std::memset(&presence, 0, sizeof(presence));
presence.largeImageKey = "ao2-logo";
- presence.largeImageText = "Objection!";
+ presence.largeImageText = tr("Objection!");
presence.instance = 1;
presence.details = this->server_name.c_str();
presence.matchSecret = this->server_id.c_str();
@@ -91,13 +91,13 @@ void Discord::state_spectate()
DiscordRichPresence presence;
std::memset(&presence, 0, sizeof(presence));
presence.largeImageKey = "ao2-logo";
- presence.largeImageText = "Objection!";
+ presence.largeImageText = tr("Objection!");
presence.instance = 1;
presence.details = this->server_name.c_str();
presence.matchSecret = this->server_id.c_str();
presence.startTimestamp = this->timestamp;
- presence.state = "Spectating";
+ presence.state = tr("Spectating");
Discord_UpdatePresence(&presence);
}
#else
diff --git a/src/evidence.cpp b/src/evidence.cpp
index ebef7490..3ea6a41f 100644
--- a/src/evidence.cpp
+++ b/src/evidence.cpp
@@ -22,7 +22,7 @@ void Courtroom::construct_evidence()
ui_evidence_delete = new AOButton(ui_evidence_overlay, ao_app);
ui_evidence_image_name = new AOLineEdit(ui_evidence_overlay);
ui_evidence_image_button = new AOButton(ui_evidence_overlay, ao_app);
- ui_evidence_image_button->setText("Choose..");
+ ui_evidence_image_button->setText(tr("Choose.."));
ui_evidence_x = new AOButton(ui_evidence_overlay, ao_app);
ui_evidence_description = new AOTextEdit(ui_evidence_overlay);
@@ -265,7 +265,7 @@ void Courtroom::on_evidence_hover(int p_id, bool p_state)
if (p_state)
{
if (final_id == local_evidence_list.size())
- ui_evidence_name->setText("Add new evidence...");
+ ui_evidence_name->setText(tr("Add new evidence..."));
else if (final_id < local_evidence_list.size())
ui_evidence_name->setText(local_evidence_list.at(final_id).name);
}
diff --git a/src/lobby.cpp b/src/lobby.cpp
index 4a96e567..776528c9 100644
--- a/src/lobby.cpp
+++ b/src/lobby.cpp
@@ -71,9 +71,9 @@ void Lobby::set_widgets()
qDebug() << "W: did not find lobby width or height in " << filename;
// Most common symptom of bad config files and missing assets.
- call_notice("It doesn't look like your client is set up correctly.\n"
+ call_notice(tr("It doesn't look like your client is set up correctly.\n"
"Did you download all resources correctly from tiny.cc/getao, "
- "including the large 'base' folder?");
+ "including the large 'base' folder?"));
this->resize(517, 666);
}
@@ -144,11 +144,11 @@ void Lobby::set_widgets()
ui_loading_text->setFrameStyle(QFrame::NoFrame);
ui_loading_text->setStyleSheet("background-color: rgba(0, 0, 0, 0);"
"color: rgba(255, 128, 0, 255);");
- ui_loading_text->append("Loading");
+ ui_loading_text->append(tr("Loading"));
set_size_and_pos(ui_progress_bar, "progress_bar");
set_size_and_pos(ui_cancel, "cancel");
- ui_cancel->setText("Cancel");
+ ui_cancel->setText(tr("Cancel"));
ui_loading_background->hide();
@@ -313,7 +313,7 @@ void Lobby::on_server_list_clicked(QModelIndex p_model)
ui_description->moveCursor(QTextCursor::Start);
ui_description->ensureCursorVisible();
- ui_player_count->setText("Offline");
+ ui_player_count->setText(tr("Offline"));
ui_connect->setEnabled(false);
diff --git a/src/main.cpp b/src/main.cpp
index 80ea93bb..8b7cb50f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -7,6 +7,20 @@
#include "courtroom.h"
#include <QPluginLoader>
#include <QDebug>
+#include <QTranslator>
+
+static void install_translators(QtApplication &app)
+{
+ QTranslator qtTranslator;
+ qtTranslator.load("qt_" + QLocale::system().name(),
+ QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ app.installTranslator(&qtTranslator);
+
+ QTranslator appTranslator;
+ appTranslator.load("ao_" + QLocale::system().name());
+ app.installTranslator(&appTranslator);
+}
+
int main(int argc, char *argv[])
{
#if QT_VERSION > QT_VERSION_CHECK(5, 6, 0)
@@ -17,6 +31,9 @@ int main(int argc, char *argv[])
#endif
AOApplication main_app(argc, argv);
+
+ install_translators(&main_app);
+
main_app.construct_lobby();
main_app.net_manager->connect_to_master();
main_app.w_lobby->show();
diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp
index 942c275d..2bd26936 100644
--- a/src/packet_distribution.cpp
+++ b/src/packet_distribution.cpp
@@ -103,15 +103,16 @@ void AOApplication::ms_packet_received(AOPacket *p_packet)
}
}
- call_notice("Outdated version! Your version: " + get_version_string()
- + "\nPlease go to aceattorneyonline.com to update.");
+ call_notice(tr("Outdated version! Your version: %1\n"
+ "Please go to aceattorneyonline.com to update.")
+ .arg(get_version_string()));
destruct_courtroom();
destruct_lobby();
}
else if (header == "DOOM")
{
- call_notice("You have been exiled from AO."
- "Have a nice day.");
+ call_notice(tr("You have been exiled from AO.\n"
+ "Have a nice day."));
destruct_courtroom();
destruct_lobby();
}
@@ -245,7 +246,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
courtroom_loaded = false;
- QString window_title = "Attorney Online 2";
+ QString window_title = tr("Attorney Online 2");
int selected_server = w_lobby->get_selected_server();
QString server_address = "", server_name = "";
@@ -271,7 +272,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_courtroom->set_window_title(window_title);
w_lobby->show_loading_overlay();
- w_lobby->set_loading_text("Loading");
+ w_lobby->set_loading_text(tr("Loading"));
w_lobby->set_loading_value(0);
AOPacket *f_packet;
@@ -359,7 +360,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
++loaded_evidence;
- w_lobby->set_loading_text("Loading evidence:\n" + QString::number(loaded_evidence) + "/" + QString::number(evidence_list_size));
+ w_lobby->set_loading_text(tr("Loading evidence:\n%1/%2").arg(QString::number(loaded_evidence)).arg(QString::number(evidence_list_size)));
w_courtroom->append_evidence(f_evi);
@@ -391,7 +392,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
++loaded_music;
- w_lobby->set_loading_text("Loading music:\n" + QString::number(loaded_music) + "/" + QString::number(music_list_size));
+ w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
if (musics_time)
{
@@ -463,7 +464,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
++loaded_chars;
- w_lobby->set_loading_text("Loading chars:\n" + QString::number(loaded_chars) + "/" + QString::number(char_list_size));
+ w_lobby->set_loading_text(tr("Loading chars:\n%1/%2").arg(QString::number(loaded_chars)).arg(QString::number(char_list_size)));
w_courtroom->append_char(f_char);
@@ -486,7 +487,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
++loaded_music;
- w_lobby->set_loading_text("Loading music:\n" + QString::number(loaded_music) + "/" + QString::number(music_list_size));
+ w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
if (musics_time)
{
@@ -638,7 +639,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
if (courtroom_constructed && f_contents.size() >= 1)
{
- call_notice("You have been kicked from the server.\nReason: " + f_contents.at(0));
+ call_notice(tr("You have been kicked from the server.\nReason: ") + f_contents.at(0));
construct_lobby();
destruct_courtroom();
}
@@ -655,7 +656,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "BD")
{
- call_notice("You are banned on this server.\nReason: " + f_contents.at(0));
+ call_notice(tr("You are banned on this server.\nReason: ") + f_contents.at(0));
}
else if (header == "ZZ")
{
diff --git a/translations/ao_en.pot b/translations/ao_en.pot
new file mode 100644
index 00000000..f256947c
--- /dev/null
+++ b/translations/ao_en.pot
@@ -0,0 +1,330 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Language: en_US\n"
+"X-Qt-Contexts: true\n"
+
+#: ../aoapplication.cpp:133
+msgctxt "AOApplication|"
+msgid "Disconnected from server."
+msgstr ""
+
+#: ../aoapplication.cpp:157
+#, qt-format
+msgctxt "AOApplication|"
+msgid "Error connecting to master server. Will try again in %n seconds."
+msgstr ""
+
+#: ../aoapplication.cpp:162
+msgctxt "AOApplication|"
+msgid ""
+"There was an error connecting to the master server.\n"
+"We deploy multiple master servers to mitigate any possible downtime, but the "
+"client appears to have exhausted all possible methods of finding and "
+"connecting to one.\n"
+"Please check your Internet connection and firewall, and please try again."
+msgstr ""
+
+#: ../packet_distribution.cpp:107
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Outdated version! Your version: %1\n"
+"Please go to aceattorneyonline.com to update."
+msgstr ""
+
+#: ../packet_distribution.cpp:115
+msgctxt "AOApplication|"
+msgid ""
+"You have been exiled from AO.\n"
+"Have a nice day."
+msgstr ""
+
+#: ../packet_distribution.cpp:228
+msgctxt "AOApplication|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../packet_distribution.cpp:254
+msgctxt "AOApplication|"
+msgid "Loading"
+msgstr ""
+
+#: ../packet_distribution.cpp:341
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading evidence:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:370 ../packet_distribution.cpp:435
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading music:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:415
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading chars:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:548
+msgctxt "AOApplication|"
+msgid "You have been kicked."
+msgstr ""
+
+#: ../packet_distribution.cpp:561
+msgctxt "AOApplication|"
+msgid "You are banned on this server."
+msgstr ""
+
+#: ../charselect.cpp:27
+msgctxt "Courtroom|"
+msgid "Spectator"
+msgstr ""
+
+#: ../charselect.cpp:149
+#, qt-format
+msgctxt "Courtroom|"
+msgid "Could not find %1"
+msgstr ""
+
+#: ../courtroom.cpp:111
+msgctxt "Courtroom|"
+msgid "Name"
+msgstr ""
+
+#: ../courtroom.cpp:152 ../courtroom.cpp:460
+msgctxt "Courtroom|"
+msgid "Pre"
+msgstr ""
+
+#: ../courtroom.cpp:154
+msgctxt "Courtroom|"
+msgid "Flip"
+msgstr ""
+
+#: ../courtroom.cpp:157
+msgctxt "Courtroom|"
+msgid "Guard"
+msgstr ""
+
+#: ../courtroom.cpp:171
+msgctxt "Courtroom|"
+msgid "White"
+msgstr ""
+
+#: ../courtroom.cpp:172
+msgctxt "Courtroom|"
+msgid "Green"
+msgstr ""
+
+#: ../courtroom.cpp:173
+msgctxt "Courtroom|"
+msgid "Red"
+msgstr ""
+
+#: ../courtroom.cpp:174
+msgctxt "Courtroom|"
+msgid "Orange"
+msgstr ""
+
+#: ../courtroom.cpp:175
+msgctxt "Courtroom|"
+msgid "Blue"
+msgstr ""
+
+#: ../courtroom.cpp:177
+msgctxt "Courtroom|"
+msgid "Yellow"
+msgstr ""
+
+#: ../courtroom.cpp:429
+msgctxt "Courtroom|"
+msgid "Music"
+msgstr ""
+
+#: ../courtroom.cpp:431
+msgctxt "Courtroom|"
+msgid "Sfx"
+msgstr ""
+
+#: ../courtroom.cpp:433
+msgctxt "Courtroom|"
+msgid "Blips"
+msgstr ""
+
+#: ../courtroom.cpp:443 ../courtroom.cpp:1656
+msgctxt "Courtroom|"
+msgid "Server"
+msgstr ""
+
+#: ../courtroom.cpp:451
+msgctxt "Courtroom|"
+msgid "Change character"
+msgstr ""
+
+#: ../courtroom.cpp:454
+msgctxt "Courtroom|"
+msgid "Reload theme"
+msgstr ""
+
+#: ../courtroom.cpp:457
+msgctxt "Courtroom|"
+msgid "Call mod"
+msgstr ""
+
+#: ../courtroom.cpp:531
+msgctxt "Courtroom|"
+msgid "Back to Lobby"
+msgstr ""
+
+#: ../courtroom.cpp:1508
+msgctxt "Courtroom|"
+msgid "You have been banned."
+msgstr ""
+
+#: ../courtroom.cpp:1534
+#, qt-format
+msgctxt "Courtroom|"
+msgid "%1 has played a song: %2"
+msgstr ""
+
+#: ../courtroom.cpp:1620
+msgctxt "Courtroom|"
+msgid "Rainbow"
+msgstr ""
+
+#: ../courtroom.cpp:1648
+msgctxt "Courtroom|"
+msgid "Master"
+msgstr ""
+
+#: ../evidence.cpp:28
+msgctxt "Courtroom|"
+msgid "Choose.."
+msgstr ""
+
+#: ../evidence.cpp:196
+msgctxt "Courtroom|"
+msgid "Images (*.png)"
+msgstr ""
+
+#: ../evidence.cpp:275
+msgctxt "Courtroom|"
+msgid "Add new evidence..."
+msgstr ""
+
+#: ../discord_rich_presence.cpp:38 ../discord_rich_presence.cpp:53
+#: ../discord_rich_presence.cpp:79 ../discord_rich_presence.cpp:98
+msgctxt "Discord|"
+msgid "Objection!"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:41
+msgctxt "Discord|"
+msgid "In Lobby"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:42
+msgctxt "Discord|"
+msgid "Idle"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:58
+msgctxt "Discord|"
+msgid "In a Server"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:73
+#, qt-format
+msgctxt "Discord|"
+msgid "Playing as %1"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:104
+msgctxt "Discord|"
+msgid "Spectating"
+msgstr ""
+
+#: ../lobby.cpp:15
+msgctxt "Lobby|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../lobby.cpp:31
+msgctxt "Lobby|"
+msgid "Name"
+msgstr ""
+
+#: ../lobby.cpp:71
+msgctxt "Lobby|"
+msgid ""
+"It doesn't look like your client is set up correctly.\n"
+"Did you download all resources correctly from tiny.cc/getao, including the "
+"large 'base' folder?"
+msgstr ""
+
+#: ../lobby.cpp:144
+msgctxt "Lobby|"
+msgid "Loading"
+msgstr ""
+
+#: ../lobby.cpp:148
+msgctxt "Lobby|"
+msgid "Cancel"
+msgstr ""
+
+#: ../lobby.cpp:267
+msgctxt "Lobby|"
+msgid ""
+"Attorney Online 2 is built using Qt 5.11.\n"
+"\n"
+"Lead development:\n"
+"longbyte1\n"
+"OmniTroid\n"
+"\n"
+"stonedDiscord\n"
+"Supporting development:\n"
+"Fiercy\n"
+"\n"
+"UI design:\n"
+"Ruekasu\n"
+"Draxirch\n"
+"\n"
+"Special thanks:\n"
+"Unishred\n"
+"Argoneus\n"
+"Noevain\n"
+"Cronnicossy"
+msgstr ""
+
+#: ../lobby.cpp:315
+msgctxt "Lobby|"
+msgid "Offline"
+msgstr ""
+
+#: ../debug_functions.cpp:10
+#, qt-format
+msgctxt "debug_functions|"
+msgid "Error: %1"
+msgstr ""
+
+#: ../debug_functions.cpp:11
+msgctxt "debug_functions|"
+msgid "Error"
+msgstr ""
+
+#: ../debug_functions.cpp:23
+msgctxt "debug_functions|"
+msgid "Notice"
+msgstr ""
diff --git a/translations/ao_en.ts b/translations/ao_en.ts
new file mode 100644
index 00000000..539c6726
--- /dev/null
+++ b/translations/ao_en.ts
@@ -0,0 +1,326 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_US">
+<context>
+ <name>AOApplication</name>
+ <message>
+ <location filename="../aoapplication.cpp" line="133"/>
+ <source>Disconnected from server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../aoapplication.cpp" line="157"/>
+ <source>Error connecting to master server. Will try again in %n seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../aoapplication.cpp" line="162"/>
+ <source>There was an error connecting to the master server.
+We deploy multiple master servers to mitigate any possible downtime, but the client appears to have exhausted all possible methods of finding and connecting to one.
+Please check your Internet connection and firewall, and please try again.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="107"/>
+ <source>Outdated version! Your version: %1
+Please go to aceattorneyonline.com to update.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="115"/>
+ <source>You have been exiled from AO.
+Have a nice day.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="228"/>
+ <source>Attorney Online 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="254"/>
+ <source>Loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="341"/>
+ <source>Loading evidence:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="370"/>
+ <location filename="../packet_distribution.cpp" line="435"/>
+ <source>Loading music:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="415"/>
+ <source>Loading chars:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="548"/>
+ <source>You have been kicked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="561"/>
+ <source>You are banned on this server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Courtroom</name>
+ <message>
+ <location filename="../charselect.cpp" line="27"/>
+ <source>Spectator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../charselect.cpp" line="149"/>
+ <source>Could not find %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="111"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="152"/>
+ <location filename="../courtroom.cpp" line="460"/>
+ <source>Pre</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="154"/>
+ <source>Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="157"/>
+ <source>Guard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="171"/>
+ <source>White</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="172"/>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="173"/>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="174"/>
+ <source>Orange</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="175"/>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="177"/>
+ <source>Yellow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="429"/>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="431"/>
+ <source>Sfx</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="433"/>
+ <source>Blips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="443"/>
+ <location filename="../courtroom.cpp" line="1656"/>
+ <source>Server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="451"/>
+ <source>Change character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="454"/>
+ <source>Reload theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="457"/>
+ <source>Call mod</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="531"/>
+ <source>Back to Lobby</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1508"/>
+ <source>You have been banned.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1534"/>
+ <source>%1 has played a song: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1620"/>
+ <source>Rainbow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1648"/>
+ <source>Master</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="28"/>
+ <source>Choose..</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="196"/>
+ <source>Images (*.png)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="275"/>
+ <source>Add new evidence...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Discord</name>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="38"/>
+ <location filename="../discord_rich_presence.cpp" line="53"/>
+ <location filename="../discord_rich_presence.cpp" line="79"/>
+ <location filename="../discord_rich_presence.cpp" line="98"/>
+ <source>Objection!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="41"/>
+ <source>In Lobby</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="42"/>
+ <source>Idle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="58"/>
+ <source>In a Server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="73"/>
+ <source>Playing as %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="104"/>
+ <source>Spectating</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Lobby</name>
+ <message>
+ <location filename="../lobby.cpp" line="15"/>
+ <source>Attorney Online 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="31"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="71"/>
+ <source>It doesn&apos;t look like your client is set up correctly.
+Did you download all resources correctly from tiny.cc/getao, including the large &apos;base&apos; folder?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="144"/>
+ <source>Loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="148"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="267"/>
+ <source>Attorney Online 2 is built using Qt 5.11.
+
+Lead development:
+longbyte1
+OmniTroid
+
+stonedDiscord
+Supporting development:
+Fiercy
+
+UI design:
+Ruekasu
+Draxirch
+
+Special thanks:
+Unishred
+Argoneus
+Noevain
+Cronnicossy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="315"/>
+ <source>Offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>debug_functions</name>
+ <message>
+ <location filename="../debug_functions.cpp" line="10"/>
+ <source>Error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../debug_functions.cpp" line="11"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../debug_functions.cpp" line="23"/>
+ <source>Notice</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/translations/ao_ja.pot b/translations/ao_ja.pot
new file mode 100644
index 00000000..52ae7928
--- /dev/null
+++ b/translations/ao_ja.pot
@@ -0,0 +1,330 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Language: ja_JP\n"
+"X-Qt-Contexts: true\n"
+
+#: ../aoapplication.cpp:133
+msgctxt "AOApplication|"
+msgid "Disconnected from server."
+msgstr ""
+
+#: ../aoapplication.cpp:157
+#, qt-format
+msgctxt "AOApplication|"
+msgid "Error connecting to master server. Will try again in %n seconds."
+msgstr ""
+
+#: ../aoapplication.cpp:162
+msgctxt "AOApplication|"
+msgid ""
+"There was an error connecting to the master server.\n"
+"We deploy multiple master servers to mitigate any possible downtime, but the "
+"client appears to have exhausted all possible methods of finding and "
+"connecting to one.\n"
+"Please check your Internet connection and firewall, and please try again."
+msgstr ""
+
+#: ../packet_distribution.cpp:107
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Outdated version! Your version: %1\n"
+"Please go to aceattorneyonline.com to update."
+msgstr ""
+
+#: ../packet_distribution.cpp:115
+msgctxt "AOApplication|"
+msgid ""
+"You have been exiled from AO.\n"
+"Have a nice day."
+msgstr ""
+
+#: ../packet_distribution.cpp:228
+msgctxt "AOApplication|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../packet_distribution.cpp:254
+msgctxt "AOApplication|"
+msgid "Loading"
+msgstr ""
+
+#: ../packet_distribution.cpp:341
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading evidence:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:370 ../packet_distribution.cpp:435
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading music:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:415
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading chars:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:548
+msgctxt "AOApplication|"
+msgid "You have been kicked."
+msgstr ""
+
+#: ../packet_distribution.cpp:561
+msgctxt "AOApplication|"
+msgid "You are banned on this server."
+msgstr ""
+
+#: ../charselect.cpp:27
+msgctxt "Courtroom|"
+msgid "Spectator"
+msgstr ""
+
+#: ../charselect.cpp:149
+#, qt-format
+msgctxt "Courtroom|"
+msgid "Could not find %1"
+msgstr ""
+
+#: ../courtroom.cpp:111
+msgctxt "Courtroom|"
+msgid "Name"
+msgstr ""
+
+#: ../courtroom.cpp:152 ../courtroom.cpp:460
+msgctxt "Courtroom|"
+msgid "Pre"
+msgstr ""
+
+#: ../courtroom.cpp:154
+msgctxt "Courtroom|"
+msgid "Flip"
+msgstr ""
+
+#: ../courtroom.cpp:157
+msgctxt "Courtroom|"
+msgid "Guard"
+msgstr ""
+
+#: ../courtroom.cpp:171
+msgctxt "Courtroom|"
+msgid "White"
+msgstr ""
+
+#: ../courtroom.cpp:172
+msgctxt "Courtroom|"
+msgid "Green"
+msgstr ""
+
+#: ../courtroom.cpp:173
+msgctxt "Courtroom|"
+msgid "Red"
+msgstr ""
+
+#: ../courtroom.cpp:174
+msgctxt "Courtroom|"
+msgid "Orange"
+msgstr ""
+
+#: ../courtroom.cpp:175
+msgctxt "Courtroom|"
+msgid "Blue"
+msgstr ""
+
+#: ../courtroom.cpp:177
+msgctxt "Courtroom|"
+msgid "Yellow"
+msgstr ""
+
+#: ../courtroom.cpp:429
+msgctxt "Courtroom|"
+msgid "Music"
+msgstr ""
+
+#: ../courtroom.cpp:431
+msgctxt "Courtroom|"
+msgid "Sfx"
+msgstr ""
+
+#: ../courtroom.cpp:433
+msgctxt "Courtroom|"
+msgid "Blips"
+msgstr ""
+
+#: ../courtroom.cpp:443 ../courtroom.cpp:1656
+msgctxt "Courtroom|"
+msgid "Server"
+msgstr ""
+
+#: ../courtroom.cpp:451
+msgctxt "Courtroom|"
+msgid "Change character"
+msgstr ""
+
+#: ../courtroom.cpp:454
+msgctxt "Courtroom|"
+msgid "Reload theme"
+msgstr ""
+
+#: ../courtroom.cpp:457
+msgctxt "Courtroom|"
+msgid "Call mod"
+msgstr ""
+
+#: ../courtroom.cpp:531
+msgctxt "Courtroom|"
+msgid "Back to Lobby"
+msgstr ""
+
+#: ../courtroom.cpp:1508
+msgctxt "Courtroom|"
+msgid "You have been banned."
+msgstr ""
+
+#: ../courtroom.cpp:1534
+#, qt-format
+msgctxt "Courtroom|"
+msgid "%1 has played a song: %2"
+msgstr ""
+
+#: ../courtroom.cpp:1620
+msgctxt "Courtroom|"
+msgid "Rainbow"
+msgstr ""
+
+#: ../courtroom.cpp:1648
+msgctxt "Courtroom|"
+msgid "Master"
+msgstr ""
+
+#: ../evidence.cpp:28
+msgctxt "Courtroom|"
+msgid "Choose.."
+msgstr ""
+
+#: ../evidence.cpp:196
+msgctxt "Courtroom|"
+msgid "Images (*.png)"
+msgstr ""
+
+#: ../evidence.cpp:275
+msgctxt "Courtroom|"
+msgid "Add new evidence..."
+msgstr ""
+
+#: ../discord_rich_presence.cpp:38 ../discord_rich_presence.cpp:53
+#: ../discord_rich_presence.cpp:79 ../discord_rich_presence.cpp:98
+msgctxt "Discord|"
+msgid "Objection!"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:41
+msgctxt "Discord|"
+msgid "In Lobby"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:42
+msgctxt "Discord|"
+msgid "Idle"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:58
+msgctxt "Discord|"
+msgid "In a Server"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:73
+#, qt-format
+msgctxt "Discord|"
+msgid "Playing as %1"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:104
+msgctxt "Discord|"
+msgid "Spectating"
+msgstr ""
+
+#: ../lobby.cpp:15
+msgctxt "Lobby|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../lobby.cpp:31
+msgctxt "Lobby|"
+msgid "Name"
+msgstr ""
+
+#: ../lobby.cpp:71
+msgctxt "Lobby|"
+msgid ""
+"It doesn't look like your client is set up correctly.\n"
+"Did you download all resources correctly from tiny.cc/getao, including the "
+"large 'base' folder?"
+msgstr ""
+
+#: ../lobby.cpp:144
+msgctxt "Lobby|"
+msgid "Loading"
+msgstr ""
+
+#: ../lobby.cpp:148
+msgctxt "Lobby|"
+msgid "Cancel"
+msgstr ""
+
+#: ../lobby.cpp:267
+msgctxt "Lobby|"
+msgid ""
+"Attorney Online 2 is built using Qt 5.11.\n"
+"\n"
+"Lead development:\n"
+"longbyte1\n"
+"OmniTroid\n"
+"\n"
+"stonedDiscord\n"
+"Supporting development:\n"
+"Fiercy\n"
+"\n"
+"UI design:\n"
+"Ruekasu\n"
+"Draxirch\n"
+"\n"
+"Special thanks:\n"
+"Unishred\n"
+"Argoneus\n"
+"Noevain\n"
+"Cronnicossy"
+msgstr ""
+
+#: ../lobby.cpp:315
+msgctxt "Lobby|"
+msgid "Offline"
+msgstr ""
+
+#: ../debug_functions.cpp:10
+#, qt-format
+msgctxt "debug_functions|"
+msgid "Error: %1"
+msgstr ""
+
+#: ../debug_functions.cpp:11
+msgctxt "debug_functions|"
+msgid "Error"
+msgstr ""
+
+#: ../debug_functions.cpp:23
+msgctxt "debug_functions|"
+msgid "Notice"
+msgstr ""
diff --git a/translations/ao_ja.ts b/translations/ao_ja.ts
new file mode 100644
index 00000000..46c42c92
--- /dev/null
+++ b/translations/ao_ja.ts
@@ -0,0 +1,326 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ja_JP">
+<context>
+ <name>AOApplication</name>
+ <message>
+ <location filename="../aoapplication.cpp" line="133"/>
+ <source>Disconnected from server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../aoapplication.cpp" line="157"/>
+ <source>Error connecting to master server. Will try again in %n seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../aoapplication.cpp" line="162"/>
+ <source>There was an error connecting to the master server.
+We deploy multiple master servers to mitigate any possible downtime, but the client appears to have exhausted all possible methods of finding and connecting to one.
+Please check your Internet connection and firewall, and please try again.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="107"/>
+ <source>Outdated version! Your version: %1
+Please go to aceattorneyonline.com to update.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="115"/>
+ <source>You have been exiled from AO.
+Have a nice day.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="228"/>
+ <source>Attorney Online 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="254"/>
+ <source>Loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="341"/>
+ <source>Loading evidence:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="370"/>
+ <location filename="../packet_distribution.cpp" line="435"/>
+ <source>Loading music:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="415"/>
+ <source>Loading chars:
+%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="548"/>
+ <source>You have been kicked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../packet_distribution.cpp" line="561"/>
+ <source>You are banned on this server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Courtroom</name>
+ <message>
+ <location filename="../charselect.cpp" line="27"/>
+ <source>Spectator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../charselect.cpp" line="149"/>
+ <source>Could not find %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="111"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="152"/>
+ <location filename="../courtroom.cpp" line="460"/>
+ <source>Pre</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="154"/>
+ <source>Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="157"/>
+ <source>Guard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="171"/>
+ <source>White</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="172"/>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="173"/>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="174"/>
+ <source>Orange</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="175"/>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="177"/>
+ <source>Yellow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="429"/>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="431"/>
+ <source>Sfx</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="433"/>
+ <source>Blips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="443"/>
+ <location filename="../courtroom.cpp" line="1656"/>
+ <source>Server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="451"/>
+ <source>Change character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="454"/>
+ <source>Reload theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="457"/>
+ <source>Call mod</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="531"/>
+ <source>Back to Lobby</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1508"/>
+ <source>You have been banned.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1534"/>
+ <source>%1 has played a song: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1620"/>
+ <source>Rainbow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../courtroom.cpp" line="1648"/>
+ <source>Master</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="28"/>
+ <source>Choose..</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="196"/>
+ <source>Images (*.png)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../evidence.cpp" line="275"/>
+ <source>Add new evidence...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Discord</name>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="38"/>
+ <location filename="../discord_rich_presence.cpp" line="53"/>
+ <location filename="../discord_rich_presence.cpp" line="79"/>
+ <location filename="../discord_rich_presence.cpp" line="98"/>
+ <source>Objection!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="41"/>
+ <source>In Lobby</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="42"/>
+ <source>Idle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="58"/>
+ <source>In a Server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="73"/>
+ <source>Playing as %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../discord_rich_presence.cpp" line="104"/>
+ <source>Spectating</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Lobby</name>
+ <message>
+ <location filename="../lobby.cpp" line="15"/>
+ <source>Attorney Online 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="31"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="71"/>
+ <source>It doesn&apos;t look like your client is set up correctly.
+Did you download all resources correctly from tiny.cc/getao, including the large &apos;base&apos; folder?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="144"/>
+ <source>Loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="148"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="267"/>
+ <source>Attorney Online 2 is built using Qt 5.11.
+
+Lead development:
+longbyte1
+OmniTroid
+
+stonedDiscord
+Supporting development:
+Fiercy
+
+UI design:
+Ruekasu
+Draxirch
+
+Special thanks:
+Unishred
+Argoneus
+Noevain
+Cronnicossy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../lobby.cpp" line="315"/>
+ <source>Offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>debug_functions</name>
+ <message>
+ <location filename="../debug_functions.cpp" line="10"/>
+ <source>Error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../debug_functions.cpp" line="11"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../debug_functions.cpp" line="23"/>
+ <source>Notice</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/translations/ja.mo b/translations/ja.mo
new file mode 100644
index 00000000..dad3f2a2
--- /dev/null
+++ b/translations/ja.mo
Binary files differ
diff --git a/translations/ja.po b/translations/ja.po
new file mode 100644
index 00000000..5457930b
--- /dev/null
+++ b/translations/ja.po
@@ -0,0 +1,337 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Language: en_US\n"
+"X-Qt-Contexts: true\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.7\n"
+"Last-Translator: oldmud0 <oldmud0@users.noreply.github.com>\n"
+"Language: ja\n"
+
+#: ../aoapplication.cpp:133
+msgctxt "AOApplication|"
+msgid "Disconnected from server."
+msgstr ""
+
+#: ../aoapplication.cpp:157
+#, qt-format
+msgctxt "AOApplication|"
+msgid "Error connecting to master server. Will try again in %n seconds."
+msgstr ""
+
+#: ../aoapplication.cpp:162
+msgctxt "AOApplication|"
+msgid ""
+"There was an error connecting to the master server.\n"
+"We deploy multiple master servers to mitigate any possible downtime, but the "
+"client appears to have exhausted all possible methods of finding and "
+"connecting to one.\n"
+"Please check your Internet connection and firewall, and please try again."
+msgstr ""
+
+#: ../packet_distribution.cpp:107
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Outdated version! Your version: %1\n"
+"Please go to aceattorneyonline.com to update."
+msgstr ""
+
+#: ../packet_distribution.cpp:115
+msgctxt "AOApplication|"
+msgid ""
+"You have been exiled from AO.\n"
+"Have a nice day."
+msgstr ""
+
+#: ../packet_distribution.cpp:228
+msgctxt "AOApplication|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../packet_distribution.cpp:254
+msgctxt "AOApplication|"
+msgid "Loading"
+msgstr ""
+
+#: ../packet_distribution.cpp:341
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading evidence:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:370 ../packet_distribution.cpp:435
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading music:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:415
+#, qt-format
+msgctxt "AOApplication|"
+msgid ""
+"Loading chars:\n"
+"%1/%2"
+msgstr ""
+
+#: ../packet_distribution.cpp:548
+msgctxt "AOApplication|"
+msgid "You have been kicked."
+msgstr ""
+
+#: ../packet_distribution.cpp:561
+msgctxt "AOApplication|"
+msgid "You are banned on this server."
+msgstr ""
+
+#: ../charselect.cpp:27
+msgctxt "Courtroom|"
+msgid "Spectator"
+msgstr ""
+
+#: ../charselect.cpp:149
+#, qt-format
+msgctxt "Courtroom|"
+msgid "Could not find %1"
+msgstr "%1を見つかりませんでした"
+
+#: ../courtroom.cpp:111
+msgctxt "Courtroom|"
+msgid "Name"
+msgstr "名前"
+
+#: ../courtroom.cpp:152 ../courtroom.cpp:460
+msgctxt "Courtroom|"
+msgid "Pre"
+msgstr ""
+
+#: ../courtroom.cpp:154
+msgctxt "Courtroom|"
+msgid "Flip"
+msgstr ""
+
+#: ../courtroom.cpp:157
+msgctxt "Courtroom|"
+msgid "Guard"
+msgstr ""
+
+#: ../courtroom.cpp:171
+msgctxt "Courtroom|"
+msgid "White"
+msgstr ""
+
+#: ../courtroom.cpp:172
+msgctxt "Courtroom|"
+msgid "Green"
+msgstr ""
+
+#: ../courtroom.cpp:173
+msgctxt "Courtroom|"
+msgid "Red"
+msgstr "赤"
+
+#: ../courtroom.cpp:174
+msgctxt "Courtroom|"
+msgid "Orange"
+msgstr "オレンジ"
+
+#: ../courtroom.cpp:175
+msgctxt "Courtroom|"
+msgid "Blue"
+msgstr "青"
+
+#: ../courtroom.cpp:177
+msgctxt "Courtroom|"
+msgid "Yellow"
+msgstr "黄色"
+
+#: ../courtroom.cpp:429
+msgctxt "Courtroom|"
+msgid "Music"
+msgstr "音楽"
+
+#: ../courtroom.cpp:431
+msgctxt "Courtroom|"
+msgid "Sfx"
+msgstr ""
+
+#: ../courtroom.cpp:433
+msgctxt "Courtroom|"
+msgid "Blips"
+msgstr "ブリップ"
+
+#: ../courtroom.cpp:443 ../courtroom.cpp:1656
+msgctxt "Courtroom|"
+msgid "Server"
+msgstr "サーバ"
+
+#: ../courtroom.cpp:451
+msgctxt "Courtroom|"
+msgid "Change character"
+msgstr ""
+
+#: ../courtroom.cpp:454
+msgctxt "Courtroom|"
+msgid "Reload theme"
+msgstr ""
+
+#: ../courtroom.cpp:457
+msgctxt "Courtroom|"
+msgid "Call mod"
+msgstr ""
+
+#: ../courtroom.cpp:531
+msgctxt "Courtroom|"
+msgid "Back to Lobby"
+msgstr ""
+
+#: ../courtroom.cpp:1508
+msgctxt "Courtroom|"
+msgid "You have been banned."
+msgstr ""
+
+#: ../courtroom.cpp:1534
+#, qt-format
+msgctxt "Courtroom|"
+msgid "%1 has played a song: %2"
+msgstr ""
+
+#: ../courtroom.cpp:1620
+msgctxt "Courtroom|"
+msgid "Rainbow"
+msgstr ""
+
+#: ../courtroom.cpp:1648
+msgctxt "Courtroom|"
+msgid "Master"
+msgstr "マスター"
+
+#: ../evidence.cpp:28
+msgctxt "Courtroom|"
+msgid "Choose.."
+msgstr "選択..."
+
+#: ../evidence.cpp:196
+msgctxt "Courtroom|"
+msgid "Images (*.png)"
+msgstr ""
+
+#: ../evidence.cpp:275
+msgctxt "Courtroom|"
+msgid "Add new evidence..."
+msgstr ""
+
+#: ../discord_rich_presence.cpp:38 ../discord_rich_presence.cpp:53
+#: ../discord_rich_presence.cpp:79 ../discord_rich_presence.cpp:98
+msgctxt "Discord|"
+msgid "Objection!"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:41
+msgctxt "Discord|"
+msgid "In Lobby"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:42
+msgctxt "Discord|"
+msgid "Idle"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:58
+msgctxt "Discord|"
+msgid "In a Server"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:73
+#, qt-format
+msgctxt "Discord|"
+msgid "Playing as %1"
+msgstr ""
+
+#: ../discord_rich_presence.cpp:104
+msgctxt "Discord|"
+msgid "Spectating"
+msgstr ""
+
+#: ../lobby.cpp:15
+msgctxt "Lobby|"
+msgid "Attorney Online 2"
+msgstr ""
+
+#: ../lobby.cpp:31
+msgctxt "Lobby|"
+msgid "Name"
+msgstr "名前"
+
+#: ../lobby.cpp:71
+msgctxt "Lobby|"
+msgid ""
+"It doesn't look like your client is set up correctly.\n"
+"Did you download all resources correctly from tiny.cc/getao, including the "
+"large 'base' folder?"
+msgstr ""
+
+#: ../lobby.cpp:144
+msgctxt "Lobby|"
+msgid "Loading"
+msgstr ""
+
+#: ../lobby.cpp:148
+msgctxt "Lobby|"
+msgid "Cancel"
+msgstr ""
+
+#: ../lobby.cpp:267
+msgctxt "Lobby|"
+msgid ""
+"Attorney Online 2 is built using Qt 5.11.\n"
+"\n"
+"Lead development:\n"
+"longbyte1\n"
+"OmniTroid\n"
+"\n"
+"stonedDiscord\n"
+"Supporting development:\n"
+"Fiercy\n"
+"\n"
+"UI design:\n"
+"Ruekasu\n"
+"Draxirch\n"
+"\n"
+"Special thanks:\n"
+"Unishred\n"
+"Argoneus\n"
+"Noevain\n"
+"Cronnicossy"
+msgstr ""
+
+#: ../lobby.cpp:315
+msgctxt "Lobby|"
+msgid "Offline"
+msgstr ""
+
+#: ../debug_functions.cpp:10
+#, qt-format
+msgctxt "debug_functions|"
+msgid "Error: %1"
+msgstr ""
+
+#: ../debug_functions.cpp:11
+msgctxt "debug_functions|"
+msgid "Error"
+msgstr ""
+
+#: ../debug_functions.cpp:23
+msgctxt "debug_functions|"
+msgid "Notice"
+msgstr ""