mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-03 09:09:47 +02:00
241 lines
6.3 KiB
Diff
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;
|
|
+}
|