Merge branch 'master' into 2.7

This commit is contained in:
stonedDiscord 2020-02-21 16:39:32 +01:00 committed by GitHub
commit 7d55ff01f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
65 changed files with 7044 additions and 210 deletions

1
.gitignore vendored
View File

@ -21,6 +21,7 @@ debug/
Makefile*
object_script*
/android/gradle*
/Attorney_Online_remake_resource.rc
/attorney_online_remake_plugin_import.cpp

210
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,210 @@
stages:
- build
- deploy
- publish
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- lib/
before_script:
- echo Current working directory is $(pwd)
build linux x86_64:
image: ubuntu
stage: build
tags:
- docker
- linux
script:
# Install dependencies
- apt-get update
- >
apt-get install --no-install-recommends -y qt5-default qtmultimedia5-dev
clang make git sudo curl ca-certificates pkg-config upx unzip
# Print versions
- qmake --version
- clang --version
# Extract BASS
#- mkdir bass
#- cd bass
#- curl http://www.un4seen.com/files/bass24-linux.zip -o bass.zip
#- unzip bass.zip
#- cp x64/libbass.so ../lib
#- curl http://www.un4seen.com/files/bassopus24-linux.zip -o bassopus.zip
#- unzip bassopus.zip
#- cp x64/libbassopus.so ../lib
#- cd ..
# Extract Discord RPC
- mkdir discord-rpc
- cd discord-rpc
- curl -L https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-linux.zip -o discord_rpc_linux.zip
- unzip discord_rpc_linux.zip
- cp discord-rpc/linux-dynamic/lib/libdiscord-rpc.so ../lib
- cd ..
# Extract QtApng
- mkdir qtapng
- cd qtapng
- curl -L https://github.com/Skycoder42/QtApng/releases/download/1.1.0-5/build_gcc_64_5.12.0.tar.xz -o apng.tar.xz
- tar -xvf apng.tar.xz
- cp gcc_64/plugins/imageformats/libqapng.so ../lib
- cd ..
# Build
- qmake -spec linux-clang "DEFINES += DISCORD QTAUDIO"
- make -j4
# Post-processing
- upx --lzma -9 --force bin/Attorney_Online
artifacts:
paths:
- bin/
build windows i686:
image: ${CI_REGISTRY_IMAGE}/builder-windows-i686
stage: build
tags:
- docker
- linux
script:
# Install dependencies
- apt-get update
- apt-get install --no-install-recommends -y make curl ca-certificates upx unzip
# Extract BASS
- mkdir bass
- cd bass
- curl http://www.un4seen.com/files/bass24.zip -o bass.zip
- unzip bass.zip
- cp bass.dll ../lib
- curl http://www.un4seen.com/files/bassopus24.zip -o bassopus.zip
- unzip bassopus.zip
- cp bassopus.dll ../lib
- cd ..
# Build
- /opt/mxe/usr/${TARGET_SPEC}/qt5/bin/qmake "DEFINES += DISCORD BASSAUDIO"
- make -j4
# Post-processing
- upx --lzma -9 --force bin/Attorney_Online.exe
artifacts:
paths:
- bin/
# Base folder
.deploy_base: &deploy_base |
mkdir base
mkdir base/themes
cp -a ../base/themes/default base/themes/
cp -a ../base/config.ini base/config.sample.ini
cp -a ../base/serverlist.txt base/serverlist.sample.txt
# Miscellaneous files
.deploy_misc: &deploy_misc |
cp -a ../README.md README.md.txt
cp -a ../LICENSE.MIT LICENSE.txt
deploy linux x86_64:
stage: deploy
dependencies:
- build linux x86_64
tags:
- docker
- linux
script:
- mkdir artifact
- cd artifact
- *deploy_base
- *deploy_misc
# Platform-specific
- cp -a ../lib/*.so .
- cp -a ../bin/Attorney_Online .
- echo "#!/bin/sh" >> ./run.sh
- echo "LD_LIBRARY_PATH=.:\$LD_LIBRARY_PATH ./Attorney_Online" >> ./run.sh
- chmod +x ./run.sh
# Zipping
# zip -r -9 -l Attorney_Online_$(git describe --tags)_linux_x86_64.zip .
- mkdir ../zip
- tar cavf ../zip/Attorney_Online_$(git describe --tags)_linux_x64.tar.xz *
- sha1sum ../zip/*
artifacts:
paths:
- zip/
deploy windows i686:
image: ubuntu
stage: deploy
dependencies:
- build windows i686
tags:
- docker
- linux
script:
- apt-get update
- apt-get install --no-install-recommends -y zip git
- mkdir artifact
- cd artifact
- *deploy_base
- *deploy_misc
# Platform-specific
- cp -a ../lib/*.dll .
- cp -a ../bin/Attorney_Online.exe .
# Zipping
# -r: recursive; -9: max compression; -l: convert to CR LF
- mkdir ../zip
- zip -r -9 -l ../zip/Attorney_Online_$(git describe --tags)_windows_x86.zip .
- sha1sum ../zip/*
artifacts:
paths:
- zip/
# How to publish to S3/Wasabi:
# - Ensure the following variables have been populated in the CI/CD settings:
# - S3_ACCESS_KEY, S3_SECRET_KEY
# - S3_MANIFESTS, S3_ARCHIVES
# - Select "Run Pipeline" on the Pipelines menu on GitLab.
# - Select the version you want to release.
# - Set the following variables:
# - MANIFEST: program_winnt_i386.json
# - ARCHIVE_FULL: ao-X.Y.Z-win32.zip
# - VERSION: X.Y.Z
# - EXECUTABLE: Attorney_Online_X.Y.Z.exe
# - Run the pipeline to completion.
# (See scripts/wasabi.sh)
publish linux x86_64:
image: ubuntu
stage: publish
dependencies:
- deploy linux x86_64
when: manual
script:
- cd zip
- ../scripts/wasabi.sh
variables:
MANIFEST: program_linux_x86_64.json
ARTIFACT_SUFFIX: _linux_x64.tar.xz
publish windows i686:
image: ubuntu
stage: publish
dependencies:
- deploy windows i686
when: manual
script:
- cd zip
- ../scripts/wasabi.sh
variables:
MANIFEST: program_winnt_i386.json
ARTIFACT_SUFFIX: _windows_x86.zip

12
.travis.yml Normal file
View File

@ -0,0 +1,12 @@
language: cpp
os: osx
addons:
homebrew:
update: true
packages:
- qt5
script:
- ./scripts/macos_build.sh
- ./scripts/macos_post_build.sh

View File

@ -1,4 +1,4 @@
QT += core gui widgets multimedia network
QT += core gui widgets network
TARGET = Attorney_Online
TEMPLATE = app
@ -12,11 +12,52 @@ MOC_DIR = $$PWD/build
SOURCES += $$files($$PWD/src/*.cpp)
HEADERS += $$files($$PWD/include/*.h)
LIBS += -L$$PWD/lib -lbass -ldiscord-rpc
CONFIG += c++11
LIBS += -L$$PWD/lib
#DEFINES += DISCORD
contains(DEFINES, DISCORD) {
LIBS += -ldiscord-rpc
}
#DEFINES += BASSAUDIO
contains(DEFINES, BASSAUDIO) {
LIBS += -lbass
}
#DEFINES += QTAUDIO
contains(DEFINES, QTAUDIO) {
QT += multimedia
}
macx:LIBS += -framework CoreFoundation -framework Foundation -framework CoreServices
CONFIG += c++14
RESOURCES += resources.qrc
TRANSLATIONS = resource/translations/ao_en.ts \
resource/translations/ao_jp.ts \
resource/translations/ao_de.ts \
resource/translations/ao_ru.ts \
resource/translations/ao_es.ts \
resource/translations/ao_pl.ts
win32:RC_ICONS = resource/logo.ico
macx:ICON = resource/logo.icns
android:DISTFILES += \
android/AndroidManifest.xml \
android/build.gradle \
android/gradle/wrapper/gradle-wrapper.jar \
android/gradle/wrapper/gradle-wrapper.properties \
android/gradlew \
android/gradlew.bat \
android/res/values/libs.xml
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

View File

@ -8,22 +8,40 @@ This program has five main dependencies
* Discord Rich Presence (https://github.com/discordapp/discord-rpc/releases)
* Qt Apng Plugin (https://github.com/Skycoder42/QtApng/releases)
### Help
If you're having issues with any of this, ask in the offical Discord: https://discord.gg/wWvQ3pw
Alternatively, you can ask OmniTroid#4004 on Discord.
### How to build dynamically (the easy way)
#### General preparation
What you want to do is first download the latest version of Qt from the first link. (get the prebuilt dynamic version)
If you're on Ubuntu, go to the scripts/ folder and run configure_ubuntu.sh. This should fetch all the required dependencies automatically.
If not, go to each one of the links above and find the right dynamic library for your platform:
* Windows: .dll
* Linux: .so
* Mac: .dylib
After going through the OS-specific steps below, compiling in Qt creator should work.
And put them in BOTH lib/ and the repository root (lib/ is required for linking and root is required for runtime)
#### Windows
Launch Qt creator, open the .pro file and try running it. Ask in the Discord if you're having issues: https://discord.gg/wWvQ3pw
If you're on Windows, you need to go find all the dependencies (see above) and put them in the lib/ folder.
#### MacOS
If you're on MacOS, you can simply go to terminal and run ./scripts/configure_macos.sh
This will automatically fetch all the required dependencies. Additionally, if you need to create a standalone release, just run ./scripts/release_macos.sh
This will make the .app bundle in bin/ able to execute as a standalone.
#### Ubuntu
If you're on Ubuntu, just go to terminal and run ./scripts/configure_ubuntu.sh
This should fetch all the required dependencies automatically.
#### Other Linux
With some tweaks to the ubuntu script, it shouldn't be a big hassle to compile it on a modern linux. Look in the script and see what you may have to modify.
### How to build statically (the hard way)
You're gonna have a bad time.
You're gonna have a bad time.
Building statically means you can distribute the final program without needing to pack alongside a lot of dynamic libraries.
This is a tricky process and is not recommended unless you know what you're doing.

View File

@ -0,0 +1,79 @@
<?xml version="1.0"?>
<manifest package="com.aceattorneyonline.ao2" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.6.2.0" android:versionCode="2" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Attorney Online 2" android:icon="@drawable/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="Attorney Online 2 Lobby" android:screenOrientation="unspecified" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- Application arguments -->
<!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
<!-- Application arguments -->
<meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
<meta-data android:name="android.app.repository" android:value="default"/>
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
<!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<!-- Messages maps -->
<!-- Splash screen -->
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
<!-- Splash screen -->
<!-- Background running -->
<!-- Warning: changing this value to true may cause unexpected crashes if the
application still try to draw after
"applicationStateChanged(Qt::ApplicationSuspended)"
signal is sent! -->
<meta-data android:name="android.app.background_running" android:value="false"/>
<!-- Background running -->
<!-- auto screen scale factor -->
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
<!-- auto screen scale factor -->
<!-- extract android style -->
<!-- available android:values :
* full - useful QWidget & Quick Controls 1 apps
* minimal - useful for Quick Controls 2 apps, it is much faster than "full"
* none - useful for apps that don't use any of the above Qt modules
-->
<meta-data android:name="android.app.extract_android_style" android:value="full"/>
<!-- extract android style -->
</activity>
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
</application>
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
Remove the comment if you do not require these default permissions. -->
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

62
android/build.gradle Normal file
View File

@ -0,0 +1,62 @@
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
repositories {
google()
jcenter()
}
apply plugin: 'com.android.application'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
android {
/*******************************************************
* The following variables:
* - androidBuildToolsVersion,
* - androidCompileSdkVersion
* - qt5AndroidDir - holds the path to qt android files
* needed to build any Qt application
* on Android.
*
* are defined in gradle.properties file. This file is
* updated by QtCreator and androiddeployqt tools.
* Changing them manually might break the compilation!
*******************************************************/
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion '28.0.3'
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qt5AndroidDir + '/res', 'res']
resources.srcDirs = ['resources']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
lintOptions {
abortOnError false
}
// Do not compress Qt binary resources file
aaptOptions {
noCompress 'rcc'
}
}

View File

@ -0,0 +1 @@
target=android-21

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,22 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<array name="qt_sources">
<item>https://download.qt.io/ministro/android/qt5/qt-5.14</item>
</array>
<!-- The following is handled automatically by the deployment tool. It should
not be edited manually. -->
<array name="bundled_libs">
<!-- %%INSERT_EXTRA_LIBS%% -->
</array>
<array name="qt_libs">
<!-- %%INSERT_QT_LIBS%% -->
</array>
<array name="load_local_libs">
<!-- %%INSERT_LOCAL_LIBS%% -->
</array>
</resources>

View File

@ -22,6 +22,10 @@
#include <QTextStream>
#include <QStringList>
#include <QColor>
#include <QScreen>
#ifdef QTAUDIO
#include <QAudioDeviceInfo>
#endif
#include <QtConcurrent/QtConcurrent>
#include <QThread>
@ -189,6 +193,9 @@ public:
// Returns the audio device used for the client.
QString get_audio_output_device();
#ifdef QTAUDIO
QAudioDeviceInfo QtAudioDevice;
#endif
// Returns whether the user would like to have custom shownames on by default.
bool get_showname_enabled_by_default();
@ -211,6 +218,9 @@ public:
//Returns the dimensions of widget with specified identifier from p_file
pos_size_type get_element_dimensions(QString p_identifier, QString p_file);
//Returns the name of the font with p_identifier from p_file
QString get_font_name(QString p_identifier, QString p_file);
//Returns the value of font_size with p_identifier from p_file
int get_font_size(QString p_identifier, QString p_file);
@ -332,7 +342,6 @@ public:
private:
const int RELEASE = 2;
const int MAJOR_VERSION = 7;
const int MINOR_VERSION = 2;
QString current_theme = "default";

View File

@ -1,13 +1,19 @@
#ifndef AOBLIPPLAYER_H
#define AOBLIPPLAYER_H
#if defined(BASSAUDIO)
#include "bass.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif
#include "aoapplication.h"
#include <QWidget>
#include <string.h>
#include <QDebug>
class AOBlipPlayer
{
public:
@ -15,16 +21,22 @@ public:
void set_blips(QString p_sfx);
void blip_tick();
void set_volume(int p_volume);
void set_volume(qreal p_volume);
int m_cycle = 0;
private:
QWidget *m_parent;
AOApplication *ao_app;
qreal m_volume;
int m_volume;
void set_volume_internal(qreal p_volume);
#if defined(BASSAUDIO)
HSTREAM m_stream_list[5];
#elif defined(QTAUDIO)
QSoundEffect m_blips;
#endif
};
#endif // AOBLIPPLAYER_H

View File

@ -35,8 +35,10 @@ protected:
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
/*
void dragLeaveEvent(QMouseEvent *e);
void dragEnterEvent(QMouseEvent *e);
*/
signals:
void evidence_clicked(int p_id);

View File

@ -1,7 +1,11 @@
#ifndef AOMUSICPLAYER_H
#define AOMUSICPLAYER_H
#if defined(BASSAUDIO)
#include "bass.h"
#elif defined(QTAUDIO)
#include <QMediaPlayer>
#endif
#include "aoapplication.h"
#include <QWidget>
@ -32,5 +36,37 @@ private:
HSTREAM m_stream;
};
#elif defined(QTAUDIO)
class AOMusicPlayer : public QObject
{
public:
AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
~AOMusicPlayer();
void play(QString p_song);
void set_volume(int p_value);
private:
QMediaPlayer m_player;
QWidget *m_parent;
AOApplication *ao_app;
int m_volume = 0;
};
#else
class AOMusicPlayer : public QObject
{
public:
AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
~AOMusicPlayer();
void play(QString p_song);
void set_volume(int p_value);
private:
QWidget *m_parent;
AOApplication *ao_app;
};
#endif
#endif // AOMUSICPLAYER_H

View File

@ -2,7 +2,13 @@
#define AOOPTIONSDIALOG_H
#include "aoapplication.h"
#ifdef BASSAUDIO
#include "bass.h"
#elif defined QTAUDIO
#include <QAudio>
#include <QAudioDeviceInfo>
#endif
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
@ -57,6 +63,8 @@ private:
QCheckBox *ui_discord_cb;
QLabel *ui_epilepsy_lbl;
QCheckBox *ui_epilepsy_cb;
QLabel *ui_language_label;
QComboBox *ui_language_combobox;
QWidget *ui_callwords_tab;
QWidget *ui_callwords_widget;

View File

@ -1,7 +1,12 @@
#ifndef AOSFXPLAYER_H
#define AOSFXPLAYER_H
#if defined(BASSAUDIO)
#include "bass.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif
#include "aoapplication.h"
#include <QWidget>
@ -17,15 +22,22 @@ public:
void play(QString p_sfx, QString p_char = "", QString shout = "");
void stop();
void set_volume(int p_volume);
void set_volume(qreal p_volume);
void setLooping(bool is_looping);
private:
QWidget *m_parent;
AOApplication *ao_app;
int m_volume = 0;
qreal m_volume = 0;
bool looping_sfx = false;
void set_volume_internal(qreal p_volume);
#if defined(BASSAUDIO)
HSTREAM m_stream;
#elif defined(QTAUDIO)
QSoundEffect m_sfx;
#endif
};
#endif // AOSFXPLAYER_H

View File

@ -10,6 +10,7 @@
#include "aomovie.h"
#include "aocharmovie.h"
#include "aomusicplayer.h"
#include "aooptionsdialog.h"
#include "aosfxplayer.h"
#include "aoblipplayer.h"
#include "aoevidencebutton.h"
@ -36,7 +37,6 @@
#include <QSlider>
#include <QVector>
#include <QCloseEvent>
#include <QSignalMapper>
#include <QMap>
#include <QTextBrowser>
#include <QSpinBox>
@ -60,6 +60,8 @@
#include <QFuture>
#include <QMetaObject>
#include <QLayout>
#include <QTextBoundaryFinder>
#include <stack>
class AOApplication;
@ -558,6 +560,7 @@ private:
void construct_char_select();
void set_char_select();
void set_char_select_page();
void char_clicked(int n_char);
void put_button_in_place(int starting, int chars_on_this_page);
void filter_character_list();
@ -673,14 +676,12 @@ private slots:
void on_char_select_left_clicked();
void on_char_select_right_clicked();
void on_char_search_changed(const QString& newtext);
void on_char_taken_clicked(int newstate);
void on_char_passworded_clicked(int newstate);
void on_char_search_changed();
void on_char_taken_clicked();
void on_char_passworded_clicked();
void on_spectator_clicked();
void char_clicked(int n_char);
void on_switch_area_music_clicked();
void on_casing_clicked();

