From 57a9e49232ecbe7ca5d6e6e04f6a20a304b8b818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Mon, 17 Dec 2018 16:00:13 +0000 Subject: [PATCH] util: fix translation of error message strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The arguments to the N_() macro must only ever be a literal string. It is not possible to use macro arguments, or use macro string concatenation in this context. The N_() macro is a no-op whose only purpose is to act as a marker for xgettext when it extracts translatable strings from the source code. Anything other than a literal string will be silently ignored by xgettext. Unfortunately this means that the clever MSG, MSG2 & MSG_EXISTS macros used for building up error message strings have prevented any of the error messages getting marked for translation. We must sadly, revert to a more explicit listing of strings for now. Reviewed-by: Jiri Denemark Signed-off-by: Daniel P. Berrangé --- src/util/virerror.c | 431 +++++++++++++++++++++++++++++++------------- 1 file changed, 303 insertions(+), 128 deletions(-) diff --git a/src/util/virerror.c b/src/util/virerror.c index b08427005f..61b47d2be0 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -908,138 +908,313 @@ typedef struct { } virErrorMsgTuple; -/** - * These macros expand to the following format of error message: - * MSG2("error message", " suffix %s") - * - no info: "error message" - * - info: "error message suffix %s" - * - * MSG("error message") - * - no info: "error message" - * - info: "error message: %s" - * - * MSG_EXISTS("sausage") - * - no info: "this sausage exists already" - * - info: "sausage %s exists already" - * - * For any other case please use: - * { "error message without info string", "message containing %s description"} - */ -#define MSG2(msg, sfx) \ - { N_(msg), N_(msg sfx) } -#define MSG(msg) \ - MSG2(msg, ": %s") -#define MSG_EXISTS(object) \ - { N_("this " object " exists already"), N_(object " %s exists already") } - const virErrorMsgTuple virErrorMsgStrings[VIR_ERR_NUMBER_LAST] = { [VIR_ERR_OK] = { NULL, NULL }, - [VIR_ERR_INTERNAL_ERROR] = MSG("internal error"), - [VIR_ERR_NO_MEMORY] = MSG("out of memory"), - [VIR_ERR_NO_SUPPORT] = MSG("this function is not supported by the connection driver"), - [VIR_ERR_UNKNOWN_HOST] = MSG2("unknown host", " %s"), - [VIR_ERR_NO_CONNECT] = MSG2("no connection driver available", " for %s"), - [VIR_ERR_INVALID_CONN] = MSG2("invalid connection pointer in", " %s"), - [VIR_ERR_INVALID_DOMAIN] = MSG2("invalid domain pointer in", " %s"), - [VIR_ERR_INVALID_ARG] = MSG("invalid argument"), - [VIR_ERR_OPERATION_FAILED] = MSG("operation failed"), - [VIR_ERR_GET_FAILED] = MSG("GET operation failed"), - [VIR_ERR_POST_FAILED] = MSG("POST operation failed"), - [VIR_ERR_HTTP_ERROR] = MSG2("got unknown HTTP error code", " %s"), - [VIR_ERR_SEXPR_SERIAL] = MSG("failed to serialize S-Expr"), - [VIR_ERR_NO_XEN] = MSG2("could not use Xen hypervisor entry", " %s"), - [VIR_ERR_XEN_CALL] = MSG2("failed Xen syscall", " %s"), - [VIR_ERR_OS_TYPE] = MSG2("unknown OS type", " %s"), - [VIR_ERR_NO_KERNEL] = MSG("missing kernel information"), - [VIR_ERR_NO_ROOT] = MSG2("missing root device information", " in %s"), - [VIR_ERR_NO_SOURCE] = MSG2("missing source information for device", " %s"), - [VIR_ERR_NO_TARGET] = MSG2("missing target information for device", " %s"), - [VIR_ERR_NO_NAME] = MSG2("missing name information", " in %s"), - [VIR_ERR_NO_OS] = MSG2("missing operating system information", " for %s"), - [VIR_ERR_NO_DEVICE] = MSG2("missing devices information", " for %s"), - [VIR_ERR_NO_XENSTORE] = MSG2("could not connect to Xen Store", " %s"), - [VIR_ERR_DRIVER_FULL] = MSG2("too many drivers registered", " in %s"), - [VIR_ERR_CALL_FAILED] = MSG("library call failed"), - [VIR_ERR_XML_ERROR] = { "XML description is invalid or not well formed", "XML error: %s" }, - [VIR_ERR_DOM_EXIST] = MSG_EXISTS("domain"), - [VIR_ERR_OPERATION_DENIED] = { "operation forbidden for read only access", "operation forbidden: %s" }, - [VIR_ERR_OPEN_FAILED] = MSG2("failed to open configuration file", " %s"), - [VIR_ERR_READ_FAILED] = MSG2("failed to read configuration file", " %s"), - [VIR_ERR_PARSE_FAILED] = MSG2("failed to parse configuration file", " %s"), - [VIR_ERR_CONF_SYNTAX] = MSG("configuration file syntax error"), - [VIR_ERR_WRITE_FAILED] = MSG("failed to write configuration file"), - [VIR_ERR_XML_DETAIL] = { "parser error", "%s" }, - [VIR_ERR_INVALID_NETWORK] = MSG2("invalid network pointer in", " %s"), - [VIR_ERR_NETWORK_EXIST] = MSG_EXISTS("network"), - [VIR_ERR_SYSTEM_ERROR] = { "system call error", "%s" }, - [VIR_ERR_RPC] = { "RPC error", "%s" }, - [VIR_ERR_GNUTLS_ERROR] = { "GNUTLS call error", "%s" }, - [VIR_WAR_NO_NETWORK] = MSG("Failed to find the network"), - [VIR_ERR_NO_DOMAIN] = MSG("Domain not found"), - [VIR_ERR_NO_NETWORK] = MSG("Network not found"), - [VIR_ERR_INVALID_MAC] = MSG("invalid MAC address"), - [VIR_ERR_AUTH_FAILED] = MSG("authentication failed"), - [VIR_ERR_INVALID_STORAGE_POOL] = MSG2("invalid storage pool pointer in", " %s"), - [VIR_ERR_INVALID_STORAGE_VOL] = MSG2("invalid storage volume pointer in", " %s"), - [VIR_WAR_NO_STORAGE] = MSG("Failed to find a storage driver"), - [VIR_ERR_NO_STORAGE_POOL] = MSG("Storage pool not found"), - [VIR_ERR_NO_STORAGE_VOL] = MSG("Storage volume not found"), - [VIR_WAR_NO_NODE] = MSG("Failed to find a node driver"), - [VIR_ERR_INVALID_NODE_DEVICE] = MSG2("invalid node device pointer", " in %s"), - [VIR_ERR_NO_NODE_DEVICE] = MSG("Node device not found"), - [VIR_ERR_NO_SECURITY_MODEL] = MSG("Security model not found"), - [VIR_ERR_OPERATION_INVALID] = MSG("Requested operation is not valid"), - [VIR_WAR_NO_INTERFACE] = MSG("Failed to find the interface"), - [VIR_ERR_NO_INTERFACE] = MSG("Interface not found"), - [VIR_ERR_INVALID_INTERFACE] = MSG2("invalid interface pointer in", " %s"), - [VIR_ERR_MULTIPLE_INTERFACES] = MSG("multiple matching interfaces found"), - [VIR_WAR_NO_NWFILTER] = MSG("Failed to start the nwfilter driver"), - [VIR_ERR_INVALID_NWFILTER] = MSG("Invalid network filter"), - [VIR_ERR_NO_NWFILTER] = MSG("Network filter not found"), - [VIR_ERR_BUILD_FIREWALL] = MSG("Error while building firewall"), - [VIR_WAR_NO_SECRET] = MSG("Failed to find a secret storage driver"), - [VIR_ERR_INVALID_SECRET] = MSG("Invalid secret"), - [VIR_ERR_NO_SECRET] = MSG("Secret not found"), - [VIR_ERR_CONFIG_UNSUPPORTED] = MSG("unsupported configuration"), - [VIR_ERR_OPERATION_TIMEOUT] = MSG("Timed out during operation"), - [VIR_ERR_MIGRATE_PERSIST_FAILED] = MSG("Failed to make domain persistent after migration"), - [VIR_ERR_HOOK_SCRIPT_FAILED] = MSG("Hook script execution failed"), - [VIR_ERR_INVALID_DOMAIN_SNAPSHOT] = MSG("Invalid snapshot"), - [VIR_ERR_NO_DOMAIN_SNAPSHOT] = MSG("Domain snapshot not found"), - [VIR_ERR_INVALID_STREAM] = MSG2("invalid stream pointer", " in %s"), - [VIR_ERR_ARGUMENT_UNSUPPORTED] = MSG("argument unsupported"), - [VIR_ERR_STORAGE_PROBE_FAILED] = MSG("Storage pool probe failed"), - [VIR_ERR_STORAGE_POOL_BUILT] = MSG("Storage pool already built"), - [VIR_ERR_SNAPSHOT_REVERT_RISKY] = MSG("revert requires force"), - [VIR_ERR_OPERATION_ABORTED] = MSG("operation aborted"), - [VIR_ERR_AUTH_CANCELLED] = MSG("authentication cancelled"), - [VIR_ERR_NO_DOMAIN_METADATA] = MSG("metadata not found"), - [VIR_ERR_MIGRATE_UNSAFE] = MSG("Unsafe migration"), - [VIR_ERR_OVERFLOW] = MSG("numerical overflow"), - [VIR_ERR_BLOCK_COPY_ACTIVE] = MSG("block copy still active"), - [VIR_ERR_OPERATION_UNSUPPORTED] = MSG("Operation not supported"), - [VIR_ERR_SSH] = MSG("SSH transport error"), - [VIR_ERR_AGENT_UNRESPONSIVE] = MSG("Guest agent is not responding"), - [VIR_ERR_RESOURCE_BUSY] = MSG("resource busy"), - [VIR_ERR_ACCESS_DENIED] = MSG("access denied"), - [VIR_ERR_DBUS_SERVICE] = MSG("error from service"), - [VIR_ERR_STORAGE_VOL_EXIST] = MSG_EXISTS("storage volume"), - [VIR_ERR_CPU_INCOMPATIBLE] = MSG("the CPU is incompatible with host CPU"), - [VIR_ERR_XML_INVALID_SCHEMA] = MSG("XML document failed to validate against schema"), - [VIR_ERR_MIGRATE_FINISH_OK] = MSG("migration successfully aborted"), - [VIR_ERR_AUTH_UNAVAILABLE] = MSG("authentication unavailable"), - [VIR_ERR_NO_SERVER] = MSG("Server not found"), - [VIR_ERR_NO_CLIENT] = MSG("Client not found"), - [VIR_ERR_AGENT_UNSYNCED] = MSG("guest agent replied with wrong id to guest-sync command"), - [VIR_ERR_LIBSSH] = MSG("libssh transport error"), - [VIR_ERR_DEVICE_MISSING] = MSG("device not found"), - [VIR_ERR_INVALID_NWFILTER_BINDING] = MSG("Invalid network filter binding"), - [VIR_ERR_NO_NWFILTER_BINDING] = MSG("Network filter binding not found"), + [VIR_ERR_INTERNAL_ERROR] = { + N_("internal error"), + N_("internal error: %s") }, + [VIR_ERR_NO_MEMORY] = { + N_("out of memory"), + N_("out of memory: %s") }, + [VIR_ERR_NO_SUPPORT] = { + N_("this function is not supported by the connection driver"), + N_("this function is not supported by the connection driver: %s") }, + [VIR_ERR_UNKNOWN_HOST] = { + N_("unknown host"), + N_("unknown host %s") }, + [VIR_ERR_NO_CONNECT] = { + N_("no connection driver available"), + N_("no connection driver available for %s") }, + [VIR_ERR_INVALID_CONN] = { + N_("invalid connection pointer in"), + N_("invalid connection pointer in %s") }, + [VIR_ERR_INVALID_DOMAIN] = { + N_("invalid domain pointer in"), + N_("invalid domain pointer in %s") }, + [VIR_ERR_INVALID_ARG] = { + N_("invalid argument"), + N_("invalid argument: %s") }, + [VIR_ERR_OPERATION_FAILED] = { + N_("operation failed"), + N_("operation failed: %s") }, + [VIR_ERR_GET_FAILED] = { + N_("GET operation failed"), + N_("GET operation failed: %s") }, + [VIR_ERR_POST_FAILED] = { + N_("POST operation failed"), + N_("POST operation failed: %s") }, + [VIR_ERR_HTTP_ERROR] = { + N_("got unknown HTTP error code"), + N_("got unknown HTTP error code %s") }, + [VIR_ERR_SEXPR_SERIAL] = { + N_("failed to serialize S-Expr"), + N_("failed to serialize S-Expr: %s") }, + [VIR_ERR_NO_XEN] = { + N_("could not use Xen hypervisor entry"), + N_("could not use Xen hypervisor entry %s") }, + [VIR_ERR_XEN_CALL] = { + N_("failed Xen syscall"), + N_("failed Xen syscall %s") }, + [VIR_ERR_OS_TYPE] = { + N_("unknown OS type"), + N_("unknown OS type %s") }, + [VIR_ERR_NO_KERNEL] = { + N_("missing kernel information"), + N_("missing kernel information: %s") }, + [VIR_ERR_NO_ROOT] = { + N_("missing root device information"), + N_("missing root device information in %s") }, + [VIR_ERR_NO_SOURCE] = { + N_("missing source information for device"), + N_("missing source information for device %s") }, + [VIR_ERR_NO_TARGET] = { + N_("missing target information for device"), + N_("missing target information for device %s") }, + [VIR_ERR_NO_NAME] = { + N_("missing name information"), + N_("missing name information in %s") }, + [VIR_ERR_NO_OS] = { + N_("missing operating system information"), + N_("missing operating system information for %s") }, + [VIR_ERR_NO_DEVICE] = { + N_("missing devices information"), + N_("missing devices information for %s") }, + [VIR_ERR_NO_XENSTORE] = { + N_("could not connect to Xen Store"), + N_("could not connect to Xen Store %s") }, + [VIR_ERR_DRIVER_FULL] = { + N_("too many drivers registered"), + N_("too many drivers registered in %s") }, + [VIR_ERR_CALL_FAILED] = { + N_("library call failed"), + N_("library call failed: %s") }, + [VIR_ERR_XML_ERROR] = { + N_("XML description is invalid or not well formed"), + N_("XML error: %s") }, + [VIR_ERR_DOM_EXIST] = { + N_("this domain exists already"), + N_("domain %s exists already") }, + [VIR_ERR_OPERATION_DENIED] = { + N_("operation forbidden for read only access"), + N_("operation forbidden: %s") }, + [VIR_ERR_OPEN_FAILED] = { + N_("failed to open configuration file"), + N_("failed to open configuration file %s") }, + [VIR_ERR_READ_FAILED] = { + N_("failed to read configuration file"), + N_("failed to read configuration file %s") }, + [VIR_ERR_PARSE_FAILED] = { + N_("failed to parse configuration file"), + N_("failed to parse configuration file %s") }, + [VIR_ERR_CONF_SYNTAX] = { + N_("configuration file syntax error"), + N_("configuration file syntax error: %s") }, + [VIR_ERR_WRITE_FAILED] = { + N_("failed to write configuration file"), + N_("failed to write configuration file: %s") }, + [VIR_ERR_XML_DETAIL] = { + N_("parser error"), + "%s" }, + [VIR_ERR_INVALID_NETWORK] = { + N_("invalid network pointer in"), + N_("invalid network pointer in %s") }, + [VIR_ERR_NETWORK_EXIST] = { + N_("this network exists already"), + N_("network %s exists already") }, + [VIR_ERR_SYSTEM_ERROR] = { + N_("system call error"), + "%s" }, + [VIR_ERR_RPC] = { + N_("RPC error"), + "%s" }, + [VIR_ERR_GNUTLS_ERROR] = { + N_("GNUTLS call error"), + "%s" }, + [VIR_WAR_NO_NETWORK] = { + N_("Failed to find the network"), + N_("Failed to find the network: %s") }, + [VIR_ERR_NO_DOMAIN] = { + N_("Domain not found"), + N_("Domain not found: %s") }, + [VIR_ERR_NO_NETWORK] = { + N_("Network not found"), + N_("Network not found: %s") }, + [VIR_ERR_INVALID_MAC] = { + N_("invalid MAC address"), + N_("invalid MAC address: %s") }, + [VIR_ERR_AUTH_FAILED] = { + N_("authentication failed"), + N_("authentication failed: %s") }, + [VIR_ERR_INVALID_STORAGE_POOL] = { + N_("invalid storage pool pointer in"), + N_("invalid storage pool pointer in %s") }, + [VIR_ERR_INVALID_STORAGE_VOL] = { + N_("invalid storage volume pointer in"), + N_("invalid storage volume pointer in %s") }, + [VIR_WAR_NO_STORAGE] = { + N_("Failed to find a storage driver"), + N_("Failed to find a storage driver: %s") }, + [VIR_ERR_NO_STORAGE_POOL] = { + N_("Storage pool not found"), + N_("Storage pool not found: %s") }, + [VIR_ERR_NO_STORAGE_VOL] = { + N_("Storage volume not found"), + N_("Storage volume not found: %s") }, + [VIR_WAR_NO_NODE] = { + N_("Failed to find a node driver"), + N_("Failed to find a node driver: %s") }, + [VIR_ERR_INVALID_NODE_DEVICE] = { + N_("invalid node device pointer"), + N_("invalid node device pointer in %s") }, + [VIR_ERR_NO_NODE_DEVICE] = { + N_("Node device not found"), + N_("Node device not found: %s") }, + [VIR_ERR_NO_SECURITY_MODEL] = { + N_("Security model not found"), + N_("Security model not found: %s") }, + [VIR_ERR_OPERATION_INVALID] = { + N_("Requested operation is not valid"), + N_("Requested operation is not valid: %s") }, + [VIR_WAR_NO_INTERFACE] = { + N_("Failed to find the interface"), + N_("Failed to find the interface: %s") }, + [VIR_ERR_NO_INTERFACE] = { + N_("Interface not found"), + N_("Interface not found: %s") }, + [VIR_ERR_INVALID_INTERFACE] = { + N_("invalid interface pointer in"), + N_("invalid interface pointer in %s") }, + [VIR_ERR_MULTIPLE_INTERFACES] = { + N_("multiple matching interfaces found"), + N_("multiple matching interfaces found: %s") }, + [VIR_WAR_NO_NWFILTER] = { + N_("Failed to start the nwfilter driver"), + N_("Failed to start the nwfilter driver: %s") }, + [VIR_ERR_INVALID_NWFILTER] = { + N_("Invalid network filter"), + N_("Invalid network filter: %s") }, + [VIR_ERR_NO_NWFILTER] = { + N_("Network filter not found"), + N_("Network filter not found: %s") }, + [VIR_ERR_BUILD_FIREWALL] = { + N_("Error while building firewall"), + N_("Error while building firewall: %s") }, + [VIR_WAR_NO_SECRET] = { + N_("Failed to find a secret storage driver"), + N_("Failed to find a secret storage driver: %s") }, + [VIR_ERR_INVALID_SECRET] = { + N_("Invalid secret"), + N_("Invalid secret: %s") }, + [VIR_ERR_NO_SECRET] = { + N_("Secret not found"), + N_("Secret not found: %s") }, + [VIR_ERR_CONFIG_UNSUPPORTED] = { + N_("unsupported configuration"), + N_("unsupported configuration: %s") }, + [VIR_ERR_OPERATION_TIMEOUT] = { + N_("Timed out during operation"), + N_("Timed out during operation: %s") }, + [VIR_ERR_MIGRATE_PERSIST_FAILED] = { + N_("Failed to make domain persistent after migration"), + N_("Failed to make domain persistent after migration: %s") }, + [VIR_ERR_HOOK_SCRIPT_FAILED] = { + N_("Hook script execution failed"), + N_("Hook script execution failed: %s") }, + [VIR_ERR_INVALID_DOMAIN_SNAPSHOT] = { + N_("Invalid snapshot"), + N_("Invalid snapshot: %s") }, + [VIR_ERR_NO_DOMAIN_SNAPSHOT] = { + N_("Domain snapshot not found"), + N_("Domain snapshot not found: %s") }, + [VIR_ERR_INVALID_STREAM] = { + N_("invalid stream pointer"), + N_("invalid stream pointer in %s") }, + [VIR_ERR_ARGUMENT_UNSUPPORTED] = { + N_("argument unsupported"), + N_("argument unsupported: %s") }, + [VIR_ERR_STORAGE_PROBE_FAILED] = { + N_("Storage pool probe failed"), + N_("Storage pool probe failed: %s") }, + [VIR_ERR_STORAGE_POOL_BUILT] = { + N_("Storage pool already built"), + N_("Storage pool already built: %s") }, + [VIR_ERR_SNAPSHOT_REVERT_RISKY] = { + N_("revert requires force"), + N_("revert requires force: %s") }, + [VIR_ERR_OPERATION_ABORTED] = { + N_("operation aborted"), + N_("operation aborted: %s") }, + [VIR_ERR_AUTH_CANCELLED] = { + N_("authentication cancelled"), + N_("authentication cancelled: %s") }, + [VIR_ERR_NO_DOMAIN_METADATA] = { + N_("metadata not found"), + N_("metadata not found: %s") }, + [VIR_ERR_MIGRATE_UNSAFE] = { + N_("Unsafe migration"), + N_("Unsafe migration: %s") }, + [VIR_ERR_OVERFLOW] = { + N_("numerical overflow"), + N_("numerical overflow: %s") }, + [VIR_ERR_BLOCK_COPY_ACTIVE] = { + N_("block copy still active"), + N_("block copy still active: %s") }, + [VIR_ERR_OPERATION_UNSUPPORTED] = { + N_("Operation not supported"), + N_("Operation not supported: %s") }, + [VIR_ERR_SSH] = { + N_("SSH transport error"), + N_("SSH transport error: %s") }, + [VIR_ERR_AGENT_UNRESPONSIVE] = { + N_("Guest agent is not responding"), + N_("Guest agent is not responding: %s") }, + [VIR_ERR_RESOURCE_BUSY] = { + N_("resource busy"), + N_("resource busy: %s") }, + [VIR_ERR_ACCESS_DENIED] = { + N_("access denied"), + N_("access denied: %s") }, + [VIR_ERR_DBUS_SERVICE] = { + N_("error from service"), + N_("error from service: %s") }, + [VIR_ERR_STORAGE_VOL_EXIST] = { + N_("this storage volume exists already"), + N_("storage volume %s exists already") }, + [VIR_ERR_CPU_INCOMPATIBLE] = { + N_("the CPU is incompatible with host CPU"), + N_("the CPU is incompatible with host CPU: %s") }, + [VIR_ERR_XML_INVALID_SCHEMA] = { + N_("XML document failed to validate against schema"), + N_("XML document failed to validate against schema: %s") }, + [VIR_ERR_MIGRATE_FINISH_OK] = { + N_("migration successfully aborted"), + N_("migration successfully aborted: %s") }, + [VIR_ERR_AUTH_UNAVAILABLE] = { + N_("authentication unavailable"), + N_("authentication unavailable: %s") }, + [VIR_ERR_NO_SERVER] = { + N_("Server not found"), + N_("Server not found: %s") }, + [VIR_ERR_NO_CLIENT] = { + N_("Client not found"), + N_("Client not found: %s") }, + [VIR_ERR_AGENT_UNSYNCED] = { + N_("guest agent replied with wrong id to guest-sync command"), + N_("guest agent replied with wrong id to guest-sync command: %s") }, + [VIR_ERR_LIBSSH] = { + N_("libssh transport error"), + N_("libssh transport error: %s") }, + [VIR_ERR_DEVICE_MISSING] = { + N_("device not found"), + N_("device not found: %s") }, + [VIR_ERR_INVALID_NWFILTER_BINDING] = { + N_("Invalid network filter binding"), + N_("Invalid network filter binding: %s") }, + [VIR_ERR_NO_NWFILTER_BINDING] = { + N_("Network filter binding not found"), + N_("Network filter binding not found: %s") }, }; -#undef MSG -#undef MSG2 -#undef MSG_EXISTS /** * virErrorMsg: