diff --git a/ocs-url.pro b/ocs-url.pro
index 304f58312d14899c2ebb61db8a5e42a184492c6f..4f7a1ded53a11157a65c0da55680ab19915d8533 100644
--- a/ocs-url.pro
+++ b/ocs-url.pro
@@ -6,7 +6,9 @@ CONFIG += c++11
 
 DEFINES += QT_DEPRECATED_WARNINGS
 
-RESOURCES += src/desktop/desktop.qrc
+RESOURCES += \
+    src/desktop/desktop.qrc \
+    src/i18n/i18n.qrc
 
 DISTFILES += \
     README.md \
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 1233f40ec4b5a907919d1d1f7fc70370665374a9..1cbaeb3ce4124b1dfbf369397197f3e1630e63c4 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -2,15 +2,14 @@
 #include <QStringList>
 #include <QUrl>
 #include <QJsonObject>
+#include <QTranslator>
+#include <QLocale>
 #include <QCommandLineParser>
 #include <QGuiApplication>
 #include <QIcon>
 #include <QQmlApplicationEngine>
 #include <QQmlContext>
 
-#include <QTranslator>
-#include <QLocale>
-
 #include "handlers/confighandler.h"
 #include "handlers/ocsurlhandler.h"
 
@@ -28,6 +27,12 @@ int main(int argc, char *argv[])
     app.setOrganizationDomain(appConfigApplication["domain"].toString());
     app.setWindowIcon(QIcon::fromTheme(appConfigApplication["id"].toString(), QIcon(appConfigApplication["icon"].toString())));
 
+    // Setup translator
+    QTranslator translator;
+    if (translator.load(QLocale(), "messages", ".", ":/i18n")) {
+        app.installTranslator(&translator);
+    }
+
     // Setup CLI
     QCommandLineParser clParser;
     clParser.setApplicationDescription(appConfigApplication["description"].toString());
@@ -44,12 +49,6 @@ int main(int argc, char *argv[])
 
     QString ocsUrl = args.at(0);
 
-    // Setup translator
-    QTranslator translator;
-    if (translator.load(QLocale(), appConfigApplication["id"].toString(), ".", ":/qm")) {
-        app.installTranslator(&translator);
-    }
-
     // Setup QML
     QQmlApplicationEngine qmlAppEngine;
     QQmlContext *qmlContext = qmlAppEngine.rootContext();
diff --git a/src/i18n/i18n.pro b/src/i18n/i18n.pro
new file mode 100644
index 0000000000000000000000000000000000000000..a2f872dfd3a55711181e0ce2255b4aff69445048
--- /dev/null
+++ b/src/i18n/i18n.pro
@@ -0,0 +1,7 @@
+SOURCES += $$system(find ../app -type f -name "*.cpp" -or -name "*.qml" -or -name "*.js")
+
+TRANSLATIONS += \
+    messages.ts \
+    messages.en_US.ts
+
+RESOURCES += i18n.qrc
diff --git a/src/i18n/i18n.qrc b/src/i18n/i18n.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..52757b9d77907783ab458abe337799f345695a3b
--- /dev/null
+++ b/src/i18n/i18n.qrc
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/i18n">
+        <file>messages.en_US.qm</file>
+    </qresource>
+</RCC>