View File

@ -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;

View File

@ -75,6 +75,8 @@ private:
QProgressBar *ui_progress_bar;
AOButton *ui_cancel;
QModelIndex last_model;
void set_size_and_pos(QWidget *p_widget, QString p_identifier);
public slots:
void fucking_threading_goddamn_it(QString fuckshitassgoddamnfuck);
@ -90,6 +92,7 @@ private slots:
void on_connect_released();
void on_about_clicked();
void on_server_list_clicked(QModelIndex p_model);
void on_server_list_doubleclicked(QModelIndex p_model);
void on_chatfield_return_pressed();
};

View File

@ -44,13 +44,11 @@ public:
QString ms_nosrv_hostname = "master.aceattorneyonline.com";
#endif
const int ms_port = 27016;
const quint16 ms_port = 27016;
const int timeout_milliseconds = 2000;
const int ms_reconnect_delay_ms = 7000;
// kind of arbitrary max buffer size
const size_t buffer_max_size = 16384;
// in seconds
const int ms_reconnect_delay = 7;
bool ms_partial_packet = false;
QString ms_temp_packet = "";

Binary file not shown.

View File

@ -0,0 +1,982 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation>Vom Server getrennt.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation>Fehler bei der Verbindung zum Master Server. Erneuter Versuch in %1 Sekunden.</translation>
</message>
<message>
<source>Error connecting to master server. Will try again in %n seconds.</source>
<translation type="vanished">Fehler bei der Verbindung zum Master Server. Erneuter Versuch in %n Sekunden.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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>Es gab einen Fehler beim Verbinden zum Master Server.
Wir verwenden mehrere Master Server um Ausfälle zu verhindern, jedoch hat der Client alle Möglichkeiten einen zu finden erschöpft.
Bitte prüfe deine Internetverbindung und Firewall, und versuche es erneut.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation>Version zu alt! Deine Version: %1
Bitte besuche aceattorneyonline.com für ein Update.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation>Du wurdest von AO befreit.
Schönen Urlaub.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation>Laden</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation>Lade Beweisstücke:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation>Lade Musik:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation>Lade Charaktere:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation>Du wurdest von diesem Server geschmissen.
Grund: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation>Du wurdest von diesem Server verbannt.
Grund: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation>Du bist von diesem Server verbannt.
Grund: %1</translation>
</message>
<message>
<source>You have been kicked from the server.
Reason: </source>
<translation type="vanished">Du wurdest von diesem Server geschmissen.
Grund: </translation>
</message>
<message>
<source>You are banned on this server.
Reason: </source>
<translation type="vanished">Du wurdest von diesem Server verbannt.
Grund: </translation>
</message>
<message>
<source>You have been kicked.</source>
<translation type="vanished">Du wurdest rausgeschmissen.</translation>
</message>
<message>
<source>You are banned on this server.</source>
<translation type="vanished">Du wurdest verbannt.</translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation>Fallansager</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation>Fallname:</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation>Verteidiger benötigt</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation>Kläger benötigt</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation>Richter benötigt</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation>Jury benötigt</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation>Stenograph benötigt</translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation>Spiel</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation>Theme:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation>Setzt das Theme. Wenn das neue Theme auch das Aussehen der Lobby verändert, must du diese neu laden um die Änderungen zu sehen.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation>Verlauf geht nach unten:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation>Wenn angehakt werden neue Nachrichten unten erscheinen (wie beim OOC). Das traditionelle (AO1) Verhalten wäre nicht angehakt.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation>Länge:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation>Die Menge an Nachrichten die aufgehoben werden bevor alte gelöscht werden. 0 bedeutet unendlich.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation>Standard Benutzername:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation>Dein OOC Name wird automatisch auf dies gesetzt.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation>Eigener Anzeigename:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation>Standardwert für die Anzeigename Box, welche den In-Charakter Namen bestimmt.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation>Rückfall MS:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation>Wenn dereingebaute Master Server fehlschlägt, wird das Spiel diesen hier verwenden.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation>Discord:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation>Erlaubt anderen auf Discord zu sehen auf welchem Server du spielst, welchen Charakter du spielst und wie lange.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation>Sprache:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation>Setzte die Sprache falls du nicht die Systemsprache verwenden möchtest.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="186"/>
<source>Callwords</source>
<translation>Alarmwörter</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="211"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Gib so viele Alarmwörter ein wie du möchtest. Groß/Kleinschreibung ist egal. Für jede Wort nur eine Zeile!&lt;br&gt;Bitte keine leere Zeile am Ende -- du bekommst sonst bei jeder Nachricht einen Alarm.&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="217"/>
<source>Audio</source>
<translation>Audio</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="228"/>
<source>Audio device:</source>
<translation>Audiogerät:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Sets the audio device for all sounds.</source>
<translation>Setzt das Audiogerät für all Geräusche.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="263"/>
<source>Music:</source>
<translation>Musik:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Sets the music&apos;s default volume.</source>
<translation>Setzt die Musiklautstärke.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="276"/>
<source>SFX:</source>
<translation>SFX:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation>Setzt die Lautstärke der Soundeffekte wie Einsprüche und die Geräusche der Charaktere.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="290"/>
<source>Blips:</source>
<translation>Blips:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation>Setzt die Lautstärke der Blips, das ist das Geräusch das die Charaktere beim Reden machen.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="309"/>
<source>Blip rate:</source>
<translation>Bliprate:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation>Setzt die Pause zwischen einzelnen Blips.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="321"/>
<source>Blank blips:</source>
<translation>Leere Blips:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation>Wenn angehakt wird das Spiel auch bei einem Leerzeichen einen Blip machen.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="334"/>
<source>Casing</source>
<translation>Fälle</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="348"/>
<source>This server supports case alerts.</source>
<translation>Dieser Server unterstützt Fallalarme.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="350"/>
<source>This server does not support case alerts.</source>
<translation>Dieser Server unterstützt Fallalarme nicht.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>Pretty self-explanatory.</source>
<translation>Eigentlich selbsterklärend.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="358"/>
<source>Casing:</source>
<translation>Fälle:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn ein Fall angekündigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="372"/>
<source>Defense:</source>
<translation>Verteidigung:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn ein Verteidiger benötigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="386"/>
<source>Prosecution:</source>
<translation>Kläger:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn ein Kläger benötigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="400"/>
<source>Judge:</source>
<translation>Richter:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn ein Richter benötigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="414"/>
<source>Juror:</source>
<translation>Jury:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn eine Jury benötigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="428"/>
<source>Stenographer:</source>
<translation>Stenograph:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation>Wenn angehakt wirst du benachrichtigt wenn ein Stenograph benötigt wird.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="442"/>
<source>CM:</source>
<translation>CM:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation>Wenn angehakt wirst du als potentielle CM angezeigt.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="456"/>
<source>Hosting cases:</source>
<translation>Fallleitung:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation>Wenn du CM bist, gib ein welche Fälle du spielen möchtest.</translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation>Passwort</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation>Zuschauer</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation>Suche</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation>Gesperrt</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation>Benutzt</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="217"/>
<source>Generating chars:
%1/%2</source>
<translation>Generiere Charaktere:
%1/%2</translation>
</message>
<message>
<source>Generating chars:
</source>
<translation type="vanished">Generiere Charaktere:
</translation>
</message>
<message>
<source>Could not find %1</source>
<translation type="vanished">Konnte %1 nicht finden.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation>Anzeigename</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation>Nachricht</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation>Vor</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation>Spiegeln</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation>Wache</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation>Fall</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation>Anzeigenamen</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation>Keine Unterbrechung</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation>Weiß</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation>Grün</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation>Rot</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation>Orange</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation>Blau</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation>Gelb</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation>Musik</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation>Sfx</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation>Blips</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation>Verlaufsgrenze</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation>Server</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation>Charakter ändern</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation>Aussehen neu laden</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation>Moderator rufen</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translation>A/M</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation>Voranimation</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation>Zurück zur Lobby</translation>
</message>
<message>
<source>You have been banned.</source>
<translation type="vanished">Du wurdest verbannt.</translation>
</message>
<message>
<source>%1 has played a song: %2</source>
<translation type="vanished">%1 hat ein Lied gespielt: %2</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation>Regenbogen</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation>Pink</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation>Cyan</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation>% Abstand</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation>Dir wurde der Wache Knopf gegeben.</translation>
</message>
<message>
<source>This does nohing, but there you go.</source>
<translation type="vanished">Dies bewirkt nichts, aber egal.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation>Dies bewirkt nichts, aber egal.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation>Du hast die Einstellungen geöffnet.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation>Du wirst nun mit </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation> gepaart, wenn der andere dies auch tut.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation>Du bist nicht mehr gepaart.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation>Hast du dich vertippt? Die ID konnte nicht erkannt werden.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation>Dein Abstand ist auf </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation>Der Abstand muss zwischen -100% und 100% liegen!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation>Das sieht nicht wie ein Abstand aus.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation>Du hast zwischen Musik- und Gebitsliste umgeschaltet.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation>Du hast Funktionen erzwungen die der Server eventuell nicht unterstützt. Möglicherweise wirst du nicht mehr sprechen können.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation>Deine Voranimation unterbrechen nun Text.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation>Deine Voranimation unterbrechen Text nicht.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation>Konnte chatlog.txt nicht öffnen.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation>Der IC Verlauf wurde gespeichert.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation>Du hattest keinen &apos;base/cases&apos; Ordner! Ich hab ihn nun angelegt aber bedenke das er leer sein wird.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation>Du musst einen Dateinamen angeben (ohne .ini). Stelle sicher das er im &apos;base/cases&apos; Ordner ist und das er korrekt formatiert ist.
Verfügbare Fälle: %1</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation>Fall von %1.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation>Gehe zu %1 für das CM Dokument.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation>Dein Fall &quot;%1&quot; wurde geladen!</translation>
</message>
<message>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: </source>
<translation type="vanished">Du musst einen Dateinamen angeben (ohne .ini). Stelle sicher das er im &apos;base/cases&apos; Ordner ist und das er korrekt formatiert ist.
Verfügbare Fälle: </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation>Zu viele Argumente! Du brauchst nur den Dateinamen, ohne Erweiterung.</translation>
</message>
<message>
<source>Case made by </source>
<translation type="vanished">Fall von </translation>
</message>
<message>
<source>Navigate to </source>
<translation type="vanished">Gehe zu </translation>
</message>
<message>
<source> for the CM doc.</source>
<translation type="vanished"> für das CM Dokument.</translation>
</message>
<message>
<source>Your case &quot;</source>
<translation type="vanished">Dein Fall &quot;</translation>
</message>
<message>
<source>&quot; was loaded!</source>
<translation type="vanished">&quot; wurde geladen!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation>Du hattest keinen &apos;base/cases&apos; Ordner! Ich hab ihn nun angelegt aber bedenke das er leer sein wird.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation>Du musst einen Dateinamen (ohne Erweiterung) angebenn, sowie den Gebietsstatus!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translation>Zu viele Argumente! Du brauchst nur den Dateinamen, ohne Erweiterung sowie den Gebietsstatus!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation>Erfolgreich gespeichert!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation>Master</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation>Grund:</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation>Moderator rufen</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation>Du musst einen Grund angeben.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation>Die Nachricht ist zu lang.</translation>
</message>
<message>
<source>Choose..</source>
<translation type="vanished">Wähle..</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation>Wähle...</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation>Bilder (*.png)</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation>Neues Beweisstück...</translation>
</message>
</context>
<context>
<name>Discord</name>
<message>
<source>Objection!</source>
<translation type="vanished">Einspruch!</translation>
</message>
<message>
<source>In Lobby</source>
<translation type="vanished">In Lobby</translation>
</message>
<message>
<source>Idle</source>
<translation type="vanished">Untätig</translation>
</message>
<message>
<source>In a Server</source>
<translation type="vanished">In einem Server</translation>
</message>
<message>
<source>Playing as %1</source>
<translation type="vanished">Spielt als %1</translation>
</message>
<message>
<source>Spectating</source>
<translation type="vanished">Zuschauend</translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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>Dein Client ist nicht korrekt eingerichtet.
Hast du ALLES von tiny.cc/getao heruntergeladen und entpackt, auch den großen &apos;base&apos; Ordner?</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation>Version: %1</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation>Laden</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;Der Gerichtsdrama Simulator&lt;p&gt;&lt;b&gt;Quelltext:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Leitende Entwicklung:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Danksagungen:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation>Online: %1/%2</translation>
</message>
<message>
<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="vanished">Attorney Online 2 wurde gemacht mit Qt 5.11.
Leitende Entwicklung:
longbyte1
OmniTroid
stonedDiscord
Unterstützende Entwicklung:
Fiercy
UI Design:
Ruekasu
Draxirch
Speziellen Dank:
Unishred
Argoneus
Noevain
Cronnicossy</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation>Offline</translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation>Fehler: %1</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translation>Hinweis</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,826 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="186"/>
<source>Callwords</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="211"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="217"/>
<source>Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="228"/>
<source>Audio device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Sets the audio device for all sounds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="263"/>
<source>Music:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Sets the music&apos;s default volume.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="276"/>
<source>SFX:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="290"/>
<source>Blips:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="309"/>
<source>Blip rate:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="321"/>
<source>Blank blips:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="334"/>
<source>Casing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="348"/>
<source>This server supports case alerts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="350"/>
<source>This server does not support case alerts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>Pretty self-explanatory.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="358"/>
<source>Casing:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="372"/>
<source>Defense:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="386"/>
<source>Prosecution:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="400"/>
<source>Judge:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="414"/>
<source>Juror:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="428"/>
<source>Stenographer:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="442"/>
<source>CM:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="456"/>
<source>Hosting cases:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="217"/>
<source>Generating chars:
%1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,883 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="es">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation>Desconectado del servidor.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation>Error al conectarse a la lista de servidores. Se intentará nuevamente en %1 segundos.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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>
<translatorcomment>I translated master servers as &quot;lista de servidores&quot; because literally nobody will understand if i make the literal translation &quot;servidor maestro&quot;. And in the end a master server is just a list of servers. Also removed the part about having multiple master servers, i just don&apos;t think the average user will understand this even if i do a good translation.</translatorcomment>
<translation>Hubo un error al obtener la lista de servidores. Verifique su conexión a Internet y firewall, y vuelva a intentarlo.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation>¡Versión desactualizada! Su versión: %1 Vaya a aceattorneyonline.com para actualizar.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation>Has sido exiliado de AO.
Que tengas un buen día.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation>Cargando</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation>Cargando evidencia:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation>Cargando música:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation>Cargando personajes:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation>Has sido expulsado del servidor.
Razón: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation>Has sido bloqueado de este servidor.
Razón: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation>Has sido bloqueado en este servidor.
Razón: %1</translation>
</message>
<message>
<source>You have been kicked from the server.
Reason: </source>
<translation type="obsolete">Has sido expulsado del servidor.
Razón: </translation>
</message>
<message>
<source>You are banned on this server.
Reason: </source>
<translation type="obsolete">Has sido bloqueado en este servidor.
Razón: </translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation>Anunciar caso</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation>Título del caso:</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation>Se necesita abogado</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation>Se necesita fiscal</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation>Se necesita juez</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation>Se necesita jurado</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation>Se necesita taquígrafo</translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation>Ajustes</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation>Jugabilidad</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation>Tema visual:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation>Establece el tema visual utilizado en el juego. Si el nuevo tema también cambia el aspecto del lobby, deberá volver a cargar el lobby para que los cambios surtan efecto, como unirse a un servidor y volver al lobby.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation>Invertir historial IC:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation>Si está marcado, los nuevos mensajes aparecerán en la parte inferior (como el chat OOC).</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation>Limite del historial:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation>La cantidad de mensajes que mantendrá el historial del chat IC antes de eliminar mensajes más antiguos. 0 significa &apos;infinito&apos;.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation>Usuario predeterminado:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation>Su nombre OOC se establecerá automáticamente a este cuando se una a un servidor.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation>Mostrar nombres:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation>Activa la casilla &apos;Mostrar nombres&apos; de forma predeterminada en el juego, que a su vez determina si el cliente debe mostrar nombres personalizados en los personajes.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation>Master SV de respaldo:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation>Si la lista de servidores predeterminada falla, el juego probará la dirección proporcionada aquí.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation>Discord:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation>Permite a otros en Discord ver en qué servidor estás, qué personaje juegas y cuánto tiempo has estado jugando.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation>Idioma:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation>Establece el idioma si no desea utilizar el idioma de su sistema.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="187"/>
<source>Callwords</source>
<translation>Palabras clave</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="212"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Ingrese tantas palabras de llamada como desee.&lt;br&gt;Esto no distingue entre mayúsculas y minúsculas. ¡Asegúrese de dejar cada palabra en su propia línea!&lt;br&gt;No deje una línea con un espacio al final; recibirá una alerta cada vez que alguien use un espacio en sus mensajes.&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="218"/>
<source>Audio</source>
<translation>Audio</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Audio device:</source>
<translation>Dispositivo:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="230"/>
<source>Sets the audio device for all sounds.</source>
<translation>Establece el dispositivo de audio.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Music:</source>
<translation>Música:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="265"/>
<source>Sets the music&apos;s default volume.</source>
<translation>Establece el volumen predeterminado de la música.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>SFX:</source>
<translation>SFX:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="278"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation>Establece el volumen predeterminado de SFX. Las interjecciones y los efectos de sonido reales cuentan como &apos;SFX&apos;.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Blips:</source>
<translation>Blips:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="292"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation>Establece el volumen de los blips, el sonido al hablar.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Blip rate:</source>
<translation>Tasa de blips:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="311"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation>Establece el retraso entre la reproducción de los sonidos blip.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>Blank blips:</source>
<translation>Blips en blanco:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="323"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation>Si está marcada, el juego reproducirá un sonido blip incluso cuando se &apos;dice&apos; un espacio.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="335"/>
<source>Casing</source>
<translation>Caso</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="349"/>
<source>This server supports case alerts.</source>
<translation>Este servidor admite alertas de casos.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>This server does not support case alerts.</source>
<translation>Este servidor no admite alertas de casos.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="352"/>
<source>Pretty self-explanatory.</source>
<translation>Bastante autoexplicativo.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>Casing:</source>
<translation>Caso:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="360"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation>Si está marcado, recibirá anuncios de casos.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>Defense:</source>
<translation>Abogado:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="374"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation>Si está marcado, recibirá alertas sobre anuncios de casos si hay un lugar de abogado libre.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>Prosecution:</source>
<translation>Fiscal:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="388"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation>Si está marcada, recibirá alertas sobre anuncios de casos si hay un puesto de fiscal libre.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>Judge:</source>
<translation>Juez:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="402"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation>Si está marcado, recibirá alertas sobre anuncios de casos si el puesto de juez está libre.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>Juror:</source>
<translation>Jurado:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="416"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation>Si está marcado, recibirá alertas sobre anuncios de casos si hay un puesto de jurado libre.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>Stenographer:</source>
<translation>Taquígrafo:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="430"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation>Si está marcado, recibirá alertas sobre anuncios de casos si hay un lugar de taquígrafo libre.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>CM:</source>
<translation>CM:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="444"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation>Si está marcado, aparecerá entre los posibles CM en el servidor.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>Hosting cases:</source>
<translation>Casos:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="458"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation>Si eres un CM, ingresa qué casos estás dispuesto a organizar.</translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation>Contraseña</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation>Espectador</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation>Buscar</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation>Contraseña</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation>En uso</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="218"/>
<source>Generating chars:
%1/%2</source>
<translation>Generando personajes:
%1/%2</translation>
</message>
<message>
<source>Generating chars:
</source>
<translation type="obsolete">Generando personajes:
</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation>Mensaje</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation>Guardia</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation>Caso</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation>Blanco</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation>Verde</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation>Rojo</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation>Naranja</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation>Azul</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation>Amarillo</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation>Arcoíris</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation>Rosado</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation>Cian</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation>% desplazamiento</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation>Ajustes</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translation>A/M</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation>Volver al lobby</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation>Te ha sido otorgado el botón Guardia.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation>Esto no hace nada, pero ahí lo tienes.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation>Abriste el menú de configuración.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation>Ahora te emparejarás con </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation> si ellos también eligen a tu personaje a cambio.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation>Ya no estás emparejado con nadie.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation>¿Estás seguro de que lo escribiste bien? El ID de personaje no pudo ser reconocido.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation>Ha configurado su desplazamiento en </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation>¡Su desplazamiento debe estar entre -100% y 100%!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation>Ese desplazamiento no se parece a uno.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation>Cambiaste tu lista de música y área.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation>Ha habilitado forzosamente funciones que el servidor puede no admitir. Es posible que no pueda hablar IC, o peor, debido a esto.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation>Sus pre-animaciones interrumpen de nuevo.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation>Sus pre-animaciones no interrumpirán el texto.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation>No se pudo abrir chatlog.txt para escribir.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation>El chat IC se ha guardado.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation>¡No tienes una carpeta `base/cases /`! Ha sido creada para ti. Pero debido a que no existia la carpeta, tampoco habían casos guardados ahí.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation>¡Debe dar un nombre de archivo para cargar (no se necesita extensión)! Asegúrese de que esté en la carpeta `base/cases/` y de que tenga el formato correcto.
Casos que puede cargar: %1</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation>Caso hecho por %1.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation>Navegue a %1 para el documento del CM.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation>Su caso &quot;%1&quot; fue cargado!</translation>
</message>
<message>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: </source>
<translation type="obsolete">¡Debe dar un nombre de archivo para cargar (no se necesita extensión)! Asegúrese de que esté en la carpeta `base/cases/` y de que tenga el formato correcto.
Casos que puede cargar: </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation>¡Demasiados argumentos para cargar un caso! Solo necesita un nombre de archivo, sin extensión.</translation>
</message>
<message>
<source>Case made by </source>
<translation type="obsolete">Caso hecho por </translation>
</message>
<message>
<source>Navigate to </source>
<translation type="obsolete">Navegue a </translation>
</message>
<message>
<source> for the CM doc.</source>
<translation type="obsolete"> para el documento de CM.</translation>
</message>
<message>
<source>Your case &quot;</source>
<translation type="obsolete">Su caso &quot;</translation>
</message>
<message>
<source>&quot; was loaded!</source>
<translation type="obsolete">&quot; fue cargado!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation>¡No tienes una carpeta `base/cases /`! Fue creada para ti.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation>¡Debe dar un nombre de archivo para guardar (no se necesita la extensión) y el estado de la sala del tribunal!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translatorcomment>why two exclamations, seems excesive.</translatorcomment>
<translation>¡Demasiados argumentos para salvar un caso! Solo necesita un nombre de archivo sin extensión y el estado de la sala del tribunal.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation>¡Guardado con éxito, puede editar el doc y doc link en el archivo ini!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation>Razón:</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation>Llamar Moderador</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation>Debes proporcionar una razón.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation>El mensaje es muy largo.</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation>Elegir...</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation>Imágenes (* .png)</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation>Añadir nueva evidencia...</translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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>No parece que su cliente esté configurado correctamente.
¿Descargó todos los recursos correctamente desde tiny.cc/getao, incluida la gran carpeta &apos;base&apos;?</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation>Versión: %1</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation>Cargando</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;El simulador de drama legal&lt;p&gt;&lt;b&gt;Código fuente:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https: //github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Desarrollo mayor:&lt;/b&gt; &lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Agradecimiento especial:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (diseño de interfaz de usuario), Draxirch (diseño de interfaz de usuario), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation>En línea: %1/%2</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation>Fuera de línea</translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation>Error: %1</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translatorcomment>In spanish it would be &quot;Aviso&quot;, but i believe it&apos;s going to be more useful for bug reports to not translate any debug string.</translatorcomment>
<translation>Notice</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,849 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ja_JP">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation>: %1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation>: %1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation>: %1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="186"/>
<source>Callwords</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="211"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="217"/>
<source>Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="228"/>
<source>Audio device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Sets the audio device for all sounds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="263"/>
<source>Music:</source>
<translation>:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Sets the music&apos;s default volume.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="276"/>
<source>SFX:</source>
<translation>:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="290"/>
<source>Blips:</source>
<translation>:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="309"/>
<source>Blip rate:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="321"/>
<source>Blank blips:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="334"/>
<source>Casing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="348"/>
<source>This server supports case alerts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="350"/>
<source>This server does not support case alerts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>Pretty self-explanatory.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="358"/>
<source>Casing:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="372"/>
<source>Defense:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="386"/>
<source>Prosecution:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="400"/>
<source>Judge:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="414"/>
<source>Juror:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="428"/>
<source>Stenographer:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="442"/>
<source>CM:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="456"/>
<source>Hosting cases:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="217"/>
<source>Generating chars:
%1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation>...</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation> (*.png)</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation>...</translation>
</message>
</context>
<context>
<name>Discord</name>
<message>
<source>Objection!</source>
<translation type="vanished">!</translation>
</message>
<message>
<source>In Lobby</source>
<translation type="vanished"></translation>
</message>
<message>
<source>Idle</source>
<translation type="vanished"></translation>
</message>
<message>
<source>In a Server</source>
<translation type="vanished"></translation>
</message>
<message>
<source>Spectating</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation></translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation>: %1</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,841 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pl_PL">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation>Odłączono od serwera.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation>Błąd podczas łączenia się do głównego serwera. Spróbuj ponownie za %1 sekundy.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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>Odkryto błąd podczas łączania się do głównego serwera.
Używamy wielu głównych serwerów, aby zminimalizować każdą możliwą przerwę, ale klient wyczerpał jaką kolwiek możliwość znalazienia i połączenia się do któregoś.
Proszę sprawdzić swoje połączenie internetowe oraz zaporę ogniową i spróbować ponownie.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation>Nieaktualna wersja! Twoja wersja: %1
Proszę udać się do aceattorneyonline.com, aby zaktualizować.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation>Zostałeś wygnany z AO2.
Życzę miłego dnia.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation>Ładowanie</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation>Ładowanie dowodów:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation>Ładowanie muzyki:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation>Ładowanie postaci:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation>Zostałeś wyrzucony z tego serwera.
Powód: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation>Zostałeś zbanowany z tego serwera.
Powód: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation>Jesteś zbanowany na tym serwerze.
Powód: %1</translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation>Ogłaszanie rozpraw</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation>Tytuł rozprawy:</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation>Potrzebny obrońca</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation>Potrzebny prokurator</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation>Potrzebny sędzia</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation>Potrzebny ławnik</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation>Potrzebny stenograf</translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation>Ustawienia</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation>Rozgrywka</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation>Motyw:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation>Ustawia motyw używany w grze. Jeżeli nowy motyw równiesz zmienia wygląd poczekalni, musisz odświeżyć poczekalnię, aby zmiany zaczęły działać, np. poprzez dołączenie do serwera i wyjście z niego.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation>Dziennik idzie w dół:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation>Jeżeli zaznaczone, nowe wiadomości zaczną się pojawiać na dole (tak jak na czacie OOC). Tradycyjne (AO1) zachowanie jest równoważne do tego bycia nie zaznaczonym.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation>Długość dziennika:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation>Ilość wiadomości, jakie czat IC będzie zostawiał zanim usunie starsze wiadomości. Wartośc 0 albo niżej, liczy się jako &apos;nieskończone&apos;.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation>Domyślna nazwa użytkownika:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation>Twoja nazwa OOC będzie ustawiana automatycznie do tej wartości, kiedy dołączysz na serwer.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation>Niestandardowe ksywki:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation>Daje domyślną wartość przyciskowi wyboru &apos;Niestandardowe ksywki&apos;, który określa czy klient powinien pokazywać niestandardowe IC nazwy.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation>Kopia zapasowa głównego serwera:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation>Jeśli wbudowane szukanie serwerów zawiedzie, gra spróbuje użyć adresu podanego tutaj i użyje go jako adresu zapasowego głównego serwera.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation>Pozwala innym na Discordzie zobaczyć na jakim serwerze się znajdujesz, jaką postać używasz i jak długo grałeś.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation>Język:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation>Ustawia język, jeśli nie chcesz używać języka systemowego.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="186"/>
<source>Callwords</source>
<translation>Zawołania</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="211"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Wpisz tyle zawołań, ile dusza zapragnie. Wielkość liter nie ma znaczenia. Miej na uwadze, aby każde zawołanie było na swojej lini!&lt;br&gt;Nie zostawiaj spacji na końcu -- zostaniesz zaalarmowany za każdym razem, kiedy ktoś użyje spacji w swojej wiadomości.&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="217"/>
<source>Audio</source>
<translation>Dźwięk</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="228"/>
<source>Audio device:</source>
<translation>Urządzenie dźwiękowe:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Sets the audio device for all sounds.</source>
<translation>Ustawia urządzenie dźwiękowe na wszystkie dźwięki.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="263"/>
<source>Music:</source>
<translation>Muzyka:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Sets the music&apos;s default volume.</source>
<translation>Ustawia domyślną głośność muzyki.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="276"/>
<source>SFX:</source>
<translation>Efekty dźwiękowe (SFX):</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation>Ustawia domyślną głośność efektów specjalnych (SFX). Wtrącenia się i same efekty specjalne zaliczane jako &apos;SFX&apos;.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="290"/>
<source>Blips:</source>
<translation>Blipy:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation>Ustawia głośność blipów, efektów dźwiękowych mówienia.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="309"/>
<source>Blip rate:</source>
<translation>Szybkość blipów:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation>Ustawia opóźnienie pomiędzy graniem blipów.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="321"/>
<source>Blank blips:</source>
<translatorcomment>The &apos;blip&apos; isn&apos;t an accurate polish representation of this english word.</translatorcomment>
<translation>Puste blipy:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation>Jeśli prawdziwe, gra zagra dźwięk blip za każdym razem spacja &apos;jest mówiona&apos;.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="334"/>
<source>Casing</source>
<translation>Rozprawa</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="348"/>
<source>This server supports case alerts.</source>
<translation>Ten serwer wspiera komunikaty rozpraw.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="350"/>
<source>This server does not support case alerts.</source>
<translation>Ten serwer nie wspiera komunikatów rozpraw.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>Pretty self-explanatory.</source>
<translation>Dosyć oczywiste.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="358"/>
<source>Casing:</source>
<translation>Rozprawy:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation>Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="372"/>
<source>Defense:</source>
<translation>Obrona:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation>Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce obrony jest otwarte.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="386"/>
<source>Prosecution:</source>
<translation>Prokuratura:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation>Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce prokuratury jest otwarte.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="400"/>
<source>Judge:</source>
<translation>Sędzia:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation>Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce sędzi jest otwarte.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="414"/>
<source>Juror:</source>
<translation>Ławnik:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation>Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce ławnika jest otwarte.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="428"/>
<source>Stenographer:</source>
<translation>Stenograf:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation>Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce stenografa jest otwarte.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="442"/>
<source>CM:</source>
<translation>Mistrz rozpraw (CM):</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation>Jeśli zaznaczone, pojawisz się wśród potencjalnych mistrzów rozpraw (CM) na serwerze.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="456"/>
<source>Hosting cases:</source>
<translation>Hostowane rozprawy:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation>Jeśli jesteś mistrzem rozpraw (CM), wpisz jakie rozprawy jesteś chętny hostowania.</translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation>Hasło</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation>Widz</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation>Wyszukaj</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation>Zahasłowany</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation>Zajęty</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="217"/>
<source>Generating chars:
%1/%2</source>
<translation>Generowanie postaci:
%1.%2</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation>Ksywka</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation>Wiadomość</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation>przed-</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation>Odwróć</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation>Na Służbie (mod)</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation>Rozprawa</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation>Ksywki</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation>Bez przerwy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation>Biały</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation>Zielony</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation>Czerwony</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation>Pomarańczowy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation>Niebieski</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation>Żółty</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation>To nic nie robi, ale proszę bardzo.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation>Musisz podać nazwę pliku, którego chcesz załadować (rozszerzenie nie potrzebne!) Upewnij się, że jest w folderze `base/cases/` i że jest to poprawnie sformatowane ini.
Rozprawy które możesz załadować: %1</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation>Rozprawa zrobiona przez %1.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation>Przejdź do %1, aby dojść do dokumentu CM.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation>Twoja rozprawa &quot;%1&quot; została wczytana!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation>Serwer</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation>Powrót do poczekalni</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation>Tęczowy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation>Różowy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation>Turkusowy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation>% wyrówanie</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation>Muzyka</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation>Sfx</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation>Blipy</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation>Limit dziennika</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation>Zmiena postaci</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation>Odśwież motyw</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation>Wezwij moda</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation>Ustawienia</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translatorcomment>O meaning &apos;Obszar&apos; and M meaning &apos;Muzyka&apos;.</translatorcomment>
<translation>O/M</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation>przed-animacja</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation>Zostałeś obdarzonym przyciskiem Na Służbie.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation>Otworzyłeś opcje.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation>Będzie teraz w parze z </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation> jeżeli oni również wybiorą ciebie spowrotem.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation>Nie jesteś już w parze z kimkolwiek.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation>Czy jesteś pewien, że dobrze to napisałeś? ID postaci nie zostało rozpoznane.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation>Musisz ustawić swoje wyrównanie do </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation>Twoje wyrównanie musi być między -100%, a 100%!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation>To wyrównanie nie wygląda na jedno.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation>Przełączyłeś swoją listę obszarów i muzyki.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation>Włączyłeś funkcje, które ten serwer może nie wspierać. Możliwe że, nie możesz rozmawiać na czacie IC lub gorzej przez to.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation>Twoje przed-animacje przerywają tekst spowrotem.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation>Twoje przed-animacje nie będą przerywać tekstu.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation>Nie można było otworzyć chatlog.txt, aby zapisać do niego.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation>Dziennik czatu IC został zapisany.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation>Nie masz folderu `base/cases/`! Został zrobiony tylko dla ciebie, ale widząc, że ZOSTAŁ zrobiony tylko dla ciebie, prawdopodobnie plik rozpraw, którego szukasz nie został znaleziony tutaj.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation>Za dużo parametrów, aby załadować rozprawę! Potrzebujesz tylko jedną nazwę pliku, bez rozszerzenia nazwy pliku.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation>Nie masz folderu `base/cases/`! Został zrobiony tylko dla ciebie, ale widząc, że ZOSTAŁ zrobiony tylko dla ciebie, prawdopodobnie jakoś usunąłeś go.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation>Musisz podać nazwę pliku, aby go zapisać (rozszerzenie nie potrzebne) i status sali sądowej!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translation>Za dużo parametrów, aby zapisać rozprawę! Potrzebujesz tylko jedną nazwę pliku, bez rozszerzenia nazwy pliku i statusu sali sądowej!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation>Zapisano pomyślnie, edytuj dokument i link cmdoc w .ini!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation>Główny</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation>Powód:</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation>Wezwij Moderatora</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation>Musisz podać przyczynę.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation>Ta wiadomość jest za długa.</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation>Wybierz...</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation>Plik obrazu (*.png)</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation>Dodaj nowe dowody...</translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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>Wygłąda na to, że twój klient nie jest ustawiony poprawnie.
Czy pobrałeś wszystkie zasoby poprawnie z tiny.cc/getao, włączając duży folder &apos;base&apos;?</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation>Wersja: %1</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation>Ładowanie</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation>&lt;h2&gt;Attorney Online: %1&lt;/h2&gt;Symulator dramy sądowej&lt;p&gt;&lt;b&gt;Kod żródłowy:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Główny rozwój:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Szczególne podziękowania:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation></translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation></translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation>Błąd: %1</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translation>Ogłoszenie</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,855 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>AOApplication</name>
<message>
<location filename="../../src/aoapplication.cpp" line="138"/>
<source>Disconnected from server.</source>
<translation>Соединение с сервером прервано.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="163"/>
<source>Error connecting to master server. Will try again in %1 seconds.</source>
<translation>Ошибка соединения с главным сервером. Попытка пересоединения будет через %1 с.</translation>
</message>
<message>
<location filename="../../src/aoapplication.cpp" line="167"/>
<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>Произошла ошибка соединения с главным сервером.
Пожалуйста, проверьте ваши Интернет-соединение, настройки браундмауэра, и попробуйте перезайти.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="106"/>
<source>Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.</source>
<translation>Устаревшая версия! У вас установлена %1
Проследуйте на сайт aceattorneyonline.com для обновления.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="114"/>
<source>You have been exiled from AO.
Have a nice day.</source>
<translation>Из AO вас отправили в жизнь.
Хорошего дня.</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="249"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="275"/>
<source>Loading</source>
<translation>Загрузка</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="363"/>
<source>Loading evidence:
%1/%2</source>
<translation>Загрузка вещдоков:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="395"/>
<location filename="../../src/packet_distribution.cpp" line="490"/>
<source>Loading music:
%1/%2</source>
<translation>Загрузка музыки:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="467"/>
<source>Loading chars:
%1/%2</source>
<translation>Загрузка персонажей:
%1/%2</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="642"/>
<source>You have been kicked from the server.
Reason: %1</source>
<translation>Вас выпнули с сервера.
Причина: %1</translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="651"/>
<source>You have been banned from the server.
Reason: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/packet_distribution.cpp" line="659"/>
<source>You are banned on this server.
Reason: %1</source>
<translation>Вас отправили в баню.
Причина: %1</translation>
</message>
<message>
<source>You have been kicked from the server.
Reason: </source>
<translation type="vanished">Вас выпнули с сервера.
Причина: </translation>
</message>
<message>
<source>You are banned on this server.
Reason: </source>
<translation type="vanished">Вас отправили в баню.
Причина: </translation>
</message>
</context>
<context>
<name>AOCaseAnnouncerDialog</name>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="9"/>
<source>Case Announcer</source>
<translation>Материалы дела</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="38"/>
<source>Case title:</source>
<translation>Название:</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="48"/>
<source>Defense needed</source>
<translation>Сторона защиты</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="50"/>
<source>Prosecution needed</source>
<translation>Сторона обвинения</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="52"/>
<source>Judge needed</source>
<translation>Без судьи никак</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="54"/>
<source>Jurors needed</source>
<translation>Суд присяжных</translation>
</message>
<message>
<location filename="../../src/aocaseannouncerdialog.cpp" line="56"/>
<source>Stenographer needed</source>
<translation>Нужен стенографист?</translation>
</message>
</context>
<context>
<name>AOOptionsDialog</name>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="11"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="40"/>
<source>Gameplay</source>
<translation>Игра</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="51"/>
<source>Theme:</source>
<translation>Тема:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="52"/>
<source>Sets the theme used in-game. If the new theme changes the lobby&apos;s look as well, you&apos;ll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.</source>
<translation>Устанавливает внешний вид игры. Может понадобиться перезайти на сервер.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="81"/>
<source>Log goes downwards:</source>
<translation>Портянку вниз:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="82"/>
<source>If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.</source>
<translation>Отметьте галочку, если хотите, чтобы сообщения в игровом чате отображались снизу, а не сверху.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="94"/>
<source>Log length:</source>
<translation>Длина игрового чата:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="95"/>
<source>The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as &apos;infinite&apos;.</source>
<translation>Количество сообщений, максимально хранимых в игровом чате. Значение, равное 0 или меньше, будет расценено как снятие такого ограничения.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="113"/>
<source>Default username:</source>
<translation>Никнейм по умолчанию:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="114"/>
<source>Your OOC name will be automatically set to this value when you join a server.</source>
<translation>Псевдоним, используемый при соединении с сервером. В основном, его видно в чате сервера.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="126"/>
<source>Custom shownames:</source>
<translation>Произвольные имена:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="127"/>
<source>Gives the default value for the in-game &apos;Custom shownames&apos; tickbox, which in turn determines whether the client should display custom in-character names.</source>
<translation>Отображать произвольные имена персонажей, установленные самими игроками.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="145"/>
<source>Backup MS:</source>
<translation>Запасной ГС:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="146"/>
<source>If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.</source>
<translation>Отображать перечень серверов от главного сервера, указанного здесь, когда не удалось соединиться с первичным ГС.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="158"/>
<source>Discord:</source>
<translation>Discord:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="159"/>
<source>Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.</source>
<translation>Показать в Discord сервер, на котором вы играете, каким персонажем управляете и время игры.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="171"/>
<source>Language:</source>
<translation>Язык:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="172"/>
<source>Sets the language if you don&apos;t want to use your system language.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="186"/>
<source>Callwords</source>
<translation>Позывные</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="211"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!&lt;br&gt;Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Введите на отдельных строках свои позывные, при указании которых в сообщениях будет подан звуковой сигнал.&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="217"/>
<source>Audio</source>
<translation>Аудио</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="228"/>
<source>Audio device:</source>
<translation>Устройство воспроизведения:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="229"/>
<source>Sets the audio device for all sounds.</source>
<translation>Куда вещать звук из игры.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="263"/>
<source>Music:</source>
<translation>Музыка:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="264"/>
<source>Sets the music&apos;s default volume.</source>
<translation>Громкость музыки по умолчанию.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="276"/>
<source>SFX:</source>
<translation>Звук. эффекты:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="277"/>
<source>Sets the SFX&apos;s default volume. Interjections and actual sound effects count as &apos;SFX&apos;.</source>
<translation>Громкость звуковых эффектов по умолчанию.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="290"/>
<source>Blips:</source>
<translation>Сигналы:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="291"/>
<source>Sets the volume of the blips, the talking sound effects.</source>
<translation>Громкость сигналов, заменяющих голос, по умолчанию.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="309"/>
<source>Blip rate:</source>
<translation>Пер. сигналов:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="310"/>
<source>Sets the delay between playing the blip sounds.</source>
<translation>Период между сигналами, заменяющими голос, по умолчанию.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="321"/>
<source>Blank blips:</source>
<translation>Пустые сигналы:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="322"/>
<source>If true, the game will play a blip sound even when a space is &apos;being said&apos;.</source>
<translation>Проигрывать сигналы даже для пробелов.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="334"/>
<source>Casing</source>
<translation>Заседание</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="348"/>
<source>This server supports case alerts.</source>
<translation>Этот сервер поддерживает объявление заседания.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="350"/>
<source>This server does not support case alerts.</source>
<translation>Этот сервер не поддерживает объявление заседания.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="351"/>
<source>Pretty self-explanatory.</source>
<translation>Весьма доходчиво.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="358"/>
<source>Casing:</source>
<translation>Новое дело:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="359"/>
<source>If checked, you will get alerts about case announcements.</source>
<translation>При заведении дела вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="372"/>
<source>Defense:</source>
<translation>Защита:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="373"/>
<source>If checked, you will get alerts about case announcements if a defense spot is open.</source>
<translation>При заведении дела, в котором нужна сторона защиты, вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="386"/>
<source>Prosecution:</source>
<translation>Обвинение:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="387"/>
<source>If checked, you will get alerts about case announcements if a prosecutor spot is open.</source>
<translation>При заведении дела, в котором нужна сторона обвинения, вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="400"/>
<source>Judge:</source>
<translation>Судья:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="401"/>
<source>If checked, you will get alerts about case announcements if the judge spot is open.</source>
<translation>При заведении дела, в котором нужен судья, вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="414"/>
<source>Juror:</source>
<translation>Присяжный:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="415"/>
<source>If checked, you will get alerts about case announcements if a juror spot is open.</source>
<translation>При заведении дела, в котором нужны присяжные заседатели, вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="428"/>
<source>Stenographer:</source>
<translation>Стенографист:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="429"/>
<source>If checked, you will get alerts about case announcements if a stenographer spot is open.</source>
<translation>При заведении дела, в котором нужна стенография, вы получите уведомление.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="442"/>
<source>CM:</source>
<translation>ПД:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="443"/>
<source>If checked, you will appear amongst the potential CMs on the server.</source>
<translation>Отметьте, если вы хотите состоять в числе производителей дел.</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="456"/>
<source>Hosting cases:</source>
<translation>ПД акт.:</translation>
</message>
<message>
<location filename="../../src/aooptionsdialog.cpp" line="457"/>
<source>If you&apos;re a CM, enter what cases you are willing to host.</source>
<translation>Будучи производителем дела (ПД), вы можете войти в зону и заниматься её оркестровкой.</translation>
</message>
</context>
<context>
<name>Courtroom</name>
<message>
<location filename="../../src/charselect.cpp" line="21"/>
<source>Password</source>
<translation>Пароль</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="27"/>
<source>Spectator</source>
<translation>Наблюдатель</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="30"/>
<location filename="../../src/courtroom.cpp" line="138"/>
<source>Search</source>
<translation>Поиск</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="35"/>
<source>Passworded</source>
<translation>Ограничен паролем</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="39"/>
<source>Taken</source>
<translation>Занят</translation>
</message>
<message>
<location filename="../../src/charselect.cpp" line="217"/>
<source>Generating chars:
%1/%2</source>
<translation>Генерация персонажей:
%1/%2</translation>
</message>
<message>
<source>Generating chars:
</source>
<translation type="vanished">Генерация персонажей:
</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="116"/>
<source>Showname</source>
<translation>Имя</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="120"/>
<source>Message</source>
<translation>Сообщение</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="130"/>
<source>Name</source>
<translation>Никнейм</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="183"/>
<source>Pre</source>
<translation>Пред.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="186"/>
<source>Flip</source>
<translation>Разв.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="190"/>
<source>Guard</source>
<translation>Охрана</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="195"/>
<location filename="../../src/courtroom.cpp" line="608"/>
<source>Casing</source>
<translation>Дело</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="200"/>
<source>Shownames</source>
<translation>Произв. имена</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="203"/>
<source>No Interrupt</source>
<translation>Говорить сразу</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="217"/>
<source>White</source>
<translation>Белый</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="218"/>
<source>Green</source>
<translation>Зелëный</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="219"/>
<source>Red</source>
<translation>Красный</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="220"/>
<source>Orange</source>
<translation>Оранжевый</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="221"/>
<source>Blue</source>
<translation>Синий</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="222"/>
<source>Yellow</source>
<translation>Жëлтый</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2688"/>
<source>This does nothing, but there you go.</source>
<translation>В общем-то, это ни на что не влияет...</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2824"/>
<source>You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1</source>
<translation>Укажите имя файла с делом (без расширения) для загрузки. Убедитесь, что оно расположено в папке `base/cases`.
Были найдены: %1</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2845"/>
<source>Case made by %1.</source>
<translation>Дело завëл игрок: %1.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2851"/>
<source>Navigate to %1 for the CM doc.</source>
<translation>Перейдите к %1 для получения материалов дела.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2870"/>
<source>Your case &quot;%1&quot; was loaded!</source>
<translation>Дело под кодовым названием &quot;%1&quot; готово!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="583"/>
<location filename="../../src/courtroom.cpp" line="2959"/>
<source>Server</source>
<translation>Сервер</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="692"/>
<source>Back to Lobby</source>
<translation>Назад в лобби</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="223"/>
<source>Rainbow</source>
<translation>Радужный</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="224"/>
<source>Pink</source>
<translation>Розовый</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="225"/>
<source>Cyan</source>
<translation>Голубой</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="248"/>
<source>% offset</source>
<translation>% сдвига</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="566"/>
<source>Music</source>
<translation>Музыка</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="568"/>
<source>Sfx</source>
<translation>Звук. эффекты</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="570"/>
<source>Blips</source>
<translation>Сигналы</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="573"/>
<source>Log limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="596"/>
<source>Change character</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="599"/>
<source>Reload theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="602"/>
<source>Call mod</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="605"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="611"/>
<source>A/M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="614"/>
<source>Preanim</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2681"/>
<source>You were granted the Guard button.</source>
<translation>Теперь у вас есть кнопка &quot;Охрана&quot;.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2695"/>
<source>You opened the settings menu.</source>
<translation>Вы открыли меню настроек.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2710"/>
<source>You will now pair up with </source>
<translation>Вы встанете парой с персонажем по имени </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2712"/>
<source> if they also choose your character in return.</source>
<translation> (если он выберет вас в ответ).</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2718"/>
<source>You are no longer paired with anyone.</source>
<translation>Теперь вы не стоите в парах.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2723"/>
<source>Are you sure you typed that well? The char ID could not be recognised.</source>
<translation>Кажется, вам нужно поменять запрос: такой идентификатор персонажа не был найден.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2739"/>
<source>You have set your offset to </source>
<translation>Вы установили сдвиг персонажа на </translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2746"/>
<source>Your offset must be between -100% and 100%!</source>
<translation>Сдвиг персонажа должен быть между -100% и 100%!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2751"/>
<source>That offset does not look like one.</source>
<translation>Неверный сдвиг персонажа.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2757"/>
<source>You switched your music and area list.</source>
<translation>Вы переключили перечень зон и музыки.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2764"/>
<source>You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.</source>
<translation>Из-за того, что вы включили не поддержимаемые сервером возможности, он может не принять ваши сообщения.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2775"/>
<source>Your pre-animations interrupt again.</source>
<translation>Персонаж будет говорить только после анимации.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2777"/>
<source>Your pre-animations will not interrupt text.</source>
<translation>Персонаж будет говорить и во время анимации.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2788"/>
<source>Couldn&apos;t open chatlog.txt to write into.</source>
<translation>Не могу открыть `chatlog.txt` для записи лога.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2801"/>
<source>The IC chatlog has been saved.</source>
<translation>Лог игрового чата сохранëн.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2813"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely the case file you&apos;re looking for can&apos;t be found in there.</source>
<translation>Файл с делом не найден. Если найдëте, положите его в папку `base/cases/`, которую мы для вас создали.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2832"/>
<source>Too many arguments to load a case! You only need one filename, without extension.</source>
<translation>Введите имя файла без расширения.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2882"/>
<source>You don&apos;t have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it&apos;s likely that you somehow deleted it.</source>
<translation>Папка `base/cases/` отсутствует!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2893"/>
<source>You need to give a filename to save (extension not needed) and the courtroom status!</source>
<translation>Введите имя файла (без расширения) и предоставьте статус зоны.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2901"/>
<source>Too many arguments to save a case! You only need a filename without extension and the courtroom status!</source>
<translation>Убедитесь, что имя файла не содержит расширение.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2923"/>
<source>Succesfully saved, edit doc and cmdoc link on the ini!</source>
<translation>Сохранение прошло успешно!</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="2951"/>
<source>Master</source>
<translation>Мастер</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3422"/>
<source>Reason:</source>
<translation>Причина:</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3423"/>
<source>Call Moderator</source>
<translation>Позвать модератора</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3431"/>
<source>You must provide a reason.</source>
<translation>Укажите причину.</translation>
</message>
<message>
<location filename="../../src/courtroom.cpp" line="3434"/>
<source>The message is too long.</source>
<translation>Слишком длинный текст.</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="25"/>
<source>Choose...</source>
<translation>Выбрать...</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="194"/>
<source>Images (*.png)</source>
<translation>Изображения (*.png)</translation>
</message>
<message>
<location filename="../../src/evidence.cpp" line="268"/>
<source>Add new evidence...</source>
<translation>Добавить новую улику...</translation>
</message>
</context>
<context>
<name>Lobby</name>
<message>
<location filename="../../src/lobby.cpp" line="12"/>
<source>Attorney Online 2</source>
<translation>Attorney Online 2</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="29"/>
<source>Name</source>
<translation>Никнейм</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="74"/>
<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>Не похоже, что ваш клиент установлен правильно.
Скачали ли вы все ресурсы (tiny.cc/getao), включая огромную папку `base`?</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="104"/>
<source>Version: %1</source>
<translation>Версия: %1</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="147"/>
<source>Loading</source>
<translation>Загрузка</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="151"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="270"/>
<source>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;The courtroom drama simulator&lt;p&gt;&lt;b&gt;Source code:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Major development:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Special thanks:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source>
<translation>&lt;h2&gt;Attorney Online %1&lt;/h2&gt;Симулятор судебной драмы&lt;p&gt;&lt;b&gt;Исходный код:&lt;/b&gt; &lt;a href=&apos;https://github.com/AttorneyOnline/AO2-Client&apos;&gt;https://github.com/AttorneyOnline/AO2-Client&lt;/a&gt;&lt;p&gt;&lt;b&gt;Основной разработкой занимались:&lt;/b&gt;&lt;br&gt;OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter&lt;p&gt;&lt;b&gt;Особенная благодарность:&lt;/b&gt;&lt;br&gt;Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (дизайн интерфейса), Draxirch (дизайн интерфейса), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="376"/>
<source>Online: %1/%2</source>
<translation>Онлайн: %1/%2</translation>
</message>
<message>
<location filename="../../src/lobby.cpp" line="114"/>
<location filename="../../src/lobby.cpp" line="316"/>
<source>Offline</source>
<translation>Вне сети</translation>
</message>
</context>
<context>
<name>debug_functions</name>
<message>
<location filename="../../src/debug_functions.cpp" line="10"/>
<source>Error: %1</source>
<translation>Ошибка: %1</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="11"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../../src/debug_functions.cpp" line="23"/>
<source>Notice</source>
<translation>На заметку</translation>
</message>
</context>
</TS>

