1 #include "pseudolocalize.h" 2 3 using namespace std; 4 5 static const char* 6 pseudolocalize_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 */ 71 string 72 pseudolocalize_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