-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtranslationfile.cpp
More file actions
135 lines (121 loc) · 4.26 KB
/
translationfile.cpp
File metadata and controls
135 lines (121 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/////////////////////////////////////////////////////////////////////////////
// Name: translationfile.cpp
// Purpose: Manage translation files and data
// Author: Jan Buchholz
// Created: 2025-11-12
/////////////////////////////////////////////////////////////////////////////
#include "translationfile.h"
#include <iostream>
#include <fstream>
#include <utility>
#include <regex>
#include "definitions.h"
#include "jbconversion.hpp"
#include "appsettings.h"
#include "mobuilder.h"
#include <wx/wx.h>
void TranslationFile::init() {
m_settings = {};
m_translations = {};
m_message = {};
m_dirty = false;
}
bool TranslationFile::save(const std::string& fileName) {
m_message = {};
json j, t;
json a = json::array();
j[CONFIG_COMMON][CONFIG_COMMON_PROJECTFOLDER] = m_settings.project_folder;
j[CONFIG_COMMON][CONFIG_COMMON_FILENAME] = m_settings.file_name;
j[CONFIG_COMMON][CONFIG_COMMON_EXCLUSION] = m_settings.exclude_folders;
for (auto& m : m_translations) {
t[CONFIG_TRANSLATION][CONFIG_TRANSLATION_SOURCEFILE] = m.source_file;
t[CONFIG_TRANSLATION][CONFIG_TRANSLATION_ORIGINALTEXT] = m.original;
t[CONFIG_TRANSLATION][CONFIG_TRANSLATION_TRANSLATEDTEXT] = m.translation;
t[CONFIG_TRANSLATION][CONFIG_TRANSLATION_STATUS] = m.status;
a.push_back(t);
}
j[CONFIG_TRANSLATIONS_ARRAY] = a;
std::ofstream ofs(fileName);
bool b = ofs.is_open();
if (b) {
ofs << std::setw(4) << j << std::endl;
ofs.close();
m_dirty = false;
} else {
m_message.mtype = error;
m_message.message = _("I/O error while saving translation file.");
}
return b;
}
bool TranslationFile::load(const std::string& fileName) {
m_message = {};
std::ifstream ifs(fileName);
if (ifs.is_open()) {
bool b = true;
try {
json j, t;
json a = json::array();
j = json::parse(ifs);
ifs.close();
m_settings = {};
m_translations = {};
mo_single_translation m;
a = j[CONFIG_TRANSLATIONS_ARRAY];
for (auto& item : a.items()) {
t = item.value()[CONFIG_TRANSLATION];
m.source_file = t[CONFIG_TRANSLATION_SOURCEFILE];
m.original = t[CONFIG_TRANSLATION_ORIGINALTEXT];
m.translation = t[CONFIG_TRANSLATION_TRANSLATEDTEXT];
m.status = t[CONFIG_TRANSLATION_STATUS];
m_translations.push_back(m);
}
m_settings.project_folder = j[CONFIG_COMMON][CONFIG_COMMON_PROJECTFOLDER];
m_settings.file_name = fileName;
m_settings.exclude_folders = j[CONFIG_COMMON][CONFIG_COMMON_EXCLUSION];
}
catch (json::parse_error&) {b = false;}
catch (json::type_error&) {b = false;}
catch (json::exception&) {b = false;}
if (!b) {
m_message.mtype = error;
m_message.message = _("Failed to parse JSON in translation file.");
}
return b;
}
m_message.mtype = error;
m_message.message = _("I/O error while loading translation file.");
return false;
}
void TranslationFile::setSettings(mo_file_settings settings) {
m_settings = std::move(settings);
}
mo_file_settings TranslationFile::getSettings() {
return m_settings;
}
void TranslationFile::setDirty(bool dirty) {
m_dirty = dirty;
}
bool TranslationFile::getDirty() {
return m_dirty;
}
void TranslationFile::setTranslations(std::vector<mo_single_translation> translations) {
m_translations = std::move(translations);
}
std::vector<mo_single_translation> TranslationFile::getTranslations() {
return m_translations;
}
void TranslationFile::setMessage(mo_message m) {
m_message = std::move(m);
}
mo_message TranslationFile::getMessage() {
return m_message;
}
bool TranslationFile::createMoFile() {
//std::string moFileName = std::regex_replace(m_settings.file_name, std::regex(".wxtrans"), ".mo");
std::string moFileName = std::regex_replace(m_settings.file_name, std::regex(FILE_EXT_WXTRANS), FILE_EXT_MO);
MoBuilder* builder = new MoBuilder();
bool b = builder->buildMoFile(m_translations, moFileName);
m_message = builder->getMessage();
delete builder;
return b;
}