View File

@ -2,5 +2,11 @@
<qresource prefix="/">
<file>resource/fonts/Ace-Attorney.ttf</file>
<file>resource/logo.png</file>
<file>resource/translations/ao_de.qm</file>
<file>resource/translations/ao_en.qm</file>
<file>resource/translations/ao_jp.qm</file>
<file>resource/translations/ao_es.qm</file>
<file>resource/translations/ao_ru.qm</file>
<file>resource/translations/ao_pl.qm</file>
</qresource>
</RCC>

6
scripts/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
node_modules/
# Cursed file
package-lock.json
s3_keys.sh

42
scripts/configure_macos.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/sh
# This script fetches all build dependencies for MacOS
# Tested on MacOS 10.14 (Mojave), Qt 5.13 and XCode 10.2
# Exit on errors and unset variables
set -eu
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
cd ${ROOT_DIR}
LIB_TARGET="../../lib"
BASS_LINK="http://uk.un4seen.com/files/bass24-osx.zip"
BASSOPUS_LINK="http://www.un4seen.com/files/bassopus24-osx.zip"
DISCORD_RPC_LINK="https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-osx.zip"
APNG_LINK="https://github.com/Skycoder42/QtApng/releases/download/1.1.2-2/qtapng_clang_64_5.13.0.tar.xz"
# Easier if we don't need to worry about an existing tmp folder tbh smh
# v Add a slash here for free tmp folder cleanup in true javascript community style
rm -rf tmp
mkdir tmp
cd tmp
curl -Ls ${BASS_LINK} -o bass.zip
unzip -qq bass.zip
cp libbass.dylib ${LIB_TARGET}
curl -Ls ${BASSOPUS_LINK} -o bassopus.zip
unzip -qq bassopus.zip
cp libbassopus.dylib ${LIB_TARGET}
curl -Ls ${DISCORD_RPC_LINK} -o discord_rpc.zip
unzip -qq discord_rpc.zip
cp discord-rpc/osx-dynamic/lib/libdiscord-rpc.dylib ${LIB_TARGET}
curl -Ls ${APNG_LINK} -o apng.tar.xz
tar -xf apng.tar.xz
cp clang_64/plugins/imageformats/libqapng.dylib ../../lib
cd ..
rm -rf tmp

View File

@ -1,10 +1,18 @@
#!/bin/bash
#assumes a somewhat recent 64-bit ubuntu
# Assumes a somewhat recent 64-bit ubuntu
# Exit on errors and unset variables
set -eu
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
cd "${ROOT_DIR}"
#need some openGL stuff
sudo apt install libgl1-mesa-dev
#install curl incase of fresh vm
sudo apt install curl
mkdir tmp
cd tmp

33
scripts/macos_build.sh Executable file
View File

@ -0,0 +1,33 @@
#!/bin/sh
set -Eexo pipefail
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig
export PATH=$PATH:/usr/local/opt/qt5/bin:/usr/local/bin
mkdir bass
cd bass
curl http://www.un4seen.com/files/bass24-osx.zip -o bass.zip
unzip bass.zip
cp libbass.dylib ../lib
curl http://www.un4seen.com/files/bassopus24-osx.zip -o bassopus.zip
unzip bassopus.zip
cp libbassopus.dylib ../lib
cd ..
mkdir discord-rpc
cd discord-rpc
curl -L https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-osx.zip -o discord_rpc_osx.zip
unzip discord_rpc_osx.zip
cp discord-rpc/osx-static/lib/libdiscord-rpc.a ../lib
cd ..
mkdir qtapng
cd qtapng
curl -L https://github.com/Skycoder42/QtApng/releases/download/1.1.0-5/build_clang_64_5.12.0.tar.xz -o apng.tar.xz
tar -xvf apng.tar.xz
cp clang_64/plugins/imageformats/libqapng.dylib ../lib
cd ..
/usr/local/opt/qt/bin/qmake && make -j2

