]>
Commit | Line | Data |
---|---|---|
bc44d920 | 1 | /* |
b19ccc9e | 2 | * "$Id: strings2po.c 7720 2008-07-11 22:46:21Z mike $" |
bc44d920 | 3 | * |
4 | * Convert Apple .strings file (UTF-16 BE text file) to GNU gettext .po files. | |
5 | * | |
6 | * Usage: | |
7 | * | |
8 | * strings2po filename.strings filename.po | |
9 | * | |
10 | * Compile with: | |
11 | * | |
12 | * gcc -o strings2po strings2po.c | |
13 | * | |
14 | * Contents: | |
15 | * | |
16 | * main() - Convert .strings file to .po. | |
17 | * read_strings() - Read a line from a .strings file. | |
18 | * write_po() - Write a line to the .po file. | |
19 | */ | |
20 | ||
21 | #include <stdio.h> | |
22 | #include <stdlib.h> | |
23 | ||
24 | ||
25 | /* | |
26 | * The .strings file format is simple: | |
27 | * | |
28 | * // comment | |
29 | * "id" = "str"; | |
30 | * | |
31 | * Both the id and str strings use standard C quoting for special characters | |
32 | * like newline and the double quote character. | |
33 | */ | |
34 | ||
35 | /* | |
36 | * Local functions... | |
37 | */ | |
38 | ||
39 | static int read_strings(FILE *strings, char *buffer, size_t bufsize, | |
40 | char **id, char **str); | |
41 | static void write_po(FILE *po, const char *what, const char *s); | |
42 | ||
43 | ||
44 | /* | |
45 | * main() - Convert .strings file to .po. | |
46 | */ | |
47 | ||
48 | int /* O - Exit code */ | |
49 | main(int argc, /* I - Number of command-line args */ | |
50 | char *argv[]) /* I - Command-line arguments */ | |
51 | { | |
52 | FILE *strings, /* .strings file */ | |
53 | *po; /* .po file */ | |
54 | char iconv[1024], /* iconv command */ | |
55 | buffer[8192], /* Line buffer */ | |
56 | *id, /* ID string */ | |
57 | *str; /* Translation string */ | |
58 | int count; /* Number of messages converted */ | |
59 | ||
60 | ||
61 | if (argc != 3) | |
62 | { | |
63 | puts("Usage: strings2po filename.strings filename.po"); | |
64 | return (1); | |
65 | } | |
66 | ||
67 | /* | |
68 | * Cheat by using iconv to convert the .strings file from UTF-16 to UTF-8 | |
69 | * which is what we need for the .po file (and it makes things a lot | |
70 | * simpler...) | |
71 | */ | |
72 | ||
73 | snprintf(iconv, sizeof(iconv), "iconv -f utf-16 -t utf-8 '%s'", argv[1]); | |
74 | if ((strings = popen(iconv, "r")) == NULL) | |
75 | { | |
76 | perror(argv[1]); | |
77 | return (1); | |
78 | } | |
79 | ||
80 | if ((po = fopen(argv[2], "w")) == NULL) | |
81 | { | |
82 | perror(argv[2]); | |
83 | pclose(strings); | |
84 | return (1); | |
85 | } | |
86 | ||
87 | count = 0; | |
88 | ||
89 | while (read_strings(strings, buffer, sizeof(buffer), &id, &str)) | |
90 | { | |
91 | count ++; | |
92 | write_po(po, "msgid", id); | |
93 | write_po(po, "msgstr", str); | |
94 | } | |
95 | ||
96 | pclose(strings); | |
97 | fclose(po); | |
98 | ||
99 | printf("%s: %d messages.\n", argv[2], count); | |
100 | ||
101 | return (0); | |
102 | } | |
103 | ||
104 | ||
105 | /* | |
106 | * 'read_strings()' - Read a line from a .strings file. | |
107 | */ | |
108 | ||
109 | static int /* O - 1 on success, 0 on failure */ | |
110 | read_strings(FILE *strings, /* I - .strings file */ | |
111 | char *buffer, /* I - Line buffer */ | |
112 | size_t bufsize, /* I - Size of line buffer */ | |
113 | char **id, /* O - Pointer to ID string */ | |
114 | char **str) /* O - Pointer to translation string */ | |
115 | { | |
116 | char *bufptr; /* Pointer into buffer */ | |
117 | ||
118 | ||
119 | while (fgets(buffer, bufsize, strings)) | |
120 | { | |
121 | if (buffer[0] != '\"') | |
122 | continue; | |
123 | ||
124 | *id = buffer + 1; | |
125 | ||
126 | for (bufptr = buffer + 1; *bufptr && *bufptr != '\"'; bufptr ++) | |
127 | if (*bufptr == '\\') | |
128 | bufptr ++; | |
129 | ||
130 | if (*bufptr != '\"') | |
131 | continue; | |
132 | ||
133 | *bufptr++ = '\0'; | |
134 | ||
135 | while (*bufptr && *bufptr != '\"') | |
136 | bufptr ++; | |
137 | ||
138 | if (!*bufptr) | |
139 | continue; | |
140 | ||
141 | bufptr ++; | |
142 | *str = bufptr; | |
143 | ||
144 | for (; *bufptr && *bufptr != '\"'; bufptr ++) | |
145 | if (*bufptr == '\\') | |
146 | bufptr ++; | |
147 | ||
148 | if (*bufptr != '\"') | |
149 | continue; | |
150 | ||
1f0275e3 | 151 | *bufptr = '\0'; |
bc44d920 | 152 | |
153 | return (1); | |
154 | } | |
155 | ||
156 | return (0); | |
157 | } | |
158 | ||
159 | ||
160 | /* | |
161 | * 'write_po()' - Write a line to the .po file. | |
162 | */ | |
163 | ||
164 | static void | |
165 | write_po(FILE *po, /* I - .po file */ | |
166 | const char *what, /* I - Type of string */ | |
167 | const char *s) /* I - String to write */ | |
168 | { | |
169 | fprintf(po, "%s \"%s\"\n", what, s); | |
170 | } | |
171 | ||
172 | ||
173 | /* | |
b19ccc9e | 174 | * End of "$Id: strings2po.c 7720 2008-07-11 22:46:21Z mike $". |
bc44d920 | 175 | */ |