1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-03 17:19:43 +02:00
audacity/lib-src/slv2/i18n.patch
2010-01-24 09:19:39 +00:00

241 lines
6.3 KiB
Diff

diff --git a/slv2/slv2/plugin.h b/slv2/slv2/plugin.h
index 8f41677..fa9ee1b 100644
--- a/slv2/slv2/plugin.h
+++ b/slv2/slv2/plugin.h
@@ -178,6 +178,18 @@ slv2_plugin_get_value_by_qname(SLV2Plugin p,
const char* predicate);
+/** Get a translated value associated with the plugin in a plugin's data files.
+ *
+ * This function is identical to slv2_plugin_get_value, but takes a QName
+ * string parameter for a predicate instead of an SLV2Value, which may be
+ * more convenient. It returns the value translated to the current language
+ * if possible.
+ */
+SLV2Values
+slv2_plugin_get_value_by_qname_i18n(SLV2Plugin p,
+ const char* predicate);
+
+
/** Get a value associated with some subject in a plugin's data files.
*
* Returns the ?object of all triples found of the form:
diff --git a/slv2/slv2/port.h b/slv2/slv2/port.h
index 6b55a56..a188361 100644
--- a/slv2/slv2/port.h
+++ b/slv2/slv2/port.h
@@ -43,6 +43,16 @@ slv2_port_get_value_by_qname(SLV2Plugin plugin,
const char* property_uri);
+/** Port analog of slv2_plugin_get_value_by_qname_i18n.
+ *
+ * Time = Query
+ */
+SLV2Values
+slv2_port_get_value_by_qname_i18n(SLV2Plugin plugin,
+ SLV2Port port,
+ const char* property_uri);
+
+
/** Return the LV2 port properties of a port.
*
* Time = Query
diff --git a/slv2/src/plugin.c b/slv2/src/plugin.c
index cb98d69..0eac6dc 100644
--- a/slv2/src/plugin.c
+++ b/slv2/src/plugin.c
@@ -373,19 +373,23 @@ slv2_plugin_verify(SLV2Plugin plugin)
SLV2Value
slv2_plugin_get_name(SLV2Plugin plugin)
{
- SLV2Values results = slv2_plugin_get_value_by_qname(plugin, "doap:name");
+ SLV2Values results = slv2_plugin_get_value_by_qname_i18n(plugin, "doap:name");
SLV2Value ret = NULL;
- // FIXME: lang?
-
if (results) {
SLV2Value val = slv2_values_get_at(results, 0);
if (slv2_value_is_string(val))
ret = slv2_value_duplicate(val);
- }
-
- if (results)
slv2_values_free(results);
+ }
+
+ else {
+ results = slv2_plugin_get_value_by_qname(plugin, "doap:name");
+ SLV2Value val = slv2_values_get_at(results, 0);
+ if (slv2_value_is_string(val))
+ ret = slv2_value_duplicate(val);
+ slv2_values_free(results);
+ }
return ret;
}
@@ -433,7 +437,29 @@ slv2_plugin_get_value_by_qname(SLV2Plugin p,
query = slv2_strjoin(
"SELECT DISTINCT ?value WHERE { \n"
- "<> ", predicate, " ?value \n"
+ "<> ", predicate, " ?value . \n"
+ "FILTER(lang(?value) = \"\") \n"
+ "}\n", NULL);
+
+ SLV2Values result = slv2_plugin_query_variable(p, query, 0);
+
+ free(query);
+
+ return result;
+}
+
+
+/* internal, get i18nd value if possible */
+SLV2Values
+slv2_plugin_get_value_by_qname_i18n(SLV2Plugin p,
+ const char* predicate)
+{
+ char* query = NULL;
+
+ query = slv2_strjoin(
+ "SELECT DISTINCT ?value WHERE { \n"
+ "<> ", predicate, " ?value . \n"
+ "FILTER(lang(?value) = \"", slv2_get_lang(), "\") \n"
"}\n", NULL);
SLV2Values result = slv2_plugin_query_variable(p, query, 0);
diff --git a/slv2/src/port.c b/slv2/src/port.c
index 9166fcc..67cd5d3 100644
--- a/slv2/src/port.c
+++ b/slv2/src/port.c
@@ -141,7 +141,8 @@ slv2_port_get_value_by_qname(SLV2Plugin p,
"SELECT DISTINCT ?value WHERE {\n"
"<", slv2_value_as_uri(p->plugin_uri), "> lv2:port ?port .\n"
"?port lv2:symbol \"", slv2_value_as_string(port->symbol), "\";\n\t",
- property, " ?value .\n}", NULL);
+ property, " ?value .\n"
+ "FILTER(lang(?value) = \"\") }", NULL);
results = slv2_plugin_query_variable(p, query, 0);
@@ -150,6 +151,29 @@ slv2_port_get_value_by_qname(SLV2Plugin p,
}
+SLV2Values
+slv2_port_get_value_by_qname_i18n(SLV2Plugin p,
+ SLV2Port port,
+ const char* property)
+{
+ assert(property);
+ SLV2Values results = NULL;
+
+ char* query = slv2_strjoin(
+ "SELECT DISTINCT ?value WHERE {\n"
+ "<", slv2_value_as_uri(p->plugin_uri), "> lv2:port ?port .\n"
+ "?port lv2:symbol \"", slv2_value_as_string(port->symbol), "\";\n\t",
+ property, " ?value .\n"
+ "FILTER(lang(?value) = \"", slv2_get_lang(),
+ "\") }", NULL);
+
+ results = slv2_plugin_query_variable(p, query, 0);
+
+ free(query);
+ return results;
+}
+
+
SLV2Value
slv2_port_get_symbol(SLV2Plugin p,
SLV2Port port)
@@ -163,12 +187,20 @@ slv2_port_get_name(SLV2Plugin p,
SLV2Port port)
{
SLV2Value ret = NULL;
- SLV2Values results = slv2_port_get_value_by_qname(p, port, "lv2:name");
+ SLV2Values results = slv2_port_get_value_by_qname_i18n(p, port, "lv2:name");
- if (results && slv2_values_size(results) == 1)
- ret = slv2_value_duplicate(slv2_values_get_at(results, 0));
+ if (results && slv2_values_size(results) > 0) {
+ ret = slv2_value_duplicate(slv2_values_get_at(results, 0));
+ slv2_values_free(results);
+ }
- slv2_values_free(results);
+ else {
+ results = slv2_port_get_value_by_qname(p, port, "lv2:name");
+ if (results && slv2_values_size(results) > 0) {
+ ret = slv2_value_duplicate(slv2_values_get_at(results, 0));
+ }
+ slv2_values_free(results);
+ }
return ret;
}
diff --git a/slv2/src/slv2_internal.h b/slv2/src/slv2_internal.h
index 87c1d53..e2d7322 100644
--- a/slv2/src/slv2_internal.h
+++ b/slv2/src/slv2_internal.h
@@ -25,6 +25,7 @@ extern "C" {
#include <stdbool.h>
#include <stddef.h>
+#include <stdlib.h>
#include <inttypes.h>
#include <librdf.h>
#include <slv2/types.h>
@@ -243,6 +244,9 @@ void slv2_scale_point_free(SLV2ScalePoint point);
char* slv2_strjoin(const char* first, ...);
+/* I18N utility functions */
+char* slv2_get_lang();
+
#ifdef __cplusplus
}
diff --git a/slv2/src/util.c b/slv2/src/util.c
index 20a9b65..7590c68 100644
--- a/slv2/src/util.c
+++ b/slv2/src/util.c
@@ -65,10 +65,34 @@ const char*
slv2_uri_to_path(const char* uri)
{
if (!strncmp(uri, "file://", (size_t)7))
- return (char*)(uri + 7);
+ return (char*)(uri + 7);
else
return NULL;
}
+char*
+slv2_get_lang()
+{
+ static char lang[32];
+ lang[31] = '\0';
+ char* tmp = getenv("LANG");
+ if (!tmp) {
+ lang[0] = '\0';
+ }
+ else {
+ strncpy(lang, tmp, 31);
+ for (int i = 0; i < 31 && lang[i]; ++i) {
+ if (lang[i] == '_')
+ lang[i] = '-';
+ else if (!(lang[i] >= 'a' && lang[i] <= 'z') &&
+ !(lang[i] >= 'A' && lang[i] <= 'Z')) {
+ lang[i] = '\0';
+ break;
+ }
+ }
+ }
+
+ return lang;
+}