24
scripts/macos_post_build.sh Normal file → Executable file
View File

@ -1,16 +1,22 @@
#!/bin/bash
#!/bin/sh
DST_FOLDER="./bin/Attorney_Online.app/Contents/Frameworks"
# This script prepares the compiled bundle for shipping as a standalone release
# Assumes the Qt bin folder is in PATH
# Should be used on a "Release" build from QT creator
# Note that this DOES NOT add the base/ folder
cd ..
# Exit on errors and unset variables
set -eu
mkdir $DST_FOLDER
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
cp ./lib/libbass.dylib $DST_FOLDER
cp ./lib/libbassopus.dylib $DST_FOLDER
cd ${ROOT_DIR}
install_name_tool -id @executable_path/../Frameworks/libbass.dylib $DST_FOLDER/libbass.dylib
# This thing basically does all the work
/usr/local/opt/qt/bin/macdeployqt ../bin/Attorney_Online.app
install_name_tool -id @executable_path/../Frameworks/libbassopus.dylib $DST_FOLDER/libbassopus.dylib
# Need to add the dependencies
cp ../lib/* ../bin/Attorney_Online.app/Contents/Frameworks
install_name_tool -change @loader_path/libbass.dylib @executable_path/../Frameworks/libbass.dylib ./bin/Attorney_Online.app/Contents/MacOS/Attorney_Online
# libbass has a funny path for some reason, just use rpath
install_name_tool -change @loader_path/libbass.dylib @rpath/libbass.dylib ../bin/Attorney_Online.app/Contents/MacOS/Attorney_Online

9
scripts/package.json Normal file
View File

@ -0,0 +1,9 @@
{
"name": "ao-ci-scripts",
"version": "1.0.0",
"main": "update_manifest.js",
"dependencies": {
"argparse": "^1.0.10"
},
"license": "ISC"
}

22
scripts/release_macos.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
# This script prepares the compiled bundle for shipping as a standalone release
# Assumes the Qt bin folder is in PATH
# Should be used on a "Release" build from QT creator
# Note that this DOES NOT add the base/ folder
# Exit on errors and unset variables
set -eu
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
cd ${ROOT_DIR}
# This thing basically does all the work
macdeployqt ../bin/Attorney_Online.app
# Need to add the dependencies
cp ../lib/* ../bin/Attorney_Online.app/Contents/Frameworks
# libbass has a funny path for some reason, just use rpath
install_name_tool -change @loader_path/libbass.dylib @rpath/libbass.dylib ../bin/Attorney_Online.app/Contents/MacOS/Attorney_Online

151
scripts/update_manifest.js Executable file
View File

@ -0,0 +1,151 @@
#!/usr/bin/env node
const fs = require("fs");
const crypto = require("crypto");
const path = require("path");
const ArgumentParser = require("argparse").ArgumentParser;
function isFile(file) {
if (!fs.existsSync(file)) {
console.error(`File '${file}' not found. Try again.`);
throw Error();
}
return file;
}
const argParser = new ArgumentParser({
addHelp: true,
description: "Adds a new latest version to the manifest file based on the " +
"provided zip file, including an incremental update."
});
argParser.addArgument("manifestFile", {
metavar: "<manifest file>", type: isFile
});
argParser.addArgument("version", {
metavar: "<version>"
});
argParser.addArgument([ "-f", "--full" ], {
metavar: "<full zip file>", type: isFile, nargs: 1,
dest: "fullZipFileArgs"
});
argParser.addArgument([ "-i", "--incremental" ], {
type: isFile, nargs: 2, dest: "incrementalArgs",
metavar: ["<incremental zip file>", "<file containing list of changed files>"]
});
argParser.addArgument([ "-e", "--executable" ], {
metavar: "[executable file]", nargs: 1,
dest: "executableArgs"
});
const {
manifestFile,
version,
fullZipFileArgs,
incrementalArgs,
executableArgs
} = argParser.parseArgs();
const [incrementalZipFile, changesFile] = incrementalArgs || [];
const [fullZipFile] = fullZipFileArgs || [];
const [executable] = executableArgs || [];
// Do one final check
if (!incrementalZipFile && !fullZipFile) {
console.error("No download archive specified! Abort.");
process.exit(1);
}
// Do a quick litmus test to prevent deleting everything incorrectly
if (changesFile && !fs.existsSync("base")) {
console.error("The working directory must be set to an " +
"asset folder in order for deleted directories " +
"to be calculated correctly. Abort.");
process.exit(1);
}
const manifest = JSON.parse(fs.readFileSync(manifestFile));
const dirsDeleted = new Set();
const specialActions = changesFile ?
fs.readFileSync(changesFile)
.toString()
.trim()
.split("\n")
.map(line => line.split("\t"))
.map(([mode, target, source]) => {
switch (mode[0]) {
case "D": // Deleted
// Check if the folder exists relative to the working
// directory, and if not, add it to the dirsDeleted list.
// Keep going up the tree to see how many directories were
// deleted.
let dir = path.dirname(target);
while (!dirsDeleted.has(dir) && !fs.existsSync(dir)) {
dirsDeleted.add(dir);
dir = path.dirname(dir);
}
return { action: "delete", target };
case "R": // Renamed
// NOTE: Make sure that the launcher's implementation of
// the move action also creates directories when needed.
return { action: "move", source, target};
default:
return null;
}
})
// Remove ignored file mode changes
.filter(action => action !== null)
// Create actions based on directories to be deleted.
// Always have deeper directories first, to guarantee that deleting
// higher-level directories will succeed.
.concat(Array.from(dirsDeleted.values())
.sort((a, b) => b.split("/").length - a.split("/").length)
.map(dir => {
return { action: "deleteDir", target: dir };
}))
: [];
const urlBase = "https://s3.wasabisys.com/ao-downloads/";
const versionEntry = {
version,
executable,
prev: manifest.versions[0] ? manifest.versions[0].version : undefined,
full: fullZipFile ? [
{
action: "dl",
url: urlBase + encodeURIComponent(path.basename(fullZipFile)),
hash: crypto.createHash("sha1")
.update(fs.readFileSync(fullZipFile))
.digest("hex")
}
] : undefined,
update: incrementalArgs ? [
...specialActions,
{
action: "dl",
url: urlBase + encodeURIComponent(path.basename(incrementalZipFile)),
hash: crypto.createHash("sha1")
.update(fs.readFileSync(incrementalZipFile))
.digest("hex")
}
] : undefined
};
console.log("Generated version entry:", versionEntry);
const existingVersions = manifest.versions.filter(v => v.version == version);
if (existingVersions.length > 0) {
console.warn(`Warning: version ${version} already exists. Adding new values.`);
// Don't overwrite prev - it will cause headaches
delete versionEntry.prev;
Object.assign(existingVersions[0], versionEntry);
console.log("Merged version entry:", existingVersions[0]);
} else {
manifest.versions = [versionEntry, ...manifest.versions];
}
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 4));

View File

@ -0,0 +1,39 @@
#!/usr/bin/env node
const fs = require("fs");
const crypto = require("crypto");
const [ _nodeExe, _jsPath, manifestFile, version, zipFile ] = process.argv;
if (!manifestFile || !version || !zipFile) {
console.log(`Usage: update_program_manifest <manifest file> <version> <zip file>`);
console.log(`Adds a new latest version to the manifest file based on the ` +
`provided zip file.`);
process.exit(1);
}
if (!fs.existsSync(manifestFile)) {
console.error(`Manifest file '${manifestFile}' not found. Try again.`);
process.exit(2);
}
if (!fs.existsSync(zipFile)) {
console.error(`Zip file '${zipFile}' not found. Try again.`);
process.exit(2);
}
const manifest = JSON.parse(fs.readFileSync(manifestFile));
manifest.versions = [{
version,
executable: "Attorney_Online.exe",
full: [
{
action: "dl",
url: "https://s3.wasabisys.com/ao-downloads/" + encodeURIComponent(zipFile),
hash: crypto.createHash("sha1").update(fs.readFileSync(zipFile)).digest("hex")
}
]
}, ...manifest.versions];
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 4));

73
scripts/wasabi.sh Executable file
View File

@ -0,0 +1,73 @@
#!/bin/bash
# Updates the specified program manifest to a new archive and version
# and uploads the new archive and manifest to S3/Wasabi.
#
# Requires:
# MANIFEST: name of the manifest file
# S3_ACCESS_KEY, S3_SECRET_KEY: S3 credentials
# S3_MANIFESTS, S3_ARCHIVES: S3 paths to manifests and downloads
# ARCHIVE_FULL: name of the full archive (if desired)
# ARCHIVE_INCR: name of the incremental archive (if desired)
# VERSION: name of the new version
# EXECUTABLE: name of the executable (if program manifest)
# -E: inherit ERR trap by shell functions
# -e: stop script on ERR trap
# -u: stop script on unbound variables
# -x: print command before running it
# -o pipefail: fail if any command in a pipeline fails
set -Eeuxo pipefail
aws configure set aws_access_key_id ${S3_ACCESS_KEY}
aws configure set aws_secret_access_key ${S3_SECRET_KEY}
aws configure set default.region us-east-1
export S3_COPY="aws s3 cp --endpoint-url=https://s3.wasabisys.com"
export ARCHIVE_FULL_ARG=""
export ARCHIVE_INCR_ARG=""
export EXECUTABLE_ARG=""
export LAST_TAGGED_VERSION=$(git rev-list --tags --skip=1 --max-count=1)
echo "Previous tagged version: ${LAST_TAGGED_VERSION}"
echo "Current tagged version: ${VERSION}"
if [[ -n $ARCHIVE_INCR && -n $LAST_TAGGED_VERSION ]]; then
echo "Incremental archive: ${ARCHIVE_INCR}"
# Get all files
export CHANGES_FILE="changes.txt"
git diff --name-status ${LAST_TAGGED_VERSION}..HEAD > ${CHANGES_FILE}
# Get added/modified files
git diff --name-only --diff-filter=dr ${LAST_TAGGED_VERSION}..HEAD | \
zip ${ARCHIVE_INCR} -@
export ARCHIVE_INCR_ARG="-i ${ARCHIVE_INCR} ${CHANGES_FILE}"
elif [[ -n $ARCHIVE_INCR && -z $LAST_TAGGED_VERSION ]]; then
echo "Incremental archive was requested, but there is no previous version"
fi
if [[ -n $ARCHIVE_FULL ]]; then
echo "Full archive: ${ARCHIVE_INCR}"
export ARCHIVE_FULL_ARG="-f ${ARCHIVE_FULL}"
fi
if [[ -v EXECUTABLE ]]; then
export EXECUTABLE_ARG="-e ${EXECUTABLE}"
fi
${S3_COPY} ${S3_MANIFESTS}/${MANIFEST} .
node $(dirname $0)/update_manifest.js ${MANIFEST} ${VERSION} \
${ARCHIVE_FULL_ARG} ${ARCHIVE_INCR_ARG} ${EXECUTABLE_ARG}
if [[ -n $ARCHIVE_INCR_ARG ]]; then
${S3_COPY} ${ARCHIVE_INCR} ${S3_ARCHIVES}
fi
if [[ -n $ARCHIVE_FULL_ARG ]]; then
${S3_COPY} ${ARCHIVE_FULL} ${S3_ARCHIVES}
fi
${S3_COPY} ${MANIFEST} ${S3_MANIFESTS}

35
scripts/wasabi_program.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
# Updates the specified program manifest to a new archive and version
# and uploads the new archive and manifest to S3/Wasabi.
#
# Requires:
# MANIFEST: name of the manifest file
# ARTIFACT_SUFFIX: suffix of the archive to be uploaded (including extension)
# S3_ACCESS_KEY and S3_SECRET_KEY
# -E: inherit ERR trap by shell functions
# -e: stop script on ERR trap
# -u: stop script on unbound variables
# -x: print command before running it
# -o pipefail: fail if any command in a pipeline fails
set -Eeuxo pipefail
aws configure set aws_access_key_id ${S3_ACCESS_KEY}
aws configure set aws_secret_access_key ${S3_SECRET_KEY}
aws configure set default.region us-east-1
export S3_COPY="aws s3 cp --endpoint-url=https://s3.wasabisys.com"
export S3_MANIFESTS="s3://ao-manifests"
export S3_ARCHIVES="s3://ao-downloads"
export VERSION=$(git describe --tags)
export ARCHIVE="Attorney_Online_${VERSION}_${ARTIFACT_SUFFIX}"
${S3_COPY} ${S3_MANIFESTS}/${MANIFEST} .
node $(dirname $0)/update_manifest.js ${MANIFEST} ${VERSION} \
-f ${ARCHIVE} -e Attorney_Online.exe
${S3_COPY} ${ARCHIVE} ${S3_ARCHIVES}
${S3_COPY} ${MANIFEST} ${S3_MANIFESTS}
rm -f ${MANIFEST}

View File

@ -0,0 +1,14 @@
FROM oldmud0/mxe-qt:5.13.0-win32-static-posix
#FROM fffaraz/qt:windows
ENV TARGET_SPEC i686-w64-mingw32.static.posix
# Build Discord RPC statically
RUN git clone https://github.com/discordapp/discord-rpc
WORKDIR discord-rpc/build
RUN /opt/mxe/usr/bin/${TARGET_SPEC}-cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mxe/usr/${TARGET_SPEC}
RUN /opt/mxe/usr/bin/${TARGET_SPEC}-cmake --build . --config Release --target install
WORKDIR ../..
# NOTE: Do not build QtApng statically! libpng contains a self-test entry point that
# takes precedence for some reason over the final build's entry point.

View File

@ -0,0 +1,44 @@
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y \
autoconf \
automake \
autopoint \
bash \
bison \
bzip2 \
flex \
g++ \
g++-multilib \
gettext \
git \
gperf \
intltool \
libc6-dev-i386 \
libgdk-pixbuf2.0-dev \
libltdl-dev \
libssl-dev \
libtool-bin \
libxml-parser-perl \
lzip \
make \
openssl \
p7zip-full \
patch \
perl \
pkg-config \
python \
ruby \
sed \
unzip \
wget \
xz-utils
RUN git clone https://github.com/mxe/mxe.git
RUN mv mxe /opt/mxe
WORKDIR /opt/mxe
RUN make -j4 MXE_TARGETS="i686-w64-mingw32.static.posix" qtbase qtmultimedia libarchive
ENV PATH=/opt/mxe/usr/bin:$PATH
WORKDIR /

View File

@ -0,0 +1,19 @@
When you want to build a new version of Qt:
```docker
docker build -t mxe-windows-static . -f Dockerfile-mxe
docker tag mxe-windows-static oldmud0/mxe-qt:5.12.1-win32-static-posix
docker push oldmud0/mxe-qt:5.12.1-win32-static-posix
```
Remember to log into Docker Hub before attempting to push.
When you want to build a new version of any dependency required for building AO:
```docker
docker build -t mxe-windows-static-ao . -f Dockerfile
docker tag mxe-windows-static-ao registry.gitlab.com/attorneyonline/ao2-client/builder-windows-i686
docker push registry.gitlab.com/attorneyonline/ao2-client/builder-windows-i686
```
Remember to create an access token in GitLab before attempting to push.
GitLab CI depends on `builder-windows-i686` image to be present in the repository's registry in order for the Windows build to succeed.

View File

@ -37,9 +37,9 @@ void AOApplication::construct_lobby()
w_lobby = new Lobby(this);
lobby_constructed = true;
QRect screenGeometry = QApplication::desktop()->screenGeometry();
int x = (screenGeometry.width()-w_lobby->width()) / 2;
int y = (screenGeometry.height()-w_lobby->height()) / 2;
QRect geometry = QGuiApplication::primaryScreen()->geometry();
int x = (geometry.width()-w_lobby->width()) / 2;
int y = (geometry.height()-w_lobby->height()) / 2;
w_lobby->move(x, y);
if (is_discord_enabled())
@ -72,9 +72,9 @@ void AOApplication::construct_courtroom()
w_courtroom = new Courtroom(this);
courtroom_constructed = true;
QRect screenGeometry = QApplication::desktop()->screenGeometry();
int x = (screenGeometry.width()-w_courtroom->width()) / 2;
int y = (screenGeometry.height()-w_courtroom->height()) / 2;
QRect geometry = QGuiApplication::primaryScreen()->geometry();
int x = (geometry.width()-w_courtroom->width()) / 2;
int y = (geometry.height()-w_courtroom->height()) / 2;
w_courtroom->move(x, y);
}
@ -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();
}
@ -160,16 +160,15 @@ void AOApplication::ms_connect_finished(bool connected, bool will_retry)
if (will_retry)
{
if (lobby_constructed)
w_lobby->append_error("Error connecting to master server. Will try again in "
+ QString::number(net_manager->ms_reconnect_delay_ms / 1000.f) + " seconds.");
w_lobby->append_error(tr("Error connecting to master server. Will try again in %1 seconds.").arg(QString::number(net_manager->ms_reconnect_delay)));
}
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."));
}
}
}

View File

@ -1,5 +1,6 @@
#include "aoblipplayer.h"
#if defined(BASSAUDIO) //Using bass.dll for the blips
AOBlipPlayer::AOBlipPlayer(QWidget *parent, AOApplication *p_ao_app)
{
m_parent = parent;
@ -17,7 +18,7 @@ void AOBlipPlayer::set_blips(QString p_sfx)
m_stream_list[n_stream] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_UNICODE | BASS_ASYNCFILE);
}
set_volume(m_volume);
set_volume_internal(m_volume);
}
void AOBlipPlayer::blip_tick()
@ -28,20 +29,89 @@ void AOBlipPlayer::blip_tick()
m_cycle = 0;
HSTREAM f_stream = m_stream_list[f_cycle];
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(f_stream, BASS_GetDevice());
BASS_ChannelPlay(f_stream, false);
}
void AOBlipPlayer::set_volume(int p_value)
void AOBlipPlayer::set_volume(qreal p_value)
{
m_volume = p_value;
m_volume = p_value / 100;
set_volume_internal(m_volume);
}
float volume = p_value / 100.0f;
void AOBlipPlayer::set_volume_internal(qreal p_value)
{
float volume = p_value;
for (int n_stream = 0 ; n_stream < 5 ; ++n_stream)
{
BASS_ChannelSetAttribute(m_stream_list[n_stream], BASS_ATTRIB_VOL, volume);
}
}
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
AOBlipPlayer::AOBlipPlayer(QWidget *parent, AOApplication *p_ao_app)
{
m_parent = parent;
ao_app = p_ao_app;
}
void AOBlipPlayer::set_blips(QString p_sfx)
{
QString f_path = ao_app->get_sounds_path(p_sfx);
for (int n_stream = 0 ; n_stream < 5 ; ++n_stream)
{
m_blips.setSource(QUrl::fromLocalFile(f_path));
}
set_volume_internal(m_volume);
}
void AOBlipPlayer::blip_tick()
{
int f_cycle = m_cycle++;
if (m_cycle == 5)
m_cycle = 0;
m_blips.play();
}
void AOBlipPlayer::set_volume(qreal p_value)
{
m_volume = p_value / 100;
set_volume_internal(m_volume);
}
void AOBlipPlayer::set_volume_internal(qreal p_value)
{
m_blips.setVolume(m_volume);
}
#else //No audio
AOBlipPlayer::AOBlipPlayer(QWidget *parent, AOApplication *p_ao_app)
{
m_parent = parent;
ao_app = p_ao_app;
}
void AOBlipPlayer::set_blips(QString p_sfx)
{
}
void AOBlipPlayer::blip_tick()
{
}
void AOBlipPlayer::set_volume(qreal p_value)
{
}
void AOBlipPlayer::set_volume_internal(qreal p_value)
{
}
#endif

View File

@ -86,6 +86,7 @@ void AOEvidenceButton::mouseDoubleClickEvent(QMouseEvent *e)
evidence_double_clicked(m_id);
}
/*
void AOEvidenceButton::dragLeaveEvent(QMouseEvent *e)
{
//QWidget::dragLeaveEvent(e);
@ -95,6 +96,7 @@ void AOEvidenceButton::dragEnterEvent(QMouseEvent *e)
{
//QWidget::dragEnterEvent(e);
}
*/
void AOEvidenceButton::enterEvent(QEvent * e)
{

View File

@ -1,6 +1,6 @@
#include "aomusicplayer.h"
#if defined(BASSAUDIO)
AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
@ -55,3 +55,75 @@ void AOMusicPlayer::kill_loop()
BASS_ChannelStop(m_stream);
}
#elif defined(QTAUDIO)
AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
}
AOMusicPlayer::~AOMusicPlayer()
{
m_player.stop();
}
void AOMusicPlayer::play(QString p_song)
{
m_player.stop();
QString f_path = ao_app->get_music_path(p_song);
m_player.setMedia(QUrl::fromLocalFile(f_path));
this->set_volume(m_volume);
m_player.play();
}
void AOMusicPlayer::set_volume(int p_value)
{
m_volume = p_value;
m_player.setVolume(m_volume);
}
QString AOMusicPlayer::get_path()
{
return f_path;
}
void AOMusicPlayer::kill_loop()
{
// TODO QTAUDIO
}
#else
AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
}
AOMusicPlayer::~AOMusicPlayer()
{
}
void AOMusicPlayer::play(QString p_song)
{
}
void AOMusicPlayer::set_volume(int p_value)
{
}
QString AOMusicPlayer::get_path()
{
return f_path;
}
void AOMusicPlayer::kill_loop()
{
}
#endif

