summaryrefslogtreecommitdiffstats
path: root/libs/host/pseudolocalize.cpp
blob: a2b3c2f101d9c6181c5122105e7e4ae366833bc9 (plain)
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
#include <host/pseudolocalize.h>

using namespace std;

static const char*
pseudolocalize_char(char c)
{
    switch (c) {
        case 'a':   return "\xc4\x83";
        case 'b':   return "\xcf\x84";
        case 'c':   return "\xc4\x8b";
        case 'd':   return "\xc4\x8f";
        case 'e':   return "\xc4\x99";
        case 'f':   return "\xc6\x92";
        case 'g':   return "\xc4\x9d";
        case 'h':   return "\xd1\x9b";
        case 'i':   return "\xcf\x8a";
        case 'j':   return "\xc4\xb5";
        case 'k':   return "\xc4\xb8";
        case 'l':   return "\xc4\xba";
        case 'm':   return "\xe1\xb8\xbf";
        case 'n':   return "\xd0\xb8";
        case 'o':   return "\xcf\x8c";
        case 'p':   return "\xcf\x81";
        case 'q':   return "\x51";
        case 'r':   return "\xd2\x91";
        case 's':   return "\xc5\xa1";
        case 't':   return "\xd1\x82";
        case 'u':   return "\xce\xb0";
        case 'v':   return "\x56";
        case 'w':   return "\xe1\xba\x85";
        case 'x':   return "\xd1\x85";
        case 'y':   return "\xe1\xbb\xb3";
        case 'z':   return "\xc5\xba";
        case 'A':   return "\xc3\x85";
        case 'B':   return "\xce\xb2";
        case 'C':   return "\xc4\x88";
        case 'D':   return "\xc4\x90";
        case 'E':   return "\xd0\x84";
        case 'F':   return "\xce\x93";
        case 'G':   return "\xc4\x9e";
        case 'H':   return "\xc4\xa6";
        case 'I':   return "\xd0\x87";
        case 'J':   return "\xc4\xb5";
        case 'K':   return "\xc4\xb6";
        case 'L':   return "\xc5\x81";
        case 'M':   return "\xe1\xb8\xbe";
        case 'N':   return "\xc5\x83";
        case 'O':   return "\xce\x98";
        case 'P':   return "\xcf\x81";
        case 'Q':   return "\x71";
        case 'R':   return "\xd0\xaf";
        case 'S':   return "\xc8\x98";
        case 'T':   return "\xc5\xa6";
        case 'U':   return "\xc5\xa8";
        case 'V':   return "\xce\xbd";
        case 'W':   return "\xe1\xba\x84";
        case 'X':   return "\xc3\x97";
        case 'Y':   return "\xc2\xa5";
        case 'Z':   return "\xc5\xbd";
        default:    return NULL;
    }
}

/**
 * Converts characters so they look like they've been localized.
 *
 * Note: This leaves escape sequences untouched so they can later be
 * processed by ResTable::collectString in the normal way.
 */
string
pseudolocalize_string(const string& source)
{
    const char* s = source.c_str();
    string result;
    const size_t I = source.length();
    for (size_t i=0; i<I; i++) {
        char c = s[i];
        if (c == '\\') {
            if (i<I-1) {
                result += '\\';
                i++;
                c = s[i];
                switch (c) {
                    case 'u':
                        // this one takes up 5 chars
                        result += string(s+i, 5);
                        i += 4;
                        break;
                    case 't':
                    case 'n':
                    case '#':
                    case '@':
                    case '?':
                    case '"':
                    case '\'':
                    case '\\':
                    default:
                        result += c;
                        break;
                }
            } else {
                result += c;
            }
        } else {
            const char* p = pseudolocalize_char(c);
            if (p != NULL) {
                result += p;
            } else {
                result += c;
            }
        }
    }

    //printf("result=\'%s\'\n", result.c_str());
    return result;
}