Commit 6575913f authored by Aurimas Juška's avatar Aurimas Juška

added support for tag translation, user installation and migration procedures for tags.xml.

svn path=/trunk/; revision=28045
parent a31ca23d
2009-02-16 Aurimas Juška <aurisj@svn.gnome.org>
* app/core/Makefile.am:
* app/core/gimp-tags.c:
* app/core/gimp-tags.h:
* app/core/gimp-user-install.c (user_install_create_files),
(user_install_migrate_files):
* configure.in:
* data/Makefile.am:
* data/tags/Makefile.am:
* data/tags/gimp-tags.dtd: added default tag set, support for
translating tags into various languages, user installation
and migration procedures.
* data/tags/gimp-tags-default.xml.in: initial tag set for testing
purposes. This has to be replaced with something else before
translators can start their work.
2009-02-16 Aurimas Juška <aurisj@svn.gnome.org>
* app/widgets/gimptagentry.c (gimp_tag_entry_set_tag_string):
......
......@@ -33,6 +33,8 @@ libappcore_a_sources = \
gimp-modules.h \
gimp-parasites.c \
gimp-parasites.h \
gimp-tags.c \
gimp-tags.h \
gimp-templates.c \
gimp-templates.h \
gimp-transform-region.c \
......
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimp-tags.c
* Copyright (C) 2009 Aurimas Juška <aurisj@svn.gnome.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "libgimpmath/gimpmath.h"
#include "libgimpconfig/gimpconfig.h"
#include "core-types.h"
#include "config/gimpxmlparser.h"
#include "gimp-utils.h"
#include "gimp-tags.h"
#include "gimp-intl.h"
#define GIMP_TAGS_FILE "tags.xml"
typedef struct
{
const gchar *locale;
GString *buf;
gboolean locale_matches;
} GimpTagsInstaller;
static void gimp_tags_installer_load_start_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer user_data,
GError **error);
static void gimp_tags_installer_load_end_element (GMarkupParseContext *context,
const gchar *element_name,
gpointer user_data,
GError **error);
static void gimp_tags_installer_load_text (GMarkupParseContext *context,
const gchar *text,
gsize text_len,
gpointer user_data,
GError **error);
static const gchar* attribute_name_to_value (const gchar **attribute_names,
const gchar **attribute_values,
const gchar *name);
gboolean
gimp_tags_user_install (void)
{
gchar *filename;
GError *error;
GMarkupParser markup_parser;
GimpXmlParser *xml_parser;
const char *tags_locale;
GimpTagsInstaller tags_installer = { 0, };
gboolean result = TRUE;
/* This is a special string to specify the language identifier to
look for in the gimp-tags-default.xml file. Please translate the
C in it according to the name of the po file used for
gimp-tags-default.xml. E.g. lithuanian for the translation,
that would be "tags-locale:lt".
*/
tags_locale = _("tags-locale:C");
if (g_str_has_prefix (tags_locale, "tags-locale:"))
{
tags_locale += strlen ("tags-locale:");
if (*tags_locale && *tags_locale != 'C')
tags_installer.locale = tags_locale;
}
else
{
g_warning ("Wrong translation for 'tags-locale:', fix the translation!");
}
tags_installer.buf = g_string_new (NULL);
g_string_append (tags_installer.buf, "<?xml version='1.0' encoding='UTF-8'?>\n");
g_string_append (tags_installer.buf, "<tags>\n");
filename = g_build_filename (gimp_data_directory (), "tags",
"gimp-tags-default.xml", NULL);
error = NULL;
markup_parser.start_element = gimp_tags_installer_load_start_element;
markup_parser.end_element = gimp_tags_installer_load_end_element;
markup_parser.text = gimp_tags_installer_load_text;
markup_parser.passthrough = NULL;
markup_parser.error = NULL;
xml_parser = gimp_xml_parser_new (&markup_parser, &tags_installer);
result = gimp_xml_parser_parse_file (xml_parser, filename, &error);
g_free (filename);
gimp_xml_parser_free (xml_parser);
if (! result)
{
g_string_free (tags_installer.buf, TRUE);
return FALSE;
}
g_string_append (tags_installer.buf, "\n</tags>\n");
filename = g_build_filename (gimp_directory (), GIMP_TAGS_FILE, NULL);
error = NULL;
result = g_file_set_contents (filename, tags_installer.buf->str, tags_installer.buf->len, &error);
g_free (filename);
g_string_free (tags_installer.buf, TRUE);
if (! result)
{
g_warning ("Error while creating tags.xml: %s\n", error->message);
g_error_free (error);
return FALSE;
}
return TRUE;
}
static void
gimp_tags_installer_load_start_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer user_data,
GError **error)
{
GimpTagsInstaller *tags_installer = (GimpTagsInstaller*) user_data;
if (! strcmp (element_name, "resource"))
{
g_string_append_printf (tags_installer->buf, "\n <resource");
while (*attribute_names)
{
g_string_append_printf (tags_installer->buf, " %s=\"%s\"",
*attribute_names, *attribute_values);
attribute_names++;
attribute_values++;
}
g_string_append_printf (tags_installer->buf, ">\n");
}
else if (! strcmp (element_name, "thetag"))
{
const char *current_locale;
current_locale = attribute_name_to_value (attribute_names, attribute_values, "xml:lang");
if (current_locale && tags_installer->locale)
{
tags_installer->locale_matches = !strcmp (current_locale, tags_installer->locale);
}
else
{
tags_installer->locale_matches = (current_locale == tags_installer->locale);
}
}
}
static void
gimp_tags_installer_load_end_element (GMarkupParseContext *context,
const gchar *element_name,
gpointer user_data,
GError **error)
{
GimpTagsInstaller *tags_installer = (GimpTagsInstaller*) user_data;
if (strcmp (element_name, "resource") == 0)
{
g_string_append (tags_installer->buf, " </resource>\n");
}
}
static void
gimp_tags_installer_load_text (GMarkupParseContext *context,
const gchar *text,
gsize text_len,
gpointer user_data,
GError **error)
{
GimpTagsInstaller *tags_installer = (GimpTagsInstaller*) user_data;
const gchar *current_element;
gchar *tag_string;
current_element = g_markup_parse_context_get_element (context);
if (tags_installer->locale_matches &&
current_element &&
strcmp (current_element, "thetag") == 0)
{
tag_string = g_markup_escape_text (text, text_len);
g_string_append_printf (tags_installer->buf, " <tag>%s</tag>\n", tag_string);
g_free (tag_string);
}
}
static const gchar*
attribute_name_to_value (const gchar **attribute_names,
const gchar **attribute_values,
const gchar *name)
{
while (*attribute_names)
{
if (! strcmp (*attribute_names, name))
{
return *attribute_values;
}
attribute_names++;
attribute_values++;
}
return NULL;
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_TAGS_H__
#define __GIMP_TAGS_H__
gboolean gimp_tags_user_install (void);
#endif /* __GIMP_TAGS_H__ */
......@@ -46,6 +46,7 @@
#include "config/gimprc.h"
#include "gimp-templates.h"
#include "gimp-tags.h"
#include "gimp-user-install.h"
#include "gimp-intl.h"
......@@ -465,6 +466,11 @@ user_install_create_files (GimpUserInstall *install)
}
}
if (! gimp_tags_user_install ())
{
return FALSE;
}
return TRUE;
}
......@@ -543,5 +549,17 @@ user_install_migrate_files (GimpUserInstall *install)
gimp_rc_save (gimprc);
g_object_unref (gimprc);
g_snprintf (dest, sizeof (dest), "%s%c%s",
gimp_directory (), G_DIR_SEPARATOR, "tags.xml");
if (! g_file_test (dest, G_FILE_TEST_IS_REGULAR))
{
/* if there was no tags.xml,
* install it with default tag set.*/
if (! gimp_tags_user_install ())
{
return FALSE;
}
}
return TRUE;
}
......@@ -2063,6 +2063,7 @@ data/images/Makefile
data/interpreters/Makefile
data/palettes/Makefile
data/patterns/Makefile
data/tags/Makefile
data/tips/Makefile
desktop/Makefile
desktop/gimp.desktop.in
......@@ -2073,6 +2074,7 @@ po-libgimp/Makefile.in
po-plug-ins/Makefile.in
po-python/Makefile.in
po-script-fu/Makefile.in
po-tags/Makefile.in
po-tips/Makefile.in
gimp-zip
Makefile
......@@ -2094,6 +2096,7 @@ AC_CONFIG_COMMANDS([sed-po-makefiles],
sed -e "/POTFILES =/r po-python/POTFILES" po-python/Makefile.in > po-python/Makefile && touch po-python/stamp-it
sed -e "/POTFILES =/r po-plug-ins/POTFILES" po-plug-ins/Makefile.in > po-plug-ins/Makefile && touch po-plug-ins/stamp-it
sed -e "/POTFILES =/r po-script-fu/POTFILES" po-script-fu/Makefile.in > po-script-fu/Makefile && touch po-script-fu/stamp-it
sed -e "/POTFILES =/r po-tags/POTFILES" po-tags/Makefile.in > po-tags/Makefile && touch po-tags/stamp-it
sed -e "/POTFILES =/r po-tips/POTFILES" po-tips/Makefile.in > po-tips/Makefile && touch po-tips/stamp-it])
AC_OUTPUT
......
......@@ -8,7 +8,8 @@ SUBDIRS = \
interpreters \
palettes \
patterns \
tips
tips \
tags
fontdir = $(gimpdatadir)/fonts
......
## Makefile.am for gimp/data/tags
tagsdatadir = $(gimpdatadir)/tags
tagsdata_in_files = gimp-tags-default.xml.in
tagsdata_data_files = $(tagsdata_in_files:.xml.in=.xml)
tagsdata_DATA = $(tagsdata_data_files)
EXTRA_DIST = \
$(tagsdata_DATA) \
$(tagsdata_in_files) \
gimp-tags.dtd
DISTCLEANFILES = $(tagsdata_data_files)
gimp-tags-default.xml: gimp-tags-default.xml.in $(wildcard $(top_srcdir)/po-tags/*.po)
$(INTLTOOL_MERGE) $(top_srcdir)/po-tags $< $(@) -x -u -c $(top_builddir)/po-tags/.intltool-merge-cache
validate: gimp-tags-default.xml
if HAVE_XMLLINT
@$(XMLLINT) --noout --path $(srcdir) --valid $< || \
( echo "* gimp-tags-default.xml INVALID *"; exit 1; )
endif
dist-hook: validate
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE tags SYSTEM "gimp-tags.dtd">
<!-- This is a list of default tags for GIMP resources. -->
<!-- -->
<!-- Please do not use separator characters, such as comma, in tags. -->
<tags>
<resource identifier="gimp-brush-clipboard" checksum="157dcef48665ab465439cfaf10d6feeb">
<tag>
<_thetag>test1</_thetag>
</tag>
<tag>
<_thetag>test2</_thetag>
</tag>
<tag>
<_thetag>test3</_thetag>
</tag>
</resource>
<resource identifier="/home/auris/gimp/trunk/build/share/gimp/2.0/brushes/confetti.gih" checksum="d136b60fdd9cf41693a485a329b32e95">
<tag>
<_thetag>test4</_thetag>
</tag>
<tag>
<_thetag>test5</_thetag>
</tag>
<tag>
<_thetag>test3</_thetag>
</tag>
</resource>
</tags>
<!-- Simple DTD for GIMP tips -->
<!ELEMENT tags (resource+)>
<!ELEMENT resource (tag+)>
<!ATTLIST resource identifier CDATA #REQUIRED>
<!ATTLIST resource checksum CDATA #IMPLIED>
<!ELEMENT tag (thetag+)>
<!ELEMENT thetag (#PCDATA)>
<!ATTLIST thetag xml:lang CDATA #IMPLIED>
2009-02-16 Aurimas Juška <aurisj@svn.gnome.org>
* LINGUAS:
* Makefile.in.in:
* POTFILES.in:
* POTFILES.skip:
* lt.po: added support for internationalization of tags for default
Gimp resources.
# please keep this list sorted alphabetically
#
lt
# Makefile for program source directory in GNU NLS utilities package.
# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
#
# This file file be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
# Please note that the actual code is *not* freely available.
#
# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
# instead of PACKAGE and to look for po2tbl in ./ not in intl/
#
# - Modified by jacob berkman <jacob@ximian.com> to install
# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
#
# - Modified by Rodney Dawes <dobey@novell.com> for use with intltool
#
# We have the following line for use by intltoolize:
# INTLTOOL_MAKEFILE
GETTEXT_PACKAGE = @GETTEXT_PACKAGE@-tags
XGETTEXT_KEYWORDS=--keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 --keyword=NC_:1c,2
PACKAGE = @PACKAGE@
VERSION = @VERSION@
SHELL = /bin/sh
srcdir = @srcdir@
top_srcdir = @top_srcdir@
top_builddir = @top_builddir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
datadir = @datadir@
datarootdir = @datarootdir@
libdir = @libdir@
DATADIRNAME = @DATADIRNAME@
itlocaledir = $(prefix)/$(DATADIRNAME)/locale
subdir = po-tags
install_sh = @install_sh@
# Automake >= 1.8 provides @mkdir_p@.
# Until it can be supposed, use the safe fallback:
mkdir_p = $(install_sh) -d
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
GMSGFMT = @GMSGFMT@
MSGFMT = @MSGFMT@
XGETTEXT = @XGETTEXT@
INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
ALL_LINGUAS = @ALL_LINGUAS@
PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; fi)
USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS`" -o -n "`echo $$ALINGUAS|grep ' ?$$lang ?'`"; then printf "$$lang "; fi; done; fi)
USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
POFILES=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(POFILES)
EXTRA_DISTFILES = POTFILES.skip Makevars LINGUAS
POTFILES = \
# This comment gets stripped out
CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
.SUFFIXES:
.SUFFIXES: .po .pox .gmo .mo .msg .cat
.po.pox:
$(MAKE) $(GETTEXT_PACKAGE).pot
$(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
.po.mo:
$(MSGFMT) -o $@ $<
.po.gmo:
file=`echo $* | sed 's,.*/,,'`.gmo \
&& rm -f $$file && $(GMSGFMT) -o $$file $<
.po.cat:
sed -f ../intl/po2msg.sed < $< > $*.msg \
&& rm -f $@ && gencat $@ $*.msg
all: all-@USE_NLS@
all-yes: $(CATALOGS)
all-no:
$(GETTEXT_PACKAGE).pot: $(POTFILES)
$(GENPOT)
install: install-data
install-data: install-data-@USE_NLS@
install-data-no: all
install-data-yes: all
$(mkdir_p) $(DESTDIR)$(itlocaledir)
linguas="$(USE_LINGUAS)"; \
for lang in $$linguas; do \
dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
$(mkdir_p) $$dir; \
if test -r $$lang.gmo; then \
$(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
else \
$(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
echo "installing $(srcdir)/$$lang.gmo as" \
"$$dir/$(GETTEXT_PACKAGE).mo"; \
fi; \
if test -r $$lang.gmo.m; then \
$(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
else \
if test -r $(srcdir)/$$lang.gmo.m ; then \
$(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
$$dir/$(GETTEXT_PACKAGE).mo.m; \
echo "installing $(srcdir)/$$lang.gmo.m as" \
"$$dir/$(GETTEXT_PACKAGE).mo.m"; \
else \
true; \
fi; \
fi; \
done
# Empty stubs to satisfy archaic automake needs
dvi info tags TAGS ID:
# Define this as empty until I found a useful application.
install-exec installcheck:
uninstall:
linguas="$(USE_LINGUAS)"; \
for lang in $$linguas; do \
rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
done
check: all $(GETTEXT_PACKAGE).pot
rm -f missing notexist
srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
if [ -r missing -o -r notexist ]; then \
exit 1; \
fi
mostlyclean:
rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
rm -f .intltool-merge-cache
clean: mostlyclean
distclean: clean
rm -f Makefile Makefile.in POTFILES stamp-it
rm -f *.mo *.msg *.cat *.cat.m *.gmo
maintainer-clean: distclean
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
rm -f Makefile.in.in
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
dist distdir: $(DISTFILES)
dists="$(DISTFILES)"; \
extra_dists="$(EXTRA_DISTFILES)"; \
for file in $$extra_dists; do \
test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
done; \
for file in $$dists; do \
test -f $$file || file="$(srcdir)/$$file"; \
ln $$file $(distdir) 2> /dev/null \
|| cp -p $$file $(distdir); \
done
update-po: Makefile
$(MAKE) $(GETTEXT_PACKAGE).pot
tmpdir=`pwd`; \
linguas="$(USE_LINGUAS)"; \
for lang in $$linguas; do \
echo "$$lang:"; \
result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
if $$result; then \
if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \
else \
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
:; \
else \
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
rm -f $$tmpdir/$$lang.new.po; \
exit 1; \
fi; \
fi; \
else \
echo "msgmerge for $$lang.gmo failed!"; \
rm -f $$tmpdir/$$lang.new.po; \
fi; \
done
Makefile POTFILES: stamp-it
@if test ! -f $@; then \
rm -f stamp-it; \
$(MAKE) stamp-it; \
fi
stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
$(SHELL) ./config.status
# Tell versions [3.59,3.63) of GNU make not to export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# Files from the Gimp distribution which have already been
# marked to allow runtime translation of messages
[encoding: UTF-8]
data/tags/gimp-tags-default.xml.in
app
desktop
desktop/gimp.desktop.in
libgimp
libgimpbase
libgimpconfig
libgimpmodule
libgimpthumb
libgimpwidgets
modules
plug-ins
tools
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-02-15 21:20+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../data/tags/gimp-tags-default.xml.in.h:1
msgid "test1"
msgstr "testas1"
#: ../data/tags/gimp-tags-default.xml.in.h:2
msgid "test2"
msgstr "testas2"
#: ../data/tags/gimp-tags-default.xml.in.h:3
msgid "test3"
msgstr "testas3"
#: ../data/tags/gimp-tags-default.xml.in.h:4
msgid "test4"
msgstr "testas4"
#: ../data/tags/gimp-tags-default.xml.in.h:5
msgid "test5"
msgstr "testas5"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment