changeset 109:79714c95a145

*: add translation files and locale files I forgot to add these in the last commit :p also now you have to ask cmake to update the translations because before the ts files were not tracked (obviously)
author Paper <mrpapersonic@gmail.com>
date Mon, 06 Nov 2023 01:51:44 -0500
parents 2004b41d4a59
children 2f3ae79adb02
files CMakeLists.txt include/gui/locale.h rc/dark.qss rc/locale/en_GB.ts rc/locale/es.ts src/gui/locale.cc
diffstat 6 files changed, 1870 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sun Nov 05 23:31:49 2023 -0500
+++ b/CMakeLists.txt	Mon Nov 06 01:51:44 2023 -0500
@@ -12,6 +12,7 @@
 option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
 option(USE_QT6 "Force build with Qt 6" OFF)
 option(USE_QT5 "Force build with Qt 5" OFF)
+option(UPDATE_TRANSLATIONS "Update *.ts translation files" OFF)
 
 add_subdirectory(dep/anitomy)
 add_subdirectory(dep/animia)
@@ -22,7 +23,7 @@
 
 if (USE_QT6)
 	set(QT_VERSION_MAJOR 6)
-elseif(USE_Qt5)
+elseif(USE_QT5)
 	set(QT_VERSION_MAJOR 5)
 else()
 	find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
@@ -123,9 +124,11 @@
 set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rc/locale")
 
 # dumb little hack to get this working on Qt5 and Qt6
-cmake_language(CALL qt${QT_VERSION_MAJOR}_create_translation ${SRC_FILES} ${TS_FILES} OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
+if (UPDATE_TRANSLATIONS)
+	cmake_language(CALL qt${QT_VERSION_MAJOR}_create_translation ${SRC_FILES} ${TS_FILES} OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
+endif()
 cmake_language(CALL qt${QT_VERSION_MAJOR}_add_translation QM_FILES ${TS_FILES})
-list(APPEND SRC_FILES ${QM_FILES})
+add_custom_target(translation ALL SOURCES ${QM_FILES} DEPENDS ${TS_FILES})
 
 function(qt_create_resource_file outfile)
 	set(QRC "<!DOCTYPE rcc><RCC version=\"1.0\">\n\t<qresource>\n")
@@ -139,7 +142,7 @@
 endfunction()
 
 qt_create_resource_file("${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc" ${QM_FILES})
-list(APPEND SRC_FILES "${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc")
+add_custom_target(resources DEPENDS translation SOURCES "${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc")
 
 # This is also used in the Win32 rc file
 set(RC_INFO_STRING "A lightweight anime tracker built with Qt.")
@@ -173,6 +176,7 @@
 endif()
 
 add_executable(minori WIN32 MACOSX_BUNDLE ${SRC_FILES})
+add_dependencies(minori resources)
 set_property(TARGET minori PROPERTY CXX_STANDARD 11)
 set_property(TARGET minori PROPERTY AUTOMOC ON)
 set_property(TARGET minori PROPERTY AUTORCC ON)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/gui/locale.h	Mon Nov 06 01:51:44 2023 -0500
@@ -0,0 +1,35 @@
+#ifndef __gui__locale_h
+#define __gui__locale_h
+
+#include <QLocale>
+#include <QTranslator>
+#include <vector>
+#include <string>
+#include <memory>
+
+namespace Locale {
+
+std::string GetLocaleFullName(const QLocale& locale);
+
+class Locale {
+public:
+	Locale();
+	Locale(const std::string& name);
+	QLocale GetLocale();
+	std::vector<QLocale> GetAvailableLocales();
+	void RefreshAvailableLocales(); // why would this ever be called?
+	bool IsLocaleAvailable(const QLocale& locale);
+	bool SetActiveLocale(const QLocale& locale);
+
+private:
+	bool SwitchTranslator(QTranslator& translator, const QString& name);
+
+	QTranslator _translator;
+	QTranslator _translator_qt;
+	QLocale _locale;
+	std::vector<QLocale> _available_translations = {};
+};
+
+}
+
+#endif // __gui__locale_h
--- a/rc/dark.qss	Sun Nov 05 23:31:49 2023 -0500
+++ b/rc/dark.qss	Mon Nov 06 01:51:44 2023 -0500
@@ -38,27 +38,26 @@
 
 AnimeListPage::pane {
 	margin: 0.04em;
+	border: 0.04em solid #808080;
+	top: -0.04em;
+	left: -0.04em;
 }
 
-AnimeListPage::pane,
 QTabWidget::pane:top {
 	border: 0.04em solid #808080;
 	top: -0.04em;
 }
 
-AnimeListPage::pane,
 QTabWidget::pane:bottom {
 	border: 0.04em solid #808080;
 	bottom: -0.04em;
 }
 
-AnimeListPage::pane,
 QTabWidget::pane:left {
 	border: 0.04em solid #808080;
 	left: -0.04em;
 }
 
-AnimeListPage::pane,
 QTabWidget::pane:right {
 	border: 0.04em solid #808080;
 	right: -0.04em;
@@ -153,7 +152,7 @@
 }
 
 QPushButton:hover {
-	background-color: rgba(57, 66, 75, 1.0);
+	background-color: #39424B;
 }
 
 /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rc/locale/en_GB.ts	Mon Nov 06 01:51:44 2023 -0500
@@ -0,0 +1,852 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_GB">
+<context>
+    <name>AboutWindow</name>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="46"/>
+        <source>About Minori</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>AnimeInfoWidget</name>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="12"/>
+        <source>Alternative titles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="15"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="15"/>
+        <source>Type:
+Episodes:
+Status:
+Season:
+Genres:
+Score:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="18"/>
+        <source>Synopsis</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>AnimeListPage</name>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="225"/>
+        <location filename="../../src/gui/pages/anime_list.cc" line="261"/>
+        <source>Column visibility</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="249"/>
+        <source>Reset to defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="278"/>
+        <source>Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="289"/>
+        <source>Delete from list...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>AnimeListPageModel</name>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="68"/>
+        <source>Anime title</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="69"/>
+        <source>Progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="70"/>
+        <source>Episodes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="71"/>
+        <source>Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="72"/>
+        <source>Score</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="73"/>
+        <source>Season</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="74"/>
+        <source>Date started</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="75"/>
+        <source>Date completed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="76"/>
+        <source>Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="77"/>
+        <source>Average score</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="78"/>
+        <source>Last updated</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>InformationDialog</name>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="46"/>
+        <source>Anime Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="107"/>
+        <source>Anime list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="135"/>
+        <source>Episodes watched:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="148"/>
+        <source>Rewatching</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="161"/>
+        <source>Status:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="180"/>
+        <source>Score:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="196"/>
+        <source>Notes:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="204"/>
+        <source>Enter your notes about this anime</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="211"/>
+        <source>Date started:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="228"/>
+        <source>Date completed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="98"/>
+        <source>Main information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="277"/>
+        <source>My list and settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../../src/gui/window.cc" line="65"/>
+        <source>Now Playing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="67"/>
+        <source>Anime List</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="68"/>
+        <source>History</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="69"/>
+        <source>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="71"/>
+        <source>Search</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="72"/>
+        <source>Seasons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="73"/>
+        <source>Torrents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="117"/>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="119"/>
+        <source>&amp;Library folders</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="120"/>
+        <source>&amp;Add new folder...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="122"/>
+        <source>&amp;Scan available episodes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="126"/>
+        <source>Play &amp;next episode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="128"/>
+        <source>Play &amp;random episode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="133"/>
+        <source>E&amp;xit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="135"/>
+        <source>&amp;Services</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="136"/>
+        <source>Synchronize &amp;list</source>
+        <translation>Synchronise &amp;list</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="141"/>
+        <source>&amp;AniList</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="142"/>
+        <location filename="../../src/gui/window.cc" line="148"/>
+        <location filename="../../src/gui/window.cc" line="152"/>
+        <source>Go to my &amp;profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="143"/>
+        <source>Go to my &amp;stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="145"/>
+        <source>&amp;Kitsu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="146"/>
+        <source>Go to my &amp;feed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="147"/>
+        <source>Go to my &amp;library</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="150"/>
+        <source>&amp;MyAnimeList</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="151"/>
+        <source>Go to my p&amp;anel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="153"/>
+        <source>Go to my &amp;history</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="155"/>
+        <source>&amp;Tools</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="156"/>
+        <source>&amp;Export anime list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="157"/>
+        <source>Export as &amp;Markdown...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="158"/>
+        <source>Export as MyAnimeList &amp;XML...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="162"/>
+        <source>Enable anime &amp;recognition</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="164"/>
+        <source>Enable auto &amp;sharing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="166"/>
+        <source>Enable &amp;auto synchronization</source>
+        <translation>Enable &amp;auto synchronisation</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="171"/>
+        <source>&amp;Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="177"/>
+        <source>&amp;View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="184"/>
+        <source>&amp;Now Playing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="188"/>
+        <source>&amp;Anime List</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="193"/>
+        <source>&amp;History</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="197"/>
+        <source>&amp;Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="201"/>
+        <source>S&amp;earch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="205"/>
+        <source>Se&amp;asons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="209"/>
+        <source>&amp;Torrents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="220"/>
+        <source>Show sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="222"/>
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="223"/>
+        <source>&amp;About Minori</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="227"/>
+        <source>About &amp;Qt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="239"/>
+        <source>&amp;Synchronize</source>
+        <translation>&amp;Synchronise</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="246"/>
+        <source>Add new folder...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="256"/>
+        <source>Placeholder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="264"/>
+        <source>S&amp;ettings</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NowPlayingPages::Default</name>
+    <message>
+        <location filename="../../src/gui/pages/now_playing.cc" line="49"/>
+        <source>Now Playing</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QCoreApplication</name>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="10"/>
+        <source>Currently watching</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="11"/>
+        <source>Plan to watch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="12"/>
+        <source>Completed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="13"/>
+        <source>Dropped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="14"/>
+        <source>On hold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="16"/>
+        <source>Not in list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="22"/>
+        <source>TV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="23"/>
+        <source>TV short</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="24"/>
+        <source>OVA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="26"/>
+        <source>Special</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="27"/>
+        <source>ONA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="28"/>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="30"/>
+        <location filename="../../src/gui/translate/anime.cc" line="41"/>
+        <location filename="../../src/gui/translate/anime.cc" line="53"/>
+        <source>Unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="36"/>
+        <source>Winter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="37"/>
+        <source>Summer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="25"/>
+        <source>Movie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="38"/>
+        <source>Fall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="39"/>
+        <source>Spring</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="47"/>
+        <source>Currently airing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="48"/>
+        <source>Finished airing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="49"/>
+        <source>Not yet aired</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="50"/>
+        <source>Cancelled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="51"/>
+        <source>On hiatus</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="59"/>
+        <source>AniList</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="61"/>
+        <source>None</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="78"/>
+        <source>Native</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="79"/>
+        <source>English</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="81"/>
+        <source>Romaji</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="57"/>
+        <source>Author:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="61"/>
+        <source>Third party components:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="77"/>
+        <source>Special thanks:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="80"/>
+        <source>for creating Taiga</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="81"/>
+        <source>and</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="82"/>
+        <source>for creating BreezeStyleSheets, on which the dark theme in this program is based off of</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="84"/>
+        <source>for providing some sample code for detecting dark mode on Windows and macOS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="86"/>
+        <source>for providing information on getting open file descriptors on macOS</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SettingsDialog</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="76"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="89"/>
+        <source>Services</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="91"/>
+        <source>Application</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SettingsPageApplication</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="25"/>
+        <source>Actions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="33"/>
+        <source>Double click:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="35"/>
+        <source>View anime info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="48"/>
+        <source>Middle click:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="50"/>
+        <source>Play next episode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="65"/>
+        <source>Appearance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="73"/>
+        <source>Title language preference:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="78"/>
+        <source>Romaji</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="79"/>
+        <source>Native</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="80"/>
+        <source>English</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="91"/>
+        <source>Application theme:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="97"/>
+        <source>Default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="98"/>
+        <source>Light</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="99"/>
+        <source>Dark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="142"/>
+        <source>Highlight anime if next episode is available in library folders</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="132"/>
+        <source>Display highlighted anime above others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="110"/>
+        <source>Set application locale (requires restart):</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="161"/>
+        <source>Progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="168"/>
+        <source>Display aired episodes (estimated)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="176"/>
+        <source>Display available episodes in library folders</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="202"/>
+        <source>Application</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="210"/>
+        <source>Anime list</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SettingsPageServices</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="27"/>
+        <source>Active service and metadata provider:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="33"/>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="124"/>
+        <source>AniList</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="21"/>
+        <source>Synchronization</source>
+        <translation>Synchronisation</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="42"/>
+        <source>Note: Minori is unable to synchronize multiple services at the same time.</source>
+        <translation>Note: Minori is unable to synchronise multiple services at the same time.</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="63"/>
+        <source>Account</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="69"/>
+        <source>Username: (not your email address)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="90"/>
+        <source>Authorize...</source>
+        <translation>Authorise...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="90"/>
+        <source>Re-authorize...</source>
+        <translation>Re-authorise...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="99"/>
+        <source>&lt;a href=&quot;http://anilist.co/&quot;&gt;Create a new AniList account&lt;/a&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="120"/>
+        <source>Services</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="123"/>
+        <source>Main</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StatisticsPage</name>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="24"/>
+        <source>Anime list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="25"/>
+        <source>Anime count:
+Episode count:
+Time spent watching:
+Time to complete:
+Average score:
+Score deviation:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="31"/>
+        <source>Score distribution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="51"/>
+        <source>Minori</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="51"/>
+        <source>Uptime:
+Requests made:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rc/locale/es.ts	Mon Nov 06 01:51:44 2023 -0500
@@ -0,0 +1,863 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es">
+<context>
+    <name>AboutWindow</name>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="46"/>
+        <source>About Minori</source>
+        <translation>Acerca de Minori</translation>
+    </message>
+</context>
+<context>
+    <name>AnimeInfoWidget</name>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="12"/>
+        <source>Alternative titles</source>
+        <translation>Títulos alternativos</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="15"/>
+        <source>Details</source>
+        <translation>Información</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="15"/>
+        <source>Type:
+Episodes:
+Status:
+Season:
+Genres:
+Score:</source>
+        <translation>Formato:
+Episodios:
+Estado:
+Temporada:
+Géneros:
+Puntuación:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/widgets/anime_info.cc" line="18"/>
+        <source>Synopsis</source>
+        <translation>Sinopsis</translation>
+    </message>
+</context>
+<context>
+    <name>AnimeListPage</name>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="225"/>
+        <location filename="../../src/gui/pages/anime_list.cc" line="261"/>
+        <source>Column visibility</source>
+        <translation>Visibilidad de la columna</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="249"/>
+        <source>Reset to defaults</source>
+        <translation>Restablecer valores predeterminado</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="278"/>
+        <source>Information</source>
+        <translation>Información</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="289"/>
+        <source>Delete from list...</source>
+        <translation>Borrar de la lista...</translation>
+    </message>
+</context>
+<context>
+    <name>AnimeListPageModel</name>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="68"/>
+        <source>Anime title</source>
+        <translation>Título del anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="69"/>
+        <source>Progress</source>
+        <translation>Progreso</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="70"/>
+        <source>Episodes</source>
+        <translation>Episodios</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="71"/>
+        <source>Type</source>
+        <translation>Formato</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="72"/>
+        <source>Score</source>
+        <translation>Puntuación</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="73"/>
+        <source>Season</source>
+        <translation>Temporada</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="74"/>
+        <source>Date started</source>
+        <translation>Fecha de inicio</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="75"/>
+        <source>Date completed</source>
+        <translation>Fecha de finalización</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="76"/>
+        <source>Notes</source>
+        <translation>Notas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="77"/>
+        <source>Average score</source>
+        <translation>Puntuación media</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/anime_list.cc" line="78"/>
+        <source>Last updated</source>
+        <translation>Última actualización</translation>
+    </message>
+</context>
+<context>
+    <name>InformationDialog</name>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="46"/>
+        <source>Anime Information</source>
+        <translation>Información sobre el anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="98"/>
+        <source>Main information</source>
+        <translation>Información principal</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="107"/>
+        <source>Anime list</source>
+        <translation>Lista de anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="135"/>
+        <source>Episodes watched:</source>
+        <translation>Episodios vistos:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="148"/>
+        <source>Rewatching</source>
+        <translation>Volver a ver</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="161"/>
+        <source>Status:</source>
+        <translation>Estado:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="180"/>
+        <source>Score:</source>
+        <translation>Puntuación:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="196"/>
+        <source>Notes:</source>
+        <translation>Notas:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="204"/>
+        <source>Enter your notes about this anime</source>
+        <translation>Introduce tus notas sobre este anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="211"/>
+        <source>Date started:</source>
+        <translation>Fecha de inicio:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="228"/>
+        <source>Date completed:</source>
+        <translation>Fecha de finalización:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/information.cc" line="277"/>
+        <source>My list and settings</source>
+        <translation>Mi lista y configuración</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../../src/gui/window.cc" line="65"/>
+        <source>Now Playing</source>
+        <translation>Jugando ahora</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="67"/>
+        <source>Anime List</source>
+        <translation>Lista de anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="68"/>
+        <source>History</source>
+        <translation>Historia</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="69"/>
+        <source>Statistics</source>
+        <translation>Estadísticas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="71"/>
+        <source>Search</source>
+        <translation>Buscar</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="72"/>
+        <source>Seasons</source>
+        <translation>Temporadas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="73"/>
+        <source>Torrents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="117"/>
+        <source>&amp;File</source>
+        <translation>&amp;Fichero</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="119"/>
+        <source>&amp;Library folders</source>
+        <translation>Directorios de la biblioteca (&amp;L)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="120"/>
+        <source>&amp;Add new folder...</source>
+        <translation>&amp;Añadir una nueva directorios...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="122"/>
+        <source>&amp;Scan available episodes</source>
+        <translation>E&amp;scanear episodios disponibles</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="126"/>
+        <source>Play &amp;next episode</source>
+        <translation>Ver el próximo episodio (&amp;N)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="128"/>
+        <source>Play &amp;random episode</source>
+        <translation>Ver episodio aleato&amp;rio</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="133"/>
+        <source>E&amp;xit</source>
+        <translation>Salida (&amp;X)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="135"/>
+        <source>&amp;Services</source>
+        <translation>&amp;Servicios</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="136"/>
+        <source>Synchronize &amp;list</source>
+        <translation>Sincronizar &amp;lista</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="141"/>
+        <source>&amp;AniList</source>
+        <translation>&amp;AniList</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="142"/>
+        <location filename="../../src/gui/window.cc" line="148"/>
+        <location filename="../../src/gui/window.cc" line="152"/>
+        <source>Go to my &amp;profile</source>
+        <translation>Ir a mi &amp;perfil</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="143"/>
+        <source>Go to my &amp;stats</source>
+        <translation>Ir a mis e&amp;stadísticas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="145"/>
+        <source>&amp;Kitsu</source>
+        <translation>&amp;Kitsu</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="146"/>
+        <source>Go to my &amp;feed</source>
+        <translation>Ir a mi &amp;feed</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="147"/>
+        <source>Go to my &amp;library</source>
+        <translation>Ir a mi biblioteca (&amp;L)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="150"/>
+        <source>&amp;MyAnimeList</source>
+        <translation>&amp;MyAnimeList</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="151"/>
+        <source>Go to my p&amp;anel</source>
+        <translation>Ir a mi p&amp;anel</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="153"/>
+        <source>Go to my &amp;history</source>
+        <translation>Ir a mi &amp;historia</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="155"/>
+        <source>&amp;Tools</source>
+        <translation>Ins&amp;trumentos</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="156"/>
+        <source>&amp;Export anime list</source>
+        <translation>&amp;Exportar lista de anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="157"/>
+        <source>Export as &amp;Markdown...</source>
+        <translation>Exportar como &amp;Markdown...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="158"/>
+        <source>Export as MyAnimeList &amp;XML...</source>
+        <translation>Exportar como &amp;XML de MyAnimeList</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="162"/>
+        <source>Enable anime &amp;recognition</source>
+        <translation>Activar el &amp;reconocimiento de anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="164"/>
+        <source>Enable auto &amp;sharing</source>
+        <translation>Activar el uso compartido automático (&amp;S)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="166"/>
+        <source>Enable &amp;auto synchronization</source>
+        <translation>Activar la sincronización &amp;automática</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="171"/>
+        <source>&amp;Settings</source>
+        <translation>Configuración (&amp;S)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="177"/>
+        <source>&amp;View</source>
+        <translation>&amp;Ver</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="184"/>
+        <source>&amp;Now Playing</source>
+        <translation>Jugando ahora (&amp;N)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="188"/>
+        <source>&amp;Anime List</source>
+        <translation>Lista de &amp;anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="193"/>
+        <source>&amp;History</source>
+        <translation>&amp;Historia</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="197"/>
+        <source>&amp;Statistics</source>
+        <translation>E&amp;stadísticas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="201"/>
+        <source>S&amp;earch</source>
+        <translation>Buscar (&amp;S)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="205"/>
+        <source>Se&amp;asons</source>
+        <translation>Tempor&amp;adas</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="209"/>
+        <source>&amp;Torrents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="220"/>
+        <source>Show sidebar</source>
+        <translation>Mostrar barra lateral</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="222"/>
+        <source>&amp;Help</source>
+        <translation>Ayuda (&amp;H)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="223"/>
+        <source>&amp;About Minori</source>
+        <translation>&amp;Acerca de Minori</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="227"/>
+        <source>About &amp;Qt</source>
+        <translation>Acerca de &amp;Qt</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="239"/>
+        <source>&amp;Synchronize</source>
+        <translation>&amp;Sincronice</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="246"/>
+        <source>Add new folder...</source>
+        <translation>Añadir una nueva carpeta...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="256"/>
+        <source>Placeholder</source>
+        <translation>Marcador de posición</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/window.cc" line="264"/>
+        <source>S&amp;ettings</source>
+        <translation>Configuración (&amp;S)</translation>
+    </message>
+</context>
+<context>
+    <name>NowPlayingPages::Default</name>
+    <message>
+        <location filename="../../src/gui/pages/now_playing.cc" line="49"/>
+        <source>Now Playing</source>
+        <translation>Jugando ahora</translation>
+    </message>
+</context>
+<context>
+    <name>QCoreApplication</name>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="10"/>
+        <source>Currently watching</source>
+        <translation>Actualmente viendo</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="11"/>
+        <source>Plan to watch</source>
+        <translation>Plan para ver</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="12"/>
+        <source>Completed</source>
+        <translation>Completado</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="13"/>
+        <source>Dropped</source>
+        <translation>Dejado</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="14"/>
+        <source>On hold</source>
+        <translation>En espera</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="16"/>
+        <source>Not in list</source>
+        <translation>No en la lista</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="22"/>
+        <source>TV</source>
+        <translation>TV</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="23"/>
+        <source>TV short</source>
+        <translation>Corto</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="24"/>
+        <source>OVA</source>
+        <translation>OVA</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="25"/>
+        <source>Movie</source>
+        <translation>Película</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="26"/>
+        <source>Special</source>
+        <translation>Especial</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="27"/>
+        <source>ONA</source>
+        <translation>ONA</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="28"/>
+        <source>Music</source>
+        <translation>Música</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="30"/>
+        <location filename="../../src/gui/translate/anime.cc" line="41"/>
+        <location filename="../../src/gui/translate/anime.cc" line="53"/>
+        <source>Unknown</source>
+        <translation>Desconocido</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="36"/>
+        <source>Winter</source>
+        <translation>Invierno</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="37"/>
+        <source>Summer</source>
+        <translation>Verano</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="38"/>
+        <source>Fall</source>
+        <translation>Otoño</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="39"/>
+        <source>Spring</source>
+        <translation>Primavera</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="47"/>
+        <source>Currently airing</source>
+        <translation>En emisión</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="48"/>
+        <source>Finished airing</source>
+        <translation>Emisión terminada</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="49"/>
+        <source>Not yet aired</source>
+        <translation>Aún no emitido</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="50"/>
+        <source>Cancelled</source>
+        <translation>Cancelado</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="51"/>
+        <source>On hiatus</source>
+        <translation>En pausa</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="59"/>
+        <source>AniList</source>
+        <translation>AniList</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="61"/>
+        <source>None</source>
+        <translation>Ninguno</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="78"/>
+        <source>Native</source>
+        <translation>Nativo</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="79"/>
+        <source>English</source>
+        <translation>Inglés</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/translate/anime.cc" line="81"/>
+        <source>Romaji</source>
+        <translation>Romaji</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="57"/>
+        <source>Author:</source>
+        <translation>Autor:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="61"/>
+        <source>Third party components:</source>
+        <translation>Componentes de terceros:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="77"/>
+        <source>Special thanks:</source>
+        <translation>Agradecimientos especiales:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="80"/>
+        <source>for creating Taiga</source>
+        <translation>para crear Taiga</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="81"/>
+        <source>and</source>
+        <translation>y</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="82"/>
+        <source>for creating BreezeStyleSheets, on which the dark theme in this program is based off of</source>
+        <translation>para crear BreezeStyleSheets, en el que se basa el tema oscuro de este programa</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="84"/>
+        <source>for providing some sample code for detecting dark mode on Windows and macOS</source>
+        <translation>por proporcionar algunos ejemplos de código para detectar el modo oscuro en Windows y macOS</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/about.cc" line="86"/>
+        <source>for providing information on getting open file descriptors on macOS</source>
+        <translation>para obtener información sobre descriptores de archivos abiertos en macOS</translation>
+    </message>
+</context>
+<context>
+    <name>SettingsDialog</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="76"/>
+        <source>Settings</source>
+        <translation>Configuración</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="89"/>
+        <source>Services</source>
+        <translation>Servicios</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings.cc" line="91"/>
+        <source>Application</source>
+        <translation>Aplicación</translation>
+    </message>
+</context>
+<context>
+    <name>SettingsPageApplication</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="25"/>
+        <source>Actions</source>
+        <translation>Acciones</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="33"/>
+        <source>Double click:</source>
+        <translation>Haz doble clic:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="35"/>
+        <source>View anime info</source>
+        <translation>Ver información sobre el anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="48"/>
+        <source>Middle click:</source>
+        <translation>Clic central:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="50"/>
+        <source>Play next episode</source>
+        <translation>Ver el próximo episodio</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="65"/>
+        <source>Appearance</source>
+        <translation>Apariencia</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="73"/>
+        <source>Title language preference:</source>
+        <translation>Preferencia lingüística del título</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="78"/>
+        <source>Romaji</source>
+        <translation>Romaji</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="79"/>
+        <source>Native</source>
+        <translation>Nativo</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="80"/>
+        <source>English</source>
+        <translation>Inglés</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="91"/>
+        <source>Application theme:</source>
+        <translation>Tema de aplicación:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="97"/>
+        <source>Default</source>
+        <translation>Predeterminado</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="98"/>
+        <source>Light</source>
+        <translation>Luminoso</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="99"/>
+        <source>Dark</source>
+        <translation>Oscuro</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="110"/>
+        <source>Set application locale (requires restart):</source>
+        <translation>Establecer la configuración regional de la aplicación (requiere reinicio):</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="132"/>
+        <source>Display highlighted anime above others</source>
+        <translation>Mostrar el anime destacado por encima de los demás</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="142"/>
+        <source>Highlight anime if next episode is available in library folders</source>
+        <translation>Resaltar el anime si el siguiente episodio está disponible en las directorios de la biblioteca</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="161"/>
+        <source>Progress</source>
+        <translation>Progreso</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="168"/>
+        <source>Display aired episodes (estimated)</source>
+        <translation>Mostrar episodios emitidos (estimación)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="176"/>
+        <source>Display available episodes in library folders</source>
+        <translation>Mostrar los episodios disponibles en las directorios de la biblioteca</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="202"/>
+        <source>Application</source>
+        <translation>Aplicación</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/application.cc" line="210"/>
+        <source>Anime list</source>
+        <translation>Lista de anime</translation>
+    </message>
+</context>
+<context>
+    <name>SettingsPageServices</name>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="21"/>
+        <source>Synchronization</source>
+        <translation>Sincronización</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="27"/>
+        <source>Active service and metadata provider:</source>
+        <translation>Proveedor activo de servicios y metadatos:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="33"/>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="124"/>
+        <source>AniList</source>
+        <translation>AniList</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="42"/>
+        <source>Note: Minori is unable to synchronize multiple services at the same time.</source>
+        <translation>Nota: Minori no puede sincronizar varios servicios al mismo tiempo.</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="63"/>
+        <source>Account</source>
+        <translation>Cuenta</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="69"/>
+        <source>Username: (not your email address)</source>
+        <translation>Nombre de usuario: (no su dirección de correo electrónico)</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="90"/>
+        <source>Authorize...</source>
+        <translation>Autoriza...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="90"/>
+        <source>Re-authorize...</source>
+        <translation>Reautorizar...</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="99"/>
+        <source>&lt;a href=&quot;http://anilist.co/&quot;&gt;Create a new AniList account&lt;/a&gt;</source>
+        <translation>&lt;a href=&quot;http://anilist.co/&quot;&gt;Crear una nueva cuenta AniList&lt;/a&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="120"/>
+        <source>Services</source>
+        <translation>Servicios</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/dialog/settings/services.cc" line="123"/>
+        <source>Main</source>
+        <translation>Principal</translation>
+    </message>
+</context>
+<context>
+    <name>StatisticsPage</name>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="24"/>
+        <source>Anime list</source>
+        <translation>Lista de anime</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="25"/>
+        <source>Anime count:
+Episode count:
+Time spent watching:
+Time to complete:
+Average score:
+Score deviation:</source>
+        <translation>Recuento de animes:
+Recuento de episodios:
+Tiempo dedicado a ver:
+Tiempo para completar:
+Puntuación media:
+Desviación de la puntuación:</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="31"/>
+        <source>Score distribution</source>
+        <translation>Distribución de la puntuación</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="51"/>
+        <source>Minori</source>
+        <translation>Minori</translation>
+    </message>
+    <message>
+        <location filename="../../src/gui/pages/statistics.cc" line="51"/>
+        <source>Uptime:
+Requests made:</source>
+        <translation>Tiempo de actividad:
+Peticiones realizadas:</translation>
+    </message>
+</context>
+</TS>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/locale.cc	Mon Nov 06 01:51:44 2023 -0500
@@ -0,0 +1,108 @@
+#include "gui/locale.h"
+#include "core/strings.h"
+#include <QTranslator>
+#include <QLocale>
+#include <QDir>
+#include <QString>
+#include <QApplication>
+#include <iostream>
+
+namespace Locale {
+
+std::string GetLocaleFullName(const QLocale& locale) {
+	QString res = QLocale::languageToString(locale.language());
+	if (locale.country() != QLocale::AnyCountry)
+		res += " (" + QLocale::countryToString(locale.country()) + ")";
+	return Strings::ToUtf8String(res);
+}
+
+Locale::Locale() {
+	RefreshAvailableLocales();
+
+	/* default to en_US */
+	if (!IsLocaleAvailable(QLocale()))
+		SetActiveLocale(QLocale("en_US"));
+	else /* TODO: is this needed? */
+		SetActiveLocale(QLocale());
+}
+
+Locale::Locale(const std::string& name) {
+	RefreshAvailableLocales();
+	SetActiveLocale(QLocale(Strings::ToQString(name)));
+}
+
+QLocale Locale::GetLocale() {
+	return _locale;
+}
+
+std::vector<QLocale> Locale::GetAvailableLocales() {
+	return _available_translations;
+}
+
+void Locale::RefreshAvailableLocales() {
+	_available_translations.clear();
+
+	/* we will always have en_US */
+	_available_translations.push_back(QLocale("en_US"));
+
+	QDir dir(":/locale");
+	if (!dir.exists())
+		return;
+
+	QStringList translations = dir.entryList({"*.qm"}, QDir::Files);
+
+	_available_translations.reserve(translations.size());
+	for (const QString& str : translations) {
+		_available_translations.push_back(QLocale(str.mid(0, str.lastIndexOf("."))));
+	}
+}
+
+bool Locale::IsLocaleAvailable(const QLocale& locale) {
+	for (const QLocale& l : _available_translations)
+		if (l == locale)
+			return true;
+	return false;
+}
+
+bool Locale::SetActiveLocale(const QLocale& locale) {
+	if (!IsLocaleAvailable(locale))
+		return false;
+	if (_locale == locale)
+		return true; /* we're... already on this locale :) */
+
+	_locale = locale;
+	QLocale::setDefault(_locale);
+
+	/* we can still do stuff even if one thing fails! */
+	bool return_value = true;
+
+	const QString name = _locale.name();
+	if (!SwitchTranslator(_translator, QString(":/locale/%1.qm").arg(name)))
+		return_value = false;
+
+	const QString path = qApp->applicationDirPath();
+	if (!SwitchTranslator(_translator_qt, path + QString("/translations/qt_%1.qm").arg(name))) {
+		/* Sometimes Qt will have proper translations for the language, but not the specific
+		   country. In that case, we still want to use that language. */
+		const int underscore_index = name.lastIndexOf("_");
+		if (!underscore_index)
+			return false;
+
+		const QString short_name = name.mid(0, underscore_index);
+		if (!SwitchTranslator(_translator_qt, path + QString("/translations/qt_%1.qm").arg(short_name)))
+			return_value = false;
+	}
+
+	return return_value;
+}
+
+bool Locale::SwitchTranslator(QTranslator& translator, const QString& path) {
+	qApp->removeTranslator(&translator);
+
+	if (!translator.load(path))
+		return false;
+	qApp->installTranslator(&translator);
+	return true;
+}
+
+}