diff options
65 files changed, 7043 insertions, 209 deletions
@@ -21,6 +21,7 @@ debug/ Makefile* object_script* +/android/gradle* /Attorney_Online_remake_resource.rc /attorney_online_remake_plugin_import.cpp diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..e2abad6e --- /dev/null +++ b/.gitlab-ci.yml @@ -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 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..36f31d59 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: cpp +os: osx + +addons: + homebrew: + update: true + packages: + - qt5 + +script: + - ./scripts/macos_build.sh + - ./scripts/macos_post_build.sh diff --git a/Attorney_Online.pro b/Attorney_Online.pro index c11b5fd6..488ddd1d 100644 --- a/Attorney_Online.pro +++ b/Attorney_Online.pro @@ -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 diff --git a/README_BUILD.md b/README_BUILD.md index 685699c9..f7441b88 100644 --- a/README_BUILD.md +++ b/README_BUILD.md @@ -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. + +#### Windows + +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. -And put them in BOTH lib/ and the repository root (lib/ is required for linking and root is required for runtime) +#### Other Linux -Launch Qt creator, open the .pro file and try running it. Ask in the Discord if you're having issues: https://discord.gg/wWvQ3pw +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. diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 00000000..0792ce86 --- /dev/null +++ b/android/AndroidManifest.xml @@ -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> diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 00000000..3087d08c --- /dev/null +++ b/android/build.gradle @@ -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' + } +} diff --git a/android/project.properties b/android/project.properties new file mode 100644 index 00000000..a08f37ed --- /dev/null +++ b/android/project.properties @@ -0,0 +1 @@ +target=android-21
\ No newline at end of file diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png Binary files differnew file mode 100644 index 00000000..f53fe30c --- /dev/null +++ b/android/res/drawable-ldpi/icon.png diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml new file mode 100644 index 00000000..6b1a4a2a --- /dev/null +++ b/android/res/values/libs.xml @@ -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> diff --git a/include/aoapplication.h b/include/aoapplication.h index f1c41907..280b7314 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -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"; diff --git a/include/aoblipplayer.h b/include/aoblipplayer.h index aebba77d..44ca48bb 100644 --- a/include/aoblipplayer.h +++ b/include/aoblipplayer.h @@ -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; + + void set_volume_internal(qreal p_volume); - int m_volume; + #if defined(BASSAUDIO) HSTREAM m_stream_list[5]; + #elif defined(QTAUDIO) + QSoundEffect m_blips; + #endif }; #endif // AOBLIPPLAYER_H diff --git a/include/aoevidencebutton.h b/include/aoevidencebutton.h index 27fb84b3..80b747cd 100644 --- a/include/aoevidencebutton.h +++ b/include/aoevidencebutton.h @@ -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); diff --git a/include/aomusicplayer.h b/include/aomusicplayer.h index a88cb79b..71ae6045 100644 --- a/include/aomusicplayer.h +++ b/include/aomusicplayer.h @@ -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 diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h index 53bd3096..233d079a 100644 --- a/include/aooptionsdialog.h +++ b/include/aooptionsdialog.h @@ -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; diff --git a/include/aosfxplayer.h b/include/aosfxplayer.h index 39bea0d4..5b4d2ece 100644 --- a/include/aosfxplayer.h +++ b/include/aosfxplayer.h @@ -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 diff --git a/include/courtroom.h b/include/courtroom.h index e00e454c..587d9630 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -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(); diff --git a/include/discord_rich_presence.h b/include/discord_rich_presence.h index e7ecc6ef..4115b516 100644 --- a/include/discord_rich_presence.h +++ b/include/discord_rich_presence.h @@ -5,6 +5,8 @@ #include <ctime> #include <QDebug> #include <string> +#include <QCoreApplication> + #include <discord-rpc.h> #include <cstring> @@ -16,6 +18,8 @@ namespace AttorneyOnline { class Discord { + Q_DECLARE_TR_FUNCTIONS(Discord) + private: const char* APPLICATION_ID = "399779271737868288"; std::string server_name, server_id; diff --git a/include/lobby.h b/include/lobby.h index 3a34fb8e..06cd798b 100644 --- a/include/lobby.h +++ b/include/lobby.h @@ -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(); }; diff --git a/include/networkmanager.h b/include/networkmanager.h index e28abfda..08b10db8 100644 --- a/include/networkmanager.h +++ b/include/networkmanager.h @@ -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 = ""; diff --git a/resource/translations/ao_de.qm b/resource/translations/ao_de.qm Binary files differnew file mode 100644 index 00000000..6fd250de --- /dev/null +++ b/resource/translations/ao_de.qm diff --git a/resource/translations/ao_de.ts b/resource/translations/ao_de.ts new file mode 100644 index 00000000..1c0675b9 --- /dev/null +++ b/resource/translations/ao_de.ts @@ -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's look as well, you'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 'infinite'.</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 'Custom shownames' 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></source> + <translation><html><head/><body>Gib so viele Alarmwörter ein wie du möchtest. Groß/Kleinschreibung ist egal. Für jede Wort nur eine Zeile!<br>Bitte keine leere Zeile am Ende -- du bekommst sonst bei jeder Nachricht einen Alarm.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</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 'being said'.</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'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'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'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.</source> + <translation>Du hattest keinen 'base/cases' 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 'base/cases' 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 "%1" was loaded!</source> + <translation>Dein Fall "%1" 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 'base/cases' 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 "</source> + <translation type="vanished">Dein Fall "</translation> + </message> + <message> + <source>" was loaded!</source> + <translation type="vanished">" wurde geladen!</translation> + </message> + <message> + <location filename="../../src/courtroom.cpp" line="2882"/> + <source>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.</source> + <translation>Du hattest keinen 'base/cases' 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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?</source> + <translation>Dein Client ist nicht korrekt eingerichtet. +Hast du ALLES von tiny.cc/getao heruntergeladen und entpackt, auch den großen 'base' 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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source> + <translation><h2>Attorney Online %1</h2>Der Gerichtsdrama Simulator<p><b>Quelltext:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Leitende Entwicklung:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Danksagungen:</b><br>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> diff --git a/resource/translations/ao_en.qm b/resource/translations/ao_en.qm Binary files differnew file mode 100644 index 00000000..9dad8dff --- /dev/null +++ b/resource/translations/ao_en.qm diff --git a/resource/translations/ao_en.ts b/resource/translations/ao_en.ts new file mode 100644 index 00000000..b917a419 --- /dev/null +++ b/resource/translations/ao_en.ts @@ -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's look as well, you'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 'infinite'.</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 'Custom shownames' 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</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 'being said'.</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'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 "%1" 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'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'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.</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'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.</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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' 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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>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> diff --git a/resource/translations/ao_es.qm b/resource/translations/ao_es.qm Binary files differnew file mode 100644 index 00000000..56bad749 --- /dev/null +++ b/resource/translations/ao_es.qm diff --git a/resource/translations/ao_es.ts b/resource/translations/ao_es.ts new file mode 100644 index 00000000..9c14710c --- /dev/null +++ b/resource/translations/ao_es.ts @@ -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 "lista de servidores" because literally nobody will understand if i make the literal translation "servidor maestro". 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'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's look as well, you'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 'infinite'.</source> + <translation>La cantidad de mensajes que mantendrá el historial del chat IC antes de eliminar mensajes más antiguos. 0 significa 'infinito'.</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 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.</source> + <translation>Activa la casilla 'Mostrar nombres' 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></source> + <translation><html><head/><body>Ingrese tantas palabras de llamada como desee.<br>Esto no distingue entre mayúsculas y minúsculas. ¡Asegúrese de dejar cada palabra en su propia línea!<br>No deje una línea con un espacio al final; recibirá una alerta cada vez que alguien use un espacio en sus mensajes.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</source> + <translation>Establece el volumen predeterminado de SFX. Las interjecciones y los efectos de sonido reales cuentan como 'SFX'.</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 'being said'.</source> + <translation>Si está marcada, el juego reproducirá un sonido blip incluso cuando se 'dice' 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'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'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'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.</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 "%1" was loaded!</source> + <translation>Su caso "%1" 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 "</source> + <translation type="obsolete">Su caso "</translation> + </message> + <message> + <source>" was loaded!</source> + <translation type="obsolete">" fue cargado!</translation> + </message> + <message> + <location filename="../../src/courtroom.cpp" line="2882"/> + <source>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.</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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?</source> + <translation>No parece que su cliente esté configurado correctamente. +¿Descargó todos los recursos correctamente desde tiny.cc/getao, incluida la gran carpeta 'base'?</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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source> + <translation><h2>Attorney Online %1</h2>El simulador de drama legal<p><b>Código fuente:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https: //github.com/AttorneyOnline/AO2-Client</a><p><b>Desarrollo mayor:</b> <br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Agradecimiento especial:</b><br>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 "Aviso", but i believe it's going to be more useful for bug reports to not translate any debug string.</translatorcomment> + <translation>Notice</translation> + </message> +</context> +</TS> diff --git a/resource/translations/ao_jp.qm b/resource/translations/ao_jp.qm Binary files differnew file mode 100644 index 00000000..e4fb562a --- /dev/null +++ b/resource/translations/ao_jp.qm diff --git a/resource/translations/ao_jp.ts b/resource/translations/ao_jp.ts new file mode 100644 index 00000000..4f8153a6 --- /dev/null +++ b/resource/translations/ao_jp.ts @@ -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's look as well, you'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 'infinite'.</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 'Custom shownames' 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</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 'being said'.</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'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 "%1" 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'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'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.</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'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.</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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' 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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>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> diff --git a/resource/translations/ao_pl.qm b/resource/translations/ao_pl.qm Binary files differnew file mode 100644 index 00000000..cdc1393c --- /dev/null +++ b/resource/translations/ao_pl.qm diff --git a/resource/translations/ao_pl.ts b/resource/translations/ao_pl.ts new file mode 100644 index 00000000..307c6048 --- /dev/null +++ b/resource/translations/ao_pl.ts @@ -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's look as well, you'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 'infinite'.</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 'nieskończone'.</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 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.</source> + <translation>Daje domyślną wartość przyciskowi wyboru 'Niestandardowe ksywki', 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></source> + <translation><html><head/><body>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!<br>Nie zostawiaj spacji na końcu -- zostaniesz zaalarmowany za każdym razem, kiedy ktoś użyje spacji w swojej wiadomości.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</source> + <translation>Ustawia domyślną głośność efektów specjalnych (SFX). Wtrącenia się i same efekty specjalne są zaliczane jako 'SFX'.</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 'blip' isn'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 'being said'.</source> + <translation>Jeśli prawdziwe, gra zagra dźwięk blip za każdym razem spacja 'jest mówiona'.</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'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 "%1" was loaded!</source> + <translation>Twoja rozprawa "%1" 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 'Obszar' and M meaning 'Muzyka'.</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'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'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.</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'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.</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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' 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 'base'?</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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source> + <translation><h2>Attorney Online: %1</h2>Symulator dramy sądowej<p><b>Kod żródłowy:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Główny rozwój:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Szczególne podziękowania:</b><br>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> diff --git a/resource/translations/ao_ru.qm b/resource/translations/ao_ru.qm Binary files differnew file mode 100644 index 00000000..19bf0a95 --- /dev/null +++ b/resource/translations/ao_ru.qm diff --git a/resource/translations/ao_ru.ts b/resource/translations/ao_ru.ts new file mode 100644 index 00000000..9714c9d5 --- /dev/null +++ b/resource/translations/ao_ru.ts @@ -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's look as well, you'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 'infinite'.</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 'Custom shownames' 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'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><html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html></source> + <translation><html><head/><body>Введите на отдельных строках свои позывные, при указании которых в сообщениях будет подан звуковой сигнал.</body></html></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'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's default volume. Interjections and actual sound effects count as 'SFX'.</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 'being said'.</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'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 "%1" was loaded!</source> + <translation>Дело под кодовым названием "%1" готово!</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>Теперь у вас есть кнопка "Охрана".</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'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'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.</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'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.</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't look like your client is set up correctly. +Did you download all resources correctly from tiny.cc/getao, including the large 'base' 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><h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy</source> + <translation><h2>Attorney Online %1</h2>Симулятор судебной драмы<p><b>Исходный код:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Основной разработкой занимались:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Особенная благодарность:</b><br>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> diff --git a/resources.qrc b/resources.qrc index bc9f322e..fce01ebc 100644 --- a/resources.qrc +++ b/resources.qrc @@ -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> diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 00000000..2f8a2b91 --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1,6 @@ +node_modules/ + +# Cursed file +package-lock.json + +s3_keys.sh diff --git a/scripts/configure_macos.sh b/scripts/configure_macos.sh new file mode 100755 index 00000000..af08966f --- /dev/null +++ b/scripts/configure_macos.sh @@ -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 diff --git a/scripts/configure_ubuntu.sh b/scripts/configure_ubuntu.sh index 3817997c..a3d07ede 100755 --- a/scripts/configure_ubuntu.sh +++ b/scripts/configure_ubuntu.sh @@ -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 diff --git a/scripts/macos_build.sh b/scripts/macos_build.sh new file mode 100755 index 00000000..efb7653f --- /dev/null +++ b/scripts/macos_build.sh @@ -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 diff --git a/scripts/macos_post_build.sh b/scripts/macos_post_build.sh index d69da0b4..25400bf5 100644..100755 --- a/scripts/macos_post_build.sh +++ b/scripts/macos_post_build.sh @@ -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 diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 00000000..126a3920 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,9 @@ +{ + "name": "ao-ci-scripts", + "version": "1.0.0", + "main": "update_manifest.js", + "dependencies": { + "argparse": "^1.0.10" + }, + "license": "ISC" +} diff --git a/scripts/release_macos.sh b/scripts/release_macos.sh new file mode 100755 index 00000000..50acb408 --- /dev/null +++ b/scripts/release_macos.sh @@ -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 diff --git a/scripts/update_manifest.js b/scripts/update_manifest.js new file mode 100755 index 00000000..1a06a2d7 --- /dev/null +++ b/scripts/update_manifest.js @@ -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)); diff --git a/scripts/update_program_manifest.js b/scripts/update_program_manifest.js new file mode 100755 index 00000000..9efc814f --- /dev/null +++ b/scripts/update_program_manifest.js @@ -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));
\ No newline at end of file diff --git a/scripts/wasabi.sh b/scripts/wasabi.sh new file mode 100755 index 00000000..95fb3ee9 --- /dev/null +++ b/scripts/wasabi.sh @@ -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} diff --git a/scripts/wasabi_program.sh b/scripts/wasabi_program.sh new file mode 100755 index 00000000..41e2e352 --- /dev/null +++ b/scripts/wasabi_program.sh @@ -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} diff --git a/scripts/windows/Dockerfile b/scripts/windows/Dockerfile new file mode 100644 index 00000000..f4f1a836 --- /dev/null +++ b/scripts/windows/Dockerfile @@ -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. diff --git a/scripts/windows/Dockerfile-mxe b/scripts/windows/Dockerfile-mxe new file mode 100644 index 00000000..873e1442 --- /dev/null +++ b/scripts/windows/Dockerfile-mxe @@ -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 / diff --git a/scripts/windows/how-to-push.md b/scripts/windows/how-to-push.md new file mode 100644 index 00000000..8c1c18d6 --- /dev/null +++ b/scripts/windows/how-to-push.md @@ -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. diff --git a/src/aoapplication.cpp b/src/aoapplication.cpp index d7c3e662..6213acd6 100644 --- a/src/aoapplication.cpp +++ b/src/aoapplication.cpp @@ -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.")); } } } diff --git a/src/aoblipplayer.cpp b/src/aoblipplayer.cpp index 74757c50..1c668ab4 100644 --- a/src/aoblipplayer.cpp +++ b/src/aoblipplayer.cpp @@ -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 diff --git a/src/aoevidencebutton.cpp b/src/aoevidencebutton.cpp index ab654bfe..4dc03959 100644 --- a/src/aoevidencebutton.cpp +++ b/src/aoevidencebutton.cpp @@ -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) { diff --git a/src/aomusicplayer.cpp b/src/aomusicplayer.cpp index 7fcb277f..32848fb0 100644 --- a/src/aomusicplayer.cpp +++ b/src/aomusicplayer.cpp @@ -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
\ No newline at end of file diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index b0e1e996..30146c90 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -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"); - } + } + #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"); diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp index e39071e5..80b6ea3c 100644 --- a/src/aosfxplayer.cpp +++ b/src/aosfxplayer.cpp @@ -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 diff --git a/src/charselect.cpp b/src/charselect.cpp index 6edd87ef..875c8a51 100644 --- a/src/charselect.cpp +++ b/src/charselect.cpp @@ -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(); } diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 09055284..054603d3 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -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. diff --git a/src/debug_functions.cpp b/src/debug_functions.cpp index 77f2f35a..a790610d 100644 --- a/src/debug_functions.cpp +++ b/src/debug_functions.cpp @@ -1,11 +1,14 @@ +#include <QMessageBox> +#include <QCoreApplication> + #include "debug_functions.h" void call_error(QString p_message) { QMessageBox *msgBox = new QMessageBox; - msgBox->setText("Error: " + p_message); - msgBox->setWindowTitle("Error"); + msgBox->setText(QCoreApplication::translate("debug_functions", "Error: %1").arg(p_message)); + msgBox->setWindowTitle(QCoreApplication::translate("debug_functions", "Error")); //msgBox->setWindowModality(Qt::NonModal); @@ -17,7 +20,7 @@ void call_notice(QString p_message) QMessageBox *msgBox = new QMessageBox; msgBox->setText(p_message); - msgBox->setWindowTitle("Notice"); + msgBox->setWindowTitle(QCoreApplication::translate("debug_functions", "Notice")); //msgBox->setWindowModality(Qt::NonModal); diff --git a/src/discord_rich_presence.cpp b/src/discord_rich_presence.cpp index 10f5833e..95a824a1 100644 --- a/src/discord_rich_presence.cpp +++ b/src/discord_rich_presence.cpp @@ -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 } diff --git a/src/evidence.cpp b/src/evidence.cpp index 4e796642..341bed0f 100644 --- a/src/evidence.cpp +++ b/src/evidence.cpp @@ -22,7 +22,7 @@ void Courtroom::construct_evidence() ui_evidence_delete = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_image_name = new AOLineEdit(ui_evidence_overlay); ui_evidence_image_button = new AOButton(ui_evidence_overlay, ao_app); - ui_evidence_image_button->setText("Choose.."); + ui_evidence_image_button->setText(tr("Choose...")); ui_evidence_x = new AOButton(ui_evidence_overlay, ao_app); ui_evidence_description = new AOTextEdit(ui_evidence_overlay); @@ -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); } diff --git a/src/hardware_functions.cpp b/src/hardware_functions.cpp index ebba6ab7..bd6a6c3c 100644 --- a/src/hardware_functions.cpp +++ b/src/hardware_functions.cpp @@ -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 diff --git a/src/lobby.cpp b/src/lobby.cpp index 6f8db065..17a07a7a 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -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); } diff --git a/src/main.cpp b/src/main.cpp index 5aae5c6e..778323fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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(); diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp index 288a9007..a9810d49 100644 --- a/src/networkmanager.cpp +++ b/src/networkmanager.cpp @@ -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); } } - diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index 7ad24739..fe26849f 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -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); diff --git a/src/path_functions.cpp b/src/path_functions.cpp index 92ff765b..c2c15a26 100644 --- a/src/path_functions.cpp +++ b/src/path_functions.cpp @@ -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 diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp index a5eb2731..1e1c4744 100644 --- a/src/text_file_functions.cpp +++ b/src/text_file_functions.cpp @@ -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) |
