pseudolocalize.cpp revision 282e181b58cf72b6ca770dc7ca5f91f135444502
1#include "pseudolocalize.h"
2
3using namespace std;
4
5static const char*
6pseudolocalize_char(char c)
7{
8    switch (c) {
9        case 'a':   return "\xc4\x83";
10        case 'b':   return "\xcf\x84";
11        case 'c':   return "\xc4\x8b";
12        case 'd':   return "\xc4\x8f";
13        case 'e':   return "\xc4\x99";
14        case 'f':   return "\xc6\x92";
15        case 'g':   return "\xc4\x9d";
16        case 'h':   return "\xd1\x9b";
17        case 'i':   return "\xcf\x8a";
18        case 'j':   return "\xc4\xb5";
19        case 'k':   return "\xc4\xb8";
20        case 'l':   return "\xc4\xba";
21        case 'm':   return "\xe1\xb8\xbf";
22        case 'n':   return "\xd0\xb8";
23        case 'o':   return "\xcf\x8c";
24        case 'p':   return "\xcf\x81";
25        case 'q':   return "\x51";
26        case 'r':   return "\xd2\x91";
27        case 's':   return "\xc5\xa1";
28        case 't':   return "\xd1\x82";
29        case 'u':   return "\xce\xb0";
30        case 'v':   return "\x56";
31        case 'w':   return "\xe1\xba\x85";
32        case 'x':   return "\xd1\x85";
33        case 'y':   return "\xe1\xbb\xb3";
34        case 'z':   return "\xc5\xba";
35        case 'A':   return "\xc3\x85";
36        case 'B':   return "\xce\xb2";
37        case 'C':   return "\xc4\x88";
38        case 'D':   return "\xc4\x90";
39        case 'E':   return "\xd0\x84";
40        case 'F':   return "\xce\x93";
41        case 'G':   return "\xc4\x9e";
42        case 'H':   return "\xc4\xa6";
43        case 'I':   return "\xd0\x87";
44        case 'J':   return "\xc4\xb5";
45        case 'K':   return "\xc4\xb6";
46        case 'L':   return "\xc5\x81";
47        case 'M':   return "\xe1\xb8\xbe";
48        case 'N':   return "\xc5\x83";
49        case 'O':   return "\xce\x98";
50        case 'P':   return "\xcf\x81";
51        case 'Q':   return "\x71";
52        case 'R':   return "\xd0\xaf";
53        case 'S':   return "\xc8\x98";
54        case 'T':   return "\xc5\xa6";
55        case 'U':   return "\xc5\xa8";
56        case 'V':   return "\xce\xbd";
57        case 'W':   return "\xe1\xba\x84";
58        case 'X':   return "\xc3\x97";
59        case 'Y':   return "\xc2\xa5";
60        case 'Z':   return "\xc5\xbd";
61        default:    return NULL;
62    }
63}
64
65/**
66 * Converts characters so they look like they've been localized.
67 *
68 * Note: This leaves escape sequences untouched so they can later be
69 * processed by ResTable::collectString in the normal way.
70 */
71string
72pseudolocalize_string(const string& source)
73{
74    const char* s = source.c_str();
75    string result;
76    const size_t I = source.length();
77    for (size_t i=0; i<I; i++) {
78        char c = s[i];
79        if (c == '\\') {
80            if (i<I-1) {
81                result += '\\';
82                i++;
83                c = s[i];
84                switch (c) {
85                    case 'u':
86                        // this one takes up 5 chars
87                        result += string(s+i, 5);
88                        i += 4;
89                        break;
90                    case 't':
91                    case 'n':
92                    case '#':
93                    case '@':
94                    case '?':
95                    case '"':
96                    case '\'':
97                    case '\\':
98                    default:
99                        result += c;
100                        break;
101                }
102            } else {
103                result += c;
104            }
105        } else {
106            const char* p = pseudolocalize_char(c);
107            if (p != NULL) {
108                result += p;
109            } else {
110                result += c;
111            }
112        }
113    }
114
115    //printf("result=\'%s\'\n", result.c_str());
116    return result;
117}
118
119
120