On Wed, Apr 19, 2017 at 3:08 AM, David Woodhouse <dwmw2 at infradead.org> wrote: > On Sun, 2017-04-09 at 02:03 -0700, Daniel Lenski wrote: >> >> --- a/library.c >> +++ b/library.c >> @@ -109,6 +109,9 @@ err: >> const struct vpn_proto openconnect_protos[] = { >> { >> .name = "anyconnect", >> + .pretty_name = "Cisco AnyConnect or openconnect", >> + .description = "Compatible with Cisco AnyConnect SSL VPN, as well as ocserv", >> + .flags = OC_PROTO_PROXY | OC_PROTO_CSD | OC_PROTO_AUTH_CERT | OC_PROTO_AUTH_OTP | OC_PROTO_AUTH_STOKEN, >> .vpn_close_session = cstp_bye, >> .tcp_connect = cstp_connect, >> .tcp_mainloop = cstp_mainloop, > > Those strings aren't going to get translated (by humans, in the .po > files) unless you put them in N_("?"); I tried this with _("..."), but it's not a const expression so can't be used with static data. According to the header file, _N("...") is a no-op. #ifdef ENABLE_NLS #include <libintl.h> #define _(s) dgettext("openconnect", s) #else #define _(s) ((char *)(s)) #endif #define N_(s) s So that's why the patch adds the _("...") wrapper in the API call instead, where the data actually becomes user-visible. Not the right way to do it? int openconnect_get_supported_protocols(struct oc_vpn_proto **protos) { struct oc_vpn_proto *pr; const struct vpn_proto *p; *protos = pr = calloc(sizeof(openconnect_protos)/sizeof(*openconnect_protos), sizeof(*pr)); if (!pr) return -ENOMEM; for (p = openconnect_protos; p->name; p++, pr++) { pr->name = p->name; pr->pretty_name = _(p->pretty_name); pr->description = _(p->description); pr->flags = p->flags; } return 0; } -Dan