| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #include <fstream> | |
| 2 #include <stdexcept> | |
| 3 #include <Windows.h> | |
| 4 | |
| 5 #include "Dictionary.h" | |
| 6 #include "Utils.h" | |
| 7 | |
| 8 Dictionary* Dictionary::instance = 0; | |
| 9 | |
| 10 const std::wstring baseLocale = L"en"; | |
| 11 | |
| 12 Dictionary::Dictionary(const std::wstring& locale) | |
| 13 { | |
| 14 std::wstring basePath = GetDllDir() + L"locales\\"; | |
| 15 | |
| 16 // Always load base locale first - that's our fallback | |
| 17 ReadDictionary(basePath, baseLocale); | |
| 18 | |
| 19 // Now try to load by full locale code | |
| 20 if (locale != baseLocale && !ReadDictionary(basePath, locale)) | |
|
Felix Dahlke
2013/06/11 12:31:14
It looks like if this or the other ReadDictionary
Wladimir Palant
2013/06/12 13:46:07
Yes, it is intended - even incomplete localization
Felix Dahlke
2013/06/13 18:07:37
Okay, just wasn't sure if it was intended.
| |
| 21 { | |
| 22 // Fall back to short locale name | |
| 23 size_t pos = locale.find(L'-'); | |
| 24 if (pos != std::wstring::npos && locale.compare(0, pos, baseLocale) != 0) | |
| 25 ReadDictionary(basePath, locale.substr(0, pos)); | |
| 26 } | |
| 27 } | |
| 28 | |
| 29 void Dictionary::Create(const std::wstring& locale) | |
| 30 { | |
| 31 if (!instance) | |
| 32 instance = new Dictionary(locale); | |
| 33 } | |
| 34 | |
| 35 Dictionary* Dictionary::GetInstance() | |
| 36 { | |
| 37 if (!instance) | |
| 38 throw std::runtime_error("Attempt to access dictionary before creating"); | |
| 39 | |
| 40 return instance; | |
| 41 } | |
| 42 | |
| 43 bool Dictionary::ReadDictionary(const std::wstring& basePath, const std::wstring & locale) | |
| 44 { | |
| 45 std::ifstream stream(basePath + locale + L".ini"); | |
|
Oleksandr
2013/06/18 07:41:09
I think it wouldn't hurt to use "filebuf::sh_read
Wladimir Palant
2013/06/18 08:17:48
Good point even though this is non-standard, will
Wladimir Palant
2013/11/05 11:30:25
After looking into this I am less convinced that t
Eric
2013/11/05 13:56:06
The full constructor is declared thus:
explic
Wladimir Palant
2013/11/06 08:51:46
Not really. If you look at http://msdn.microsoft.c
Eric
2013/11/06 17:49:53
After realizing that I hadn't remembered what was
Felix Dahlke
2013/11/06 23:09:50
This seems a bit like premature optimisation to me
Wladimir Palant
2013/11/07 06:53:57
According to http://msdn.microsoft.com/en-us/libra
| |
| 46 if (stream.fail()) | |
| 47 return false; | |
| 48 | |
| 49 std::string section; | |
| 50 while (!stream.eof()) | |
|
Felix Dahlke
2013/06/11 12:31:14
I think the following would suffice, it'd be a bit
Wladimir Palant
2013/06/12 13:46:07
IMHO that will get us into an endless loop - std::
Felix Dahlke
2013/06/13 18:07:37
No, it wouldn't be an endless loop, this is the ca
| |
| 51 { | |
| 52 std::string line; | |
| 53 std::getline(stream, line); | |
| 54 if (stream.fail()) | |
| 55 return false; | |
| 56 | |
| 57 line = ::TrimString(line); | |
| 58 if (line.size() >= 2 && line[0] == '[' && line[line.size() - 1] == ']') | |
| 59 { | |
| 60 // Section header | |
| 61 section = line.substr(1, line.size() - 2); | |
| 62 } | |
| 63 else if (line.size() >= 1 && line[0] == '#') | |
|
Felix Dahlke
2013/06/11 12:31:14
This won't allow for comments preceeded by whitesp
Wladimir Palant
2013/06/12 13:46:07
We call TrimLine earlier so whitespace is allowed.
Felix Dahlke
2013/06/13 18:07:37
Hm. One benefit of this is that the translated str
| |
| 64 { | |
| 65 // Comment | |
| 66 continue; | |
| 67 } | |
| 68 else | |
| 69 { | |
| 70 // Value | |
| 71 size_t pos = line.find('='); | |
| 72 if (pos != std::string::npos) | |
| 73 { | |
| 74 std::string key = ::TrimString(line.substr(0, pos)); | |
| 75 std::string value = ::TrimString(line.substr(pos + 1)); | |
| 76 data[KeyType(section, key)] = ToUtf16String(value); | |
| 77 } | |
| 78 } | |
| 79 } | |
| 80 return true; | |
| 81 } | |
| 82 | |
| 83 std::wstring Dictionary::Lookup(const std::string& section, const std::string& k ey) const | |
| 84 { | |
| 85 DataType::const_iterator it = data.find(KeyType(section, key)); | |
| 86 if (it == data.end()) | |
| 87 return L"### MISSING STRING [" + ToUtf16String(section) + L", " + ToUtf16Str ing(key) + L"] ###"; | |
| 88 | |
| 89 return it->second; | |
| 90 } | |
| OLD | NEW |