1 /* Writing Desktop Entry files.
2 Copyright (C) 1995-1998, 2000-2003, 2005-2006, 2008-2009, 2014-2015
3 Free Software Foundation, Inc.
4 This file was written by Daiki Ueno <ueno@gnu.org>.
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "write-desktop.h"
31 #include "msgl-iconv.h"
32 #include "po-charset.h"
33 #include "read-catalog.h"
35 #include "read-desktop.h"
36 #include "fwriteerror.h"
40 #define _(str) gettext (str)
42 typedef struct msgfmt_desktop_reader_ty msgfmt_desktop_reader_ty;
43 struct msgfmt_desktop_reader_ty
46 msgfmt_operand_list_ty *operands;
52 msgfmt_desktop_handle_group (struct desktop_reader_ty *reader,
55 msgfmt_desktop_reader_ty *msgfmt_reader = (msgfmt_desktop_reader_ty *) reader;
57 fprintf (msgfmt_reader->output_file, "[%s]\n", group);
61 msgfmt_desktop_handle_pair (desktop_reader_ty *reader,
67 msgfmt_desktop_reader_ty *msgfmt_reader = (msgfmt_desktop_reader_ty *) reader;
72 /* Write translated pair, if any. */
73 if (hash_find_entry (msgfmt_reader->keywords, key, strlen (key),
76 bool is_list = (bool) keyword_value;
77 char *unescaped = desktop_unescape_string (value, is_list);
80 for (i = 0; i < msgfmt_reader->operands->nitems; i++)
82 msgfmt_operand_ty *operand = &msgfmt_reader->operands->items[i];
85 mp = message_list_search (operand->mlp, NULL, unescaped);
86 if (mp && *mp->msgstr != '\0')
90 escaped = desktop_escape_string (mp->msgstr, is_list);
91 fprintf (msgfmt_reader->output_file,
93 key, operand->language, escaped);
100 /* Write untranslated pair. */
101 fprintf (msgfmt_reader->output_file, "%s=%s\n", key, value);
104 /* Preserve already translated pair. */
105 fprintf (msgfmt_reader->output_file, "%s[%s]=%s\n", key, locale, value);
109 msgfmt_desktop_handle_comment (struct desktop_reader_ty *reader, const char *s)
111 msgfmt_desktop_reader_ty *msgfmt_reader = (msgfmt_desktop_reader_ty *) reader;
113 fputc ('#', msgfmt_reader->output_file);
114 fputs (s, msgfmt_reader->output_file);
115 fputc ('\n', msgfmt_reader->output_file);
119 msgfmt_desktop_handle_blank (struct desktop_reader_ty *reader, const char *s)
121 msgfmt_desktop_reader_ty *msgfmt_reader = (msgfmt_desktop_reader_ty *) reader;
123 fputs (s, msgfmt_reader->output_file);
124 fputc ('\n', msgfmt_reader->output_file);
127 desktop_reader_class_ty msgfmt_methods =
129 sizeof (msgfmt_desktop_reader_ty),
132 msgfmt_desktop_handle_group,
133 msgfmt_desktop_handle_pair,
134 msgfmt_desktop_handle_comment,
135 msgfmt_desktop_handle_blank
139 msgdomain_write_desktop_bulk (msgfmt_operand_list_ty *operands,
140 const char *template_file_name,
141 hash_table *keywords,
142 const char *file_name)
144 desktop_reader_ty *reader;
145 msgfmt_desktop_reader_ty *msgfmt_reader;
148 reader = desktop_reader_alloc (&msgfmt_methods);
149 msgfmt_reader = (msgfmt_desktop_reader_ty *) reader;
151 msgfmt_reader->operands = operands;
152 msgfmt_reader->keywords = keywords;
154 if (strcmp (file_name, "-") == 0)
155 msgfmt_reader->output_file = stdout;
158 msgfmt_reader->output_file = fopen (file_name, "w");
159 if (msgfmt_reader->output_file == NULL)
161 desktop_reader_free (reader);
162 error (0, errno, _("error while opening \"%s\" for writing"),
168 template_file = fopen (template_file_name, "r");
169 if (template_file == NULL)
171 desktop_reader_free (reader);
172 error (0, errno, _("error while opening \"%s\" for reading"),
177 desktop_parse (reader, template_file, template_file_name, template_file_name);
179 /* Make sure nothing went wrong. */
180 if (fwriteerror (msgfmt_reader->output_file))
182 error (0, errno, _("error while writing \"%s\" file"),
187 desktop_reader_free (reader);
193 msgdomain_write_desktop (message_list_ty *mlp,
194 const char *canon_encoding,
195 const char *locale_name,
196 const char *template_file_name,
197 hash_table *keywords,
198 const char *file_name)
200 msgfmt_operand_ty operand;
201 msgfmt_operand_list_ty operands;
203 /* Convert the messages to Unicode. */
204 iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
206 /* Create a single-element operands and run the bulk operation on it. */
207 operand.language = (char *) locale_name;
210 operands.items = &operand;
212 return msgdomain_write_desktop_bulk (&operands,