Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2020, 2021 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify it under the
6 : terms of the GNU General Public License as published by the Free Software
7 : Foundation; either version 3, or (at your option) any later version.
8 :
9 : TALER is distributed in the hope that it will be useful, but WITHOUT ANY
10 : WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 : A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 :
13 : You should have received a copy of the GNU General Public License along with
14 : TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
15 : */
16 : /**
17 : * @file json/i18n.c
18 : * @brief helper functions for i18n in JSON processing
19 : * @author Christian Grothoff
20 : */
21 : #include "taler/platform.h"
22 : #include <gnunet/gnunet_util_lib.h>
23 : #include "taler/taler_util.h"
24 : #include "taler/taler_json_lib.h"
25 :
26 :
27 : const json_t *
28 0 : TALER_JSON_extract_i18n (const json_t *object,
29 : const char *language_pattern,
30 : const char *field)
31 : {
32 : const json_t *ret;
33 : json_t *i18n;
34 0 : double quality = -1;
35 :
36 0 : ret = json_object_get (object,
37 : field);
38 0 : if (NULL == ret)
39 0 : return NULL; /* field MUST exist in object */
40 : {
41 : char *name;
42 :
43 0 : GNUNET_asprintf (&name,
44 : "%s_i18n",
45 : field);
46 0 : i18n = json_object_get (object,
47 : name);
48 0 : GNUNET_free (name);
49 : }
50 0 : if (NULL == i18n)
51 0 : return ret;
52 : {
53 : const char *key;
54 : json_t *value;
55 :
56 0 : json_object_foreach (i18n, key, value) {
57 0 : double q = TALER_pattern_matches (language_pattern,
58 : key);
59 0 : if (q > quality)
60 : {
61 0 : quality = q;
62 0 : ret = value;
63 : }
64 : }
65 : }
66 0 : return ret;
67 : }
68 :
69 :
70 : bool
71 153 : TALER_JSON_check_i18n (const json_t *i18n)
72 : {
73 : const char *field;
74 : json_t *member;
75 :
76 153 : if (! json_is_object (i18n))
77 0 : return false;
78 153 : json_object_foreach ((json_t *) i18n, field, member)
79 : {
80 0 : if (! json_is_string (member))
81 0 : return false;
82 : /* Field name must be either of format "en_UK"
83 : or just "en"; we do not care about capitalization;
84 : for syntax, see GNU Gettext manual, including
85 : appendix A for rare language codes. */
86 0 : switch (strlen (field))
87 : {
88 0 : case 0:
89 : case 1:
90 0 : return false;
91 0 : case 2:
92 0 : if (! isalpha (field[0]))
93 0 : return false;
94 0 : if (! isalpha (field[1]))
95 0 : return false;
96 0 : break;
97 0 : case 3:
98 : case 4:
99 0 : return false;
100 0 : case 5:
101 0 : if (! isalpha (field[0]))
102 0 : return false;
103 0 : if (! isalpha (field[1]))
104 0 : return false;
105 0 : if ('_' != field[2])
106 0 : return false;
107 0 : if (! isalpha (field[3]))
108 0 : return false;
109 0 : if (! isalpha (field[4]))
110 0 : return false;
111 0 : break;
112 0 : case 6:
113 0 : if (! isalpha (field[0]))
114 0 : return false;
115 0 : if (! isalpha (field[1]))
116 0 : return false;
117 0 : if ('_' != field[2])
118 0 : return false;
119 0 : if (! isalpha (field[3]))
120 0 : return false;
121 0 : if (! isalpha (field[4]))
122 0 : return false;
123 0 : if (! isalpha (field[5]))
124 0 : return false;
125 0 : break;
126 0 : default:
127 0 : return false;
128 : }
129 : }
130 153 : return true;
131 : }
132 :
133 :
134 : /* end of i18n.c */
|