The translation memory is now a plugin

parent 73b02b56
......@@ -65,9 +65,14 @@ AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums])
dnl ================================================================
dnl GSettings stuff
dnl ================================================================
GLIB_GSETTINGS
dnl ================================================================
dnl GResource stuff
dnl ================================================================
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
AC_SUBST(GLIB_COMPILE_RESOURCES)
dnl ==========================================================================
dnl
dnl If you add a version number here, you *must* add an AC_SUBST line for
......@@ -76,7 +81,7 @@ dnl
dnl ==========================================================================
GTHREAD_REQUIRED=2.13.0
GTK_REQUIRED=3.0.3
GTK_REQUIRED=3.3.15
GLIB_REQUIRED=2.28.0
LIBXML_REQUIRED=2.4.12
SOURCEVIEW_REQUIRED=3.0.0
......@@ -289,11 +294,12 @@ plugins/open-tran/Makefile
plugins/open-tran/org.gnome.gtranslator.plugins.open-tran.gschema.xml.in
plugins/codeview/Makefile
plugins/codeview/org.gnome.gtranslator.plugins.codeview.gschema.xml.in
plugins/translation-memory/Makefile
plugins/translation-memory/gda/Makefile
plugins/translation-memory/org.gnome.gtranslator.plugins.translation-memory.gschema.xml.in
src/Makefile
src/dialogs/Makefile
src/toolbareditor/Makefile
src/translation-memory/Makefile
src/translation-memory/gda/Makefile
])
AC_OUTPUT
......
......@@ -26,10 +26,10 @@
<separator/>
<menuitem name="EditFuzzyMenu" action="EditFuzzy"/>
<separator/>
<menuitem name="EditTranslationMemory" action="EditTranslationMemory"/>
<separator/>
<placeholder name="EditOps_1" />
<separator/>
<placeholder name="EditOps_2" />
<separator/>
<menuitem name="EditToolbarMenu" action="EditToolbar"/>
<menuitem name="EditPreferencesMenu" action="EditPreferences"/>
</menu>
......@@ -83,7 +83,17 @@
<menuitem name="SearchReplaceMenu" action="SearchReplace"/>
</menu>
<placeholder name="SubversionPlaceholder" />
<menu name="ToolsMenu" action="Tools">
<placeholder name="ToolsOps_1" />
<separator/>
<placeholder name="ToolsOps_2" />
<separator/>
<placeholder name="ToolsOps_3" />
<separator/>
<placeholder name="ToolsOps_4" />
<separator/>
<placeholder name="ToolsOps_5" />
</menu>
<placeholder name="ExtraMenu_1" />
......
......@@ -109,47 +109,6 @@
</_description>
</key>
</schema>
<schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gtranslator.preferences.tm" path="/org/gnome/gtranslator/preferences/tm/">
<key name="po-directory" type="s">
<default>''</default>
<_summary>PO directory</_summary>
<_description>
Directory containing PO files to add to the translation memory.
</_description>
</key>
<key name="restrict-to-filename" type="b">
<default>false</default>
<_summary>Restrict search by filename</_summary>
<_description>
If true, only include files with a specified filename when searching
the translation memory.
</_description>
</key>
<key name="filename-restriction" type="s">
<default>''</default>
<_summary>Filename to restrict search to</_summary>
<_description>
Filename to which searching of the translation memory should be
restricted.
</_description>
</key>
<key name="max-missing-words" type="i">
<default>2</default>
<_summary>Maximum number of missing words</_summary>
<_description>
Maximum number of words that can be missing from a message displayed as
a match by the translation memory.
</_description>
</key>
<key name="max-length-diff" type="i">
<default>2</default>
<_summary>Maximum difference in message length</_summary>
<_description>
Maximum difference in length between messages displayed as matches by
the translation memory.
</_description>
</key>
</schema>
<schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gtranslator.preferences.ui" path="/org/gnome/gtranslator/preferences/ui/">
<key name="panel-switcher-style" enum="org.gnome.gtranslator.SwitcherStyle">
<default>'both'</default>
......
......@@ -3,7 +3,8 @@ SUBDIRS = \
charmap \
codeview \
fullscreen \
insert-params
insert-params \
translation-memory
if USE_LIBJSON_GLIB
SUBDIRS += open-tran
......
SUBDIRS = gda
# Translation memory plugin
plugindir = $(libdir)/gtranslator/plugins
INCLUDES = \
-I$(top_srcdir) \
-I$(top_srcdir)/src \
$(GTRANSLATOR_CFLAGS) \
$(WARN_CFLAGS) \
$(DISABLE_DEPRECATED)
plugin_LTLIBRARIES = \
libtranslation-memory.la
BUILT_SOURCES = \
gtr-translation-memory-resources.c
libtranslation_memory_la_SOURCES = \
gtr-translation-memory-window-activatable.c \
gtr-translation-memory-window-activatable.h \
gtr-translation-memory-tab-activatable.c \
gtr-translation-memory-tab-activatable.h \
gtr-translation-memory-ui.c \
gtr-translation-memory-ui.h \
gtr-translation-memory-dialog.c \
gtr-translation-memory-dialog.h \
gtr-translation-memory.c \
gtr-translation-memory.h \
gtr-translation-memory-plugin.h \
gtr-translation-memory-plugin.c \
$(BUILT_SOURCES)
libtranslation_memory_la_LDFLAGS = \
$(PLUGIN_LIBTOOL_FLAGS) \
$(GTRANSLATOR_LIBS) \
gda/libgda.la
gtr-translation-memory-resources.c: gtr-translation-memory.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies gtr-translation-memory.gresource.xml)
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-source gtr-translation-memory.gresource.xml
# Plugin Info
plugin_in_files = gtr-translation-memory.plugin.desktop.in
%.plugin: %.plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
plugin_DATA = $(plugin_in_files:.plugin.desktop.in=.plugin)
gsettings_SCHEMAS = org.gnome.gtranslator.plugins.translation-memory.gschema.xml
@INTLTOOL_XML_NOMERGE_RULE@
@GSETTINGS_RULES@
EXTRA_DIST = \
$(plugin_in_files) \
gtr-translation-memory.gresource.xml \
org.gnome.gtranslator.plugins.translation-memory.gschema.xml.in.in
CLEANFILES = $(plugin_DATA) $(BUILT_SOURCES)
DISTCLEANFILES = $(plugin_DATA) $(BUILT_SOURCES)
MAINTAINERCLEANFILES = $(gsettings_SCHEMAS:.xml=.valid)
-include $(top_srcdir)/git.mk
INCLUDES = \
-I$(top_srcdir) \
-I$(top_builddir) \
-I$(top_srcdir)/src \
-I$(top_builddir)/src \
-I$(top_srcdir)/plugins/translation-memory \
-I$(headerdir) \
$(GTRANSLATOR_CFLAGS) \
$(WARN_CFLAGS) \
$(DISABLE_DEPRECATED)
noinst_LTLIBRARIES = \
libgda.la
libgda_la_SOURCES = \
gtr-gda.c \
gtr-gda.h
libgda_la_CFLAGS = \
$(GTRANSLATOR_CFLAGS) \
$(WARN_CFLAGS) \
$(DISABLE_DEPRECATED) \
$(AM_CFLAGS)
EXTRA_DIST = $(pixmaps__DATA)
-include $(top_srcdir)/git.mk
......@@ -36,7 +36,7 @@
GtrGdaPrivate))
static void
gtr_translation_memory_iface_init (GtrTranslationMemoryIface * iface);
gtr_translation_memory_iface_init (GtrTranslationMemoryInterface * iface);
G_DEFINE_TYPE_WITH_CODE (GtrGda,
gtr_gda,
......@@ -703,7 +703,7 @@ gtr_gda_set_max_items (GtrTranslationMemory * tm, gint items)
}
static void
gtr_translation_memory_iface_init (GtrTranslationMemoryIface * iface)
gtr_translation_memory_iface_init (GtrTranslationMemoryInterface * iface)
{
iface->store = gtr_gda_store;
iface->store_list = gtr_gda_store_list;
......
/*
* Copyright (C) 2012 Ignacio Casal Quinteiro <icq@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 "gtr-translation-memory-dialog.h"
#include "gtr-profile-manager.h"
#include "gtr-utils.h"
#include "gtr-po.h"
#include <glib/gi18n.h>
#define GTR_TRANSLATION_MEMORY_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GTR_TYPE_TRANSLATION_MEMORY_DIALOG, GtrTranslationMemoryDialogPrivate))
struct _GtrTranslationMemoryDialogPrivate
{
GSettings *tm_settings;
GtkWidget *directory_entry;
GtkWidget *search_button;
GtkWidget *add_database_button;
GtkWidget *add_database_progressbar;
GtkWidget *tm_lang_entry;
GtkWidget *use_lang_profile_in_tm;
GtrTranslationMemory *translation_memory;
};
G_DEFINE_TYPE (GtrTranslationMemoryDialog, gtr_translation_memory_dialog, GTK_TYPE_DIALOG)
static void
gtr_translation_memory_dialog_finalize (GObject *object)
{
G_OBJECT_CLASS (gtr_translation_memory_dialog_parent_class)->finalize (object);
}
static void
gtr_translation_memory_dialog_dispose (GObject *object)
{
GtrTranslationMemoryDialogPrivate *priv = GTR_TRANSLATION_MEMORY_DIALOG (object)->priv;
if (priv->tm_settings != NULL)
{
g_object_unref (priv->tm_settings);
priv->tm_settings = NULL;
}
G_OBJECT_CLASS (gtr_translation_memory_dialog_parent_class)->dispose (object);
}
static void
gtr_translation_memory_dialog_class_init (GtrTranslationMemoryDialogClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = gtr_translation_memory_dialog_finalize;
object_class->dispose = gtr_translation_memory_dialog_dispose;
g_type_class_add_private (object_class, sizeof (GtrTranslationMemoryDialogPrivate));
}
/***************Translation Memory pages****************/
static void
response_filechooser_cb (GtkDialog *dialog,
gint response_id, GtrTranslationMemoryDialog *dlg)
{
if (response_id == GTK_RESPONSE_YES)
{
gchar *filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
gtk_entry_set_text (GTK_ENTRY (dlg->priv->directory_entry),
filename);
g_settings_set_string (dlg->priv->tm_settings,
"po-directory",
filename);
g_free (filename);
}
gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
on_search_button_clicked (GtkButton *button,
GtrTranslationMemoryDialog *dlg)
{
GtkWidget *filechooser;
filechooser = gtk_file_chooser_dialog_new ("Select PO directory",
GTK_WINDOW (dlg),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL,
GTK_STOCK_OK,
GTK_RESPONSE_YES, NULL);
g_signal_connect (GTK_DIALOG (filechooser), "response",
G_CALLBACK (response_filechooser_cb), dlg);
gtk_dialog_run (GTK_DIALOG (filechooser));
}
typedef struct _IdleData
{
GSList *list;
GtkProgressBar *progress;
GtrTranslationMemory *tm;
GtkWindow *parent;
} IdleData;
static gboolean
add_to_database (gpointer data_pointer)
{
IdleData *data = (IdleData *) data_pointer;
static GSList *l = NULL;
gdouble percentage;
if (l == NULL)
l = data->list;
else
l = g_slist_next (l);
if (l)
{
GList *msg_list = NULL;
GFile *location;
GError *error = NULL;
GtrPo *po;
po = gtr_po_new ();
location = (GFile *) l->data;
gtr_po_parse (po, location, &error);
if (error)
return TRUE;
msg_list = gtr_po_get_messages (po);
gtr_translation_memory_store_list (data->tm, msg_list);
g_object_unref (po);
}
else
{
GtkWidget *dialog;
gtk_progress_bar_set_fraction (data->progress, 1.0);
dialog = gtk_message_dialog_new (data->parent,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_CLOSE, NULL);
gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
_
("<span weight=\"bold\" size=\"large\">Strings added to database</span>"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return FALSE;
}
percentage =
(gdouble) g_slist_position (data->list,
l) / (gdouble) g_slist_length (data->list);
/*
* Set the progress only if the values are reasonable.
*/
if (percentage > 0.0 || percentage < 1.0)
{
/* Set the progressbar status. */
gtk_progress_bar_set_fraction (data->progress, percentage);
}
return TRUE;
}
static void
destroy_idle_data (gpointer data)
{
IdleData *d = (IdleData *) data;
gtk_widget_hide (GTK_WIDGET (d->progress));
g_slist_free_full (d->list, g_object_unref);
g_free (d);
}
static void
on_add_database_button_clicked (GtkButton *button,
GtrTranslationMemoryDialog *dlg)
{
GFile *dir;
gchar *dir_name;
IdleData *data;
data = g_new0 (IdleData, 1);
data->list = NULL;
dir_name = g_settings_get_string (dlg->priv->tm_settings,
"po-directory");
dir = g_file_new_for_path (dir_name);
g_free (dir_name);
if (g_settings_get_boolean (dlg->priv->tm_settings,
"restrict-to-filename"))
{
gchar *restriction;
restriction = g_settings_get_string (dlg->priv->tm_settings,
"filename-restriction");
gtr_utils_scan_dir (dir, &data->list, restriction);
g_free (restriction);
}
else
gtr_utils_scan_dir (dir, &data->list, NULL);
data->tm = dlg->priv->translation_memory;
data->progress = GTK_PROGRESS_BAR (dlg->priv->add_database_progressbar);
data->parent = GTK_WINDOW (dlg);
gtk_widget_show (dlg->priv->add_database_progressbar);
g_idle_add_full (G_PRIORITY_HIGH_IDLE + 30,
(GSourceFunc) add_to_database,
data, (GDestroyNotify) destroy_idle_data);
g_object_unref (dir);
}
static void
gtr_translation_memory_dialog_init (GtrTranslationMemoryDialog *dlg)
{
GtrTranslationMemoryDialogPrivate *priv;
GtkWidget *action_area;
GtkWidget *content_area;
GtkBuilder *builder;
GtkWidget *content;
GtrProfileManager *prof_manager;
GtrProfile *profile;
const gchar *language_code;
gchar *filename = NULL;
GError *error = NULL;
gchar *root_objects[] = {
"translation-memory-box",
NULL
};
dlg->priv = GTR_TRANSLATION_MEMORY_DIALOG_GET_PRIVATE (dlg);
priv = dlg->priv;
priv->tm_settings = g_settings_new ("org.gnome.gtranslator.plugins.translation-memory");
gtk_dialog_add_buttons (GTK_DIALOG (dlg),
GTK_STOCK_CLOSE,
GTK_RESPONSE_CLOSE,
NULL);
gtk_window_set_title (GTK_WINDOW (dlg), _("Gtranslator Translation Memory Manager"));
gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
gtk_window_set_destroy_with_parent (GTK_WINDOW (dlg), TRUE);
action_area = gtk_dialog_get_action_area (GTK_DIALOG (dlg));
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dlg));
/* HIG defaults */
gtk_container_set_border_width (GTK_CONTAINER (dlg), 5);
gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */
gtk_container_set_border_width (GTK_CONTAINER (action_area), 5);
gtk_box_set_spacing (GTK_BOX (action_area), 4);
g_signal_connect (dlg, "response",
G_CALLBACK (gtk_widget_destroy), NULL);
builder = gtk_builder_new ();
gtk_builder_add_objects_from_resource (builder, "/org/gnome/gtranslator/plugins/translation-memory/ui/gtr-translation-memory-dialog.ui", root_objects, &error);
content = GTK_WIDGET (gtk_builder_get_object (builder, "translation-memory-box"));
g_object_ref (content);
priv->directory_entry = GTK_WIDGET (gtk_builder_get_object (builder, "directory-entry"));
priv->search_button = GTK_WIDGET (gtk_builder_get_object (builder, "search-button"));
priv->add_database_button = GTK_WIDGET (gtk_builder_get_object (builder, "add-database-button"));
priv->add_database_progressbar = GTK_WIDGET (gtk_builder_get_object (builder, "add-database-progressbar"));
priv->use_lang_profile_in_tm = GTK_WIDGET (gtk_builder_get_object (builder, "use-lang-profile-in-tm"));
priv->tm_lang_entry = GTK_WIDGET (gtk_builder_get_object (builder, "tm-lang-entry"));
g_object_unref (builder);
gtk_box_pack_start (GTK_BOX (content_area), content, TRUE, TRUE, 0);
g_object_unref (content);
prof_manager = gtr_profile_manager_get_default ();
profile = gtr_profile_manager_get_active_profile (prof_manager);
if (profile != NULL)
{
language_code = gtr_profile_get_language_code (profile);
filename = g_strconcat (language_code, ".po", NULL);
gtk_entry_set_text (GTK_ENTRY (priv->tm_lang_entry), filename);
}
g_object_unref (prof_manager);
if (filename != NULL)
g_settings_set_string (priv->tm_settings,
"filename-restriction",
filename);
g_free (filename);
g_settings_bind (priv->tm_settings,
"restrict-to-filename",
priv->use_lang_profile_in_tm,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (priv->tm_settings,
"po-directory",
priv->directory_entry,
"text",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (priv->tm_settings,
"filename-restriction",
priv->tm_lang_entry,
"text",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_signal_connect (GTK_BUTTON (priv->search_button), "clicked",
G_CALLBACK (on_search_button_clicked), dlg);
g_signal_connect (GTK_BUTTON (priv->add_database_button), "clicked",
G_CALLBACK (on_add_database_button_clicked), dlg);
}
GtkWidget *
gtr_translation_memory_dialog_new (GtrTranslationMemory *translation_memory)
{
GtrTranslationMemoryDialog *dlg;
dlg = GTR_TRANSLATION_MEMORY_DIALOG (g_object_new (GTR_TYPE_TRANSLATION_MEMORY_DIALOG, NULL));
/* FIXME: use a property */
dlg->priv->translation_memory = translation_memory;
return GTK_WIDGET (dlg);
}
/*
* Copyright (C) 2012 Ignacio Casal Quinteiro <icq@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/>.
*/
#ifndef __GTR_TRANSLATION_MEMORY_DIALOG_H__
#define __GTR_TRANSLATION_MEMORY_DIALOG_H__
#include <gtk/gtk.h>
#include "gtr-translation-memory.h"
G_BEGIN_DECLS
#define GTR_TYPE_TRANSLATION_MEMORY_DIALOG (gtr_translation_memory_dialog_get_type ())
#define GTR_TRANSLATION_MEMORY_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTR_TYPE_TRANSLATION_MEMORY_DIALOG, GtrTranslationMemoryDialog))
#define GTR_TRANSLATION_MEMORY_DIALOG_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTR_TYPE_TRANSLATION_MEMORY_DIALOG, GtrTranslationMemoryDialog const))
#define GTR_TRANSLATION_MEMORY_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTR_TYPE_TRANSLATION_MEMORY_DIALOG, GtrTranslationMemoryDialogClass))
#define GTR_IS_TRANSLATION_MEMORY_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTR_TYPE_TRANSLATION_MEMORY_DIALOG))
#define GTR_IS_TRANSLATION_MEMORY_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTR_TYPE_TRANSLATION_MEMORY_DIALOG))
#define GTR_TRANSLATION_MEMORY_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTR_TYPE_TRANSLATION_MEMORY_DIALOG, GtrTranslationMemoryDialogClass))
typedef struct _GtrTranslationMemoryDialog GtrTranslationMemoryDialog;
typedef struct _GtrTranslationMemoryDialogClass GtrTranslationMemoryDialogClass;
typedef struct _GtrTranslationMemoryDialogPrivate GtrTranslationMemoryDialogPrivate;
struct _GtrTranslationMemoryDialog
{
GtkDialog parent;
GtrTranslationMemoryDialogPrivate *priv;
};
struct _GtrTranslationMemoryDialogClass
{
GtkDialogClass parent_class;
};
GType gtr_translation_memory_dialog_get_type (void) G_GNUC_CONST;
GtkWidget *gtr_translation_memory_dialog_new (GtrTranslationMemory *translation_memory);
G_END_DECLS
#endif /* __GTR_TRANSLATION_MEMORY_DIALOG_H__ */
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="translation-memory-dialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="translation-memory-box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">12</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>