View File

@ -1,6 +1,5 @@
#include "aooptionsdialog.h"
#include "aoapplication.h"
#include "bass.h"
AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDialog(parent)
{
@ -178,6 +177,21 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_epilepsy_cb);
ui_language_label = new QLabel(ui_form_layout_widget);
ui_language_label->setText(tr("Language:"));
ui_language_label->setToolTip(tr("Sets the language if you don't want to use your system language."));
ui_gameplay_form->setWidget(10, QFormLayout::LabelRole, ui_language_label);
ui_language_combobox = new QComboBox(ui_form_layout_widget);
ui_language_combobox->addItem(configini->value("language", " ").value<QString>() + " - Keep current setting");
ui_language_combobox->addItem(" - Default");
ui_language_combobox->addItem("en - English");
ui_language_combobox->addItem("de - Deutsch");
ui_language_combobox->addItem("es - Español");
ui_language_combobox->addItem("jp - 日本語");
ui_language_combobox->addItem("ru - Русский");
ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_language_combobox);
// Here we start the callwords tab.
ui_callwords_tab = new QWidget();
ui_settings_tabs->addTab(ui_callwords_tab, tr("Callwords"));
@ -229,22 +243,30 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_audio_device_combobox = new QComboBox(ui_audio_widget);
// Let's fill out the combobox with the available audio devices.
// Let's fill out the combobox with the available audio devices. Or don't if there is no audio
int a = 0;
BASS_DEVICEINFO info;
if (needs_default_audiodev())
{
ui_audio_device_combobox->addItem("default");
}
ui_audio_device_combobox->addItem("default");
}
#ifdef BASSAUDIO
BASS_DEVICEINFO info;
for (a = 0; BASS_GetDeviceInfo(a, &info); a++)
{
ui_audio_device_combobox->addItem(info.name);
if (p_ao_app->get_audio_output_device() == info.name)
ui_audio_device_combobox->setCurrentIndex(ui_audio_device_combobox->count()-1);
}
#elif defined QTAUDIO
foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
{
ui_audio_device_combobox->addItem(deviceInfo.deviceName());
if (p_ao_app->get_audio_output_device() == deviceInfo.deviceName())
ui_audio_device_combobox->setCurrentIndex(ui_audio_device_combobox->count()-1);
}
#endif
ui_audio_layout->setWidget(0, QFormLayout::FieldRole, ui_audio_device_combobox);
ui_audio_volume_divider = new QFrame(ui_audio_widget);
@ -510,6 +532,7 @@ void AOOptionsDialog::save_pressed()
configini->setValue("master", ui_ms_textbox->text());
configini->setValue("discord", ui_discord_cb->isChecked());
configini->setValue("shakeandflash", ui_epilepsy_cb->isChecked());
configini->setValue("language", ui_language_combobox->currentText().left(2));
QFile* callwordsini = new QFile(ao_app->get_base_path() + "callwords.ini");

View File

@ -1,6 +1,7 @@
#include "aosfxplayer.h"
#include "file_functions.h"
#if defined(BASSAUDIO) //Using bass.dll for sfx
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
@ -31,7 +32,7 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
BASS_ChannelStop(m_stream);
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
set_volume(m_volume);
set_volume_internal(m_volume);
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
@ -56,9 +57,95 @@ void AOSfxPlayer::stop()
BASS_ChannelStop(m_stream);
}
void AOSfxPlayer::set_volume(int p_value)
void AOSfxPlayer::set_volume(qreal p_value)
{
m_volume = p_value;
float volume = p_value / 100.0f;
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
m_volume = p_value / 100;
set_volume_internal(m_volume);
}
void AOSfxPlayer::set_volume_internal(qreal p_value)
{
float volume = p_value;
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
}
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
}
void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
{
m_sfx.stop();
QString misc_path = "";
QString char_path = "";
QString sound_path = ao_app->get_sounds_path(p_sfx);
if (shout != "")
misc_path = ao_app->get_base_path() + "misc/" + shout + "/" + p_sfx;
if (p_char != "")
char_path = ao_app->get_character_path(p_char, p_sfx);
QString f_path;
if (file_exists(char_path))
f_path = char_path;
else if (file_exists(misc_path))
f_path = misc_path;
else
f_path = sound_path;
if (file_exists(f_path)) //if its missing, it will glitch out
{
m_sfx.setSource(QUrl::fromLocalFile(f_path));
set_volume_internal(m_volume);
m_sfx.play();
}
}
void AOSfxPlayer::stop()
{
m_sfx.stop();
}
void AOSfxPlayer::set_volume(qreal p_value)
{
m_volume = p_value/100;
set_volume_internal(m_volume);
}
void AOSfxPlayer::set_volume_internal(qreal p_value)
{
m_sfx.setVolume(m_volume);
}
#else
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
}
void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
{
}
void AOSfxPlayer::stop()
{
}
void AOSfxPlayer::set_volume(qreal p_value)
{
}
void AOSfxPlayer::set_volume_internal(qreal p_value)
{
}
#endif

View File

@ -97,7 +97,6 @@ void Courtroom::construct_char_select()
set_size_and_pos(ui_char_buttons, "char_buttons");
connect (char_button_mapper, SIGNAL(mapped(int)), this, SLOT(char_clicked(int)));
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
@ -105,9 +104,9 @@ void Courtroom::construct_char_select()
connect(ui_spectator, SIGNAL(clicked()), this, SLOT(on_spectator_clicked()));
connect(ui_char_search, SIGNAL(textEdited(const QString&)), this, SLOT(on_char_search_changed(const QString&)));
connect(ui_char_passworded, SIGNAL(stateChanged(int)), this, SLOT(on_char_passworded_clicked(int)));
connect(ui_char_taken, SIGNAL(stateChanged(int)), this, SLOT(on_char_taken_clicked(int)));
connect(ui_char_search, SIGNAL(textEdited(const QString&)), this, SLOT(on_char_search_changed()));
connect(ui_char_passworded, SIGNAL(stateChanged(int)), this, SLOT(on_char_passworded_clicked()));
connect(ui_char_taken, SIGNAL(stateChanged(int)), this, SLOT(on_char_taken_clicked()));
}
void Courtroom::set_char_select()
@ -189,6 +188,7 @@ void Courtroom::char_clicked(int n_char)
}
else
{
ao_app->send_server_packet(new AOPacket("PW#" + ui_char_password->text() + "#%"));
ao_app->send_server_packet(new AOPacket("CC#" + QString::number(ao_app->s_pv) + "#" + QString::number(n_char) + "#" + get_hdid() + "#%"));
}
@ -280,17 +280,17 @@ void Courtroom::filter_character_list()
set_char_select_page();
}
void Courtroom::on_char_search_changed(const QString& newtext)
void Courtroom::on_char_search_changed()
{
filter_character_list();
}
void Courtroom::on_char_passworded_clicked(int newstate)
void Courtroom::on_char_passworded_clicked()
{
filter_character_list();
}
void Courtroom::on_char_taken_clicked(int newstate)
void Courtroom::on_char_taken_clicked()
{
filter_character_list();
}

View File

