mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-04-02 10:42:14 -04:00
byuu says: The problems with the Windows and Qt4 ports have all been resolved, although there's a fairly gross hack on a few Qt widgets to not destruct once Application::quit() is called to avoid a double free crash (I'm unsure where Qt is destructing the widgets internally.) The Cocoa port compiles again at least, though it's bound to have endless problems. I improved the Label painting in the GTK ports, which fixes the background color on labels inside TabFrame widgets. I've optimized the Makefile system even further. I added a "redo state" command to bsnes, which is created whenever you load the undo state. There are also hotkeys for both now, although I don't think they're really something you want to map hotkeys to. I moved the nall::Locale object inside hiro::Application, so that it can be used to translate the BrowserDialog and MessageDialog window strings. I improved the Super Game Boy emulation of `MLT_REQ`, fixing Pokemon Yellow's custom border and probably more stuff. Lots of other small fixes and improvements. Things are finally stable once again after the harrowing layout redesign catastrophe. Errata: - ICD::joypID should be set to 3 on reset(). joypWrite() may as well take uint1 instead of bool. - hiro/Qt: remove pWindow::setMaximumSize() comment; found a workaround for it - nall/GNUmakefile: don't set object.path if it's already set (allow overrides before including the file)
86 lines
2.1 KiB
C++
86 lines
2.1 KiB
C++
#pragma once
|
|
|
|
namespace nall {
|
|
|
|
struct Locale {
|
|
struct Dictionary {
|
|
string location;
|
|
string language;
|
|
Markup::Node document;
|
|
};
|
|
|
|
auto scan(string pathname) -> void {
|
|
dictionaries.reset();
|
|
selected.reset();
|
|
for(auto filename : directory::icontents(pathname, "*.bml")) {
|
|
Dictionary dictionary;
|
|
dictionary.location = {pathname, filename};
|
|
dictionary.document = BML::unserialize(string::read(dictionary.location));
|
|
dictionary.language = dictionary.document["locale/language"].text();
|
|
dictionaries.append(dictionary);
|
|
}
|
|
}
|
|
|
|
auto available() const -> string_vector {
|
|
string_vector result;
|
|
for(auto& dictionary : dictionaries) {
|
|
result.append(dictionary.language);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
auto select(string language) -> bool {
|
|
selected.reset();
|
|
for(auto& dictionary : dictionaries) {
|
|
if(dictionary.language == language) {
|
|
selected = dictionary;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
template<typename... P>
|
|
auto operator()(string ns, string input, P&&... p) const -> string {
|
|
string_vector arguments{forward<P>(p)...};
|
|
if(selected) {
|
|
for(auto node : selected().document) {
|
|
if(node.name() == "namespace" && node.text() == ns) {
|
|
for(auto map : node) {
|
|
if(map.name() == "map" && map["input"].text() == input) {
|
|
input = map["value"].text();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(uint index : range(arguments.size())) {
|
|
input.replace({"{", index, "}"}, arguments[index]);
|
|
}
|
|
return input;
|
|
}
|
|
|
|
struct Namespace {
|
|
Namespace(Locale& _locale, string _namespace) : _locale(_locale), _namespace(_namespace) {}
|
|
|
|
template<typename... P>
|
|
auto operator()(string input, P&&... p) const -> string {
|
|
return _locale(_namespace, input, forward<P>(p)...);
|
|
}
|
|
|
|
template<typename... P>
|
|
auto tr(string input, P&&... p) const -> string {
|
|
return _locale(_namespace, input, forward<P>(p)...);
|
|
}
|
|
|
|
private:
|
|
Locale& _locale;
|
|
string _namespace;
|
|
};
|
|
|
|
private:
|
|
vector<Dictionary> dictionaries;
|
|
maybe<Dictionary&> selected;
|
|
};
|
|
|
|
}
|