/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- * * Copyright (C) 2016 Richard Hughes * * SPDX-License-Identifier: LGPL-2.1+ */ /** * SECTION:as-translation * @short_description: Object representing a single translation. * @include: appstream-glib.h * @stability: Stable * * Translation systems such as gettext install the translated files in a * specific location. * * This object represents translation data for an application. * * See also: #AsApp */ #include "config.h" #include "as-translation-private.h" #include "as-node-private.h" #include "as-ref-string.h" #include "as-utils-private.h" #include "as-yaml.h" typedef struct { AsTranslationKind kind; AsRefString *id; } AsTranslationPrivate; G_DEFINE_TYPE_WITH_PRIVATE (AsTranslation, as_translation, G_TYPE_OBJECT) #define GET_PRIVATE(o) (as_translation_get_instance_private (o)) static void as_translation_finalize (GObject *object) { AsTranslation *translation = AS_TRANSLATION (object); AsTranslationPrivate *priv = GET_PRIVATE (translation); if (priv->id != NULL) as_ref_string_unref (priv->id); G_OBJECT_CLASS (as_translation_parent_class)->finalize (object); } static void as_translation_init (AsTranslation *translation) { } static void as_translation_class_init (AsTranslationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = as_translation_finalize; } /** * as_translation_kind_from_string: * @kind: the string. * * Converts the text representation to an enumerated value. * * Returns: (transfer full): a #AsTranslationKind, or %AS_TRANSLATION_KIND_UNKNOWN for unknown. * * Since: 0.5.8 **/ AsTranslationKind as_translation_kind_from_string (const gchar *kind) { if (g_strcmp0 (kind, "gettext") == 0) return AS_TRANSLATION_KIND_GETTEXT; if (g_strcmp0 (kind, "qt") == 0) return AS_TRANSLATION_KIND_QT; return AS_TRANSLATION_KIND_UNKNOWN; } /** * as_translation_kind_to_string: * @kind: the #AsTranslationKind. * * Converts the enumerated value to an text representation. * * Returns: string version of @kind * * Since: 0.5.8 **/ const gchar * as_translation_kind_to_string (AsTranslationKind kind) { if (kind == AS_TRANSLATION_KIND_GETTEXT) return "gettext"; if (kind == AS_TRANSLATION_KIND_QT) return "qt"; return NULL; } /** * as_translation_get_id: * @translation: a #AsTranslation instance. * * Gets the ID for this translation. * * Returns: ID, e.g. "foobar-1.0.2" * * Since: 0.5.8 **/ const gchar * as_translation_get_id (AsTranslation *translation) { AsTranslationPrivate *priv = GET_PRIVATE (translation); g_return_val_if_fail (AS_IS_TRANSLATION (translation), NULL); return priv->id; } /** * as_translation_get_kind: * @translation: a #AsTranslation instance. * * Gets the translation kind. * * Returns: the #AsTranslationKind * * Since: 0.5.8 **/ AsTranslationKind as_translation_get_kind (AsTranslation *translation) { AsTranslationPrivate *priv = GET_PRIVATE (translation); g_return_val_if_fail (AS_IS_TRANSLATION (translation), AS_TRANSLATION_KIND_UNKNOWN); return priv->kind; } /** * as_translation_set_id: * @translation: a #AsTranslation instance. * @id: the URL. * * Sets the ID for this translation. * * Since: 0.5.8 **/ void as_translation_set_id (AsTranslation *translation, const gchar *id) { AsTranslationPrivate *priv = GET_PRIVATE (translation); g_return_if_fail (AS_IS_TRANSLATION (translation)); as_ref_string_assign_safe (&priv->id, id); } /** * as_translation_set_kind: * @translation: a #AsTranslation instance. * @kind: the #AsTranslationKind, e.g. %AS_TRANSLATION_KIND_THUMBNAIL. * * Sets the translation kind. * * Since: 0.5.8 **/ void as_translation_set_kind (AsTranslation *translation, AsTranslationKind kind) { AsTranslationPrivate *priv = GET_PRIVATE (translation); g_return_if_fail (AS_IS_TRANSLATION (translation)); priv->kind = kind; } /** * as_translation_node_insert: (skip) * @translation: a #AsTranslation instance. * @parent: the parent #GNode to use.. * @ctx: the #AsNodeContext * * Inserts the translation into the DOM tree. * * Returns: (transfer none): A populated #GNode * * Since: 0.5.8 **/ GNode * as_translation_node_insert (AsTranslation *translation, GNode *parent, AsNodeContext *ctx) { AsTranslationPrivate *priv = GET_PRIVATE (translation); GNode *n; g_return_val_if_fail (AS_IS_TRANSLATION (translation), NULL); /* invalid */ if (priv->kind == AS_TRANSLATION_KIND_UNKNOWN) return NULL; n = as_node_insert (parent, "translation", priv->id, AS_NODE_INSERT_FLAG_NONE, "type", as_translation_kind_to_string (priv->kind), NULL); return n; } /** * as_translation_node_parse: * @translation: a #AsTranslation instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DOM node. * * Returns: %TRUE for success * * Since: 0.5.8 **/ gboolean as_translation_node_parse (AsTranslation *translation, GNode *node, AsNodeContext *ctx, GError **error) { AsTranslationPrivate *priv = GET_PRIVATE (translation); const gchar *tmp; g_return_val_if_fail (AS_IS_TRANSLATION (translation), FALSE); tmp = as_node_get_attribute (node, "type"); as_translation_set_kind (translation, as_translation_kind_from_string (tmp)); as_ref_string_assign (&priv->id, as_node_get_data_as_refstr (node)); return TRUE; } /** * as_translation_node_parse_dep11: * @translation: a #AsTranslation instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DEP-11 node. * * Returns: %TRUE for success * * Since: 0.5.8 **/ gboolean as_translation_node_parse_dep11 (AsTranslation *translation, GNode *node, AsNodeContext *ctx, GError **error) { GNode *n; const gchar *tmp; g_return_val_if_fail (AS_IS_TRANSLATION (translation), FALSE); for (n = node->children; n != NULL; n = n->next) { tmp = as_yaml_node_get_key (n); if (g_strcmp0 (tmp, "id") == 0) as_translation_set_id (translation, as_yaml_node_get_value (n)); } return TRUE; } /** * as_translation_new: * * Creates a new #AsTranslation. * * Returns: (transfer full): a #AsTranslation * * Since: 0.5.8 **/ AsTranslation * as_translation_new (void) { AsTranslation *translation; translation = g_object_new (AS_TYPE_TRANSLATION, NULL); return AS_TRANSLATION (translation); }