@ -2,10 +2,10 @@
Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
#ifdef BASSAUDIO
// Change the default audio output device to be the one the user has given
// in his config.ini file for now.
int a = 0;
unsigned int a = 0;
BASS_DEVICEINFO info;
if (ao_app->get_audio_output_device() == "default")
@ -20,13 +20,29 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
if (ao_app->get_audio_output_device() == info.name)
{
BASS_SetDevice(a);
BASS_Init(a, 48000, BASS_DEVICE_LATENCY, nullptr, nullptr);
BASS_Init(static_cast<int>(a), 48000, BASS_DEVICE_LATENCY, nullptr, nullptr);
load_bass_opus_plugin();
qDebug() << info.name << "was set as the default audio output device.";
break;
}
}
}
#elif defined QTAUDIO
if (ao_app->get_audio_output_device() != "default")
{
foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
{
if (ao_app->get_audio_output_device() == deviceInfo.deviceName())
{
ao_app->QtAudioDevice = deviceInfo;
qDebug() << deviceInfo.deviceName() << "was set as the default audio output device.";
break;
}
}
}
#endif
keepalive_timer = new QTimer(this);
keepalive_timer->start(60000);
@ -47,20 +63,22 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
testimony_hide_timer = new QTimer(this);
testimony_hide_timer->setSingleShot(true);
char_button_mapper = new QSignalMapper(this);
music_player = new AOMusicPlayer(this, ao_app);
music_player->set_volume(0);
sfx_player = new AOSfxPlayer(this, ao_app);
sfx_player->set_volume(0);
objection_player = new AOSfxPlayer(this, ao_app);
objection_player->set_volume(0);
misc_sfx_player = new AOSfxPlayer(this, ao_app);
misc_sfx_player->set_volume(0);
frame_emote_sfx_player = new AOSfxPlayer(this, ao_app);
frame_emote_sfx_player->set_volume(0);
pair_frame_emote_sfx_player = new AOSfxPlayer(this, ao_app); // todo: recode pair // todo: recode fucking everything
pair_frame_emote_sfx_player->set_volume(0);
blip_player = new AOBlipPlayer(this, ao_app);
blip_player->set_volume(0);
@ -133,7 +151,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_ooc_chat_name = new QLineEdit(this);
ui_ooc_chat_name->setFrame(false);
ui_ooc_chat_name->setPlaceholderText("Name");
ui_ooc_chat_name->setPlaceholderText(tr("Name"));
ui_ooc_chat_name->setMaxLength(30);
ui_ooc_chat_name->setText(p_ao_app->get_default_username());
@ -186,13 +204,18 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_switch_area_music = new AOButton(this, ao_app);
ui_pre = new QCheckBox(this);
ui_pre->setText("Pre");
ui_pre->setText(tr("Pre"));
ui_flip = new QCheckBox(this);
ui_flip->setText("Flip");
ui_flip->setText(tr("Flip"));
ui_flip->hide();
ui_guard = new QCheckBox(this);
ui_guard->setText("Disable Modcalls");
ui_guard->setText(tr("Disable Modcalls"));
ui_guard->hide();
ui_casing = new QCheckBox(this);
ui_casing->setChecked(ao_app->get_casing_enabled());
ui_casing->setText(tr("Casing"));
@ -218,15 +241,15 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_prosecution_minus = new AOButton(this, ao_app);
ui_text_color = new QComboBox(this);
ui_text_color->addItem("White");
ui_text_color->addItem("Green");
ui_text_color->addItem("Red");
ui_text_color->addItem("Orange");
ui_text_color->addItem("Blue");
ui_text_color->addItem("Yellow");
ui_text_color->addItem("Rainbow");
ui_text_color->addItem("Pink");
ui_text_color->addItem("Cyan");
ui_text_color->addItem(tr("White"));
ui_text_color->addItem(tr("Green"));
ui_text_color->addItem(tr("Red"));
ui_text_color->addItem(tr("Orange"));
ui_text_color->addItem(tr("Blue"));
ui_text_color->addItem(tr("Yellow"));
ui_text_color->addItem(tr("Rainbow"));
ui_text_color->addItem(tr("Pink"));
ui_text_color->addItem(tr("Cyan"));
ui_music_slider = new QSlider(Qt::Horizontal, this);
ui_music_slider->setRange(0, 100);
@ -245,10 +268,11 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_log_limit_spinbox->setValue(ao_app->get_max_log_size());
ui_mute_list = new QListWidget(this);
ui_pair_list = new QListWidget(this);
ui_pair_offset_spinbox = new QSpinBox(this);
ui_pair_offset_spinbox->setRange(-100,100);
ui_pair_offset_spinbox->setSuffix("% offset");
ui_pair_offset_spinbox->setSuffix(tr("% offset"));
ui_pair_button = new AOButton(this, ao_app);
ui_evidence_button = new AOButton(this, ao_app);
@ -566,14 +590,14 @@ void Courtroom::set_widgets()
ui_prosecution_bar->set_image("prosecutionbar" + QString::number(prosecution_bar_state) + ".png");
set_size_and_pos(ui_music_label, "music_label");
ui_music_label->setText("Music");
ui_music_label->setText(tr("Music"));
set_size_and_pos(ui_sfx_label, "sfx_label");
ui_sfx_label->setText("Sfx");
ui_sfx_label->setText(tr("Sfx"));
set_size_and_pos(ui_blip_label, "blip_label");
ui_blip_label->setText("Blips");
ui_blip_label->setText(tr("Blips"));
set_size_and_pos(ui_log_limit_label, "log_limit_label");
ui_log_limit_label->setText("Log limit");
ui_log_limit_label->setText(tr("Log limit"));
set_size_and_pos(ui_hold_it, "hold_it");
ui_hold_it->set_image("holdit.png");
@ -583,7 +607,7 @@ void Courtroom::set_widgets()
ui_take_that->set_image("takethat.png");
set_size_and_pos(ui_ooc_toggle, "ooc_toggle");
ui_ooc_toggle->setText("Server");
ui_ooc_toggle->setText(tr("Server"));
set_size_and_pos(ui_witness_testimony, "witness_testimony");
ui_witness_testimony->set_image("witnesstestimony.png");
@ -596,25 +620,25 @@ void Courtroom::set_widgets()
ui_not_guilty->set_image("notguilty.png");
set_size_and_pos(ui_change_character, "change_character");
ui_change_character->setText("Change character");
ui_change_character->setText(tr("Change character"));
set_size_and_pos(ui_reload_theme, "reload_theme");
ui_reload_theme->setText("Reload theme");
ui_reload_theme->setText(tr("Reload theme"));
set_size_and_pos(ui_call_mod, "call_mod");
ui_call_mod->setText("Call mod");
ui_call_mod->setText(tr("Call mod"));
set_size_and_pos(ui_settings, "settings");
ui_settings->setText("Settings");
ui_settings->setText(tr("Settings"));
set_size_and_pos(ui_announce_casing, "casing_button");
ui_announce_casing->setText("Casing");
ui_announce_casing->setText(tr("Casing"));
set_size_and_pos(ui_switch_area_music, "switch_area_music");
ui_switch_area_music->setText("A/M");
ui_switch_area_music->setText(tr("A/M"));
set_size_and_pos(ui_pre, "pre");
ui_pre->setText("Preanim");
ui_pre->setText(tr("Preanim"));
set_size_and_pos(ui_pre_non_interrupt, "pre_no_interrupt");
set_size_and_pos(ui_flip, "flip");
@ -695,7 +719,7 @@ void Courtroom::set_widgets()
ui_selector->hide();
set_size_and_pos(ui_back_to_lobby, "back_to_lobby");
ui_back_to_lobby->setText("Back to Lobby");
ui_back_to_lobby->setText(tr("Back to Lobby"));
set_size_and_pos(ui_char_password, "char_password");
@ -738,7 +762,9 @@ void Courtroom::set_font(QWidget *widget, QString p_identifier)
int f_weight = ao_app->get_font_size(p_identifier, design_file);
QString class_name = widget->metaObject()->className();
widget->setFont(QFont("Sans", f_weight));
QString fontt = ao_app->get_font_name(p_identifier + "_font", design_file);
widget->setFont(QFont(fontt, f_weight));
QColor f_color = ao_app->get_color(p_identifier + "_color", design_file);
@ -2333,6 +2359,7 @@ void Courtroom::chat_tick()
//do not perform heavy operations here
QString f_message = m_chatmessage[MESSAGE];
f_message.remove(0, tick_pos);
// Due to our new text speed system, we always need to stop the timer now.
chat_tick_timer->stop();
@ -2347,7 +2374,7 @@ void Courtroom::chat_tick()
f_message.remove(0,2);
}
if (tick_pos >= f_message.size())
if (f_message.size() == 0)
{
text_state = 2;
if (anim_state != 4)
@ -2359,9 +2386,21 @@ void Courtroom::chat_tick()
else
{
QString f_character = f_message.at(tick_pos);
QTextBoundaryFinder tbf(QTextBoundaryFinder::Grapheme, f_message);
QString f_character;
int f_char_length;
tbf.toNextBoundary();
if (tbf.position() == -1)
f_character = f_message;
else
f_character = f_message.left(tbf.position());
f_char_length = f_character.length();
f_character = f_character.toHtmlEscaped();
if (f_character == " ")
ui_vp_message->insertPlainText(" ");
@ -2466,7 +2505,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
tick_pos--;
tick_pos -= f_char_length;
}
}
@ -2487,7 +2526,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
tick_pos--;
tick_pos -= f_char_length;
}
}
@ -2531,11 +2570,7 @@ void Courtroom::chat_tick()
case INLINE_GREY:
ui_vp_message->insertHtml("<font color=\""+ get_text_color("_inline_grey").name() +"\">" + f_character + "</font>");
break;
default:
ui_vp_message->insertHtml(f_character);
break;
}
}
else
{
@ -2586,7 +2621,7 @@ void Courtroom::chat_tick()
if(blank_blip)
qDebug() << "blank_blip found true";
if (f_message.at(tick_pos) != ' ' || blank_blip)
if (f_character != ' ' || blank_blip)
{
if (blip_pos % blip_rate == 0 && !formatting_char)
@ -2598,7 +2633,7 @@ void Courtroom::chat_tick()
++blip_pos;
}
++tick_pos;
tick_pos += f_char_length;
// Restart the timer, but according to the newly set speeds, if there were any.
// Keep the speed at bay.
@ -2625,6 +2660,7 @@ void Courtroom::chat_tick()
}
}
void Courtroom::show_testimony()
{
if (!testimony_in_progress || m_chatmessage[SIDE] != "wit")
@ -2997,19 +3033,24 @@ void Courtroom::on_ooc_return_pressed()
toggle_judge_buttons(false);
}
}
else if (ooc_message.startsWith("/login"))
{
ui_guard->show();
append_server_chatmessage("CLIENT", tr("You were granted the Guard button."), "1");
}
else if (ooc_message.startsWith("/rainbow") && ao_app->yellow_text_enabled && !rainbow_appended)
{
//ui_text_color->addItem("Rainbow");
ui_ooc_chat_message->clear();
//rainbow_appended = true;
append_server_chatmessage("CLIENT", "This does nohing, but there you go.", "1");
append_server_chatmessage("CLIENT", tr("This does nothing, but there you go."), "1");
return;
}
else if (ooc_message.startsWith("/settings"))
{
ui_ooc_chat_message->clear();
ao_app->call_settings_menu();
append_server_chatmessage("CLIENT", "You opened the settings menu.", "1");
append_server_chatmessage("CLIENT", tr("You opened the settings menu."), "1");
return;
}
else if (ooc_message.startsWith("/pair"))
@ -3024,19 +3065,20 @@ void Courtroom::on_ooc_return_pressed()
if (whom > -1)
{
other_charid = whom;
QString msg = "You will now pair up with ";
QString msg = tr("You will now pair up with ");
msg.append(char_list.at(whom).name);
msg.append(" if they also choose your character in return.");
msg.append(tr(" if they also choose your character in return."));
append_server_chatmessage("CLIENT", msg, "1");
}
else
{
append_server_chatmessage("CLIENT", "You are no longer paired with anyone.", "1");
other_charid = -1;
append_server_chatmessage("CLIENT", tr("You are no longer paired with anyone."), "1");
}
}
else
{
append_server_chatmessage("CLIENT", "Are you sure you typed that well? The char ID could not be recognised.", "1");
append_server_chatmessage("CLIENT", tr("Are you sure you typed that well? The char ID could not be recognised."), "1");
}
return;
}
@ -3052,32 +3094,32 @@ void Courtroom::on_ooc_return_pressed()
if (off >= -100 && off <= 100)
{
offset_with_pair = off;
QString msg = "You have set your offset to ";
QString msg = tr("You have set your offset to ");
msg.append(QString::number(off));
msg.append("%.");
append_server_chatmessage("CLIENT", msg, "1");
}
else
{
append_server_chatmessage("CLIENT", "Your offset must be between -100% and 100%!", "1");
append_server_chatmessage("CLIENT", tr("Your offset must be between -100% and 100%!"), "1");
}
}
else
{
append_server_chatmessage("CLIENT", "That offset does not look like one.", "1");
append_server_chatmessage("CLIENT", tr("That offset does not look like one."), "1");
}
return;
}
else if (ooc_message.startsWith("/switch_am"))
{
append_server_chatmessage("CLIENT", "You switched your music and area list.", "1");
append_server_chatmessage("CLIENT", tr("You switched your music and area list."), "1");
on_switch_area_music_clicked();
ui_ooc_chat_message->clear();
return;
}
else if (ooc_message.startsWith("/enable_blocks"))
{
append_server_chatmessage("CLIENT", "You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.", "1");
append_server_chatmessage("CLIENT", tr("You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this."), "1");
ao_app->cccc_ic_support_enabled = true;
ao_app->arup_enabled = true;
ao_app->modcall_reason_enabled = true;
@ -3088,9 +3130,9 @@ void Courtroom::on_ooc_return_pressed()
else if (ooc_message.startsWith("/non_int_pre"))
{
if (ui_pre_non_interrupt->isChecked())
append_server_chatmessage("CLIENT", "Your pre-animations interrupt again.", "1");
append_server_chatmessage("CLIENT", tr("Your pre-animations interrupt again."), "1");
else
append_server_chatmessage("CLIENT", "Your pre-animations will not interrupt text.", "1");
append_server_chatmessage("CLIENT", tr("Your pre-animations will not interrupt text."), "1");
ui_pre_non_interrupt->setChecked(!ui_pre_non_interrupt->isChecked());
ui_ooc_chat_message->clear();
return;
@ -3101,7 +3143,7 @@ void Courtroom::on_ooc_return_pressed()
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
{
append_server_chatmessage("CLIENT", "Couldn't open chatlog.txt to write into.", "1");
append_server_chatmessage("CLIENT", tr("Couldn't open chatlog.txt to write into."), "1");
ui_ooc_chat_message->clear();
return;
}
@ -3114,7 +3156,7 @@ void Courtroom::on_ooc_return_pressed()
file.close();
append_server_chatmessage("CLIENT", "The IC chatlog has been saved.", "1");
append_server_chatmessage("CLIENT", tr("The IC chatlog has been saved."), "1");
ui_ooc_chat_message->clear();
return;
}
@ -3126,7 +3168,7 @@ void Courtroom::on_ooc_return_pressed()
if (!casefolder.exists())
{
QDir::current().mkdir("base/" + casefolder.dirName());
append_server_chatmessage("CLIENT", "You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.", "1");
append_server_chatmessage("CLIENT", tr("You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there."), "1");
ui_ooc_chat_message->clear();
return;
}
@ -3137,7 +3179,7 @@ void Courtroom::on_ooc_return_pressed()
if (command.size() < 2)
{
append_server_chatmessage("CLIENT", "You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.\nCases you can load: " + caseslist.join(", "), "1");
append_server_chatmessage("CLIENT", tr("You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.\nCases you can load: %1").arg(caseslist.join(", ")), "1");
ui_ooc_chat_message->clear();
return;
}
@ -3145,7 +3187,7 @@ void Courtroom::on_ooc_return_pressed()
if (command.size() > 2)
{
append_server_chatmessage("CLIENT", "Too many arguments to load a case! You only need one filename, without extension.", "1");
append_server_chatmessage("CLIENT", tr("Too many arguments to load a case! You only need one filename, without extension."), "1");
ui_ooc_chat_message->clear();
return;
}
@ -3158,13 +3200,13 @@ void Courtroom::on_ooc_return_pressed()
QString casestatus = casefile.value("status", "").value<QString>();
if (!caseauth.isEmpty())
append_server_chatmessage("CLIENT", "Case made by " + caseauth + ".", "1");
append_server_chatmessage("CLIENT", tr("Case made by %1.").arg(caseauth), "1");
if (!casedoc.isEmpty())
ao_app->send_server_packet(new AOPacket("CT#" + ui_ooc_chat_name->text() + "#/doc " + casedoc + "#%"));
if (!casestatus.isEmpty())
ao_app->send_server_packet(new AOPacket("CT#" + ui_ooc_chat_name->text() + "#/status " + casestatus + "#%"));
if (!cmdoc.isEmpty())
append_server_chatmessage("CLIENT", "Navigate to " + cmdoc + " for the CM doc.", "1");
append_server_chatmessage("CLIENT", tr("Navigate to %1 for the CM doc.").arg(cmdoc), "1");
for (int i = local_evidence_list.size() - 1; i >= 0; i--) {
ao_app->send_server_packet(new AOPacket("DE#" + QString::number(i) + "#%"));
@ -3183,10 +3225,64 @@ void Courtroom::on_ooc_return_pressed()
ao_app->send_server_packet(new AOPacket("PE", f_contents));
}
append_server_chatmessage("CLIENT", "Your case \"" + command[1] + "\" was loaded!", "1");
append_server_chatmessage("CLIENT", tr("Your case \"%1\" was loaded!").arg(command[1]), "1");
ui_ooc_chat_message->clear();
return;
}
else if(ooc_message.startsWith("/save_case"))
{
QStringList command = ooc_message.split(" ", QString::SkipEmptyParts);
QDir casefolder("base/cases");
if (!casefolder.exists())
{
QDir::current().mkdir("base/" + casefolder.dirName());
append_server_chatmessage("CLIENT", tr("You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it."), "1");
ui_ooc_chat_message->clear();
return;
}
QStringList caseslist = casefolder.entryList();
caseslist.removeOne(".");
caseslist.removeOne("..");
caseslist.replaceInStrings(".ini","");
if (command.size() < 3)
{
append_server_chatmessage("CLIENT", tr("You need to give a filename to save (extension not needed) and the courtroom status!"), "1");
ui_ooc_chat_message->clear();
return;
}
if (command.size() > 3)
{
append_server_chatmessage("CLIENT", tr("Too many arguments to save a case! You only need a filename without extension and the courtroom status!"), "1");
ui_ooc_chat_message->clear();
return;
}
QSettings casefile("base/cases/" + command[1] + ".ini", QSettings::IniFormat);
casefile.setValue("author",ui_ooc_chat_name->text());
casefile.setValue("cmdoc","");
casefile.setValue("doc", "");
casefile.setValue("status",command[2]);
casefile.sync();
for(int i = local_evidence_list.size() - 1; i >= 0; i--)
{
QString clean_evidence_dsc = local_evidence_list[i].description.replace(QRegularExpression("<owner = ...>..."), "");
clean_evidence_dsc = clean_evidence_dsc.replace(clean_evidence_dsc.lastIndexOf(">"), 1, "");
casefile.beginGroup(QString::number(i));
casefile.sync();
casefile.setValue("name",local_evidence_list[i].name);
casefile.setValue("description",local_evidence_list[i].description);
casefile.setValue("image",local_evidence_list[i].image);
casefile.endGroup();
}
casefile.sync();
append_server_chatmessage("CLIENT", tr("Succesfully saved, edit doc and cmdoc link on the ini!"), "1");
ui_ooc_chat_message->clear();
return;
}
QStringList packet_contents;
packet_contents.append(ui_ooc_chat_name->text());
@ -3210,7 +3306,7 @@ void Courtroom::on_ooc_toggle_clicked()
{
ui_ms_chatlog->show();
ui_server_chatlog->hide();
ui_ooc_toggle->setText("Master");
ui_ooc_toggle->setText(tr("Master"));
server_ooc = false;
}
@ -3218,7 +3314,7 @@ void Courtroom::on_ooc_toggle_clicked()
{
ui_ms_chatlog->hide();
ui_server_chatlog->show();
ui_ooc_toggle->setText("Server");
ui_ooc_toggle->setText(tr("Server"));
server_ooc = true;
}
@ -3316,6 +3412,7 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
QListWidgetItem *f_item = ui_pair_list->item(p_index.row());
QString f_char = f_item->text();
QString real_char;
int f_cid = -1;
if (f_char.endsWith(" [x]"))
{
@ -3323,17 +3420,19 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
f_item->setText(real_char);
}
else
real_char = f_char;
int f_cid = -1;
for (int n_char = 0 ; n_char < char_list.size() ; n_char++)
{
real_char = f_char;
for (int n_char = 0 ; n_char < char_list.size() ; n_char++)
{
if (char_list.at(n_char).name == real_char)
f_cid = n_char;
}
}
if (f_cid < 0 || f_cid >= char_list.size())
if (f_cid < -2 || f_cid >= char_list.size())
{
qDebug() << "W: " << real_char << " not present in char_list";
return;
@ -3352,8 +3451,10 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
for (int i = 0; i < ui_pair_list->count(); i++) {
ui_pair_list->item(i)->setText(sorted_pair_list.at(i));
}
f_item->setText(real_char + " [x]");
if(other_charid != -1)
{
f_item->setText(real_char + " [x]");
}
}
void Courtroom::on_music_list_double_clicked(QModelIndex p_model)
@ -3695,8 +3796,8 @@ void Courtroom::on_call_mod_clicked()
QInputDialog input;
input.setWindowFlags(Qt::WindowSystemMenuHint);
input.setLabelText("Reason:");
input.setWindowTitle("Call Moderator");
input.setLabelText(tr("Reason:"));
input.setWindowTitle(tr("Call Moderator"));
auto code = input.exec();
if (code != QDialog::Accepted)
@ -3704,10 +3805,10 @@ void Courtroom::on_call_mod_clicked()
QString text = input.textValue();
if (text.isEmpty()) {
errorBox.critical(nullptr, "Error", "You must provide a reason.");
errorBox.critical(nullptr, tr("Error"), tr("You must provide a reason."));
return;
} else if (text.length() > 256) {
errorBox.critical(nullptr, "Error", "The message is too long.");
errorBox.critical(nullptr, tr("Error"), tr("The message is too long."));
return;
}
@ -3854,23 +3955,29 @@ Courtroom::~Courtroom()
delete blip_player;
}
#if (defined (_WIN32) || defined (_WIN64))
void Courtroom::load_bass_opus_plugin()
{
#ifdef BASSAUDIO
BASS_PluginLoad("bassopus.dll", 0);
#endif
}
#elif (defined (LINUX) || defined (__linux__))
void Courtroom::load_bass_opus_plugin()
{
#ifdef BASSAUDIO
BASS_PluginLoad("libbassopus.so", 0);
#endif
}
#elif defined __APPLE__
void Courtroom::load_bass_opus_plugin()
{
QString libpath = ao_app->get_base_path() + "../../Frameworks/libbassopus.dylib";
QByteArray ba = libpath.toLocal8Bit();
#ifdef BASSAUDIO
BASS_PluginLoad(ba.data(), 0);
#endif
}
#else
#error This operating system is unsupported for bass plugins.

