-
Notifications
You must be signed in to change notification settings - Fork 0
/
string_table.cpp
94 lines (80 loc) · 2.19 KB
/
string_table.cpp
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
// string_table.cpp
#include "utility.h"
#include "exception.h"
#include "string_table.h"
using namespace GGXXACPRReplayOrganizer;
// -- StringTable --------------------------------------------------------
StringTable::ID::ID( unsigned int number ) :
number_( number )
{
}
std::wstring
StringTable::ID::Get( void ) const
{
return StringTable::Get( *this );
}
namespace {
std::optional<HMODULE> lib;
std::wstring current_language;
}
std::wstring
StringTable::GetUserDefaultLocaleString( void )
{
if ( GGXXACPRReplayOrganizer::Utility::UserDefaultLocaleIsJapan() ) {
return L"japanese";
}
if ( GGXXACPRReplayOrganizer::Utility::UserDefaultLocaleIsKorea() ) {
return L"korean";
}
if ( GGXXACPRReplayOrganizer::Utility::UserDefaultLocaleIsChina() ) {
return L"chinese_traditional";
}
return L"english";
}
void
StringTable::Initialize( const std::wstring& language )
{
std::wstring dll_name = language;
if ( language.empty() ) {
dll_name = StringTable::GetUserDefaultLocaleString();
}
std::wstring path = Utility::GetLanguageDirectoryPath() + L"\\" + dll_name + L".dll";
HMODULE tmp = ::LoadLibraryW( path.c_str() );
if ( tmp == NULL ) {
throw LanguageException( language );
}
if ( lib ) {
::FreeLibrary( lib.value() );
}
lib = tmp;
current_language = language;
}
std::wstring
StringTable::GetCurrentLanguage( void )
{
return current_language;
}
std::wstring
StringTable::Get( ID id )
{
if ( lib ) {
for ( size_t buf_size = 1024; ; ) {
auto buf = std::make_unique<wchar_t[]>( buf_size );
int ret = ::LoadStringW( lib.value(), id.number_, buf.get(), static_cast<int>( buf_size ) );
if ( ret == 0 ) {
break;
}
if ( ret < static_cast<int>( buf_size - 2 ) ) {
return buf.get();
}
buf_size = static_cast<size_t>( buf_size * 1.5 );
}
}
// ここは生メッセージ
if ( Utility::UserDefaultLocaleIsJapan() ) {
return L"メッセージの取得に失敗しました。ID = " + std::format( L"{}", id.number_ );
}
else {
return L"Failed to get the message. ID = " + std::format( L"{}", id.number_ );
}
}