View File

@ -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);

View File

@ -2,6 +2,7 @@
namespace AttorneyOnline {
#ifdef DISCORD
Discord::Discord()
{
DiscordEventHandlers handlers;
@ -11,10 +12,10 @@ Discord::Discord()
qInfo() << "Discord RPC ready";
};
handlers.disconnected = [](int errorCode, const char* message) {
qInfo() << "Discord RPC disconnected! " << message;
qInfo() << "Discord RPC disconnected! " << message << errorCode;
};
handlers.errored = [](int errorCode, const char* message) {
qWarning() << "Discord RPC errored out! " << message;
qWarning() << "Discord RPC errored out! " << message << errorCode;
};
qInfo() << "Initializing Discord RPC";
Discord_Initialize(APPLICATION_ID, &handlers, 1, nullptr);
@ -99,5 +100,36 @@ void Discord::state_spectate()
presence.state = "Spectating";
Discord_UpdatePresence(&presence);
}
#else
Discord::Discord()
{
}
Discord::~Discord()
{
}
void Discord::state_lobby()
{
}
void Discord::state_server(std::string name, std::string server_id)
{
qDebug() << "Discord RPC: Setting server state";
}
void Discord::state_character(std::string name)
{
qDebug() << "Discord RPC: Setting character state";
}
void Discord::state_spectate()
{
qDebug() << "Discord RPC: Setting specator state";
}
#endif
}

View File

@ -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);
@ -188,11 +188,12 @@ void Courtroom::on_evidence_image_name_edited()
void Courtroom::on_evidence_image_button_clicked()
{
QDir dir(ao_app->get_base_path() + "evidence");
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFile);
dialog.setNameFilter(tr("Images (*.png)"));
dialog.setViewMode(QFileDialog::List);
dialog.setDirectory(ao_app->get_base_path() + "evidence");
dialog.setDirectory(dir);
QStringList filenames;
@ -203,13 +204,8 @@ void Courtroom::on_evidence_image_button_clicked()
return;
QString filename = filenames.at(0);
QStringList split_filename = filename.split("/");
filename = split_filename.at(split_filename.size() - 1);
filename = dir.relativeFilePath(filename);
ui_evidence_image_name->setText(filename);
on_evidence_image_name_edited();
}
@ -269,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);
}

View File

@ -5,12 +5,12 @@
#if (defined (_WIN32) || defined (_WIN64))
#include <windows.h>
DWORD dwVolSerial;
BOOL bIsRetrieved;
static DWORD dwVolSerial;
static BOOL bIsRetrieved;
QString get_hdid()
{
bIsRetrieved = GetVolumeInformation(TEXT("C:\\"), NULL, NULL, &dwVolSerial, NULL, NULL, NULL, NULL);
bIsRetrieved = GetVolumeInformation(TEXT("C:\\"), nullptr, 0, &dwVolSerial, nullptr, nullptr, nullptr, 0);
if (bIsRetrieved)
return QString::number(dwVolSerial, 16);
@ -18,7 +18,6 @@ QString get_hdid()
//a totally random string
//what could possibly go wrong
return "gxsps32sa9fnwic92mfbs0";
}
#elif (defined (LINUX) || defined (__linux__))
@ -51,10 +50,31 @@ QString get_hdid()
}
#elif defined __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
QString get_hdid()
{
//hdids are broken at this point anyways
return "just a mac passing by";
CFStringRef serial;
char buffer[64] = {0};
QString hdid;
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert)
{
CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
CFSTR(kIOPlatformSerialNumberKey),
kCFAllocatorDefault, 0);
if (serialNumberAsCFString) {
serial = (CFStringRef)serialNumberAsCFString;
}
if (CFStringGetCString(serial, buffer, 64, kCFStringEncodingUTF8)) {
hdid = buffer;
}
IOObjectRelease(platformExpert);
}
return hdid;
}
#else

View File

@ -9,7 +9,7 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
this->setWindowTitle("Attorney Online 2");
this->setWindowTitle(tr("Attorney Online 2"));
this->setWindowIcon(QIcon(":/logo.png"));
ui_background = new AOImage(this, ao_app);
@ -26,7 +26,7 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
ui_chatbox = new AOTextArea(this);
ui_chatbox->setOpenExternalLinks(true);
ui_chatname = new QLineEdit(this);
ui_chatname->setPlaceholderText("Name");
ui_chatname->setPlaceholderText(tr("Name"));
ui_chatname->setText(ao_app->get_ooc_name());
ui_chatmessage = new QLineEdit(this);
ui_loading_background = new AOImage(this, ao_app);
@ -47,6 +47,7 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
connect(ui_connect, SIGNAL(released()), this, SLOT(on_connect_released()));
connect(ui_about, SIGNAL(clicked()), this, SLOT(on_about_clicked()));
connect(ui_server_list, SIGNAL(clicked(QModelIndex)), this, SLOT(on_server_list_clicked(QModelIndex)));
connect(ui_server_list, SIGNAL(activated(QModelIndex)), this, SLOT(on_server_list_doubleclicked(QModelIndex)));
connect(ui_chatmessage, SIGNAL(returnPressed()), this, SLOT(on_chatfield_return_pressed()));
connect(ui_cancel, SIGNAL(clicked()), ao_app, SLOT(loading_cancelled()));
@ -71,9 +72,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);
}
@ -101,7 +102,7 @@ void Lobby::set_widgets()
ui_connect->set_image("connect.png");
set_size_and_pos(ui_version, "version");
ui_version->setText("Version: " + ao_app->get_version_string());
ui_version->setText(tr("Version: %1").arg(ao_app->get_version_string()));
set_size_and_pos(ui_about, "about");
ui_about->set_image("about.png");
@ -111,7 +112,7 @@ void Lobby::set_widgets()
"font: bold;");
set_size_and_pos(ui_player_count, "player_count");
ui_player_count->setText("Offline");
ui_player_count->setText(tr("Offline"));
ui_player_count->setStyleSheet("font: bold;"
"color: white;"
"qproperty-alignment: AlignCenter;");
@ -144,11 +145,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();
@ -286,9 +287,13 @@ void Lobby::on_about_clicked()
QMessageBox::about(this, "About", msg);
}
//clicked on an item in the serverlist
void Lobby::on_server_list_clicked(QModelIndex p_model)
{
if (p_model != last_model)
{
server_type f_server;
last_model = p_model;
int n_server = p_model.row();
if (n_server < 0)
@ -317,11 +322,19 @@ 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);
ao_app->net_manager->connect_to_server(f_server);
}
}
//doubleclicked on an item in the serverlist so we'll connect right away
void Lobby::on_server_list_doubleclicked(QModelIndex p_model)
{
on_server_list_clicked(p_model);
on_connect_released();
}
void Lobby::on_chatfield_return_pressed()
@ -377,7 +390,7 @@ void Lobby::append_error(QString f_message)
void Lobby::set_player_count(int players_online, int max_players)
{
QString f_string = "Online: " + QString::number(players_online) + "/" + QString::number(max_players);
QString f_string = tr("Online: %1/%2").arg(QString::number(players_online)).arg(QString::number(max_players));
ui_player_count->setText(f_string);
}

View File

@ -1,4 +1,3 @@
#include "aoapplication.h"
#include "datatypes.h"
@ -7,6 +6,9 @@
#include "courtroom.h"
#include <QPluginLoader>
#include <QDebug>
#include <QTranslator>
#include <QLibraryInfo>
int main(int argc, char *argv[])
{
#if QT_VERSION > QT_VERSION_CHECK(5, 6, 0)
@ -17,6 +19,23 @@ int main(int argc, char *argv[])
#endif
AOApplication main_app(argc, argv);
QSettings *configini = main_app.configini;
QString p_language = configini->value("language", QLocale::system().name()).toString();
if (p_language == " " || p_language == "")
p_language = QLocale::system().name();
QTranslator qtTranslator;
qtTranslator.load("qt_" + p_language,
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
main_app.installTranslator(&qtTranslator);
QTranslator appTranslator;
qDebug() << ":/resource/translations/ao_" + p_language;
appTranslator.load("ao_" + p_language, ":/resource/translations/");
main_app.installTranslator(&appTranslator);
main_app.construct_lobby();
main_app.w_lobby->show();
main_app.net_manager->connect_to_master();

View File

@ -78,11 +78,8 @@ void NetworkManager::ship_server_packet(QString p_packet)
void NetworkManager::handle_ms_packet()
{
char buffer[buffer_max_size];
std::memset(buffer, 0, buffer_max_size);
ms_socket->read(buffer, buffer_max_size);
QString in_data = buffer;
QByteArray buffer = ms_socket->readAll();
QString in_data = QString::fromUtf8(buffer, buffer.size());
if (!in_data.endsWith("%"))
{
@ -137,7 +134,9 @@ void NetworkManager::on_srv_lookup()
for (const QDnsServiceRecord &record : srv_records)
{
#ifdef DEBUG_NETWORK
qDebug() << "Connecting to " << record.target() << ":" << record.port();
#endif
ms_socket->connectToHost(record.target(), record.port());
QTime timer;
timer.start();
@ -206,7 +205,7 @@ void NetworkManager::on_ms_socket_error(QAbstractSocket::SocketError error)
emit ms_connect_finished(false, true);
ms_reconnect_timer->start(ms_reconnect_delay_ms);
ms_reconnect_timer->start(ms_reconnect_delay * 1000);
}
void NetworkManager::retry_ms_connect()
@ -217,11 +216,8 @@ void NetworkManager::retry_ms_connect()
void NetworkManager::handle_server_packet()
{
char buffer[buffer_max_size];
std::memset(buffer, 0, buffer_max_size);
server_socket->read(buffer, buffer_max_size);
QString in_data = buffer;
QByteArray buffer = server_socket->readAll();
QString in_data = QString::fromUtf8(buffer, buffer.size());
if (!in_data.endsWith("%"))
{
@ -249,4 +245,3 @@ void NetworkManager::handle_server_packet()
ao_app->server_packet_received(f_packet);
}
}

View File

@ -43,8 +43,10 @@ void AOApplication::ms_packet_received(AOPacket *p_packet)
QString header = p_packet->get_header();
QStringList f_contents = p_packet->get_contents();
#ifdef DEBUG_NETWORK
if (header != "CHECK")
qDebug() << "R(ms):" << p_packet->to_string();
#endif
if (header == "ALL")
{
@ -130,8 +132,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(tr("You have been exiled from AO.\n"
"Have a nice day."));
destruct_courtroom();
destruct_lobby();
}
@ -149,8 +159,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
QStringList f_contents = p_packet->get_contents();
QString f_packet = p_packet->to_string();
#ifdef DEBUG_NETWORK
if (header != "checkconnection")
qDebug() << "R:" << f_packet;
#endif
if (header == "decryptor")
{
@ -193,6 +205,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
s_pv = f_contents.at(0).toInt();
server_software = f_contents.at(1);
w_lobby->enable_connect_button();
send_server_packet(new AOPacket("ID#AO2#" + get_version_string() + "#%"));
}
else if (header == "CT")
@ -266,7 +280,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 = "";
@ -292,7 +306,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;
@ -335,7 +349,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);
@ -347,6 +361,65 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
send_server_packet(new AOPacket("AE#" + next_packet_number + "#%"));
}
else if (header == "EM")
{
if (!courtroom_constructed)
goto end;
bool musics_time = false;
int areas = 0;
for (int n_element = 0 ; n_element < f_contents.size() ; n_element += 2)
{
if (f_contents.at(n_element).toInt() != loaded_music)
break;
if (n_element == f_contents.size() - 1)
break;
QString f_music = f_contents.at(n_element + 1);
++loaded_music;
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)
{
w_courtroom->append_music(f_music);
}
else
{
if (f_music.endsWith(".wav") ||
f_music.endsWith(".mp3") ||
f_music.endsWith(".mp4") ||
f_music.endsWith(".ogg") ||
f_music.endsWith(".opus"))
{
musics_time = true;
areas--;
w_courtroom->fix_last_area();
w_courtroom->append_music(f_music);
}
else
{
w_courtroom->append_area(f_music);
areas++;
}
}
for (int area_n = 0; area_n < areas; area_n++)
{
w_courtroom->arup_append(0, "Unknown", "Unknown", "Unknown");
}
int total_loading_size = char_list_size * 2 + evidence_list_size + music_list_size;
int loading_value = int(((loaded_chars + generated_chars + loaded_music + loaded_evidence) / static_cast<double>(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
}
QString next_packet_number = QString::number(((loaded_music - 1) / 10) + 1);
send_server_packet(new AOPacket("AM#" + next_packet_number + "#%"));
}
else if (header == "CharsCheck")
{
if (!courtroom_constructed)
@ -380,7 +453,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);
@ -401,7 +474,35 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
{
if (!musics_time && f_contents.at(n_element) == "===MUSIC START===.mp3")
++loaded_music;
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)
{
w_courtroom->append_music(f_contents.at(n_element));
}
else
{
if (f_contents.at(n_element).endsWith(".wav") ||
f_contents.at(n_element).endsWith(".mp3") ||
f_contents.at(n_element).endsWith(".mp4") ||
f_contents.at(n_element).endsWith(".ogg") ||
f_contents.at(n_element).endsWith(".opus"))
{
musics_time = true;
w_courtroom->fix_last_area();
w_courtroom->append_music(f_contents.at(n_element));
areas--;
}
else
{
w_courtroom->append_area(f_contents.at(n_element));
areas++;
}
}
for (int area_n = 0; area_n < areas; area_n++)
{
musics_time = true;
continue;
@ -566,7 +667,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: %1").arg(f_contents.at(0)));
construct_lobby();
destruct_courtroom();
}
@ -575,7 +676,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
if (courtroom_constructed && f_contents.size() >= 1)
{
call_notice("You have been banned from the server.\nReason: " + f_contents.at(0));
call_notice(tr("You have been banned from the server.\nReason: %1").arg(f_contents.at(0)));
construct_lobby();
destruct_courtroom();
}
@ -583,7 +684,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: %1").arg(f_contents.at(0)));
}
else if (header == "ZZ")
{
@ -609,7 +710,9 @@ void AOApplication::send_ms_packet(AOPacket *p_packet)
net_manager->ship_ms_packet(f_packet);
#ifdef DEBUG_NETWORK
qDebug() << "S(ms):" << f_packet;
#endif
delete p_packet;
}
@ -623,14 +726,18 @@ void AOApplication::send_server_packet(AOPacket *p_packet, bool encoded)
if (encryption_needed)
{
#ifdef DEBUG_NETWORK
qDebug() << "S(e):" << f_packet;
#endif
p_packet->encrypt_header(s_decryptor);
f_packet = p_packet->to_string();
}
else
{
#ifdef DEBUG_NETWORK
qDebug() << "S:" << f_packet;
#endif
}
net_manager->ship_server_packet(f_packet);

View File

@ -30,6 +30,8 @@ QString AOApplication::get_base_path()
QString external_storage = getenv("EXTERNAL_STORAGE");
base_path = external_storage + "/AO2/";
}
#elif defined __APPLE__
base_path = applicationDirPath() + "/../../../base/";
#else
base_path = applicationDirPath() + "/base/";
#endif

View File

@ -224,7 +224,19 @@ pos_size_type AOApplication::get_element_dimensions(QString p_identifier, QStrin
return return_value;
}
QString AOApplication::get_font_name(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, design_ini_path);
QString default_path = get_default_theme_path(p_file);
if (f_result == "")
{
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return "Sans";
}
return f_result;
}
int AOApplication::get_font_size(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
@ -443,8 +455,9 @@ QString AOApplication::get_chat(QString p_char)
QString AOApplication::get_char_shouts(QString p_char)
{
QString f_result = read_char_ini(p_char, "shouts", "Options");
return f_result;
if (f_result == "")
return "default";
else return f_result;
}
int AOApplication::get_preanim_duration(QString p_char, QString p_emote)