From f10997a5d0d55a14602afdfa095001f415e613c2 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 19 2015 15:39:06 +0000 Subject: import evince-3.14.2-5.el7 --- diff --git a/.evince.metadata b/.evince.metadata index b3ff363..20c8239 100644 --- a/.evince.metadata +++ b/.evince.metadata @@ -1 +1 @@ -cc31bf06309634fa7b651811f9b94a549547712c SOURCES/evince-3.8.3.tar.xz +3df7132fd094ddd729a3095011d3fd203bc7c706 SOURCES/evince-3.14.2.tar.xz diff --git a/.gitignore b/.gitignore index 5fadaeb..642e7ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/evince-3.8.3.tar.xz +SOURCES/evince-3.14.2.tar.xz diff --git a/SOURCES/evince-3.14.2-copy-permissions.patch b/SOURCES/evince-3.14.2-copy-permissions.patch new file mode 100644 index 0000000..621543d --- /dev/null +++ b/SOURCES/evince-3.14.2-copy-permissions.patch @@ -0,0 +1,30 @@ +From d9c747da91f937fb9fda422615860008bb1d3b4c Mon Sep 17 00:00:00 2001 +From: Marek Kasik +Date: Wed, 19 Aug 2015 17:46:34 +0200 +Subject: [PATCH] libdocument: Don't copy permissions from original file + +Consider copy as a new file and use default permissions for it +when saving a copy of opened document. + +https://bugzilla.gnome.org/show_bug.cgi?id=753019 +--- + libdocument/ev-file-helpers.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/libdocument/ev-file-helpers.c b/libdocument/ev-file-helpers.c +index 6691a55..59d7b1e 100644 +--- a/libdocument/ev-file-helpers.c ++++ b/libdocument/ev-file-helpers.c +@@ -456,7 +456,8 @@ ev_file_copy_metadata (const char *from, + target_file = g_file_new_for_uri (to); + + result = g_file_copy_attributes (source_file, target_file, +- G_FILE_COPY_ALL_METADATA, ++ G_FILE_COPY_ALL_METADATA | ++ G_FILE_COPY_TARGET_DEFAULT_PERMS, + NULL, error); + + g_object_unref (target_file); +-- +2.4.3 + diff --git a/SOURCES/evince-3.14.2-smclient.patch b/SOURCES/evince-3.14.2-smclient.patch new file mode 100644 index 0000000..b1b26af --- /dev/null +++ b/SOURCES/evince-3.14.2-smclient.patch @@ -0,0 +1,4829 @@ +diff --git a/configure.ac b/configure.ac +index d6ca0c6..45023be 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -229,6 +229,46 @@ if test -z "$GDBUS_CODEGEN"; then + AC_MSG_ERROR([gdbus-codegen not found]) + fi + ++# ********* ++# SM client ++# ********* ++ ++GDK_TARGET="$($PKG_CONFIG --variable targets gdk-3.0)" ++ ++AC_MSG_CHECKING([which smclient backend to use]) ++AC_ARG_WITH([smclient], ++ [AS_HELP_STRING([--with-smclient-backend=no|xsmp|win32|quartz], ++ [Setting smclient backend (default:auto)])], ++ [], ++ [case "$GDK_TARGET" in ++ x11*) case "$with_platform" in ++ gnome) with_smclient=xsmp ;; ++ *) with_smclient=no ;; ++ esac ;; ++ win32|quartz) with_smclient=$GDK_TARGET ;; ++ *) with_smclient=no ;; ++ esac]) ++ ++AC_MSG_RESULT([$with_smclient]) ++ ++if test "$with_smclient" != "no"; then ++ AC_DEFINE([WITH_SMCLIENT],[1],[Define if smclient is enabled]) ++ ++ case "$with_smclient" in ++ xsmp) SMCLIENT_PKGS="sm >= 1.0.0 ice x11" ;; ++ *) SMCLIENT_PKGS="" ;; ++ esac ++ ++ PKG_CHECK_MODULES([SMCLIENT],[gtk+-3.0 gthread-2.0 $SMCLIENT_PKGS]) ++ AC_SUBST([SMCLIENT_CFLAGS]) ++ AC_SUBST([SMCLIENT_LIBS]) ++fi ++ ++AM_CONDITIONAL([WITH_SMCLIENT],[test "$with_smclient" != "no"]) ++AM_CONDITIONAL([WITH_SMCLIENT_XSMP],[test "$with_smclient" = "xsmp"]) ++AM_CONDITIONAL([WITH_SMCLIENT_WIN32],[test "$with_smclient" = "win32"]) ++AM_CONDITIONAL([WITH_SMCLIENT_QUARTZ],[test "$with_smclient" = "quartz"]) ++ + # *** + + BACKEND_LIBTOOL_FLAGS="-module -avoid-version -no-undefined -export-symbols \$(top_srcdir)/backend/backend.symbols" +@@ -855,6 +895,7 @@ backend/xps/Makefile + browser-plugin/Makefile + cut-n-paste/Makefile + cut-n-paste/gimpcellrenderertoggle/Makefile ++cut-n-paste/smclient/Makefile + cut-n-paste/synctex/Makefile + cut-n-paste/libgd/Makefile + data/evince.desktop.in +@@ -944,6 +985,7 @@ GTK Doc reference ........: $enable_gtk_doc + GObject Introspection ....: $enable_introspection + DBUS communication .......: $enable_dbus + Keyring integration ......: $with_keyring ++Session Manager client ...: $with_smclient + GTK+ Unix Print ..........: $with_gtk_unix_print + Thumbnail cache ..........: $enable_gnome_desktop + +diff --git a/cut-n-paste/Makefile.am b/cut-n-paste/Makefile.am +index 2d5684d..35d7cc9 100644 +--- a/cut-n-paste/Makefile.am ++++ b/cut-n-paste/Makefile.am +@@ -1,3 +1,3 @@ +-SUBDIRS = gimpcellrenderertoggle synctex libgd ++SUBDIRS = smclient gimpcellrenderertoggle synctex libgd + + -include $(top_srcdir)/git.mk +diff --git a/cut-n-paste/smclient/Makefile.am b/cut-n-paste/smclient/Makefile.am +new file mode 100644 +index 0000000..f9e7ecc +--- /dev/null ++++ b/cut-n-paste/smclient/Makefile.am +@@ -0,0 +1,40 @@ ++noinst_LTLIBRARIES = libsmclient.la ++ ++NULL = ++ ++if WITH_SMCLIENT ++libsmclient_la_SOURCES = \ ++ eggsmclient.c \ ++ eggsmclient.h \ ++ eggsmclient-private.h \ ++ $(NULL) ++ ++libsmclient_la_CPPFLAGS = \ ++ -DG_LOG_DOMAIN=\""EggSMClient"\" \ ++ $(AM_CPPFLAGS) ++ ++libsmclient_la_CFLAGS = \ ++ $(SMCLIENT_CFLAGS) \ ++ $(AM_CFLAGS) ++ ++libsmclient_la_LIBADD = \ ++ $(SMCLIENT_LIBS) ++ ++if WITH_SMCLIENT_XSMP ++libsmclient_la_SOURCES += \ ++ eggdesktopfile.c \ ++ eggdesktopfile.h \ ++ eggsmclient-xsmp.c \ ++ $(NULL) ++libsmclient_la_CPPFLAGS += -DEGG_SM_CLIENT_BACKEND_XSMP ++endif ++if WITH_SMCLIENT_WIN32 ++libsmclient_la_SOURCES += eggsmclient-win32.c ++endif ++if WITH_SMCLIENT_QUARTZ ++libsmclient_la_SOURCES += eggsmclient-osx.c ++endif ++ ++endif # WITH_SMCLIENT ++ ++-include $(top_srcdir)/git.mk +diff --git a/cut-n-paste/smclient/eggdesktopfile.c b/cut-n-paste/smclient/eggdesktopfile.c +new file mode 100644 +index 0000000..8bc072a +--- /dev/null ++++ b/cut-n-paste/smclient/eggdesktopfile.c +@@ -0,0 +1,1528 @@ ++/* eggdesktopfile.c - Freedesktop.Org Desktop Files ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * Based on gnome-desktop-item.c ++ * Copyright (C) 1999, 2000 Red Hat Inc. ++ * Copyright (C) 2001 George Lebl ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public License ++ * as published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; see the file COPYING.LIB. If not, ++ * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#include "eggdesktopfile.h" ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++struct EggDesktopFile { ++ GKeyFile *key_file; ++ char *source; ++ ++ char *name, *icon; ++ EggDesktopFileType type; ++ char document_code; ++}; ++ ++/** ++ * egg_desktop_file_new: ++ * @desktop_file_path: path to a Freedesktop-style Desktop file ++ * @error: error pointer ++ * ++ * Creates a new #EggDesktopFile for @desktop_file. ++ * ++ * Return value: the new #EggDesktopFile, or %NULL on error. ++ **/ ++EggDesktopFile * ++egg_desktop_file_new (const char *desktop_file_path, GError **error) ++{ ++ GKeyFile *key_file; ++ ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_file (key_file, desktop_file_path, 0, error)) ++ { ++ g_key_file_free (key_file); ++ return NULL; ++ } ++ ++ return egg_desktop_file_new_from_key_file (key_file, desktop_file_path, ++ error); ++} ++ ++/** ++ * egg_desktop_file_new_from_data_dirs: ++ * @desktop_file_path: relative path to a Freedesktop-style Desktop file ++ * @error: error pointer ++ * ++ * Looks for @desktop_file_path in the paths returned from ++ * g_get_user_data_dir() and g_get_system_data_dirs(), and creates ++ * a new #EggDesktopFile from it. ++ * ++ * Return value: the new #EggDesktopFile, or %NULL on error. ++ **/ ++EggDesktopFile * ++egg_desktop_file_new_from_data_dirs (const char *desktop_file_path, ++ GError **error) ++{ ++ EggDesktopFile *desktop_file; ++ GKeyFile *key_file; ++ char *full_path; ++ ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_data_dirs (key_file, desktop_file_path, ++ &full_path, 0, error)) ++ { ++ g_key_file_free (key_file); ++ return NULL; ++ } ++ ++ desktop_file = egg_desktop_file_new_from_key_file (key_file, ++ full_path, ++ error); ++ g_free (full_path); ++ return desktop_file; ++} ++ ++/** ++ * egg_desktop_file_new_from_dirs: ++ * @desktop_file_path: relative path to a Freedesktop-style Desktop file ++ * @search_dirs: NULL-terminated array of directories to search ++ * @error: error pointer ++ * ++ * Looks for @desktop_file_path in the paths returned from ++ * g_get_user_data_dir() and g_get_system_data_dirs(), and creates ++ * a new #EggDesktopFile from it. ++ * ++ * Return value: the new #EggDesktopFile, or %NULL on error. ++ **/ ++EggDesktopFile * ++egg_desktop_file_new_from_dirs (const char *desktop_file_path, ++ const char **search_dirs, ++ GError **error) ++{ ++ EggDesktopFile *desktop_file; ++ GKeyFile *key_file; ++ char *full_path; ++ ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_dirs (key_file, desktop_file_path, search_dirs, ++ &full_path, 0, error)) ++ { ++ g_key_file_free (key_file); ++ return NULL; ++ } ++ ++ desktop_file = egg_desktop_file_new_from_key_file (key_file, ++ full_path, ++ error); ++ g_free (full_path); ++ return desktop_file; ++} ++ ++/** ++ * egg_desktop_file_new_from_key_file: ++ * @key_file: a #GKeyFile representing a desktop file ++ * @source: the path or URI that @key_file was loaded from, or %NULL ++ * @error: error pointer ++ * ++ * Creates a new #EggDesktopFile for @key_file. Assumes ownership of ++ * @key_file (on success or failure); you should consider @key_file to ++ * be freed after calling this function. ++ * ++ * Return value: the new #EggDesktopFile, or %NULL on error. ++ **/ ++EggDesktopFile * ++egg_desktop_file_new_from_key_file (GKeyFile *key_file, ++ const char *source, ++ GError **error) ++{ ++ EggDesktopFile *desktop_file; ++ char *version, *type; ++ ++ if (!g_key_file_has_group (key_file, EGG_DESKTOP_FILE_GROUP)) ++ { ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_INVALID, ++ _("File is not a valid .desktop file")); ++ g_key_file_free (key_file); ++ return NULL; ++ } ++ ++ version = g_key_file_get_value (key_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_VERSION, ++ NULL); ++ if (version) ++ { ++ double version_num; ++ char *end; ++ ++ version_num = g_ascii_strtod (version, &end); ++ if (*end) ++ { ++ g_warning ("Invalid Version string '%s' in %s", ++ version, source ? source : "(unknown)"); ++ } ++ else if (version_num > 1.0) ++ { ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_INVALID, ++ /* translators: 'Version' is from a desktop file, and ++ * should not be translated. '%s' would probably be a ++ * version number. */ ++ _("Unrecognized desktop file Version '%s'"), version); ++ g_free (version); ++ g_key_file_free (key_file); ++ return NULL; ++ } ++ g_free (version); ++ } ++ ++ desktop_file = g_new0 (EggDesktopFile, 1); ++ desktop_file->key_file = key_file; ++ ++ if (g_path_is_absolute (source)) ++ desktop_file->source = g_filename_to_uri (source, NULL, NULL); ++ else ++ desktop_file->source = g_strdup (source); ++ ++ desktop_file->name = g_key_file_get_locale_string (key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_NAME, ++ NULL, ++ error); ++ if (!desktop_file->name) ++ { ++ egg_desktop_file_free (desktop_file); ++ return NULL; ++ } ++ ++ type = g_key_file_get_string (key_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_TYPE, error); ++ if (!type) ++ { ++ egg_desktop_file_free (desktop_file); ++ return NULL; ++ } ++ ++ if (!strcmp (type, "Application")) ++ { ++ char *exec, *p; ++ ++ desktop_file->type = EGG_DESKTOP_FILE_TYPE_APPLICATION; ++ ++ exec = g_key_file_get_string (key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_EXEC, ++ error); ++ if (!exec) ++ { ++ egg_desktop_file_free (desktop_file); ++ g_free (type); ++ return NULL; ++ } ++ ++ /* See if it takes paths or URIs or neither */ ++ for (p = exec; *p; p++) ++ { ++ if (*p == '%') ++ { ++ if (p[1] == '\0' || strchr ("FfUu", p[1])) ++ { ++ desktop_file->document_code = p[1]; ++ break; ++ } ++ p++; ++ } ++ } ++ ++ g_free (exec); ++ } ++ else if (!strcmp (type, "Link")) ++ { ++ char *url; ++ ++ desktop_file->type = EGG_DESKTOP_FILE_TYPE_LINK; ++ ++ url = g_key_file_get_string (key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_URL, ++ error); ++ if (!url) ++ { ++ egg_desktop_file_free (desktop_file); ++ g_free (type); ++ return NULL; ++ } ++ g_free (url); ++ } ++ else if (!strcmp (type, "Directory")) ++ desktop_file->type = EGG_DESKTOP_FILE_TYPE_DIRECTORY; ++ else ++ desktop_file->type = EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED; ++ ++ g_free (type); ++ ++ /* Check the Icon key */ ++ desktop_file->icon = g_key_file_get_string (key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_ICON, ++ NULL); ++ if (desktop_file->icon && !g_path_is_absolute (desktop_file->icon)) ++ { ++ char *ext; ++ ++ /* Lots of .desktop files still get this wrong */ ++ ext = strrchr (desktop_file->icon, '.'); ++ if (ext && (!strcmp (ext, ".png") || ++ !strcmp (ext, ".xpm") || ++ !strcmp (ext, ".svg"))) ++ { ++ g_warning ("Desktop file '%s' has malformed Icon key '%s'" ++ "(should not include extension)", ++ source ? source : "(unknown)", ++ desktop_file->icon); ++ *ext = '\0'; ++ } ++ } ++ ++ return desktop_file; ++} ++ ++/** ++ * egg_desktop_file_free: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Frees @desktop_file. ++ **/ ++void ++egg_desktop_file_free (EggDesktopFile *desktop_file) ++{ ++ g_key_file_free (desktop_file->key_file); ++ g_free (desktop_file->source); ++ g_free (desktop_file->name); ++ g_free (desktop_file->icon); ++ g_free (desktop_file); ++} ++ ++/** ++ * egg_desktop_file_get_source: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Gets the URI that @desktop_file was loaded from. ++ * ++ * Return value: @desktop_file's source URI ++ **/ ++const char * ++egg_desktop_file_get_source (EggDesktopFile *desktop_file) ++{ ++ return desktop_file->source; ++} ++ ++/** ++ * egg_desktop_file_get_desktop_file_type: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Gets the desktop file type of @desktop_file. ++ * ++ * Return value: @desktop_file's type ++ **/ ++EggDesktopFileType ++egg_desktop_file_get_desktop_file_type (EggDesktopFile *desktop_file) ++{ ++ return desktop_file->type; ++} ++ ++/** ++ * egg_desktop_file_get_name: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Gets the (localized) value of @desktop_file's "Name" key. ++ * ++ * Return value: the application/link name ++ **/ ++const char * ++egg_desktop_file_get_name (EggDesktopFile *desktop_file) ++{ ++ return desktop_file->name; ++} ++ ++/** ++ * egg_desktop_file_get_icon: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Gets the value of @desktop_file's "Icon" key. ++ * ++ * If the icon string is a full path (that is, if g_path_is_absolute() ++ * returns %TRUE when called on it), it points to a file containing an ++ * unthemed icon. If the icon string is not a full path, it is the ++ * name of a themed icon, which can be looked up with %GtkIconTheme, ++ * or passed directly to a theme-aware widget like %GtkImage or ++ * %GtkCellRendererPixbuf. ++ * ++ * Return value: the icon path or name ++ **/ ++const char * ++egg_desktop_file_get_icon (EggDesktopFile *desktop_file) ++{ ++ return desktop_file->icon; ++} ++ ++gboolean ++egg_desktop_file_has_key (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) ++{ ++ return g_key_file_has_key (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ error); ++} ++ ++char * ++egg_desktop_file_get_string (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) ++{ ++ return g_key_file_get_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ error); ++} ++ ++char * ++egg_desktop_file_get_locale_string (EggDesktopFile *desktop_file, ++ const char *key, ++ const char *locale, ++ GError **error) ++{ ++ return g_key_file_get_locale_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, locale, ++ error); ++} ++ ++gboolean ++egg_desktop_file_get_boolean (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) ++{ ++ return g_key_file_get_boolean (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ error); ++} ++ ++double ++egg_desktop_file_get_numeric (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) ++{ ++ return g_key_file_get_double (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ error); ++} ++ ++int ++egg_desktop_file_get_integer (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) ++{ ++ return g_key_file_get_integer (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ error); ++} ++ ++char ** ++egg_desktop_file_get_string_list (EggDesktopFile *desktop_file, ++ const char *key, ++ gsize *length, ++ GError **error) ++{ ++ return g_key_file_get_string_list (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, length, ++ error); ++} ++ ++char ** ++egg_desktop_file_get_locale_string_list (EggDesktopFile *desktop_file, ++ const char *key, ++ const char *locale, ++ gsize *length, ++ GError **error) ++{ ++ return g_key_file_get_locale_string_list (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, key, ++ locale, length, ++ error); ++} ++ ++/** ++ * egg_desktop_file_can_launch: ++ * @desktop_file: an #EggDesktopFile ++ * @desktop_environment: the name of the running desktop environment, ++ * or %NULL ++ * ++ * Tests if @desktop_file can/should be launched in the current ++ * environment. If @desktop_environment is non-%NULL, @desktop_file's ++ * "OnlyShowIn" and "NotShowIn" keys are checked to make sure that ++ * this desktop_file is appropriate for the named environment. ++ * ++ * Furthermore, if @desktop_file has type ++ * %EGG_DESKTOP_FILE_TYPE_APPLICATION, its "TryExec" key (if any) is ++ * also checked, to make sure the binary it points to exists. ++ * ++ * egg_desktop_file_can_launch() does NOT check the value of the ++ * "Hidden" key. ++ * ++ * Return value: %TRUE if @desktop_file can be launched ++ **/ ++gboolean ++egg_desktop_file_can_launch (EggDesktopFile *desktop_file, ++ const char *desktop_environment) ++{ ++ char *try_exec, *found_program; ++ char **only_show_in, **not_show_in; ++ gboolean found; ++ int i; ++ ++ if (desktop_file->type != EGG_DESKTOP_FILE_TYPE_APPLICATION && ++ desktop_file->type != EGG_DESKTOP_FILE_TYPE_LINK) ++ return FALSE; ++ ++ if (desktop_environment) ++ { ++ only_show_in = g_key_file_get_string_list (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_ONLY_SHOW_IN, ++ NULL, NULL); ++ if (only_show_in) ++ { ++ for (i = 0, found = FALSE; only_show_in[i] && !found; i++) ++ { ++ if (!strcmp (only_show_in[i], desktop_environment)) ++ found = TRUE; ++ } ++ ++ g_strfreev (only_show_in); ++ ++ if (!found) ++ return FALSE; ++ } ++ ++ not_show_in = g_key_file_get_string_list (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_NOT_SHOW_IN, ++ NULL, NULL); ++ if (not_show_in) ++ { ++ for (i = 0, found = FALSE; not_show_in[i] && !found; i++) ++ { ++ if (!strcmp (not_show_in[i], desktop_environment)) ++ found = TRUE; ++ } ++ ++ g_strfreev (not_show_in); ++ ++ if (found) ++ return FALSE; ++ } ++ } ++ ++ if (desktop_file->type == EGG_DESKTOP_FILE_TYPE_APPLICATION) ++ { ++ try_exec = g_key_file_get_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_TRY_EXEC, ++ NULL); ++ if (try_exec) ++ { ++ found_program = g_find_program_in_path (try_exec); ++ g_free (try_exec); ++ ++ if (!found_program) ++ return FALSE; ++ g_free (found_program); ++ } ++ } ++ ++ return TRUE; ++} ++ ++/** ++ * egg_desktop_file_accepts_documents: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Tests if @desktop_file represents an application that can accept ++ * documents on the command line. ++ * ++ * Return value: %TRUE or %FALSE ++ **/ ++gboolean ++egg_desktop_file_accepts_documents (EggDesktopFile *desktop_file) ++{ ++ return desktop_file->document_code != 0; ++} ++ ++/** ++ * egg_desktop_file_accepts_multiple: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Tests if @desktop_file can accept multiple documents at once. ++ * ++ * If this returns %FALSE, you can still pass multiple documents to ++ * egg_desktop_file_launch(), but that will result in multiple copies ++ * of the application being launched. See egg_desktop_file_launch() ++ * for more details. ++ * ++ * Return value: %TRUE or %FALSE ++ **/ ++gboolean ++egg_desktop_file_accepts_multiple (EggDesktopFile *desktop_file) ++{ ++ return (desktop_file->document_code == 'F' || ++ desktop_file->document_code == 'U'); ++} ++ ++/** ++ * egg_desktop_file_accepts_uris: ++ * @desktop_file: an #EggDesktopFile ++ * ++ * Tests if @desktop_file can accept (non-"file:") URIs as documents to ++ * open. ++ * ++ * Return value: %TRUE or %FALSE ++ **/ ++gboolean ++egg_desktop_file_accepts_uris (EggDesktopFile *desktop_file) ++{ ++ return (desktop_file->document_code == 'U' || ++ desktop_file->document_code == 'u'); ++} ++ ++static void ++append_quoted_word (GString *str, ++ const char *s, ++ gboolean in_single_quotes, ++ gboolean in_double_quotes) ++{ ++ const char *p; ++ ++ if (!in_single_quotes && !in_double_quotes) ++ g_string_append_c (str, '\''); ++ else if (!in_single_quotes && in_double_quotes) ++ g_string_append (str, "\"'"); ++ ++ if (!strchr (s, '\'')) ++ g_string_append (str, s); ++ else ++ { ++ for (p = s; *p != '\0'; p++) ++ { ++ if (*p == '\'') ++ g_string_append (str, "'\\''"); ++ else ++ g_string_append_c (str, *p); ++ } ++ } ++ ++ if (!in_single_quotes && !in_double_quotes) ++ g_string_append_c (str, '\''); ++ else if (!in_single_quotes && in_double_quotes) ++ g_string_append (str, "'\""); ++} ++ ++static void ++do_percent_subst (EggDesktopFile *desktop_file, ++ char code, ++ GString *str, ++ GSList **documents, ++ gboolean in_single_quotes, ++ gboolean in_double_quotes) ++{ ++ GSList *d; ++ char *doc; ++ ++ switch (code) ++ { ++ case '%': ++ g_string_append_c (str, '%'); ++ break; ++ ++ case 'F': ++ case 'U': ++ for (d = *documents; d; d = d->next) ++ { ++ doc = d->data; ++ g_string_append (str, " "); ++ append_quoted_word (str, doc, in_single_quotes, in_double_quotes); ++ } ++ *documents = NULL; ++ break; ++ ++ case 'f': ++ case 'u': ++ if (*documents) ++ { ++ doc = (*documents)->data; ++ g_string_append (str, " "); ++ append_quoted_word (str, doc, in_single_quotes, in_double_quotes); ++ *documents = (*documents)->next; ++ } ++ break; ++ ++ case 'i': ++ if (desktop_file->icon) ++ { ++ g_string_append (str, "--icon "); ++ append_quoted_word (str, desktop_file->icon, ++ in_single_quotes, in_double_quotes); ++ } ++ break; ++ ++ case 'c': ++ if (desktop_file->name) ++ { ++ append_quoted_word (str, desktop_file->name, ++ in_single_quotes, in_double_quotes); ++ } ++ break; ++ ++ case 'k': ++ if (desktop_file->source) ++ { ++ append_quoted_word (str, desktop_file->source, ++ in_single_quotes, in_double_quotes); ++ } ++ break; ++ ++ case 'D': ++ case 'N': ++ case 'd': ++ case 'n': ++ case 'v': ++ case 'm': ++ /* Deprecated; skip */ ++ break; ++ ++ default: ++ g_warning ("Unrecognized %%-code '%%%c' in Exec", code); ++ break; ++ } ++} ++ ++static char * ++parse_exec (EggDesktopFile *desktop_file, ++ GSList **documents, ++ GError **error) ++{ ++ char *exec, *p, *command; ++ gboolean escape, single_quot, double_quot; ++ GString *gs; ++ ++ exec = g_key_file_get_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_EXEC, ++ error); ++ if (!exec) ++ return NULL; ++ ++ /* Build the command */ ++ gs = g_string_new (NULL); ++ escape = single_quot = double_quot = FALSE; ++ ++ for (p = exec; *p != '\0'; p++) ++ { ++ if (escape) ++ { ++ escape = FALSE; ++ g_string_append_c (gs, *p); ++ } ++ else if (*p == '\\') ++ { ++ if (!single_quot) ++ escape = TRUE; ++ g_string_append_c (gs, *p); ++ } ++ else if (*p == '\'') ++ { ++ g_string_append_c (gs, *p); ++ if (!single_quot && !double_quot) ++ single_quot = TRUE; ++ else if (single_quot) ++ single_quot = FALSE; ++ } ++ else if (*p == '"') ++ { ++ g_string_append_c (gs, *p); ++ if (!single_quot && !double_quot) ++ double_quot = TRUE; ++ else if (double_quot) ++ double_quot = FALSE; ++ } ++ else if (*p == '%' && p[1]) ++ { ++ do_percent_subst (desktop_file, p[1], gs, documents, ++ single_quot, double_quot); ++ p++; ++ } ++ else ++ g_string_append_c (gs, *p); ++ } ++ ++ g_free (exec); ++ command = g_string_free (gs, FALSE); ++ ++ /* Prepend "xdg-terminal " if needed (FIXME: use gvfs) */ ++ if (g_key_file_has_key (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_TERMINAL, ++ NULL)) ++ { ++ GError *terminal_error = NULL; ++ gboolean use_terminal = ++ g_key_file_get_boolean (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_TERMINAL, ++ &terminal_error); ++ if (terminal_error) ++ { ++ g_free (command); ++ g_propagate_error (error, terminal_error); ++ return NULL; ++ } ++ ++ if (use_terminal) ++ { ++ gs = g_string_new ("xdg-terminal "); ++ append_quoted_word (gs, command, FALSE, FALSE); ++ g_free (command); ++ command = g_string_free (gs, FALSE); ++ } ++ } ++ ++ return command; ++} ++ ++static GSList * ++translate_document_list (EggDesktopFile *desktop_file, GSList *documents) ++{ ++ gboolean accepts_uris = egg_desktop_file_accepts_uris (desktop_file); ++ GSList *ret, *d; ++ ++ for (d = documents, ret = NULL; d; d = d->next) ++ { ++ const char *document = d->data; ++ gboolean is_uri = !g_path_is_absolute (document); ++ char *translated; ++ ++ if (accepts_uris) ++ { ++ if (is_uri) ++ translated = g_strdup (document); ++ else ++ translated = g_filename_to_uri (document, NULL, NULL); ++ } ++ else ++ { ++ if (is_uri) ++ translated = g_filename_from_uri (document, NULL, NULL); ++ else ++ translated = g_strdup (document); ++ } ++ ++ if (translated) ++ ret = g_slist_prepend (ret, translated); ++ } ++ ++ return g_slist_reverse (ret); ++} ++ ++static void ++free_document_list (GSList *documents) ++{ ++ GSList *d; ++ ++ for (d = documents; d; d = d->next) ++ g_free (d->data); ++ g_slist_free (documents); ++} ++ ++/** ++ * egg_desktop_file_parse_exec: ++ * @desktop_file: a #EggDesktopFile ++ * @documents: a list of document paths or URIs ++ * @error: error pointer ++ * ++ * Parses @desktop_file's Exec key, inserting @documents into it, and ++ * returns the result. ++ * ++ * If @documents contains non-file: URIs and @desktop_file does not ++ * accept URIs, those URIs will be ignored. Likewise, if @documents ++ * contains more elements than @desktop_file accepts, the extra ++ * documents will be ignored. ++ * ++ * Return value: the parsed Exec string ++ **/ ++char * ++egg_desktop_file_parse_exec (EggDesktopFile *desktop_file, ++ GSList *documents, ++ GError **error) ++{ ++ GSList *translated, *docs; ++ char *command; ++ ++ docs = translated = translate_document_list (desktop_file, documents); ++ command = parse_exec (desktop_file, &docs, error); ++ free_document_list (translated); ++ ++ return command; ++} ++ ++static gboolean ++parse_link (EggDesktopFile *desktop_file, ++ EggDesktopFile **app_desktop_file, ++ GSList **documents, ++ GError **error) ++{ ++ char *url; ++ GKeyFile *key_file; ++ ++ url = g_key_file_get_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_URL, ++ error); ++ if (!url) ++ return FALSE; ++ *documents = g_slist_prepend (NULL, url); ++ ++ /* FIXME: use gvfs */ ++ key_file = g_key_file_new (); ++ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_NAME, ++ "xdg-open"); ++ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_TYPE, ++ "Application"); ++ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_EXEC, ++ "xdg-open %u"); ++ *app_desktop_file = egg_desktop_file_new_from_key_file (key_file, NULL, NULL); ++ return TRUE; ++} ++ ++#if GTK_CHECK_VERSION (2, 12, 0) ++static char * ++start_startup_notification (GdkDisplay *display, ++ EggDesktopFile *desktop_file, ++ const char *argv0, ++ int screen, ++ int workspace, ++ guint32 launch_time) ++{ ++ static int sequence = 0; ++ char *startup_id; ++ char *description, *wmclass; ++ char *screen_str, *workspace_str; ++ ++ if (g_key_file_has_key (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY, ++ NULL)) ++ { ++ if (!g_key_file_get_boolean (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY, ++ NULL)) ++ return NULL; ++ wmclass = NULL; ++ } ++ else ++ { ++ wmclass = g_key_file_get_string (desktop_file->key_file, ++ EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_STARTUP_WM_CLASS, ++ NULL); ++ if (!wmclass) ++ return NULL; ++ } ++ ++ if (launch_time == (guint32)-1) ++ launch_time = gdk_x11_display_get_user_time (display); ++ startup_id = g_strdup_printf ("%s-%lu-%s-%s-%d_TIME%lu", ++ g_get_prgname (), ++ (unsigned long)getpid (), ++ g_get_host_name (), ++ argv0, ++ sequence++, ++ (unsigned long)launch_time); ++ ++ description = g_strdup_printf (_("Starting %s"), desktop_file->name); ++ screen_str = g_strdup_printf ("%d", screen); ++ workspace_str = workspace == -1 ? NULL : g_strdup_printf ("%d", workspace); ++ ++ gdk_x11_display_broadcast_startup_message (display, "new", ++ "ID", startup_id, ++ "NAME", desktop_file->name, ++ "SCREEN", screen_str, ++ "BIN", argv0, ++ "ICON", desktop_file->icon, ++ "DESKTOP", workspace_str, ++ "DESCRIPTION", description, ++ "WMCLASS", wmclass, ++ NULL); ++ ++ g_free (description); ++ g_free (wmclass); ++ g_free (screen_str); ++ g_free (workspace_str); ++ ++ return startup_id; ++} ++ ++static void ++end_startup_notification (GdkDisplay *display, ++ const char *startup_id) ++{ ++ gdk_x11_display_broadcast_startup_message (display, "remove", ++ "ID", startup_id, ++ NULL); ++} ++ ++#define EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH (30 /* seconds */) ++ ++typedef struct { ++ GdkDisplay *display; ++ char *startup_id; ++} StartupNotificationData; ++ ++static gboolean ++startup_notification_timeout (gpointer data) ++{ ++ StartupNotificationData *sn_data = data; ++ ++ end_startup_notification (sn_data->display, sn_data->startup_id); ++ g_object_unref (sn_data->display); ++ g_free (sn_data->startup_id); ++ g_free (sn_data); ++ ++ return FALSE; ++} ++ ++static void ++set_startup_notification_timeout (GdkDisplay *display, ++ const char *startup_id) ++{ ++ StartupNotificationData *sn_data; ++ ++ sn_data = g_new (StartupNotificationData, 1); ++ sn_data->display = g_object_ref (display); ++ sn_data->startup_id = g_strdup (startup_id); ++ ++ g_timeout_add_seconds (EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH, ++ startup_notification_timeout, sn_data); ++} ++#endif /* GTK 2.12 */ ++ ++static GPtrArray * ++array_putenv (GPtrArray *env, char *variable) ++{ ++ guint i, keylen; ++ ++ if (!env) ++ { ++ char **envp; ++ ++ env = g_ptr_array_new (); ++ ++ envp = g_listenv (); ++ for (i = 0; envp[i]; i++) ++ { ++ const char *value; ++ ++ value = g_getenv (envp[i]); ++ g_ptr_array_add (env, g_strdup_printf ("%s=%s", envp[i], ++ value ? value : "")); ++ } ++ g_strfreev (envp); ++ } ++ ++ keylen = strcspn (variable, "="); ++ ++ /* Remove old value of key */ ++ for (i = 0; i < env->len; i++) ++ { ++ char *envvar = env->pdata[i]; ++ ++ if (!strncmp (envvar, variable, keylen) && envvar[keylen] == '=') ++ { ++ g_free (envvar); ++ g_ptr_array_remove_index_fast (env, i); ++ break; ++ } ++ } ++ ++ /* Add new value */ ++ g_ptr_array_add (env, g_strdup (variable)); ++ ++ return env; ++} ++ ++static gboolean ++egg_desktop_file_launchv (EggDesktopFile *desktop_file, ++ GSList *documents, va_list args, ++ GError **error) ++{ ++ EggDesktopFileLaunchOption option; ++ GSList *translated_documents = NULL, *docs = NULL; ++ char *command, **argv; ++ int argc, i, screen_num; ++ gboolean success, current_success; ++ GdkDisplay *display; ++ char *startup_id; ++ ++ GPtrArray *env = NULL; ++ char **variables = NULL; ++ GdkScreen *screen = NULL; ++ int workspace = -1; ++ const char *directory = NULL; ++ guint32 launch_time = (guint32)-1; ++ GSpawnFlags flags = G_SPAWN_SEARCH_PATH; ++ GSpawnChildSetupFunc setup_func = NULL; ++ gpointer setup_data = NULL; ++ ++ GPid *ret_pid = NULL; ++ int *ret_stdin = NULL, *ret_stdout = NULL, *ret_stderr = NULL; ++ char **ret_startup_id = NULL; ++ ++ if (documents && desktop_file->document_code == 0) ++ { ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE, ++ _("Application does not accept documents on command line")); ++ return FALSE; ++ } ++ ++ /* Read the options: technically it's incorrect for the caller to ++ * NULL-terminate the list of options (rather than 0-terminating ++ * it), but NULL-terminating lets us use G_GNUC_NULL_TERMINATED, ++ * it's more consistent with other glib/gtk methods, and it will ++ * work as long as sizeof (int) <= sizeof (NULL), and NULL is ++ * represented as 0. (Which is true everywhere we care about.) ++ */ ++ while ((option = va_arg (args, EggDesktopFileLaunchOption))) ++ { ++ switch (option) ++ { ++ case EGG_DESKTOP_FILE_LAUNCH_CLEARENV: ++ if (env) ++ g_ptr_array_free (env, TRUE); ++ env = g_ptr_array_new (); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_PUTENV: ++ variables = va_arg (args, char **); ++ for (i = 0; variables[i]; i++) ++ env = array_putenv (env, variables[i]); ++ break; ++ ++ case EGG_DESKTOP_FILE_LAUNCH_SCREEN: ++ screen = va_arg (args, GdkScreen *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_WORKSPACE: ++ workspace = va_arg (args, int); ++ break; ++ ++ case EGG_DESKTOP_FILE_LAUNCH_DIRECTORY: ++ directory = va_arg (args, const char *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_TIME: ++ launch_time = va_arg (args, guint32); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_FLAGS: ++ flags |= va_arg (args, GSpawnFlags); ++ /* Make sure they didn't set any flags that don't make sense. */ ++ flags &= ~G_SPAWN_FILE_AND_ARGV_ZERO; ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC: ++ setup_func = va_arg (args, GSpawnChildSetupFunc); ++ setup_data = va_arg (args, gpointer); ++ break; ++ ++ case EGG_DESKTOP_FILE_LAUNCH_RETURN_PID: ++ ret_pid = va_arg (args, GPid *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE: ++ ret_stdin = va_arg (args, int *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE: ++ ret_stdout = va_arg (args, int *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE: ++ ret_stderr = va_arg (args, int *); ++ break; ++ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID: ++ ret_startup_id = va_arg (args, char **); ++ break; ++ ++ default: ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_UNRECOGNIZED_OPTION, ++ _("Unrecognized launch option: %d"), ++ GPOINTER_TO_INT (option)); ++ success = FALSE; ++ goto out; ++ } ++ } ++ ++ if (screen) ++ { ++ char *display_name = gdk_screen_make_display_name (screen); ++ char *display_env = g_strdup_printf ("DISPLAY=%s", display_name); ++ env = array_putenv (env, display_env); ++ g_free (display_name); ++ g_free (display_env); ++ ++ display = gdk_screen_get_display (screen); ++ } ++ else ++ { ++ display = gdk_display_get_default (); ++ screen = gdk_display_get_default_screen (display); ++ } ++ screen_num = gdk_screen_get_number (screen); ++ ++ translated_documents = translate_document_list (desktop_file, documents); ++ docs = translated_documents; ++ ++ success = FALSE; ++ ++ do ++ { ++ command = parse_exec (desktop_file, &docs, error); ++ if (!command) ++ goto out; ++ ++ if (!g_shell_parse_argv (command, &argc, &argv, error)) ++ { ++ g_free (command); ++ goto out; ++ } ++ g_free (command); ++ ++#if GTK_CHECK_VERSION (2, 12, 0) ++ startup_id = start_startup_notification (display, desktop_file, ++ argv[0], screen_num, ++ workspace, launch_time); ++ if (startup_id) ++ { ++ char *startup_id_env = g_strdup_printf ("DESKTOP_STARTUP_ID=%s", ++ startup_id); ++ env = array_putenv (env, startup_id_env); ++ g_free (startup_id_env); ++ } ++#else ++ startup_id = NULL; ++#endif /* GTK 2.12 */ ++ ++ if (env != NULL) ++ g_ptr_array_add (env, NULL); ++ ++ current_success = ++ g_spawn_async_with_pipes (directory, ++ argv, ++ env ? (char **)(env->pdata) : NULL, ++ flags, ++ setup_func, setup_data, ++ ret_pid, ++ ret_stdin, ret_stdout, ret_stderr, ++ error); ++ g_strfreev (argv); ++ ++ if (startup_id) ++ { ++#if GTK_CHECK_VERSION (2, 12, 0) ++ if (current_success) ++ { ++ set_startup_notification_timeout (display, startup_id); ++ ++ if (ret_startup_id) ++ *ret_startup_id = startup_id; ++ else ++ g_free (startup_id); ++ } ++ else ++#endif /* GTK 2.12 */ ++ g_free (startup_id); ++ } ++ else if (ret_startup_id) ++ *ret_startup_id = NULL; ++ ++ if (current_success) ++ { ++ /* If we successfully launch any instances of the app, make ++ * sure we return TRUE and don't set @error. ++ */ ++ success = TRUE; ++ error = NULL; ++ ++ /* Also, only set the output params on the first one */ ++ ret_pid = NULL; ++ ret_stdin = ret_stdout = ret_stderr = NULL; ++ ret_startup_id = NULL; ++ } ++ } ++ while (docs && current_success); ++ ++ out: ++ if (env) ++ { ++ g_ptr_array_foreach (env, (GFunc)g_free, NULL); ++ g_ptr_array_free (env, TRUE); ++ } ++ free_document_list (translated_documents); ++ ++ return success; ++} ++ ++/** ++ * egg_desktop_file_launch: ++ * @desktop_file: an #EggDesktopFile ++ * @documents: a list of URIs or paths to documents to open ++ * @error: error pointer ++ * @...: additional options ++ * ++ * Launches @desktop_file with the given arguments. Additional options ++ * can be specified as follows: ++ * ++ * %EGG_DESKTOP_FILE_LAUNCH_CLEARENV: (no arguments) ++ * clears the environment in the child process ++ * %EGG_DESKTOP_FILE_LAUNCH_PUTENV: (char **variables) ++ * adds the NAME=VALUE strings in the given %NULL-terminated ++ * array to the child process's environment ++ * %EGG_DESKTOP_FILE_LAUNCH_SCREEN: (GdkScreen *screen) ++ * causes the application to be launched on the given screen ++ * %EGG_DESKTOP_FILE_LAUNCH_WORKSPACE: (int workspace) ++ * causes the application to be launched on the given workspace ++ * %EGG_DESKTOP_FILE_LAUNCH_DIRECTORY: (char *dir) ++ * causes the application to be launched in the given directory ++ * %EGG_DESKTOP_FILE_LAUNCH_TIME: (guint32 launch_time) ++ * sets the "launch time" for the application. If the user ++ * interacts with another window after @launch_time but before ++ * the launched application creates its first window, the window ++ * manager may choose to not give focus to the new application. ++ * Passing 0 for @launch_time will explicitly request that the ++ * application not receive focus. ++ * %EGG_DESKTOP_FILE_LAUNCH_FLAGS (GSpawnFlags flags) ++ * Sets additional #GSpawnFlags to use. See g_spawn_async() for ++ * more details. ++ * %EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC (GSpawnChildSetupFunc, gpointer) ++ * Sets the child setup callback and the data to pass to it. ++ * (See g_spawn_async() for more details.) ++ * ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_PID (GPid **pid) ++ * On a successful launch, sets *@pid to the PID of the launched ++ * application. ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID (char **startup_id) ++ * On a successful launch, sets *@startup_id to the Startup ++ * Notification "startup id" of the launched application. ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE (int *fd) ++ * On a successful launch, sets *@fd to the file descriptor of ++ * a pipe connected to the application's stdin. ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE (int *fd) ++ * On a successful launch, sets *@fd to the file descriptor of ++ * a pipe connected to the application's stdout. ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE (int *fd) ++ * On a successful launch, sets *@fd to the file descriptor of ++ * a pipe connected to the application's stderr. ++ * ++ * The options should be terminated with a single %NULL. ++ * ++ * If @documents contains multiple documents, but ++ * egg_desktop_file_accepts_multiple() returns %FALSE for ++ * @desktop_file, then egg_desktop_file_launch() will actually launch ++ * multiple instances of the application. In that case, the return ++ * value (as well as any values passed via ++ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_PID, etc) will only reflect the ++ * first instance of the application that was launched (but the ++ * %EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC will be called for each ++ * instance). ++ * ++ * Return value: %TRUE if the application was successfully launched. ++ **/ ++gboolean ++egg_desktop_file_launch (EggDesktopFile *desktop_file, ++ GSList *documents, GError **error, ++ ...) ++{ ++ va_list args; ++ gboolean success; ++ EggDesktopFile *app_desktop_file; ++ ++ switch (desktop_file->type) ++ { ++ case EGG_DESKTOP_FILE_TYPE_APPLICATION: ++ va_start (args, error); ++ success = egg_desktop_file_launchv (desktop_file, documents, ++ args, error); ++ va_end (args); ++ break; ++ ++ case EGG_DESKTOP_FILE_TYPE_LINK: ++ if (documents) ++ { ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE, ++ /* translators: The 'Type=Link' string is found in a ++ * desktop file, and should not be translated. */ ++ _("Can't pass document URIs to a 'Type=Link' desktop entry")); ++ return FALSE; ++ } ++ ++ if (!parse_link (desktop_file, &app_desktop_file, &documents, error)) ++ return FALSE; ++ ++ va_start (args, error); ++ success = egg_desktop_file_launchv (app_desktop_file, documents, ++ args, error); ++ va_end (args); ++ ++ egg_desktop_file_free (app_desktop_file); ++ free_document_list (documents); ++ break; ++ ++ case EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED: ++ case EGG_DESKTOP_FILE_TYPE_DIRECTORY: ++ default: ++ g_set_error (error, EGG_DESKTOP_FILE_ERROR, ++ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE, ++ _("Not a launchable item")); ++ success = FALSE; ++ break; ++ } ++ ++ return success; ++} ++ ++ ++GQuark ++egg_desktop_file_error_quark (void) ++{ ++ return g_quark_from_static_string ("egg-desktop_file-error-quark"); ++} ++ ++ ++G_LOCK_DEFINE_STATIC (egg_desktop_file); ++static EggDesktopFile *egg_desktop_file; ++ ++static void ++egg_set_desktop_file_internal (const char *desktop_file_path, ++ gboolean set_defaults) ++{ ++ GError *error = NULL; ++ ++ G_LOCK (egg_desktop_file); ++ if (egg_desktop_file) ++ egg_desktop_file_free (egg_desktop_file); ++ ++ egg_desktop_file = egg_desktop_file_new (desktop_file_path, &error); ++ if (error) ++ { ++ g_warning ("Could not load desktop file '%s': %s", ++ desktop_file_path, error->message); ++ g_error_free (error); ++ } ++ ++ if (set_defaults && egg_desktop_file != NULL) { ++ /* Set localized application name and default window icon */ ++ if (egg_desktop_file->name) ++ g_set_application_name (egg_desktop_file->name); ++ if (egg_desktop_file->icon) ++ { ++ if (g_path_is_absolute (egg_desktop_file->icon)) ++ gtk_window_set_default_icon_from_file (egg_desktop_file->icon, NULL); ++ else ++ gtk_window_set_default_icon_name (egg_desktop_file->icon); ++ } ++ } ++ ++ G_UNLOCK (egg_desktop_file); ++} ++ ++/** ++ * egg_set_desktop_file: ++ * @desktop_file_path: path to the application's desktop file ++ * ++ * Creates an #EggDesktopFile for the application from the data at ++ * @desktop_file_path. This will also call g_set_application_name() ++ * with the localized application name from the desktop file, and ++ * gtk_window_set_default_icon_name() or ++ * gtk_window_set_default_icon_from_file() with the application's ++ * icon. Other code may use additional information from the desktop ++ * file. ++ * See egg_set_desktop_file_without_defaults() for a variant of this ++ * function that does not set the application name and default window ++ * icon. ++ * ++ * Note that for thread safety reasons, this function can only ++ * be called once, and is mutually exclusive with calling ++ * egg_set_desktop_file_without_defaults(). ++ **/ ++void ++egg_set_desktop_file (const char *desktop_file_path) ++{ ++ egg_set_desktop_file_internal (desktop_file_path, TRUE); ++} ++ ++/** ++ * egg_set_desktop_file_without_defaults: ++ * @desktop_file_path: path to the application's desktop file ++ * ++ * Creates an #EggDesktopFile for the application from the data at ++ * @desktop_file_path. ++ * See egg_set_desktop_file() for a variant of this function that ++ * sets the application name and default window icon from the information ++ * in the desktop file. ++ * ++ * Note that for thread safety reasons, this function can only ++ * be called once, and is mutually exclusive with calling ++ * egg_set_desktop_file(). ++ **/ ++void ++egg_set_desktop_file_without_defaults (const char *desktop_file_path) ++{ ++ egg_set_desktop_file_internal (desktop_file_path, FALSE); ++} ++ ++/** ++ * egg_get_desktop_file: ++ * ++ * Gets the application's #EggDesktopFile, as set by ++ * egg_set_desktop_file(). ++ * ++ * Return value: the #EggDesktopFile, or %NULL if it hasn't been set. ++ **/ ++EggDesktopFile * ++egg_get_desktop_file (void) ++{ ++ EggDesktopFile *retval; ++ ++ G_LOCK (egg_desktop_file); ++ retval = egg_desktop_file; ++ G_UNLOCK (egg_desktop_file); ++ ++ return retval; ++} +diff --git a/cut-n-paste/smclient/eggdesktopfile.h b/cut-n-paste/smclient/eggdesktopfile.h +new file mode 100644 +index 0000000..0e9f401 +--- /dev/null ++++ b/cut-n-paste/smclient/eggdesktopfile.h +@@ -0,0 +1,163 @@ ++/* eggdesktopfile.h - Freedesktop.Org Desktop Files ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public License ++ * as published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; see the file COPYING.LIB. If not, ++ * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#ifndef __EGG_DESKTOP_FILE_H__ ++#define __EGG_DESKTOP_FILE_H__ ++ ++#include ++ ++G_BEGIN_DECLS ++ ++typedef struct EggDesktopFile EggDesktopFile; ++ ++typedef enum { ++ EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED, ++ ++ EGG_DESKTOP_FILE_TYPE_APPLICATION, ++ EGG_DESKTOP_FILE_TYPE_LINK, ++ EGG_DESKTOP_FILE_TYPE_DIRECTORY ++} EggDesktopFileType; ++ ++EggDesktopFile *egg_desktop_file_new (const char *desktop_file_path, ++ GError **error); ++ ++EggDesktopFile *egg_desktop_file_new_from_data_dirs (const char *desktop_file_path, ++ GError **error); ++EggDesktopFile *egg_desktop_file_new_from_dirs (const char *desktop_file_path, ++ const char **search_dirs, ++ GError **error); ++EggDesktopFile *egg_desktop_file_new_from_key_file (GKeyFile *key_file, ++ const char *source, ++ GError **error); ++ ++void egg_desktop_file_free (EggDesktopFile *desktop_file); ++ ++const char *egg_desktop_file_get_source (EggDesktopFile *desktop_file); ++ ++EggDesktopFileType egg_desktop_file_get_desktop_file_type (EggDesktopFile *desktop_file); ++ ++const char *egg_desktop_file_get_name (EggDesktopFile *desktop_file); ++const char *egg_desktop_file_get_icon (EggDesktopFile *desktop_file); ++ ++gboolean egg_desktop_file_can_launch (EggDesktopFile *desktop_file, ++ const char *desktop_environment); ++ ++gboolean egg_desktop_file_accepts_documents (EggDesktopFile *desktop_file); ++gboolean egg_desktop_file_accepts_multiple (EggDesktopFile *desktop_file); ++gboolean egg_desktop_file_accepts_uris (EggDesktopFile *desktop_file); ++ ++char *egg_desktop_file_parse_exec (EggDesktopFile *desktop_file, ++ GSList *documents, ++ GError **error); ++ ++gboolean egg_desktop_file_launch (EggDesktopFile *desktop_file, ++ GSList *documents, ++ GError **error, ++ ...) G_GNUC_NULL_TERMINATED; ++ ++typedef enum { ++ EGG_DESKTOP_FILE_LAUNCH_CLEARENV = 1, ++ EGG_DESKTOP_FILE_LAUNCH_PUTENV, ++ EGG_DESKTOP_FILE_LAUNCH_SCREEN, ++ EGG_DESKTOP_FILE_LAUNCH_WORKSPACE, ++ EGG_DESKTOP_FILE_LAUNCH_DIRECTORY, ++ EGG_DESKTOP_FILE_LAUNCH_TIME, ++ EGG_DESKTOP_FILE_LAUNCH_FLAGS, ++ EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC, ++ EGG_DESKTOP_FILE_LAUNCH_RETURN_PID, ++ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE, ++ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE, ++ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE, ++ EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID ++} EggDesktopFileLaunchOption; ++ ++/* Standard Keys */ ++#define EGG_DESKTOP_FILE_GROUP "Desktop Entry" ++ ++#define EGG_DESKTOP_FILE_KEY_TYPE "Type" ++#define EGG_DESKTOP_FILE_KEY_VERSION "Version" ++#define EGG_DESKTOP_FILE_KEY_NAME "Name" ++#define EGG_DESKTOP_FILE_KEY_GENERIC_NAME "GenericName" ++#define EGG_DESKTOP_FILE_KEY_NO_DISPLAY "NoDisplay" ++#define EGG_DESKTOP_FILE_KEY_COMMENT "Comment" ++#define EGG_DESKTOP_FILE_KEY_ICON "Icon" ++#define EGG_DESKTOP_FILE_KEY_HIDDEN "Hidden" ++#define EGG_DESKTOP_FILE_KEY_ONLY_SHOW_IN "OnlyShowIn" ++#define EGG_DESKTOP_FILE_KEY_NOT_SHOW_IN "NotShowIn" ++#define EGG_DESKTOP_FILE_KEY_TRY_EXEC "TryExec" ++#define EGG_DESKTOP_FILE_KEY_EXEC "Exec" ++#define EGG_DESKTOP_FILE_KEY_PATH "Path" ++#define EGG_DESKTOP_FILE_KEY_TERMINAL "Terminal" ++#define EGG_DESKTOP_FILE_KEY_MIME_TYPE "MimeType" ++#define EGG_DESKTOP_FILE_KEY_CATEGORIES "Categories" ++#define EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY "StartupNotify" ++#define EGG_DESKTOP_FILE_KEY_STARTUP_WM_CLASS "StartupWMClass" ++#define EGG_DESKTOP_FILE_KEY_URL "URL" ++ ++/* Accessors */ ++gboolean egg_desktop_file_has_key (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error); ++char *egg_desktop_file_get_string (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error) G_GNUC_MALLOC; ++char *egg_desktop_file_get_locale_string (EggDesktopFile *desktop_file, ++ const char *key, ++ const char *locale, ++ GError **error) G_GNUC_MALLOC; ++gboolean egg_desktop_file_get_boolean (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error); ++double egg_desktop_file_get_numeric (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error); ++int egg_desktop_file_get_integer (EggDesktopFile *desktop_file, ++ const char *key, ++ GError **error); ++char **egg_desktop_file_get_string_list (EggDesktopFile *desktop_file, ++ const char *key, ++ gsize *length, ++ GError **error) G_GNUC_MALLOC; ++char **egg_desktop_file_get_locale_string_list (EggDesktopFile *desktop_file, ++ const char *key, ++ const char *locale, ++ gsize *length, ++ GError **error) G_GNUC_MALLOC; ++ ++ ++/* Errors */ ++#define EGG_DESKTOP_FILE_ERROR egg_desktop_file_error_quark() ++ ++GQuark egg_desktop_file_error_quark (void); ++ ++typedef enum { ++ EGG_DESKTOP_FILE_ERROR_INVALID, ++ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE, ++ EGG_DESKTOP_FILE_ERROR_UNRECOGNIZED_OPTION ++} EggDesktopFileError; ++ ++/* Global application desktop file */ ++void egg_set_desktop_file (const char *desktop_file_path); ++void egg_set_desktop_file_without_defaults (const char *desktop_file_path); ++EggDesktopFile *egg_get_desktop_file (void); ++ ++ ++G_END_DECLS ++ ++#endif /* __EGG_DESKTOP_FILE_H__ */ +diff --git a/cut-n-paste/smclient/eggsmclient-osx.c b/cut-n-paste/smclient/eggsmclient-osx.c +new file mode 100644 +index 0000000..06528eb +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient-osx.c +@@ -0,0 +1,235 @@ ++/* ++ * Copyright (C) 2007 Novell, Inc. ++ * Copyright (C) 2008 Red Hat, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++/* EggSMClientOSX ++ * ++ * For details on the OS X logout process, see: ++ * http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/BootProcess.html#//apple_ref/doc/uid/20002130-114618 ++ * ++ * EggSMClientOSX registers for the kAEQuitApplication AppleEvent; the ++ * handler we register (quit_requested()) will be invoked from inside ++ * the quartz event-handling code (specifically, from inside ++ * [NSApplication nextEventMatchingMask]) when an AppleEvent arrives. ++ * We use AESuspendTheCurrentEvent() and AEResumeTheCurrentEvent() to ++ * allow asynchronous / non-main-loop-reentering processing of the ++ * quit request. (These are part of the Carbon framework; it doesn't ++ * seem to be possible to handle AppleEvents asynchronously from ++ * Cocoa.) ++ */ ++ ++#include "config.h" ++ ++#include "eggsmclient-private.h" ++#include ++#include ++#include ++ ++#define EGG_TYPE_SM_CLIENT_OSX (egg_sm_client_osx_get_type ()) ++#define EGG_SM_CLIENT_OSX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_OSX, EggSMClientOSX)) ++#define EGG_SM_CLIENT_OSX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_OSX, EggSMClientOSXClass)) ++#define EGG_IS_SM_CLIENT_OSX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_OSX)) ++#define EGG_IS_SM_CLIENT_OSX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_OSX)) ++#define EGG_SM_CLIENT_OSX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_OSX, EggSMClientOSXClass)) ++ ++typedef struct _EggSMClientOSX EggSMClientOSX; ++typedef struct _EggSMClientOSXClass EggSMClientOSXClass; ++ ++struct _EggSMClientOSX { ++ EggSMClient parent; ++ ++ AppleEvent quit_event, quit_reply; ++ gboolean quit_requested, quitting; ++}; ++ ++struct _EggSMClientOSXClass ++{ ++ EggSMClientClass parent_class; ++ ++}; ++ ++static void sm_client_osx_startup (EggSMClient *client, ++ const char *client_id); ++static void sm_client_osx_will_quit (EggSMClient *client, ++ gboolean will_quit); ++static gboolean sm_client_osx_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation); ++ ++static pascal OSErr quit_requested (const AppleEvent *, AppleEvent *, long); ++ ++G_DEFINE_TYPE (EggSMClientOSX, egg_sm_client_osx, EGG_TYPE_SM_CLIENT) ++ ++static void ++egg_sm_client_osx_init (EggSMClientOSX *osx) ++{ ++ ; ++} ++ ++static void ++egg_sm_client_osx_class_init (EggSMClientOSXClass *klass) ++{ ++ EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass); ++ ++ sm_client_class->startup = sm_client_osx_startup; ++ sm_client_class->will_quit = sm_client_osx_will_quit; ++ sm_client_class->end_session = sm_client_osx_end_session; ++} ++ ++EggSMClient * ++egg_sm_client_osx_new (void) ++{ ++ return g_object_new (EGG_TYPE_SM_CLIENT_OSX, NULL); ++} ++ ++static void ++sm_client_osx_startup (EggSMClient *client, ++ const char *client_id) ++{ ++ AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, ++ NewAEEventHandlerUPP (quit_requested), ++ (long)GPOINTER_TO_SIZE (client), false); ++} ++ ++static gboolean ++idle_quit_requested (gpointer client) ++{ ++ egg_sm_client_quit_requested (client); ++ return FALSE; ++} ++ ++static pascal OSErr ++quit_requested (const AppleEvent *aevt, AppleEvent *reply, long refcon) ++{ ++ EggSMClient *client = GSIZE_TO_POINTER ((gsize)refcon); ++ EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); ++ ++ g_return_val_if_fail (!osx->quit_requested, userCanceledErr); ++ ++ /* FIXME AEInteractWithUser? */ ++ ++ osx->quit_requested = TRUE; ++ AEDuplicateDesc (aevt, &osx->quit_event); ++ AEDuplicateDesc (reply, &osx->quit_reply); ++ AESuspendTheCurrentEvent (aevt); ++ ++ /* Don't emit the "quit_requested" signal immediately, since we're ++ * called from a weird point in the guts of gdkeventloop-quartz.c ++ */ ++ g_idle_add (idle_quit_requested, client); ++ return noErr; ++} ++ ++static pascal OSErr ++quit_requested_resumed (const AppleEvent *aevt, AppleEvent *reply, long refcon) ++{ ++ EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); ++ ++ osx->quit_requested = FALSE; ++ return osx->quitting ? noErr : userCanceledErr; ++} ++ ++static gboolean ++idle_will_quit (gpointer client) ++{ ++ EggSMClientOSX *osx = (EggSMClientOSX *)client; ++ ++ /* Resume the event with a new handler that will return a value to ++ * the system. ++ */ ++ AEResumeTheCurrentEvent (&osx->quit_event, &osx->quit_reply, ++ NewAEEventHandlerUPP (quit_requested_resumed), ++ (long)GPOINTER_TO_SIZE (client)); ++ AEDisposeDesc (&osx->quit_event); ++ AEDisposeDesc (&osx->quit_reply); ++ ++ if (osx->quitting) ++ egg_sm_client_quit (client); ++ return FALSE; ++} ++ ++static void ++sm_client_osx_will_quit (EggSMClient *client, ++ gboolean will_quit) ++{ ++ EggSMClientOSX *osx = (EggSMClientOSX *)client; ++ ++ g_return_if_fail (osx->quit_requested); ++ ++ osx->quitting = will_quit; ++ ++ /* Finish in an idle handler since the caller might have called ++ * egg_sm_client_will_quit() from inside the "quit_requested" signal ++ * handler, but may not expect the "quit" signal to arrive during ++ * the _will_quit() call. ++ */ ++ g_idle_add (idle_will_quit, client); ++} ++ ++static gboolean ++sm_client_osx_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation) ++{ ++ static const ProcessSerialNumber loginwindow_psn = { 0, kSystemProcess }; ++ AppleEvent event = { typeNull, NULL }, reply = { typeNull, NULL }; ++ AEAddressDesc target; ++ AEEventID id; ++ OSErr err; ++ ++ switch (style) ++ { ++ case EGG_SM_CLIENT_END_SESSION_DEFAULT: ++ case EGG_SM_CLIENT_LOGOUT: ++ id = request_confirmation ? kAELogOut : kAEReallyLogOut; ++ break; ++ case EGG_SM_CLIENT_REBOOT: ++ id = request_confirmation ? kAEShowRestartDialog : kAERestart; ++ break; ++ case EGG_SM_CLIENT_SHUTDOWN: ++ id = request_confirmation ? kAEShowShutdownDialog : kAEShutDown; ++ break; ++ } ++ ++ err = AECreateDesc (typeProcessSerialNumber, &loginwindow_psn, ++ sizeof (loginwindow_psn), &target); ++ if (err != noErr) ++ { ++ g_warning ("Could not create descriptor for loginwindow: %d", err); ++ return FALSE; ++ } ++ ++ err = AECreateAppleEvent (kCoreEventClass, id, &target, ++ kAutoGenerateReturnID, kAnyTransactionID, ++ &event); ++ AEDisposeDesc (&target); ++ if (err != noErr) ++ { ++ g_warning ("Could not create logout AppleEvent: %d", err); ++ return FALSE; ++ } ++ ++ err = AESend (&event, &reply, kAENoReply, kAENormalPriority, ++ kAEDefaultTimeout, NULL, NULL); ++ AEDisposeDesc (&event); ++ if (err == noErr) ++ AEDisposeDesc (&reply); ++ ++ return err == noErr; ++} +diff --git a/cut-n-paste/smclient/eggsmclient-private.h b/cut-n-paste/smclient/eggsmclient-private.h +new file mode 100644 +index 0000000..703c003 +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient-private.h +@@ -0,0 +1,59 @@ ++/* eggsmclient-private.h ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#ifndef __EGG_SM_CLIENT_PRIVATE_H__ ++#define __EGG_SM_CLIENT_PRIVATE_H__ ++ ++#include ++ ++#if !GTK_CHECK_VERSION(2,91,7) && !GTK_CHECK_VERSION(3,0,0) ++/* GTK+ 3 includes this automatically */ ++#include ++#endif ++ ++#include "eggsmclient.h" ++ ++G_BEGIN_DECLS ++ ++GKeyFile *egg_sm_client_save_state (EggSMClient *client); ++void egg_sm_client_quit_requested (EggSMClient *client); ++void egg_sm_client_quit_cancelled (EggSMClient *client); ++void egg_sm_client_quit (EggSMClient *client); ++ ++#if defined (GDK_WINDOWING_X11) ++# ifdef EGG_SM_CLIENT_BACKEND_XSMP ++GType egg_sm_client_xsmp_get_type (void); ++EggSMClient *egg_sm_client_xsmp_new (void); ++# endif ++# ifdef EGG_SM_CLIENT_BACKEND_DBUS ++GType egg_sm_client_dbus_get_type (void); ++EggSMClient *egg_sm_client_dbus_new (void); ++# endif ++#elif defined (GDK_WINDOWING_WIN32) ++GType egg_sm_client_win32_get_type (void); ++EggSMClient *egg_sm_client_win32_new (void); ++#elif defined (GDK_WINDOWING_QUARTZ) ++GType egg_sm_client_osx_get_type (void); ++EggSMClient *egg_sm_client_osx_new (void); ++#endif ++ ++G_END_DECLS ++ ++ ++#endif /* __EGG_SM_CLIENT_PRIVATE_H__ */ +diff --git a/cut-n-paste/smclient/eggsmclient-win32.c b/cut-n-paste/smclient/eggsmclient-win32.c +new file mode 100644 +index 0000000..3fec775 +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient-win32.c +@@ -0,0 +1,353 @@ ++/* ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++/* EggSMClientWin32 ++ * ++ * For details on the Windows XP logout process, see: ++ * http://msdn.microsoft.com/en-us/library/aa376876.aspx. ++ * ++ * Vista adds some new APIs which EggSMClient does not make use of; see ++ * http://msdn.microsoft.com/en-us/library/ms700677(VS.85).aspx ++ * ++ * When shutting down, Windows sends every top-level window a ++ * WM_QUERYENDSESSION event, which the application must respond to ++ * synchronously, saying whether or not it will quit. To avoid main ++ * loop re-entrancy problems (and to avoid having to muck about too ++ * much with the guts of the gdk-win32 main loop), we watch for this ++ * event in a separate thread, which then signals the main thread and ++ * waits for the main thread to handle the event. Since we don't want ++ * to require g_thread_init() to be called, we do this all using ++ * Windows-specific thread methods. ++ * ++ * After the application handles the WM_QUERYENDSESSION event, ++ * Windows then sends it a WM_ENDSESSION event with a TRUE or FALSE ++ * parameter indicating whether the session is or is not actually ++ * going to end now. We handle this from the other thread as well. ++ * ++ * As mentioned above, Vista introduces several additional new APIs ++ * that don't fit into the (current) EggSMClient API. Windows also has ++ * an entirely separate shutdown-notification scheme for non-GUI apps, ++ * which we also don't handle here. ++ */ ++ ++#include "config.h" ++ ++#include "eggsmclient-private.h" ++#include ++ ++#define WIN32_LEAN_AND_MEAN ++#define UNICODE ++#include ++#include ++ ++#define EGG_TYPE_SM_CLIENT_WIN32 (egg_sm_client_win32_get_type ()) ++#define EGG_SM_CLIENT_WIN32(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_WIN32, EggSMClientWin32)) ++#define EGG_SM_CLIENT_WIN32_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_WIN32, EggSMClientWin32Class)) ++#define EGG_IS_SM_CLIENT_WIN32(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_WIN32)) ++#define EGG_IS_SM_CLIENT_WIN32_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_WIN32)) ++#define EGG_SM_CLIENT_WIN32_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_WIN32, EggSMClientWin32Class)) ++ ++typedef struct _EggSMClientWin32 EggSMClientWin32; ++typedef struct _EggSMClientWin32Class EggSMClientWin32Class; ++ ++struct _EggSMClientWin32 { ++ EggSMClient parent; ++ ++ HANDLE message_event, response_event; ++ ++ volatile GSourceFunc event; ++ volatile gboolean will_quit; ++}; ++ ++struct _EggSMClientWin32Class ++{ ++ EggSMClientClass parent_class; ++ ++}; ++ ++static void sm_client_win32_startup (EggSMClient *client, ++ const char *client_id); ++static void sm_client_win32_will_quit (EggSMClient *client, ++ gboolean will_quit); ++static gboolean sm_client_win32_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation); ++ ++static GSource *g_win32_handle_source_add (HANDLE handle, GSourceFunc callback, ++ gpointer user_data); ++static gboolean got_message (gpointer user_data); ++static void sm_client_thread (gpointer data); ++ ++G_DEFINE_TYPE (EggSMClientWin32, egg_sm_client_win32, EGG_TYPE_SM_CLIENT) ++ ++static void ++egg_sm_client_win32_init (EggSMClientWin32 *win32) ++{ ++ ; ++} ++ ++static void ++egg_sm_client_win32_class_init (EggSMClientWin32Class *klass) ++{ ++ EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass); ++ ++ sm_client_class->startup = sm_client_win32_startup; ++ sm_client_class->will_quit = sm_client_win32_will_quit; ++ sm_client_class->end_session = sm_client_win32_end_session; ++} ++ ++EggSMClient * ++egg_sm_client_win32_new (void) ++{ ++ return g_object_new (EGG_TYPE_SM_CLIENT_WIN32, NULL); ++} ++ ++static void ++sm_client_win32_startup (EggSMClient *client, ++ const char *client_id) ++{ ++ EggSMClientWin32 *win32 = (EggSMClientWin32 *)client; ++ ++ win32->message_event = CreateEvent (NULL, FALSE, FALSE, NULL); ++ win32->response_event = CreateEvent (NULL, FALSE, FALSE, NULL); ++ g_win32_handle_source_add (win32->message_event, got_message, win32); ++ _beginthread (sm_client_thread, 0, client); ++} ++ ++static void ++sm_client_win32_will_quit (EggSMClient *client, ++ gboolean will_quit) ++{ ++ EggSMClientWin32 *win32 = (EggSMClientWin32 *)client; ++ ++ win32->will_quit = will_quit; ++ SetEvent (win32->response_event); ++} ++ ++static gboolean ++sm_client_win32_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation) ++{ ++ UINT uFlags = EWX_LOGOFF; ++ ++ switch (style) ++ { ++ case EGG_SM_CLIENT_END_SESSION_DEFAULT: ++ case EGG_SM_CLIENT_LOGOUT: ++ uFlags = EWX_LOGOFF; ++ break; ++ case EGG_SM_CLIENT_REBOOT: ++ uFlags = EWX_REBOOT; ++ break; ++ case EGG_SM_CLIENT_SHUTDOWN: ++ uFlags = EWX_POWEROFF; ++ break; ++ } ++ ++ /* There's no way to make ExitWindowsEx() show a logout dialog, so ++ * we ignore @request_confirmation. ++ */ ++ ++#ifdef SHTDN_REASON_FLAG_PLANNED ++ ExitWindowsEx (uFlags, SHTDN_REASON_FLAG_PLANNED); ++#else ++ ExitWindowsEx (uFlags, 0); ++#endif ++ ++ return TRUE; ++} ++ ++ ++/* callbacks from logout-listener thread */ ++ ++static gboolean ++emit_quit_requested (gpointer smclient) ++{ ++ gdk_threads_enter (); ++ egg_sm_client_quit_requested (smclient); ++ gdk_threads_leave (); ++ ++ return FALSE; ++} ++ ++static gboolean ++emit_quit (gpointer smclient) ++{ ++ EggSMClientWin32 *win32 = smclient; ++ ++ gdk_threads_enter (); ++ egg_sm_client_quit (smclient); ++ gdk_threads_leave (); ++ ++ SetEvent (win32->response_event); ++ return FALSE; ++} ++ ++static gboolean ++emit_quit_cancelled (gpointer smclient) ++{ ++ EggSMClientWin32 *win32 = smclient; ++ ++ gdk_threads_enter (); ++ egg_sm_client_quit_cancelled (smclient); ++ gdk_threads_leave (); ++ ++ SetEvent (win32->response_event); ++ return FALSE; ++} ++ ++static gboolean ++got_message (gpointer smclient) ++{ ++ EggSMClientWin32 *win32 = smclient; ++ ++ win32->event (win32); ++ return TRUE; ++} ++ ++/* Windows HANDLE GSource */ ++ ++typedef struct { ++ GSource source; ++ GPollFD pollfd; ++} GWin32HandleSource; ++ ++static gboolean ++g_win32_handle_source_prepare (GSource *source, gint *timeout) ++{ ++ *timeout = -1; ++ return FALSE; ++} ++ ++static gboolean ++g_win32_handle_source_check (GSource *source) ++{ ++ GWin32HandleSource *hsource = (GWin32HandleSource *)source; ++ ++ return hsource->pollfd.revents; ++} ++ ++static gboolean ++g_win32_handle_source_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) ++{ ++ return (*callback) (user_data); ++} ++ ++static void ++g_win32_handle_source_finalize (GSource *source) ++{ ++ ; ++} ++ ++GSourceFuncs g_win32_handle_source_funcs = { ++ g_win32_handle_source_prepare, ++ g_win32_handle_source_check, ++ g_win32_handle_source_dispatch, ++ g_win32_handle_source_finalize ++}; ++ ++static GSource * ++g_win32_handle_source_add (HANDLE handle, GSourceFunc callback, gpointer user_data) ++{ ++ GWin32HandleSource *hsource; ++ GSource *source; ++ ++ source = g_source_new (&g_win32_handle_source_funcs, sizeof (GWin32HandleSource)); ++ hsource = (GWin32HandleSource *)source; ++ hsource->pollfd.fd = (int)handle; ++ hsource->pollfd.events = G_IO_IN; ++ hsource->pollfd.revents = 0; ++ g_source_add_poll (source, &hsource->pollfd); ++ ++ g_source_set_callback (source, callback, user_data, NULL); ++ g_source_attach (source, NULL); ++ return source; ++} ++ ++/* logout-listener thread */ ++ ++LRESULT CALLBACK ++sm_client_win32_window_procedure (HWND hwnd, ++ UINT message, ++ WPARAM wParam, ++ LPARAM lParam) ++{ ++ EggSMClientWin32 *win32 = ++ (EggSMClientWin32 *)GetWindowLongPtr (hwnd, GWLP_USERDATA); ++ ++ switch (message) ++ { ++ case WM_QUERYENDSESSION: ++ win32->event = emit_quit_requested; ++ SetEvent (win32->message_event); ++ ++ WaitForSingleObject (win32->response_event, INFINITE); ++ return win32->will_quit; ++ ++ case WM_ENDSESSION: ++ if (wParam) ++ { ++ /* The session is ending */ ++ win32->event = emit_quit; ++ } ++ else ++ { ++ /* Nope, the session *isn't* ending */ ++ win32->event = emit_quit_cancelled; ++ } ++ ++ SetEvent (win32->message_event); ++ WaitForSingleObject (win32->response_event, INFINITE); ++ ++ return 0; ++ ++ default: ++ return DefWindowProc (hwnd, message, wParam, lParam); ++ } ++} ++ ++static void ++sm_client_thread (gpointer smclient) ++{ ++ HINSTANCE instance; ++ WNDCLASSEXW wcl; ++ ATOM klass; ++ HWND window; ++ MSG msg; ++ ++ instance = GetModuleHandle (NULL); ++ ++ memset (&wcl, 0, sizeof (WNDCLASSEX)); ++ wcl.cbSize = sizeof (WNDCLASSEX); ++ wcl.lpfnWndProc = sm_client_win32_window_procedure; ++ wcl.hInstance = instance; ++ wcl.lpszClassName = L"EggSmClientWindow"; ++ klass = RegisterClassEx (&wcl); ++ ++ window = CreateWindowEx (0, MAKEINTRESOURCE (klass), ++ L"EggSmClientWindow", 0, ++ 10, 10, 50, 50, GetDesktopWindow (), ++ NULL, instance, NULL); ++ SetWindowLongPtr (window, GWLP_USERDATA, (LONG_PTR)smclient); ++ ++ /* main loop */ ++ while (GetMessage (&msg, NULL, 0, 0)) ++ DispatchMessage (&msg); ++} +diff --git a/cut-n-paste/smclient/eggsmclient-xsmp.c b/cut-n-paste/smclient/eggsmclient-xsmp.c +new file mode 100644 +index 0000000..205f973 +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient-xsmp.c +@@ -0,0 +1,1382 @@ ++/* ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * Inspired by various other pieces of code including GsmClient (C) ++ * 2001 Havoc Pennington, GnomeClient (C) 1998 Carsten Schaar, and twm ++ * session code (C) 1998 The Open Group. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#include "config.h" ++ ++#include "eggsmclient.h" ++#include "eggsmclient-private.h" ++ ++#include "eggdesktopfile.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ()) ++#define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP)) ++#define EGG_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) ++#define EGG_IS_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_XSMP)) ++#define EGG_IS_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_XSMP)) ++#define EGG_SM_CLIENT_XSMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) ++ ++typedef struct _EggSMClientXSMP EggSMClientXSMP; ++typedef struct _EggSMClientXSMPClass EggSMClientXSMPClass; ++ ++/* These mostly correspond to the similarly-named states in section ++ * 9.1 of the XSMP spec. Some of the states there aren't represented ++ * here, because we don't need them. SHUTDOWN_CANCELLED is slightly ++ * different from the spec; we use it when the client is IDLE after a ++ * ShutdownCancelled message, but the application is still interacting ++ * and doesn't know the shutdown has been cancelled yet. ++ */ ++typedef enum ++{ ++ XSMP_STATE_IDLE, ++ XSMP_STATE_SAVE_YOURSELF, ++ XSMP_STATE_INTERACT_REQUEST, ++ XSMP_STATE_INTERACT, ++ XSMP_STATE_SAVE_YOURSELF_DONE, ++ XSMP_STATE_SHUTDOWN_CANCELLED, ++ XSMP_STATE_CONNECTION_CLOSED ++} EggSMClientXSMPState; ++ ++static const char *state_names[] = { ++ "idle", ++ "save-yourself", ++ "interact-request", ++ "interact", ++ "save-yourself-done", ++ "shutdown-cancelled", ++ "connection-closed" ++}; ++ ++#define EGG_SM_CLIENT_XSMP_STATE(xsmp) (state_names[(xsmp)->state]) ++ ++struct _EggSMClientXSMP ++{ ++ EggSMClient parent; ++ ++ SmcConn connection; ++ char *client_id; ++ ++ EggSMClientXSMPState state; ++ char **restart_command; ++ gboolean set_restart_command; ++ int restart_style; ++ ++ guint idle; ++ ++ /* Current SaveYourself state */ ++ guint expecting_initial_save_yourself : 1; ++ guint need_save_state : 1; ++ guint need_quit_requested : 1; ++ guint interact_errors : 1; ++ guint shutting_down : 1; ++ ++ /* Todo list */ ++ guint waiting_to_set_initial_properties : 1; ++ guint waiting_to_emit_quit : 1; ++ guint waiting_to_emit_quit_cancelled : 1; ++ guint waiting_to_save_myself : 1; ++ ++}; ++ ++struct _EggSMClientXSMPClass ++{ ++ EggSMClientClass parent_class; ++ ++}; ++ ++static void sm_client_xsmp_startup (EggSMClient *client, ++ const char *client_id); ++static void sm_client_xsmp_set_restart_command (EggSMClient *client, ++ int argc, ++ const char **argv); ++static void sm_client_xsmp_will_quit (EggSMClient *client, ++ gboolean will_quit); ++static gboolean sm_client_xsmp_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation); ++ ++static void xsmp_save_yourself (SmcConn smc_conn, ++ SmPointer client_data, ++ int save_style, ++ Bool shutdown, ++ int interact_style, ++ Bool fast); ++static void xsmp_die (SmcConn smc_conn, ++ SmPointer client_data); ++static void xsmp_save_complete (SmcConn smc_conn, ++ SmPointer client_data); ++static void xsmp_shutdown_cancelled (SmcConn smc_conn, ++ SmPointer client_data); ++static void xsmp_interact (SmcConn smc_conn, ++ SmPointer client_data); ++ ++static SmProp *array_prop (const char *name, ++ ...); ++static SmProp *ptrarray_prop (const char *name, ++ GPtrArray *values); ++static SmProp *string_prop (const char *name, ++ const char *value); ++static SmProp *card8_prop (const char *name, ++ unsigned char value); ++ ++static void set_properties (EggSMClientXSMP *xsmp, ...); ++static void delete_properties (EggSMClientXSMP *xsmp, ...); ++ ++static GPtrArray *generate_command (char **restart_command, ++ const char *client_id, ++ const char *state_file); ++ ++static void save_state (EggSMClientXSMP *xsmp); ++static void do_save_yourself (EggSMClientXSMP *xsmp); ++static void update_pending_events (EggSMClientXSMP *xsmp); ++ ++static void ice_init (void); ++static gboolean process_ice_messages (IceConn ice_conn); ++static void smc_error_handler (SmcConn smc_conn, ++ Bool swap, ++ int offending_minor_opcode, ++ unsigned long offending_sequence, ++ int error_class, ++ int severity, ++ SmPointer values); ++ ++G_DEFINE_TYPE (EggSMClientXSMP, egg_sm_client_xsmp, EGG_TYPE_SM_CLIENT) ++ ++static void ++egg_sm_client_xsmp_init (EggSMClientXSMP *xsmp) ++{ ++ xsmp->state = XSMP_STATE_CONNECTION_CLOSED; ++ xsmp->connection = NULL; ++ xsmp->restart_style = SmRestartIfRunning; ++} ++ ++static void ++egg_sm_client_xsmp_class_init (EggSMClientXSMPClass *klass) ++{ ++ EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass); ++ ++ sm_client_class->startup = sm_client_xsmp_startup; ++ sm_client_class->set_restart_command = sm_client_xsmp_set_restart_command; ++ sm_client_class->will_quit = sm_client_xsmp_will_quit; ++ sm_client_class->end_session = sm_client_xsmp_end_session; ++} ++ ++EggSMClient * ++egg_sm_client_xsmp_new (void) ++{ ++ const gchar *backend = g_getenv ("GDK_BACKEND"); ++ ++#if GTK_CHECK_VERSION(3,0,0) ++ if (backend != NULL && strcmp (backend, "x11") != 0) ++ return NULL; ++#endif ++ ++ if (!g_getenv ("SESSION_MANAGER")) ++ return NULL; ++ ++ return g_object_new (EGG_TYPE_SM_CLIENT_XSMP, NULL); ++} ++ ++static gboolean ++sm_client_xsmp_set_initial_properties (gpointer user_data) ++{ ++ EggSMClientXSMP *xsmp = user_data; ++ EggDesktopFile *desktop_file; ++ GPtrArray *clone, *restart; ++ char pid_str[64]; ++ ++ if (xsmp->idle) ++ { ++ g_source_remove (xsmp->idle); ++ xsmp->idle = 0; ++ } ++ xsmp->waiting_to_set_initial_properties = FALSE; ++ ++ if (egg_sm_client_get_mode () == EGG_SM_CLIENT_MODE_NO_RESTART) ++ xsmp->restart_style = SmRestartNever; ++ ++ /* Parse info out of desktop file */ ++ desktop_file = egg_get_desktop_file (); ++ if (desktop_file) ++ { ++ GError *err = NULL; ++ char *cmdline, **argv; ++ int argc; ++ ++ if (xsmp->restart_style == SmRestartIfRunning) ++ { ++ if (egg_desktop_file_get_boolean (desktop_file, ++ "X-GNOME-AutoRestart", NULL)) ++ xsmp->restart_style = SmRestartImmediately; ++ } ++ ++ if (!xsmp->set_restart_command) ++ { ++ cmdline = egg_desktop_file_parse_exec (desktop_file, NULL, &err); ++ if (cmdline && g_shell_parse_argv (cmdline, &argc, &argv, &err)) ++ { ++ egg_sm_client_set_restart_command (EGG_SM_CLIENT (xsmp), ++ argc, (const char **)argv); ++ g_strfreev (argv); ++ } ++ else ++ { ++ g_warning ("Could not parse Exec line in desktop file: %s", ++ err->message); ++ g_error_free (err); ++ } ++ g_free (cmdline); ++ } ++ } ++ ++ if (!xsmp->set_restart_command) ++ xsmp->restart_command = g_strsplit (g_get_prgname (), " ", -1); ++ ++ clone = generate_command (xsmp->restart_command, NULL, NULL); ++ restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL); ++ ++ g_debug ("Setting initial properties"); ++ ++ /* Program, CloneCommand, RestartCommand, and UserID are required. ++ * ProcessID isn't required, but the SM may be able to do something ++ * useful with it. ++ */ ++ g_snprintf (pid_str, sizeof (pid_str), "%lu", (gulong) getpid ()); ++ set_properties (xsmp, ++ string_prop (SmProgram, g_get_prgname ()), ++ ptrarray_prop (SmCloneCommand, clone), ++ ptrarray_prop (SmRestartCommand, restart), ++ string_prop (SmUserID, g_get_user_name ()), ++ string_prop (SmProcessID, pid_str), ++ card8_prop (SmRestartStyleHint, xsmp->restart_style), ++ NULL); ++ g_ptr_array_free (clone, TRUE); ++ g_ptr_array_free (restart, TRUE); ++ ++ if (desktop_file) ++ { ++ set_properties (xsmp, ++ string_prop ("_GSM_DesktopFile", egg_desktop_file_get_source (desktop_file)), ++ NULL); ++ } ++ ++ update_pending_events (xsmp); ++ return FALSE; ++} ++ ++/* This gets called from two different places: xsmp_die() (when the ++ * server asks us to disconnect) and process_ice_messages() (when the ++ * server disconnects unexpectedly). ++ */ ++static void ++sm_client_xsmp_disconnect (EggSMClientXSMP *xsmp) ++{ ++ SmcConn connection; ++ ++ if (!xsmp->connection) ++ return; ++ ++ g_debug ("Disconnecting"); ++ ++ connection = xsmp->connection; ++ xsmp->connection = NULL; ++ SmcCloseConnection (connection, 0, NULL); ++ xsmp->state = XSMP_STATE_CONNECTION_CLOSED; ++ ++ xsmp->waiting_to_save_myself = FALSE; ++ update_pending_events (xsmp); ++} ++ ++static void ++sm_client_xsmp_startup (EggSMClient *client, ++ const char *client_id) ++{ ++ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client; ++ SmcCallbacks callbacks; ++ char *ret_client_id; ++ char error_string_ret[256]; ++ ++ xsmp->client_id = g_strdup (client_id); ++ ++ ice_init (); ++ SmcSetErrorHandler (smc_error_handler); ++ ++ callbacks.save_yourself.callback = xsmp_save_yourself; ++ callbacks.die.callback = xsmp_die; ++ callbacks.save_complete.callback = xsmp_save_complete; ++ callbacks.shutdown_cancelled.callback = xsmp_shutdown_cancelled; ++ ++ callbacks.save_yourself.client_data = xsmp; ++ callbacks.die.client_data = xsmp; ++ callbacks.save_complete.client_data = xsmp; ++ callbacks.shutdown_cancelled.client_data = xsmp; ++ ++ client_id = NULL; ++ error_string_ret[0] = '\0'; ++ xsmp->connection = ++ SmcOpenConnection (NULL, xsmp, SmProtoMajor, SmProtoMinor, ++ SmcSaveYourselfProcMask | SmcDieProcMask | ++ SmcSaveCompleteProcMask | ++ SmcShutdownCancelledProcMask, ++ &callbacks, ++ xsmp->client_id, &ret_client_id, ++ sizeof (error_string_ret), error_string_ret); ++ ++ if (!xsmp->connection) ++ { ++ g_warning ("Failed to connect to the session manager: %s\n", ++ error_string_ret[0] ? ++ error_string_ret : "no error message given"); ++ xsmp->state = XSMP_STATE_CONNECTION_CLOSED; ++ return; ++ } ++ ++ /* We expect a pointless initial SaveYourself if either (a) we ++ * didn't have an initial client ID, or (b) we DID have an initial ++ * client ID, but the server rejected it and gave us a new one. ++ */ ++ if (!xsmp->client_id || ++ (ret_client_id && strcmp (xsmp->client_id, ret_client_id) != 0)) ++ xsmp->expecting_initial_save_yourself = TRUE; ++ ++ if (ret_client_id) ++ { ++ g_free (xsmp->client_id); ++ xsmp->client_id = g_strdup (ret_client_id); ++ free (ret_client_id); ++ ++ gdk_threads_enter (); ++#if !GTK_CHECK_VERSION(2,23,3) && !GTK_CHECK_VERSION(3,0,0) ++ gdk_set_sm_client_id (xsmp->client_id); ++#else ++ gdk_x11_set_sm_client_id (xsmp->client_id); ++#endif ++ gdk_threads_leave (); ++ ++ g_debug ("Got client ID \"%s\"", xsmp->client_id); ++ } ++ ++ xsmp->state = XSMP_STATE_IDLE; ++ ++ /* Do not set the initial properties until we reach the main loop, ++ * so that the application has a chance to call ++ * egg_set_desktop_file(). (This may also help the session manager ++ * have a better idea of when the application is fully up and ++ * running.) ++ */ ++ xsmp->waiting_to_set_initial_properties = TRUE; ++ xsmp->idle = g_idle_add (sm_client_xsmp_set_initial_properties, client); ++} ++ ++static void ++sm_client_xsmp_set_restart_command (EggSMClient *client, ++ int argc, ++ const char **argv) ++{ ++ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client; ++ int i; ++ ++ g_strfreev (xsmp->restart_command); ++ ++ xsmp->restart_command = g_new (char *, argc + 1); ++ for (i = 0; i < argc; i++) ++ xsmp->restart_command[i] = g_strdup (argv[i]); ++ xsmp->restart_command[i] = NULL; ++ ++ xsmp->set_restart_command = TRUE; ++} ++ ++static void ++sm_client_xsmp_will_quit (EggSMClient *client, ++ gboolean will_quit) ++{ ++ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client; ++ ++ if (xsmp->state == XSMP_STATE_CONNECTION_CLOSED) ++ { ++ /* The session manager has already exited! Schedule a quit ++ * signal. ++ */ ++ xsmp->waiting_to_emit_quit = TRUE; ++ update_pending_events (xsmp); ++ return; ++ } ++ else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED) ++ { ++ /* We received a ShutdownCancelled message while the application ++ * was interacting; Schedule a quit_cancelled signal. ++ */ ++ xsmp->waiting_to_emit_quit_cancelled = TRUE; ++ update_pending_events (xsmp); ++ return; ++ } ++ ++ g_return_if_fail (xsmp->state == XSMP_STATE_INTERACT); ++ ++ g_debug ("Sending InteractDone(%s)", will_quit ? "False" : "True"); ++ SmcInteractDone (xsmp->connection, !will_quit); ++ ++ if (will_quit && xsmp->need_save_state) ++ save_state (xsmp); ++ ++ g_debug ("Sending SaveYourselfDone(%s)", will_quit ? "True" : "False"); ++ SmcSaveYourselfDone (xsmp->connection, will_quit); ++ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE; ++} ++ ++static gboolean ++sm_client_xsmp_end_session (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation) ++{ ++ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client; ++ int save_type; ++ ++ /* To end the session via XSMP, we have to send a ++ * SaveYourselfRequest. We aren't allowed to do that if anything ++ * else is going on, but we don't want to expose this fact to the ++ * application. So we do our best to patch things up here... ++ * ++ * In the worst case, this method might block for some length of ++ * time in process_ice_messages, but the only time that code path is ++ * honestly likely to get hit is if the application tries to end the ++ * session as the very first thing it does, in which case it ++ * probably won't actually block anyway. It's not worth gunking up ++ * the API to try to deal nicely with the other 0.01% of cases where ++ * this happens. ++ */ ++ ++ while (xsmp->state != XSMP_STATE_IDLE || ++ xsmp->expecting_initial_save_yourself) ++ { ++ /* If we're already shutting down, we don't need to do anything. */ ++ if (xsmp->shutting_down) ++ return TRUE; ++ ++ switch (xsmp->state) ++ { ++ case XSMP_STATE_CONNECTION_CLOSED: ++ return FALSE; ++ ++ case XSMP_STATE_SAVE_YOURSELF: ++ /* Trying to log out from the save_state callback? Whatever. ++ * Abort the save_state. ++ */ ++ SmcSaveYourselfDone (xsmp->connection, FALSE); ++ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE; ++ break; ++ ++ case XSMP_STATE_INTERACT_REQUEST: ++ case XSMP_STATE_INTERACT: ++ case XSMP_STATE_SHUTDOWN_CANCELLED: ++ /* Already in a shutdown-related state, just ignore ++ * the new shutdown request... ++ */ ++ return TRUE; ++ ++ case XSMP_STATE_IDLE: ++ if (xsmp->waiting_to_set_initial_properties) ++ sm_client_xsmp_set_initial_properties (xsmp); ++ ++ if (!xsmp->expecting_initial_save_yourself) ++ break; ++ /* else fall through */ ++ ++ case XSMP_STATE_SAVE_YOURSELF_DONE: ++ /* We need to wait for some response from the server.*/ ++ process_ice_messages (SmcGetIceConnection (xsmp->connection)); ++ break; ++ ++ default: ++ /* Hm... shouldn't happen */ ++ return FALSE; ++ } ++ } ++ ++ /* xfce4-session will do the wrong thing if we pass SmSaveGlobal and ++ * the user chooses to save the session. But gnome-session will do ++ * the wrong thing if we pass SmSaveBoth and the user chooses NOT to ++ * save the session... Sigh. ++ */ ++ if (!strcmp (SmcVendor (xsmp->connection), "xfce4-session")) ++ save_type = SmSaveBoth; ++ else ++ save_type = SmSaveGlobal; ++ ++ g_debug ("Sending SaveYourselfRequest(SmSaveGlobal, Shutdown, SmInteractStyleAny, %sFast)", request_confirmation ? "!" : ""); ++ SmcRequestSaveYourself (xsmp->connection, ++ save_type, ++ True, /* shutdown */ ++ SmInteractStyleAny, ++ !request_confirmation, /* fast */ ++ True /* global */); ++ return TRUE; ++} ++ ++static gboolean ++idle_do_pending_events (gpointer data) ++{ ++ EggSMClientXSMP *xsmp = data; ++ EggSMClient *client = data; ++ ++ gdk_threads_enter (); ++ ++ xsmp->idle = 0; ++ ++ if (xsmp->waiting_to_emit_quit) ++ { ++ xsmp->waiting_to_emit_quit = FALSE; ++ egg_sm_client_quit (client); ++ goto out; ++ } ++ ++ if (xsmp->waiting_to_emit_quit_cancelled) ++ { ++ xsmp->waiting_to_emit_quit_cancelled = FALSE; ++ egg_sm_client_quit_cancelled (client); ++ xsmp->state = XSMP_STATE_IDLE; ++ } ++ ++ if (xsmp->waiting_to_save_myself) ++ { ++ xsmp->waiting_to_save_myself = FALSE; ++ do_save_yourself (xsmp); ++ } ++ ++ out: ++ gdk_threads_leave (); ++ return FALSE; ++} ++ ++static void ++update_pending_events (EggSMClientXSMP *xsmp) ++{ ++ gboolean want_idle = ++ xsmp->waiting_to_emit_quit || ++ xsmp->waiting_to_emit_quit_cancelled || ++ xsmp->waiting_to_save_myself; ++ ++ if (want_idle) ++ { ++ if (xsmp->idle == 0) ++ xsmp->idle = g_idle_add (idle_do_pending_events, xsmp); ++ } ++ else ++ { ++ if (xsmp->idle != 0) ++ g_source_remove (xsmp->idle); ++ xsmp->idle = 0; ++ } ++} ++ ++static void ++fix_broken_state (EggSMClientXSMP *xsmp, const char *message, ++ gboolean send_interact_done, ++ gboolean send_save_yourself_done) ++{ ++ g_warning ("Received XSMP %s message in state %s: client or server error", ++ message, EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ /* Forget any pending SaveYourself plans we had */ ++ xsmp->waiting_to_save_myself = FALSE; ++ update_pending_events (xsmp); ++ ++ if (send_interact_done) ++ SmcInteractDone (xsmp->connection, False); ++ if (send_save_yourself_done) ++ SmcSaveYourselfDone (xsmp->connection, True); ++ ++ xsmp->state = send_save_yourself_done ? XSMP_STATE_SAVE_YOURSELF_DONE : XSMP_STATE_IDLE; ++} ++ ++/* SM callbacks */ ++ ++static void ++xsmp_save_yourself (SmcConn smc_conn, ++ SmPointer client_data, ++ int save_type, ++ Bool shutdown, ++ int interact_style, ++ Bool fast) ++{ ++ EggSMClientXSMP *xsmp = client_data; ++ gboolean wants_quit_requested; ++ ++ g_debug ("Received SaveYourself(%s, %s, %s, %s) in state %s", ++ save_type == SmSaveLocal ? "SmSaveLocal" : ++ save_type == SmSaveGlobal ? "SmSaveGlobal" : "SmSaveBoth", ++ shutdown ? "Shutdown" : "!Shutdown", ++ interact_style == SmInteractStyleAny ? "SmInteractStyleAny" : ++ interact_style == SmInteractStyleErrors ? "SmInteractStyleErrors" : ++ "SmInteractStyleNone", fast ? "Fast" : "!Fast", ++ EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ if (xsmp->state != XSMP_STATE_IDLE && ++ xsmp->state != XSMP_STATE_SHUTDOWN_CANCELLED) ++ { ++ fix_broken_state (xsmp, "SaveYourself", FALSE, TRUE); ++ return; ++ } ++ ++ if (xsmp->waiting_to_set_initial_properties) ++ sm_client_xsmp_set_initial_properties (xsmp); ++ ++ /* If this is the initial SaveYourself, ignore it; we've already set ++ * properties and there's no reason to actually save state too. ++ */ ++ if (xsmp->expecting_initial_save_yourself) ++ { ++ xsmp->expecting_initial_save_yourself = FALSE; ++ ++ if (save_type == SmSaveLocal && ++ interact_style == SmInteractStyleNone && ++ !shutdown && !fast) ++ { ++ g_debug ("Sending SaveYourselfDone(True) for initial SaveYourself"); ++ SmcSaveYourselfDone (xsmp->connection, True); ++ /* As explained in the comment at the end of ++ * do_save_yourself(), SAVE_YOURSELF_DONE is the correct ++ * state here, not IDLE. ++ */ ++ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE; ++ return; ++ } ++ else ++ g_warning ("First SaveYourself was not the expected one!"); ++ } ++ ++ /* Even ignoring the "fast" flag completely, there are still 18 ++ * different combinations of save_type, shutdown and interact_style. ++ * We interpret them as follows: ++ * ++ * Type Shutdown Interact Interpretation ++ * G F A/E/N do nothing (1) ++ * G T N do nothing (1)* ++ * G T A/E quit_requested (2) ++ * L/B F A/E/N save_state (3) ++ * L/B T N save_state (3)* ++ * L/B T A/E quit_requested, then save_state (4) ++ * ++ * 1. Do nothing, because the SM asked us to do something ++ * uninteresting (save open files, but then don't quit ++ * afterward) or rude (save open files without asking the user ++ * for confirmation). ++ * ++ * 2. Request interaction and then emit ::quit_requested. This ++ * perhaps isn't quite correct for the SmInteractStyleErrors ++ * case, but we don't care. ++ * ++ * 3. Emit ::save_state. The SmSaveBoth SaveYourselfs in these ++ * rows essentially get demoted to SmSaveLocal, because their ++ * Global halves correspond to "do nothing". ++ * ++ * 4. Request interaction, emit ::quit_requested, and then emit ++ * ::save_state after interacting. This is the SmSaveBoth ++ * equivalent of #2, but we also promote SmSaveLocal shutdown ++ * SaveYourselfs to SmSaveBoth here, because we want to give ++ * the user a chance to save open files before quitting. ++ * ++ * (* It would be nice if we could do something useful when the ++ * session manager sends a SaveYourself with shutdown True and ++ * SmInteractStyleNone. But we can't, so we just pretend it didn't ++ * even tell us it was shutting down. The docs for ::quit mention ++ * that it might not always be preceded by ::quit_requested.) ++ */ ++ ++ /* As an optimization, we don't actually request interaction and ++ * emit ::quit_requested if the application isn't listening to the ++ * signal. ++ */ ++ wants_quit_requested = g_signal_has_handler_pending (xsmp, g_signal_lookup ("quit_requested", EGG_TYPE_SM_CLIENT), 0, FALSE); ++ ++ xsmp->need_save_state = (save_type != SmSaveGlobal); ++ xsmp->need_quit_requested = (shutdown && wants_quit_requested && ++ interact_style != SmInteractStyleNone); ++ xsmp->interact_errors = (interact_style == SmInteractStyleErrors); ++ ++ xsmp->shutting_down = shutdown; ++ ++ do_save_yourself (xsmp); ++} ++ ++static void ++do_save_yourself (EggSMClientXSMP *xsmp) ++{ ++ if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED) ++ { ++ /* The SM cancelled a previous SaveYourself, but we haven't yet ++ * had a chance to tell the application, so we can't start ++ * processing this SaveYourself yet. ++ */ ++ xsmp->waiting_to_save_myself = TRUE; ++ update_pending_events (xsmp); ++ return; ++ } ++ ++ if (xsmp->need_quit_requested) ++ { ++ xsmp->state = XSMP_STATE_INTERACT_REQUEST; ++ ++ g_debug ("Sending InteractRequest(%s)", ++ xsmp->interact_errors ? "Error" : "Normal"); ++ SmcInteractRequest (xsmp->connection, ++ xsmp->interact_errors ? SmDialogError : SmDialogNormal, ++ xsmp_interact, ++ xsmp); ++ return; ++ } ++ ++ if (xsmp->need_save_state) ++ { ++ save_state (xsmp); ++ ++ /* Though unlikely, the client could have been disconnected ++ * while the application was saving its state. ++ */ ++ if (!xsmp->connection) ++ return; ++ } ++ ++ g_debug ("Sending SaveYourselfDone(True)"); ++ SmcSaveYourselfDone (xsmp->connection, True); ++ ++ /* The client state diagram in the XSMP spec says that after a ++ * non-shutdown SaveYourself, we go directly back to "idle". But ++ * everything else in both the XSMP spec and the libSM docs ++ * disagrees. ++ */ ++ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE; ++} ++ ++static void ++save_state (EggSMClientXSMP *xsmp) ++{ ++ GKeyFile *state_file; ++ char *state_file_path, *data; ++ EggDesktopFile *desktop_file; ++ GPtrArray *restart; ++ int offset, fd; ++ ++ /* We set xsmp->state before emitting save_state, but our caller is ++ * responsible for setting it back afterward. ++ */ ++ xsmp->state = XSMP_STATE_SAVE_YOURSELF; ++ ++ state_file = egg_sm_client_save_state ((EggSMClient *)xsmp); ++ if (!state_file) ++ { ++ restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL); ++ set_properties (xsmp, ++ ptrarray_prop (SmRestartCommand, restart), ++ NULL); ++ g_ptr_array_free (restart, TRUE); ++ delete_properties (xsmp, SmDiscardCommand, NULL); ++ return; ++ } ++ ++ desktop_file = egg_get_desktop_file (); ++ if (desktop_file) ++ { ++ GKeyFile *merged_file; ++ char *desktop_file_path; ++ ++ merged_file = g_key_file_new (); ++ desktop_file_path = ++ g_filename_from_uri (egg_desktop_file_get_source (desktop_file), ++ NULL, NULL); ++ if (desktop_file_path && ++ g_key_file_load_from_file (merged_file, desktop_file_path, ++ G_KEY_FILE_KEEP_COMMENTS | ++ G_KEY_FILE_KEEP_TRANSLATIONS, NULL)) ++ { ++ guint g, k, i; ++ char **groups, **keys, *value, *exec; ++ ++ groups = g_key_file_get_groups (state_file, NULL); ++ for (g = 0; groups[g]; g++) ++ { ++ keys = g_key_file_get_keys (state_file, groups[g], NULL, NULL); ++ for (k = 0; keys[k]; k++) ++ { ++ value = g_key_file_get_value (state_file, groups[g], ++ keys[k], NULL); ++ if (value) ++ { ++ g_key_file_set_value (merged_file, groups[g], ++ keys[k], value); ++ g_free (value); ++ } ++ } ++ g_strfreev (keys); ++ } ++ g_strfreev (groups); ++ ++ g_key_file_free (state_file); ++ state_file = merged_file; ++ ++ /* Update Exec key using "--sm-client-state-file %k" */ ++ restart = generate_command (xsmp->restart_command, ++ NULL, "%k"); ++ for (i = 0; i < restart->len; i++) ++ restart->pdata[i] = g_shell_quote (restart->pdata[i]); ++ g_ptr_array_add (restart, NULL); ++ exec = g_strjoinv (" ", (char **)restart->pdata); ++ g_strfreev ((char **)restart->pdata); ++ g_ptr_array_free (restart, FALSE); ++ ++ g_key_file_set_string (state_file, EGG_DESKTOP_FILE_GROUP, ++ EGG_DESKTOP_FILE_KEY_EXEC, ++ exec); ++ g_free (exec); ++ } ++ else ++ desktop_file = NULL; ++ ++ g_free (desktop_file_path); ++ } ++ ++ /* Now write state_file to disk. (We can't use mktemp(), because ++ * that requires the filename to end with "XXXXXX", and we want ++ * it to end with ".desktop".) ++ */ ++ ++ data = g_key_file_to_data (state_file, NULL, NULL); ++ g_key_file_free (state_file); ++ ++ offset = 0; ++ while (1) ++ { ++ state_file_path = g_strdup_printf ("%s%csession-state%c%s-%ld.%s", ++ g_get_user_config_dir (), ++ G_DIR_SEPARATOR, G_DIR_SEPARATOR, ++ g_get_prgname (), ++ (long)time (NULL) + offset, ++ desktop_file ? "desktop" : "state"); ++ ++ fd = open (state_file_path, O_WRONLY | O_CREAT | O_EXCL, 0644); ++ if (fd == -1) ++ { ++ if (errno == EEXIST) ++ { ++ offset++; ++ g_free (state_file_path); ++ continue; ++ } ++ else if (errno == ENOTDIR || errno == ENOENT) ++ { ++ char *sep = strrchr (state_file_path, G_DIR_SEPARATOR); ++ ++ *sep = '\0'; ++ if (g_mkdir_with_parents (state_file_path, 0755) != 0) ++ { ++ g_warning ("Could not create directory '%s'", ++ state_file_path); ++ g_free (state_file_path); ++ state_file_path = NULL; ++ break; ++ } ++ ++ continue; ++ } ++ ++ g_warning ("Could not create file '%s': %s", ++ state_file_path, g_strerror (errno)); ++ g_free (state_file_path); ++ state_file_path = NULL; ++ break; ++ } ++ ++ close (fd); ++ g_file_set_contents (state_file_path, data, -1, NULL); ++ break; ++ } ++ g_free (data); ++ ++ restart = generate_command (xsmp->restart_command, xsmp->client_id, ++ state_file_path); ++ set_properties (xsmp, ++ ptrarray_prop (SmRestartCommand, restart), ++ NULL); ++ g_ptr_array_free (restart, TRUE); ++ ++ if (state_file_path) ++ { ++ set_properties (xsmp, ++ array_prop (SmDiscardCommand, ++ "/bin/rm", "-rf", state_file_path, ++ NULL), ++ NULL); ++ g_free (state_file_path); ++ } ++} ++ ++static void ++xsmp_interact (SmcConn smc_conn, ++ SmPointer client_data) ++{ ++ EggSMClientXSMP *xsmp = client_data; ++ EggSMClient *client = client_data; ++ ++ g_debug ("Received Interact message in state %s", ++ EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ if (xsmp->state != XSMP_STATE_INTERACT_REQUEST) ++ { ++ fix_broken_state (xsmp, "Interact", TRUE, TRUE); ++ return; ++ } ++ ++ xsmp->state = XSMP_STATE_INTERACT; ++ egg_sm_client_quit_requested (client); ++} ++ ++static void ++xsmp_die (SmcConn smc_conn, ++ SmPointer client_data) ++{ ++ EggSMClientXSMP *xsmp = client_data; ++ EggSMClient *client = client_data; ++ ++ g_debug ("Received Die message in state %s", ++ EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ sm_client_xsmp_disconnect (xsmp); ++ egg_sm_client_quit (client); ++} ++ ++static void ++xsmp_save_complete (SmcConn smc_conn, ++ SmPointer client_data) ++{ ++ EggSMClientXSMP *xsmp = client_data; ++ ++ g_debug ("Received SaveComplete message in state %s", ++ EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE) ++ xsmp->state = XSMP_STATE_IDLE; ++ else ++ fix_broken_state (xsmp, "SaveComplete", FALSE, FALSE); ++} ++ ++static void ++xsmp_shutdown_cancelled (SmcConn smc_conn, ++ SmPointer client_data) ++{ ++ EggSMClientXSMP *xsmp = client_data; ++ EggSMClient *client = client_data; ++ ++ g_debug ("Received ShutdownCancelled message in state %s", ++ EGG_SM_CLIENT_XSMP_STATE (xsmp)); ++ ++ xsmp->shutting_down = FALSE; ++ ++ if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE) ++ { ++ /* We've finished interacting and now the SM has agreed to ++ * cancel the shutdown. ++ */ ++ xsmp->state = XSMP_STATE_IDLE; ++ egg_sm_client_quit_cancelled (client); ++ } ++ else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED) ++ { ++ /* Hm... ok, so we got a shutdown SaveYourself, which got ++ * cancelled, but the application was still interacting, so we ++ * didn't tell it yet, and then *another* SaveYourself arrived, ++ * which we must still be waiting to tell the app about, except ++ * that now that SaveYourself has been cancelled too! Dizzy yet? ++ */ ++ xsmp->waiting_to_save_myself = FALSE; ++ update_pending_events (xsmp); ++ } ++ else ++ { ++ g_debug ("Sending SaveYourselfDone(False)"); ++ SmcSaveYourselfDone (xsmp->connection, False); ++ ++ if (xsmp->state == XSMP_STATE_INTERACT) ++ { ++ /* The application is currently interacting, so we can't ++ * tell it about the cancellation yet; we will wait until ++ * after it calls egg_sm_client_will_quit(). ++ */ ++ xsmp->state = XSMP_STATE_SHUTDOWN_CANCELLED; ++ } ++ else ++ { ++ /* The shutdown was cancelled before the application got a ++ * chance to interact. ++ */ ++ xsmp->state = XSMP_STATE_IDLE; ++ } ++ } ++} ++ ++/* Utilities */ ++ ++/* Create a restart/clone/Exec command based on @restart_command. ++ * If @client_id is non-%NULL, add "--sm-client-id @client_id". ++ * If @state_file is non-%NULL, add "--sm-client-state-file @state_file". ++ * ++ * None of the input strings are g_strdup()ed; the caller must keep ++ * them around until it is done with the returned GPtrArray, and must ++ * then free the array, but not its contents. ++ */ ++static GPtrArray * ++generate_command (char **restart_command, const char *client_id, ++ const char *state_file) ++{ ++ GPtrArray *cmd; ++ int i; ++ ++ cmd = g_ptr_array_new (); ++ g_ptr_array_add (cmd, restart_command[0]); ++ ++ if (client_id) ++ { ++ g_ptr_array_add (cmd, (char *)"--sm-client-id"); ++ g_ptr_array_add (cmd, (char *)client_id); ++ } ++ ++ if (state_file) ++ { ++ g_ptr_array_add (cmd, (char *)"--sm-client-state-file"); ++ g_ptr_array_add (cmd, (char *)state_file); ++ } ++ ++ for (i = 1; restart_command[i]; i++) ++ g_ptr_array_add (cmd, restart_command[i]); ++ ++ return cmd; ++} ++ ++/* Takes a NULL-terminated list of SmProp * values, created by ++ * array_prop, ptrarray_prop, string_prop, card8_prop, sets them, and ++ * frees them. ++ */ ++static void ++set_properties (EggSMClientXSMP *xsmp, ...) ++{ ++ GPtrArray *props; ++ SmProp *prop; ++ va_list ap; ++ guint i; ++ ++ props = g_ptr_array_new (); ++ ++ va_start (ap, xsmp); ++ while ((prop = va_arg (ap, SmProp *))) ++ g_ptr_array_add (props, prop); ++ va_end (ap); ++ ++ if (xsmp->connection) ++ { ++ SmcSetProperties (xsmp->connection, props->len, ++ (SmProp **)props->pdata); ++ } ++ ++ for (i = 0; i < props->len; i++) ++ { ++ prop = props->pdata[i]; ++ g_free (prop->vals); ++ g_free (prop); ++ } ++ g_ptr_array_free (props, TRUE); ++} ++ ++/* Takes a NULL-terminated list of property names and deletes them. */ ++static void ++delete_properties (EggSMClientXSMP *xsmp, ...) ++{ ++ GPtrArray *props; ++ char *prop; ++ va_list ap; ++ ++ if (!xsmp->connection) ++ return; ++ ++ props = g_ptr_array_new (); ++ ++ va_start (ap, xsmp); ++ while ((prop = va_arg (ap, char *))) ++ g_ptr_array_add (props, prop); ++ va_end (ap); ++ ++ SmcDeleteProperties (xsmp->connection, props->len, ++ (char **)props->pdata); ++ ++ g_ptr_array_free (props, TRUE); ++} ++ ++/* Takes an array of strings and creates a LISTofARRAY8 property. The ++ * strings are neither dupped nor freed; they need to remain valid ++ * until you're done with the SmProp. ++ */ ++static SmProp * ++array_prop (const char *name, ...) ++{ ++ SmProp *prop; ++ SmPropValue pv; ++ GArray *vals; ++ char *value; ++ va_list ap; ++ ++ prop = g_new (SmProp, 1); ++ prop->name = (char *)name; ++ prop->type = (char *)SmLISTofARRAY8; ++ ++ vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue)); ++ ++ va_start (ap, name); ++ while ((value = va_arg (ap, char *))) ++ { ++ pv.length = strlen (value); ++ pv.value = value; ++ g_array_append_val (vals, pv); ++ } ++ ++ prop->num_vals = vals->len; ++ prop->vals = (SmPropValue *)vals->data; ++ ++ g_array_free (vals, FALSE); ++ ++ return prop; ++} ++ ++/* Takes a GPtrArray of strings and creates a LISTofARRAY8 property. ++ * The array contents are neither dupped nor freed; they need to ++ * remain valid until you're done with the SmProp. ++ */ ++static SmProp * ++ptrarray_prop (const char *name, GPtrArray *values) ++{ ++ SmProp *prop; ++ SmPropValue pv; ++ GArray *vals; ++ guint i; ++ ++ prop = g_new (SmProp, 1); ++ prop->name = (char *)name; ++ prop->type = (char *)SmLISTofARRAY8; ++ ++ vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue)); ++ ++ for (i = 0; i < values->len; i++) ++ { ++ pv.length = strlen (values->pdata[i]); ++ pv.value = values->pdata[i]; ++ g_array_append_val (vals, pv); ++ } ++ ++ prop->num_vals = vals->len; ++ prop->vals = (SmPropValue *)vals->data; ++ ++ g_array_free (vals, FALSE); ++ ++ return prop; ++} ++ ++/* Takes a string and creates an ARRAY8 property. The string is ++ * neither dupped nor freed; it needs to remain valid until you're ++ * done with the SmProp. ++ */ ++static SmProp * ++string_prop (const char *name, const char *value) ++{ ++ SmProp *prop; ++ ++ prop = g_new (SmProp, 1); ++ prop->name = (char *)name; ++ prop->type = (char *)SmARRAY8; ++ ++ prop->num_vals = 1; ++ prop->vals = g_new (SmPropValue, 1); ++ ++ prop->vals[0].length = strlen (value); ++ prop->vals[0].value = (char *)value; ++ ++ return prop; ++} ++ ++/* Takes a char and creates a CARD8 property. */ ++static SmProp * ++card8_prop (const char *name, unsigned char value) ++{ ++ SmProp *prop; ++ char *card8val; ++ ++ /* To avoid having to allocate and free prop->vals[0], we cheat and ++ * make vals a 2-element-long array and then use the second element ++ * to store value. ++ */ ++ ++ prop = g_new (SmProp, 1); ++ prop->name = (char *)name; ++ prop->type = (char *)SmCARD8; ++ ++ prop->num_vals = 1; ++ prop->vals = g_new (SmPropValue, 2); ++ card8val = (char *)(&prop->vals[1]); ++ card8val[0] = value; ++ ++ prop->vals[0].length = 1; ++ prop->vals[0].value = card8val; ++ ++ return prop; ++} ++ ++/* ICE code. This makes no effort to play nice with anyone else trying ++ * to use libICE. Fortunately, no one uses libICE for anything other ++ * than SM. (DCOP uses ICE, but it has its own private copy of ++ * libICE.) ++ * ++ * When this moves to gtk, it will need to be cleverer, to avoid ++ * tripping over old apps that use GnomeClient or that use libSM ++ * directly. ++ */ ++ ++#include ++#include ++ ++static void ice_error_handler (IceConn ice_conn, ++ Bool swap, ++ int offending_minor_opcode, ++ unsigned long offending_sequence, ++ int error_class, ++ int severity, ++ IcePointer values); ++static void ice_io_error_handler (IceConn ice_conn); ++static void ice_connection_watch (IceConn ice_conn, ++ IcePointer client_data, ++ Bool opening, ++ IcePointer *watch_data); ++ ++static void ++ice_init (void) ++{ ++ IceSetIOErrorHandler (ice_io_error_handler); ++ IceSetErrorHandler (ice_error_handler); ++ IceAddConnectionWatch (ice_connection_watch, NULL); ++} ++ ++static gboolean ++process_ice_messages (IceConn ice_conn) ++{ ++ IceProcessMessagesStatus status; ++ ++ gdk_threads_enter (); ++ status = IceProcessMessages (ice_conn, NULL, NULL); ++ gdk_threads_leave (); ++ ++ switch (status) ++ { ++ case IceProcessMessagesSuccess: ++ return TRUE; ++ ++ case IceProcessMessagesIOError: ++ sm_client_xsmp_disconnect (IceGetConnectionContext (ice_conn)); ++ return FALSE; ++ ++ case IceProcessMessagesConnectionClosed: ++ return FALSE; ++ ++ default: ++ g_assert_not_reached (); ++ } ++} ++ ++static gboolean ++ice_iochannel_watch (GIOChannel *channel, ++ GIOCondition condition, ++ gpointer client_data) ++{ ++ return process_ice_messages (client_data); ++} ++ ++static void ++ice_connection_watch (IceConn ice_conn, ++ IcePointer client_data, ++ Bool opening, ++ IcePointer *watch_data) ++{ ++ guint watch_id; ++ ++ if (opening) ++ { ++ GIOChannel *channel; ++ int fd = IceConnectionNumber (ice_conn); ++ ++ fcntl (fd, F_SETFD, fcntl (fd, F_GETFD, 0) | FD_CLOEXEC); ++ channel = g_io_channel_unix_new (fd); ++ watch_id = g_io_add_watch (channel, G_IO_IN | G_IO_ERR, ++ ice_iochannel_watch, ice_conn); ++ g_io_channel_unref (channel); ++ ++ *watch_data = GUINT_TO_POINTER (watch_id); ++ } ++ else ++ { ++ watch_id = GPOINTER_TO_UINT (*watch_data); ++ g_source_remove (watch_id); ++ } ++} ++ ++static void ++ice_error_handler (IceConn ice_conn, ++ Bool swap, ++ int offending_minor_opcode, ++ unsigned long offending_sequence, ++ int error_class, ++ int severity, ++ IcePointer values) ++{ ++ /* Do nothing */ ++} ++ ++static void ++ice_io_error_handler (IceConn ice_conn) ++{ ++ /* Do nothing */ ++} ++ ++static void ++smc_error_handler (SmcConn smc_conn, ++ Bool swap, ++ int offending_minor_opcode, ++ unsigned long offending_sequence, ++ int error_class, ++ int severity, ++ SmPointer values) ++{ ++ /* Do nothing */ ++} +diff --git a/cut-n-paste/smclient/eggsmclient.c b/cut-n-paste/smclient/eggsmclient.c +new file mode 100644 +index 0000000..513d938 +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient.c +@@ -0,0 +1,604 @@ ++/* ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++ ++#include "eggsmclient.h" ++#include "eggsmclient-private.h" ++ ++static void egg_sm_client_debug_handler (const char *log_domain, ++ GLogLevelFlags log_level, ++ const char *message, ++ gpointer user_data); ++ ++enum { ++ SAVE_STATE, ++ QUIT_REQUESTED, ++ QUIT_CANCELLED, ++ QUIT, ++ LAST_SIGNAL ++}; ++ ++static guint signals[LAST_SIGNAL]; ++ ++struct _EggSMClientPrivate { ++ GKeyFile *state_file; ++}; ++ ++#define EGG_SM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), EGG_TYPE_SM_CLIENT, EggSMClientPrivate)) ++ ++G_DEFINE_TYPE (EggSMClient, egg_sm_client, G_TYPE_OBJECT) ++ ++static EggSMClient *global_client; ++static EggSMClientMode global_client_mode = EGG_SM_CLIENT_MODE_NORMAL; ++ ++static void ++egg_sm_client_init (EggSMClient *client) ++{ ++ ; ++} ++ ++static void ++egg_sm_client_class_init (EggSMClientClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ ++ g_type_class_add_private (klass, sizeof (EggSMClientPrivate)); ++ ++ /** ++ * EggSMClient::save_state: ++ * @client: the client ++ * @state_file: a #GKeyFile to save state information into ++ * ++ * Emitted when the session manager has requested that the ++ * application save information about its current state. The ++ * application should save its state into @state_file, and then the ++ * session manager may then restart the application in a future ++ * session and tell it to initialize itself from that state. ++ * ++ * You should not save any data into @state_file's "start group" ++ * (ie, the %NULL group). Instead, applications should save their ++ * data into groups with names that start with the application name, ++ * and libraries that connect to this signal should save their data ++ * into groups with names that start with the library name. ++ * ++ * Alternatively, rather than (or in addition to) using @state_file, ++ * the application can save its state by calling ++ * egg_sm_client_set_restart_command() during the processing of this ++ * signal (eg, to include a list of files to open). ++ **/ ++ signals[SAVE_STATE] = ++ g_signal_new ("save_state", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (EggSMClientClass, save_state), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__POINTER, ++ G_TYPE_NONE, ++ 1, G_TYPE_POINTER); ++ ++ /** ++ * EggSMClient::quit_requested: ++ * @client: the client ++ * ++ * Emitted when the session manager requests that the application ++ * exit (generally because the user is logging out). The application ++ * should decide whether or not it is willing to quit (perhaps after ++ * asking the user what to do with documents that have unsaved ++ * changes) and then call egg_sm_client_will_quit(), passing %TRUE ++ * or %FALSE to give its answer to the session manager. (It does not ++ * need to give an answer before returning from the signal handler; ++ * it can interact with the user asynchronously and then give its ++ * answer later on.) If the application does not connect to this ++ * signal, then #EggSMClient will automatically return %TRUE on its ++ * behalf. ++ * ++ * The application should not save its session state as part of ++ * handling this signal; if the user has requested that the session ++ * be saved when logging out, then ::save_state will be emitted ++ * separately. ++ * ++ * If the application agrees to quit, it should then wait for either ++ * the ::quit_cancelled or ::quit signals to be emitted. ++ **/ ++ signals[QUIT_REQUESTED] = ++ g_signal_new ("quit_requested", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (EggSMClientClass, quit_requested), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, ++ 0); ++ ++ /** ++ * EggSMClient::quit_cancelled: ++ * @client: the client ++ * ++ * Emitted when the session manager decides to cancel a logout after ++ * the application has already agreed to quit. After receiving this ++ * signal, the application can go back to what it was doing before ++ * receiving the ::quit_requested signal. ++ **/ ++ signals[QUIT_CANCELLED] = ++ g_signal_new ("quit_cancelled", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (EggSMClientClass, quit_cancelled), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, ++ 0); ++ ++ /** ++ * EggSMClient::quit: ++ * @client: the client ++ * ++ * Emitted when the session manager wants the application to quit ++ * (generally because the user is logging out). The application ++ * should exit as soon as possible after receiving this signal; if ++ * it does not, the session manager may choose to forcibly kill it. ++ * ++ * Normally a GUI application would only be sent a ::quit if it ++ * agreed to quit in response to a ::quit_requested signal. However, ++ * this is not guaranteed; in some situations the session manager ++ * may decide to end the session without giving applications a ++ * chance to object. ++ **/ ++ signals[QUIT] = ++ g_signal_new ("quit", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (EggSMClientClass, quit), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, ++ 0); ++} ++ ++static gboolean sm_client_disable = FALSE; ++static char *sm_client_state_file = NULL; ++static char *sm_client_id = NULL; ++static char *sm_config_prefix = NULL; ++ ++static gboolean ++sm_client_post_parse_func (GOptionContext *context, ++ GOptionGroup *group, ++ gpointer data, ++ GError **error) ++{ ++ EggSMClient *client = egg_sm_client_get (); ++ ++ if (sm_client_id == NULL) ++ { ++ const gchar *desktop_autostart_id; ++ ++ desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); ++ ++ if (desktop_autostart_id != NULL) ++ sm_client_id = g_strdup (desktop_autostart_id); ++ } ++ ++ /* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes to ++ * use the same client id. */ ++ g_unsetenv ("DESKTOP_AUTOSTART_ID"); ++ ++ if (global_client_mode != EGG_SM_CLIENT_MODE_DISABLED && ++ EGG_SM_CLIENT_GET_CLASS (client)->startup) ++ EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id); ++ return TRUE; ++} ++ ++/** ++ * egg_sm_client_get_option_group: ++ * ++ * Creates a %GOptionGroup containing the session-management-related ++ * options. You should add this group to the application's ++ * %GOptionContext if you want to use #EggSMClient. ++ * ++ * Return value: the %GOptionGroup ++ **/ ++GOptionGroup * ++egg_sm_client_get_option_group (void) ++{ ++ const GOptionEntry entries[] = { ++ { "sm-client-disable", 0, 0, ++ G_OPTION_ARG_NONE, &sm_client_disable, ++ N_("Disable connection to session manager"), NULL }, ++ { "sm-client-state-file", 0, 0, ++ G_OPTION_ARG_FILENAME, &sm_client_state_file, ++ N_("Specify file containing saved configuration"), N_("FILE") }, ++ { "sm-client-id", 0, 0, ++ G_OPTION_ARG_STRING, &sm_client_id, ++ N_("Specify session management ID"), N_("ID") }, ++ /* GnomeClient compatibility option */ ++ { "sm-disable", 0, G_OPTION_FLAG_HIDDEN, ++ G_OPTION_ARG_NONE, &sm_client_disable, ++ NULL, NULL }, ++ /* GnomeClient compatibility option. This is a dummy option that only ++ * exists so that sessions saved by apps with GnomeClient can be restored ++ * later when they've switched to EggSMClient. See bug #575308. ++ */ ++ { "sm-config-prefix", 0, G_OPTION_FLAG_HIDDEN, ++ G_OPTION_ARG_STRING, &sm_config_prefix, ++ NULL, NULL }, ++ { NULL } ++ }; ++ GOptionGroup *group; ++ ++ /* Use our own debug handler for the "EggSMClient" domain. */ ++ g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, ++ egg_sm_client_debug_handler, NULL); ++ ++ group = g_option_group_new ("sm-client", ++ _("Session management options:"), ++ _("Show session management options"), ++ NULL, NULL); ++ g_option_group_add_entries (group, entries); ++ g_option_group_set_parse_hooks (group, NULL, sm_client_post_parse_func); ++ ++ return group; ++} ++ ++/** ++ * egg_sm_client_set_mode: ++ * @mode: an #EggSMClient mode ++ * ++ * Sets the "mode" of #EggSMClient as follows: ++ * ++ * %EGG_SM_CLIENT_MODE_DISABLED: Session management is completely ++ * disabled, until the mode is changed again. The application will ++ * not even connect to the session manager. (egg_sm_client_get() ++ * will still return an #EggSMClient object.) ++ * ++ * %EGG_SM_CLIENT_MODE_NO_RESTART: The application will connect to ++ * the session manager (and thus will receive notification when the ++ * user is logging out, etc), but will request to not be ++ * automatically restarted with saved state in future sessions. ++ * ++ * %EGG_SM_CLIENT_MODE_NORMAL: The default. #EggSMCLient will ++ * function normally. ++ * ++ * This must be called before the application's main loop begins and ++ * before any call to egg_sm_client_get(), unless the mode was set ++ * earlier to %EGG_SM_CLIENT_MODE_DISABLED and this call enables ++ * session management. Note that option parsing will call ++ * egg_sm_client_get(). ++ **/ ++void ++egg_sm_client_set_mode (EggSMClientMode mode) ++{ ++ EggSMClientMode old_mode = global_client_mode; ++ ++ g_return_if_fail (global_client == NULL || global_client_mode == EGG_SM_CLIENT_MODE_DISABLED); ++ g_return_if_fail (!(global_client != NULL && mode == EGG_SM_CLIENT_MODE_DISABLED)); ++ ++ global_client_mode = mode; ++ ++ if (global_client != NULL && old_mode == EGG_SM_CLIENT_MODE_DISABLED) ++ { ++ if (EGG_SM_CLIENT_GET_CLASS (global_client)->startup) ++ EGG_SM_CLIENT_GET_CLASS (global_client)->startup (global_client, sm_client_id); ++ } ++} ++ ++/** ++ * egg_sm_client_get_mode: ++ * ++ * Gets the global #EggSMClientMode. See egg_sm_client_set_mode() ++ * for details. ++ * ++ * Return value: the global #EggSMClientMode ++ **/ ++EggSMClientMode ++egg_sm_client_get_mode (void) ++{ ++ return global_client_mode; ++} ++ ++/** ++ * egg_sm_client_get: ++ * ++ * Returns the master #EggSMClient for the application. ++ * ++ * On platforms that support saved sessions (ie, POSIX/X11), the ++ * application will only request to be restarted by the session ++ * manager if you call egg_set_desktop_file() to set an application ++ * desktop file. In particular, if the desktop file contains the key ++ * "X ++ * ++ * Return value: the master #EggSMClient. ++ **/ ++EggSMClient * ++egg_sm_client_get (void) ++{ ++ if (!global_client) ++ { ++ if (!sm_client_disable) ++ { ++#if defined (GDK_WINDOWING_WIN32) ++ global_client = egg_sm_client_win32_new (); ++#elif defined (GDK_WINDOWING_QUARTZ) ++ global_client = egg_sm_client_osx_new (); ++#else ++ /* If both D-Bus and XSMP are compiled in, try XSMP first ++ * (since it supports state saving) and fall back to D-Bus ++ * if XSMP isn't available. ++ */ ++# ifdef EGG_SM_CLIENT_BACKEND_XSMP ++ global_client = egg_sm_client_xsmp_new (); ++# endif ++# ifdef EGG_SM_CLIENT_BACKEND_DBUS ++ if (!global_client) ++ global_client = egg_sm_client_dbus_new (); ++# endif ++#endif ++ } ++ ++ /* Fallback: create a dummy client, so that callers don't have ++ * to worry about a %NULL return value. ++ */ ++ if (!global_client) ++ global_client = g_object_new (EGG_TYPE_SM_CLIENT, NULL); ++ } ++ ++ return global_client; ++} ++ ++/** ++ * egg_sm_client_is_resumed: ++ * @client: the client ++ * ++ * Checks whether or not the current session has been resumed from ++ * a previous saved session. If so, the application should call ++ * egg_sm_client_get_state_file() and restore its state from the ++ * returned #GKeyFile. ++ * ++ * Return value: %TRUE if the session has been resumed ++ **/ ++gboolean ++egg_sm_client_is_resumed (EggSMClient *client) ++{ ++ g_return_val_if_fail (client == global_client, FALSE); ++ ++ return sm_client_state_file != NULL; ++} ++ ++/** ++ * egg_sm_client_get_state_file: ++ * @client: the client ++ * ++ * If the application was resumed by the session manager, this will ++ * return the #GKeyFile containing its state from the previous ++ * session. ++ * ++ * Note that other libraries and #EggSMClient itself may also store ++ * state in the key file, so if you call egg_sm_client_get_groups(), ++ * on it, the return value will likely include groups that you did not ++ * put there yourself. (It is also not guaranteed that the first ++ * group created by the application will still be the "start group" ++ * when it is resumed.) ++ * ++ * Return value: the #GKeyFile containing the application's earlier ++ * state, or %NULL on error. You should not free this key file; it ++ * is owned by @client. ++ **/ ++GKeyFile * ++egg_sm_client_get_state_file (EggSMClient *client) ++{ ++ EggSMClientPrivate *priv = EGG_SM_CLIENT_GET_PRIVATE (client); ++ char *state_file_path; ++ GError *err = NULL; ++ ++ g_return_val_if_fail (client == global_client, NULL); ++ ++ if (!sm_client_state_file) ++ return NULL; ++ if (priv->state_file) ++ return priv->state_file; ++ ++ if (!strncmp (sm_client_state_file, "file://", 7)) ++ state_file_path = g_filename_from_uri (sm_client_state_file, NULL, NULL); ++ else ++ state_file_path = g_strdup (sm_client_state_file); ++ ++ priv->state_file = g_key_file_new (); ++ if (!g_key_file_load_from_file (priv->state_file, state_file_path, 0, &err)) ++ { ++ g_warning ("Could not load SM state file '%s': %s", ++ sm_client_state_file, err->message); ++ g_clear_error (&err); ++ g_key_file_free (priv->state_file); ++ priv->state_file = NULL; ++ } ++ ++ g_free (state_file_path); ++ return priv->state_file; ++} ++ ++/** ++ * egg_sm_client_set_restart_command: ++ * @client: the client ++ * @argc: the length of @argv ++ * @argv: argument vector ++ * ++ * Sets the command used to restart @client if it does not have a ++ * .desktop file that can be used to find its restart command. ++ * ++ * This can also be used when handling the ::save_state signal, to ++ * save the current state via an updated command line. (Eg, providing ++ * a list of filenames to open when the application is resumed.) ++ **/ ++void ++egg_sm_client_set_restart_command (EggSMClient *client, ++ int argc, ++ const char **argv) ++{ ++ g_return_if_fail (EGG_IS_SM_CLIENT (client)); ++ ++ if (EGG_SM_CLIENT_GET_CLASS (client)->set_restart_command) ++ EGG_SM_CLIENT_GET_CLASS (client)->set_restart_command (client, argc, argv); ++} ++ ++/** ++ * egg_sm_client_will_quit: ++ * @client: the client ++ * @will_quit: whether or not the application is willing to quit ++ * ++ * This MUST be called in response to the ::quit_requested signal, to ++ * indicate whether or not the application is willing to quit. The ++ * application may call it either directly from the signal handler, or ++ * at some later point (eg, after asynchronously interacting with the ++ * user). ++ * ++ * If the application does not connect to ::quit_requested, ++ * #EggSMClient will call this method on its behalf (passing %TRUE ++ * for @will_quit). ++ * ++ * After calling this method, the application should wait to receive ++ * either ::quit_cancelled or ::quit. ++ **/ ++void ++egg_sm_client_will_quit (EggSMClient *client, ++ gboolean will_quit) ++{ ++ g_return_if_fail (EGG_IS_SM_CLIENT (client)); ++ ++ if (EGG_SM_CLIENT_GET_CLASS (client)->will_quit) ++ EGG_SM_CLIENT_GET_CLASS (client)->will_quit (client, will_quit); ++} ++ ++/** ++ * egg_sm_client_end_session: ++ * @style: a hint at how to end the session ++ * @request_confirmation: whether or not the user should get a chance ++ * to confirm the action ++ * ++ * Requests that the session manager end the current session. @style ++ * indicates how the session should be ended, and ++ * @request_confirmation indicates whether or not the user should be ++ * given a chance to confirm the logout/reboot/shutdown. Both of these ++ * flags are merely hints though; the session manager may choose to ++ * ignore them. ++ * ++ * Return value: %TRUE if the request was sent; %FALSE if it could not ++ * be (eg, because it could not connect to the session manager). ++ **/ ++gboolean ++egg_sm_client_end_session (EggSMClientEndStyle style, ++ gboolean request_confirmation) ++{ ++ EggSMClient *client = egg_sm_client_get (); ++ ++ g_return_val_if_fail (EGG_IS_SM_CLIENT (client), FALSE); ++ ++ if (EGG_SM_CLIENT_GET_CLASS (client)->end_session) ++ { ++ return EGG_SM_CLIENT_GET_CLASS (client)->end_session (client, style, ++ request_confirmation); ++ } ++ else ++ return FALSE; ++} ++ ++/* Signal-emitting callbacks from platform-specific code */ ++ ++GKeyFile * ++egg_sm_client_save_state (EggSMClient *client) ++{ ++ GKeyFile *state_file; ++ char *group; ++ ++ g_return_val_if_fail (client == global_client, NULL); ++ ++ state_file = g_key_file_new (); ++ ++ g_debug ("Emitting save_state"); ++ g_signal_emit (client, signals[SAVE_STATE], 0, state_file); ++ g_debug ("Done emitting save_state"); ++ ++ group = g_key_file_get_start_group (state_file); ++ if (group) ++ { ++ g_free (group); ++ return state_file; ++ } ++ else ++ { ++ g_key_file_free (state_file); ++ return NULL; ++ } ++} ++ ++void ++egg_sm_client_quit_requested (EggSMClient *client) ++{ ++ g_return_if_fail (client == global_client); ++ ++ if (!g_signal_has_handler_pending (client, signals[QUIT_REQUESTED], 0, FALSE)) ++ { ++ g_debug ("Not emitting quit_requested because no one is listening"); ++ egg_sm_client_will_quit (client, TRUE); ++ return; ++ } ++ ++ g_debug ("Emitting quit_requested"); ++ g_signal_emit (client, signals[QUIT_REQUESTED], 0); ++ g_debug ("Done emitting quit_requested"); ++} ++ ++void ++egg_sm_client_quit_cancelled (EggSMClient *client) ++{ ++ g_return_if_fail (client == global_client); ++ ++ g_debug ("Emitting quit_cancelled"); ++ g_signal_emit (client, signals[QUIT_CANCELLED], 0); ++ g_debug ("Done emitting quit_cancelled"); ++} ++ ++void ++egg_sm_client_quit (EggSMClient *client) ++{ ++ g_return_if_fail (client == global_client); ++ ++ g_debug ("Emitting quit"); ++ g_signal_emit (client, signals[QUIT], 0); ++ g_debug ("Done emitting quit"); ++ ++ /* FIXME: should we just call gtk_main_quit() here? */ ++} ++ ++static void ++egg_sm_client_debug_handler (const char *log_domain, ++ GLogLevelFlags log_level, ++ const char *message, ++ gpointer user_data) ++{ ++ static int debug = -1; ++ ++ if (debug < 0) ++ debug = (g_getenv ("EGG_SM_CLIENT_DEBUG") != NULL); ++ ++ if (debug) ++ g_log_default_handler (log_domain, log_level, message, NULL); ++} +diff --git a/cut-n-paste/smclient/eggsmclient.h b/cut-n-paste/smclient/eggsmclient.h +new file mode 100644 +index 0000000..65e258b +--- /dev/null ++++ b/cut-n-paste/smclient/eggsmclient.h +@@ -0,0 +1,117 @@ ++/* eggsmclient.h ++ * Copyright (C) 2007 Novell, Inc. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the ++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#ifndef __EGG_SM_CLIENT_H__ ++#define __EGG_SM_CLIENT_H__ ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define EGG_TYPE_SM_CLIENT (egg_sm_client_get_type ()) ++#define EGG_SM_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT, EggSMClient)) ++#define EGG_SM_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT, EggSMClientClass)) ++#define EGG_IS_SM_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT)) ++#define EGG_IS_SM_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT)) ++#define EGG_SM_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT, EggSMClientClass)) ++ ++typedef struct _EggSMClient EggSMClient; ++typedef struct _EggSMClientClass EggSMClientClass; ++typedef struct _EggSMClientPrivate EggSMClientPrivate; ++ ++typedef enum { ++ EGG_SM_CLIENT_END_SESSION_DEFAULT, ++ EGG_SM_CLIENT_LOGOUT, ++ EGG_SM_CLIENT_REBOOT, ++ EGG_SM_CLIENT_SHUTDOWN ++} EggSMClientEndStyle; ++ ++typedef enum { ++ EGG_SM_CLIENT_MODE_DISABLED, ++ EGG_SM_CLIENT_MODE_NO_RESTART, ++ EGG_SM_CLIENT_MODE_NORMAL ++} EggSMClientMode; ++ ++struct _EggSMClient ++{ ++ GObject parent; ++ ++}; ++ ++struct _EggSMClientClass ++{ ++ GObjectClass parent_class; ++ ++ /* signals */ ++ void (*save_state) (EggSMClient *client, ++ GKeyFile *state_file); ++ ++ void (*quit_requested) (EggSMClient *client); ++ void (*quit_cancelled) (EggSMClient *client); ++ void (*quit) (EggSMClient *client); ++ ++ /* virtual methods */ ++ void (*startup) (EggSMClient *client, ++ const char *client_id); ++ void (*set_restart_command) (EggSMClient *client, ++ int argc, ++ const char **argv); ++ void (*will_quit) (EggSMClient *client, ++ gboolean will_quit); ++ gboolean (*end_session) (EggSMClient *client, ++ EggSMClientEndStyle style, ++ gboolean request_confirmation); ++ ++ /* Padding for future expansion */ ++ void (*_egg_reserved1) (void); ++ void (*_egg_reserved2) (void); ++ void (*_egg_reserved3) (void); ++ void (*_egg_reserved4) (void); ++}; ++ ++GType egg_sm_client_get_type (void) G_GNUC_CONST; ++ ++GOptionGroup *egg_sm_client_get_option_group (void); ++ ++/* Initialization */ ++void egg_sm_client_set_mode (EggSMClientMode mode); ++EggSMClientMode egg_sm_client_get_mode (void); ++EggSMClient *egg_sm_client_get (void); ++ ++/* Resuming a saved session */ ++gboolean egg_sm_client_is_resumed (EggSMClient *client); ++GKeyFile *egg_sm_client_get_state_file (EggSMClient *client); ++ ++/* Alternate means of saving state */ ++void egg_sm_client_set_restart_command (EggSMClient *client, ++ int argc, ++ const char **argv); ++ ++/* Handling "quit_requested" signal */ ++void egg_sm_client_will_quit (EggSMClient *client, ++ gboolean will_quit); ++ ++/* Initiate a logout/reboot/shutdown */ ++gboolean egg_sm_client_end_session (EggSMClientEndStyle style, ++ gboolean request_confirmation); ++ ++G_END_DECLS ++ ++ ++#endif /* __EGG_SM_CLIENT_H__ */ +diff --git a/help/reference/shell/Makefile.am b/help/reference/shell/Makefile.am +index 8726fba..3dfb1a2 100644 +--- a/help/reference/shell/Makefile.am ++++ b/help/reference/shell/Makefile.am +@@ -113,6 +113,7 @@ FILTER_OUT = \ + + GTKDOC_LIBS = \ + $(top_builddir)/cut-n-paste/gimpcellrenderertoggle/libgimpcellrenderertoggle.la \ ++ $(top_builddir)/cut-n-paste/smclient/libsmclient.la \ + $(top_builddir)/cut-n-paste/libgd/libgd.la \ + $(top_builddir)/properties/libevproperties.la \ + $(top_builddir)/libdocument/libevdocument3.la \ +diff --git a/po/POTFILES.in b/po/POTFILES.in +index 873676d..d235d92 100644 +--- a/po/POTFILES.in ++++ b/po/POTFILES.in +@@ -21,6 +21,8 @@ backend/tiff/evince-tiffdocument.metainfo.xml.in.in + [type: gettext/ini]backend/tiff/tiffdocument.evince-backend.in.in + backend/xps/evince-xpsdocument.metainfo.xml.in.in + [type: gettext/ini]backend/xps/xpsdocument.evince-backend.in.in ++cut-n-paste/smclient/eggdesktopfile.c ++cut-n-paste/smclient/eggsmclient.c + browser-plugin/EvBrowserPluginToolbar.cpp + data/evince.desktop.in.in + data/evince-previewer.desktop.in.in +diff --git a/shell/Makefile.am b/shell/Makefile.am +index debb80b..4a3ecaf 100644 +--- a/shell/Makefile.am ++++ b/shell/Makefile.am +@@ -93,6 +93,7 @@ evince_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_srcdir)/cut-n-paste/gimpcellrenderertoggle \ ++ -I$(top_srcdir)/cut-n-paste/smclient \ + -I$(top_srcdir)/cut-n-paste/libgd/ \ + -I$(top_srcdir)/libdocument \ + -I$(top_builddir)/libdocument \ +@@ -116,6 +117,7 @@ endif + + evince_LDADD= \ + $(top_builddir)/cut-n-paste/gimpcellrenderertoggle/libgimpcellrenderertoggle.la \ ++ $(top_builddir)/cut-n-paste/smclient/libsmclient.la \ + $(top_builddir)/cut-n-paste/libgd/libgd.la \ + $(top_builddir)/properties/libevproperties.la \ + $(top_builddir)/libdocument/libevdocument3.la \ +diff --git a/shell/ev-application.c b/shell/ev-application.c +index af9ae38..4034a72 100644 +--- a/shell/ev-application.c ++++ b/shell/ev-application.c +@@ -35,6 +35,10 @@ + #endif + #include + ++#ifdef WITH_SMCLIENT ++#include "eggsmclient.h" ++#endif ++ + #include "ev-application.h" + #include "ev-file-helpers.h" + #include "ev-stock-icons.h" +@@ -56,6 +60,10 @@ struct _EvApplication { + EvMediaPlayerKeys *keys; + gboolean doc_registered; + #endif ++ ++#ifdef WITH_SMCLIENT ++ EggSMClient *smclient; ++#endif + }; + + struct _EvApplicationClass { +@@ -107,6 +115,71 @@ ev_application_new (void) + NULL); + } + ++/* Session */ ++gboolean ++ev_application_load_session (EvApplication *application) ++{ ++ GKeyFile *state_file; ++ gchar *uri; ++ ++#ifdef WITH_SMCLIENT ++ if (egg_sm_client_is_resumed (application->smclient)) { ++ state_file = egg_sm_client_get_state_file (application->smclient); ++ if (!state_file) ++ return FALSE; ++ } else ++#endif /* WITH_SMCLIENT */ ++ return FALSE; ++ ++ uri = g_key_file_get_string (state_file, "Evince", "uri", NULL); ++ if (!uri) ++ return FALSE; ++ ++ ev_application_open_uri_at_dest (application, uri, ++ gdk_screen_get_default (), ++ NULL, 0, NULL, ++ GDK_CURRENT_TIME); ++ g_free (uri); ++ g_key_file_free (state_file); ++ ++ return TRUE; ++} ++ ++#ifdef WITH_SMCLIENT ++ ++static void ++smclient_save_state_cb (EggSMClient *client, ++ GKeyFile *state_file, ++ EvApplication *application) ++{ ++ if (!application->uri) ++ return; ++ ++ g_key_file_set_string (state_file, "Evince", "uri", application->uri); ++} ++ ++static void ++smclient_quit_cb (EggSMClient *client, ++ GApplication *application) ++{ ++ g_application_quit (application); ++} ++#endif /* WITH_SMCLIENT */ ++ ++static void ++ev_application_init_session (EvApplication *application) ++{ ++#ifdef WITH_SMCLIENT ++ application->smclient = egg_sm_client_get (); ++ g_signal_connect (application->smclient, "save_state", ++ G_CALLBACK (smclient_save_state_cb), ++ application); ++ g_signal_connect (application->smclient, "quit", ++ G_CALLBACK (smclient_quit_cb), ++ application); ++#endif ++} ++ + #ifdef ENABLE_DBUS + /** + * ev_display_open_if_needed: +@@ -1229,6 +1302,8 @@ ev_application_init (EvApplication *ev_application) + if (!g_file_test (ev_application->dot_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) + ev_application_migrate_config_dir (ev_application); + ++ ev_application_init_session (ev_application); ++ + ev_application_accel_map_load (ev_application); + } + +diff --git a/shell/ev-application.h b/shell/ev-application.h +index f81a64f..250a0e5 100644 +--- a/shell/ev-application.h ++++ b/shell/ev-application.h +@@ -49,6 +49,7 @@ typedef struct _EvApplicationClass EvApplicationClass; + GType ev_application_get_type (void) G_GNUC_CONST; + EvApplication *ev_application_new (void); + ++gboolean ev_application_load_session (EvApplication *application); + void ev_application_open_recent_view (EvApplication *application, + GdkScreen *screen, + guint32 timestamp); +diff --git a/shell/main.c b/shell/main.c +index 0901ff7..6d63ed8 100644 +--- a/shell/main.c ++++ b/shell/main.c +@@ -33,6 +33,13 @@ + #include "ev-stock-icons.h" + #include "ev-metadata.h" + ++#ifdef WITH_SMCLIENT ++#include "eggsmclient.h" ++#ifdef GDK_WINDOWING_X11 ++#include "eggdesktopfile.h" ++#endif ++#endif /* WITH_SMCLIENT */ ++ + #ifdef G_OS_WIN32 + #include + #include +@@ -270,6 +277,10 @@ main (int argc, char *argv[]) + g_option_context_set_translation_domain(context, GETTEXT_PACKAGE); + g_option_context_add_main_entries (context, goption_options, GETTEXT_PACKAGE); + ++#ifdef WITH_SMCLIENT ++ g_option_context_add_group (context, egg_sm_client_get_option_group ()); ++#endif ++ + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + + if (!g_option_context_parse (context, &argc, &argv, &error)) { +@@ -294,9 +305,13 @@ main (int argc, char *argv[]) + + ev_stock_icons_init (); + ++#if defined(WITH_SMCLIENT) && defined(GDK_WINDOWING_X11) ++ egg_set_desktop_file (GNOMEDATADIR "/applications/evince.desktop"); ++#else + /* Manually set name and icon */ + g_set_application_name (_("Document Viewer")); + gtk_window_set_default_icon_name ("evince"); ++#endif /* WITH_SMCLIENT && GDK_WINDOWING_X11 */ + + application = ev_application_new (); + if (!g_application_register (G_APPLICATION (application), NULL, &error)) { +@@ -306,6 +321,7 @@ main (int argc, char *argv[]) + goto done; + } + ++ ev_application_load_session (application); + load_files (file_arguments); + + /* Change directory so we don't prevent unmounting in case the initial cwd +-- +2.4.3 + diff --git a/SOURCES/evince-3.14.2-translations.patch b/SOURCES/evince-3.14.2-translations.patch new file mode 100644 index 0000000..02d626e --- /dev/null +++ b/SOURCES/evince-3.14.2-translations.patch @@ -0,0 +1,1092 @@ +Index: new/po/bn_IN.po +=================================================================== +--- new.orig/po/bn_IN.po ++++ new/po/bn_IN.po +@@ -92,8 +92,7 @@ msgid "" + "The document is composed of several files. One or more of these files cannot " + "be accessed." + msgstr "" +-"একাধিক ফাইল একত্রিত করে এই ডকুমেন্ট নির্মিত হয়েছে ও এর মধ্যে এক অথবা একাধিক " +-"ফাইল " ++"একাধিক ফাইল একত্রিত করে এই ডকুমেন্ট নির্মিত হয়েছে ও এর মধ্যে এক অথবা একাধিক ফাইল " + "ব্যবহার করা সম্ভব নয়।" + + #: ../backend/djvu/djvudocument.evince-backend.in.in.h:1 +@@ -170,10 +169,8 @@ msgid "" + "14 fonts. If the substitute fonts selected by fontconfig are not the same as " + "the fonts used to create the PDF, the rendering may not be correct." + msgstr "" +-"এই নথিতে নন-এম্বেড করা ফন্ট রয়েছে যা PDF স্ট্যান্ডার্ড 14 ফন্ট ভুক্ত নয়। " +-"fontconfig " +-"দ্বারা নির্বাচিত বিকল্প ফন্টগুলি এবং PDF তৈরি করতে ব্যবহৃত ফন্টগুলি এক না " +-"হলে, " ++"এই নথিতে নন-এম্বেড করা ফন্ট রয়েছে যা PDF স্ট্যান্ডার্ড 14 ফন্ট ভুক্ত নয়। fontconfig " ++"দ্বারা নির্বাচিত বিকল্প ফন্টগুলি এবং PDF তৈরি করতে ব্যবহৃত ফন্টগুলি এক না হলে, " + "রেন্ডারিং সঠিক নাও হতে পারে।" + + #: ../backend/pdf/ev-poppler.cc:1129 +@@ -332,12 +329,10 @@ msgid "Shrink the document" + msgstr "ডকুমেন্টের মাপ হ্রাস করুন" + + #: ../browser-plugin/EvBrowserPluginToolbar.cpp:368 +-#| msgid "Downloading document (%d%%)" + msgid "Download document" + msgstr "নথি ডাউনলোড করুন" + + #: ../browser-plugin/EvBrowserPluginToolbar.cpp:381 +-#| msgid "Print this document" + msgid "Print document" + msgstr "নথি মুদ্রণ করুন" + +@@ -370,8 +365,7 @@ msgstr "ডকুমেন্টের � + #: ../data/org.gnome.Evince.gschema.xml.in.h:2 + msgid "Override document restrictions, like restriction to copy or to print." + msgstr "" +-"ডকুমেন্টের ক্ষেত্র ধার্য নিষেধাজ্ঞা যেমন কপি অথবা প্রিন্ট সংক্রান্ত, অগ্রাহ্য " +-"করা হবে।" ++"ডকুমেন্টের ক্ষেত্র ধার্য নিষেধাজ্ঞা যেমন কপি অথবা প্রিন্ট সংক্রান্ত, অগ্রাহ্য করা হবে।" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:3 + msgid "Automatically reload the document" +@@ -398,8 +392,8 @@ msgid "" + "The maximum size that will be used to cache rendered pages, limits maximum " + "zoom level." + msgstr "" +-"রেন্ডার্ড পৃষ্ঠাগুলি ক্যাশ করতে যে সর্বাধিক মাপ ব্যবহৃত হবে, তা সর্বাধিক জুম " +-"স্তর সীমাবদ্ধ করে।" ++"রেন্ডার্ড পৃষ্ঠাগুলি ক্যাশ করতে যে সর্বাধিক মাপ ব্যবহৃত হবে, তা সর্বাধিক জুম স্তর " ++"সীমাবদ্ধ করে।" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:9 + msgid "" +@@ -410,7 +404,6 @@ msgstr "" + "দেখান।" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:10 +-#| msgid "Adjust the zoom level" + msgid "Allow links to change the zoom level." + msgstr "লিঙ্কগুলিকে জুম স্তর পরিবর্তন করতে অনুমতি দিন।" + +@@ -484,7 +477,6 @@ msgstr "%d পৃষ্ঠা প্র� + + #. Initial state + #: ../libview/ev-print-operation.c:350 +-#| msgid "Preparing to print…" + msgid "Preparing preview…" + msgstr "পূর্বরূপ প্রস্তুত করা হচ্ছে…" + +@@ -494,7 +486,6 @@ msgstr "সমাপ্তি..." + + #: ../libview/ev-print-operation.c:354 + #, c-format +-#| msgid "Printing page %d of %d…" + msgid "Generating preview: page %d of %d" + msgstr "পূর্বরূপ উপস্থিত করা হচ্ছে: %d পৃষ্ঠা %d এর মধ্যে" + +@@ -509,7 +500,6 @@ msgid "Printing page %d of %d…" + msgstr "%d পৃষ্ঠা প্রদর্শন করা হচ্ছে, সর্বমোট %d..." + + #: ../libview/ev-print-operation.c:1214 +-#| msgid "Postscript is not supported by this printer." + msgid "Requested format is not supported by this printer." + msgstr "অনুরোধ জানানো ফর্ম্যাট এই প্রিন্টার দ্বারা সমর্থিত নয়।" + +@@ -523,9 +513,7 @@ msgstr "সতর্কবার্ত� + + #: ../libview/ev-print-operation.c:1280 + msgid "Your print range selection does not include any pages" +-msgstr "" +-"প্রিন্টের উদ্দেশ্যে আপনার নির্বাচিত পৃষ্ঠার সীমার মধ্যে কোনো পৃষ্ঠা উপস্থিত " +-"নেই" ++msgstr "প্রিন্টের উদ্দেশ্যে আপনার নির্বাচিত পৃষ্ঠার সীমার মধ্যে কোনো পৃষ্ঠা উপস্থিত নেই" + + #. translators: Title of the print dialog + #. translators: Print document currently shown in the Print Preview window +@@ -563,14 +551,11 @@ msgstr "" + "\n" + "• \"শূণ্য\": পৃষ্ঠার মাপ পরিবর্তিত হবে না।\n" + "\n" +-"• \"প্রিন্ট করার যোগ্য মাপে সংকুচন\": প্রিন্ট করার যোগ্য অংশের তুলনায় নথির " +-"মধ্যে " ++"• \"প্রিন্ট করার যোগ্য মাপে সংকুচন\": প্রিন্ট করার যোগ্য অংশের তুলনায় নথির মধ্যে " + "উপস্থিত বড় মাপের পাতাগুলি, প্রিন্টারের পাতার মাপ অনুযায়ী সংকুচন করা হবে।\n" + "\n" +-"• \"প্রিন্ট করার যোগ্য মাপে নির্ধারণ\": প্রিন্টারের পাতার মধ্যে প্রিন্ট করার " +-"যোগ্য " +-"অংশের মধ্যে সুসংগতভাবে নথির পাতাগুলি নির্ধারণের জন্য নথির পাতাগুলি মাপ বড় " +-"অথবা ছোট " ++"• \"প্রিন্ট করার যোগ্য মাপে নির্ধারণ\": প্রিন্টারের পাতার মধ্যে প্রিন্ট করার যোগ্য " ++"অংশের মধ্যে সুসংগতভাবে নথির পাতাগুলি নির্ধারণের জন্য নথির পাতাগুলি মাপ বড় অথবা ছোট " + "করা হবে।\n" + + #: ../libview/ev-print-operation.c:1984 +@@ -582,8 +567,7 @@ msgid "" + "Rotate printer page orientation of each page to match orientation of each " + "document page. Document pages will be centered within the printer page." + msgstr "" +-"নথির প্রত্যেকটি পৃষ্ঠার দিশার সাথে সামঞ্জস্য বজায় রাখার জন্য প্রিন্টারের " +-"পৃষ্ঠার দিশা " ++"নথির প্রত্যেকটি পৃষ্ঠার দিশার সাথে সামঞ্জস্য বজায় রাখার জন্য প্রিন্টারের পৃষ্ঠার দিশা " + "আবর্তিত হবে। নথির পৃষ্ঠাগুলি প্রিন্টারের পৃষ্ঠার কেন্দ্রে অবস্থিত হবে।" + + #: ../libview/ev-print-operation.c:1992 +@@ -594,8 +578,7 @@ msgstr "ডকুমেন্টের � + msgid "" + "When enabled, each page will be printed on the same size paper as the " + "document page." +-msgstr "" +-"সক্রিয় থাকলে, ডকুমেন্টের পৃষ্ঠার মাপের কাগজে প্রতিটি পৃষ্ঠা প্রিন্ট করা হবে।" ++msgstr "সক্রিয় থাকলে, ডকুমেন্টের পৃষ্ঠার মাপের কাগজে প্রতিটি পৃষ্ঠা প্রিন্ট করা হবে।" + + #: ../libview/ev-print-operation.c:2094 + msgid "Page Handling" +@@ -720,9 +703,7 @@ msgstr "সম্পূর্ণ উই� + + #: ../previewer/ev-previewer-window.c:321 + msgid "Make the current document fill the window width" +-msgstr "" +-"উইন্ডোর সম্পূর্ণ প্রস্থের মাপ অনুসারে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি " +-"করুন" ++msgstr "উইন্ডোর সম্পূর্ণ প্রস্থের মাপ অনুসারে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি করুন" + + #: ../previewer/ev-previewer-window.c:536 + msgid "Page" +@@ -933,10 +914,8 @@ msgid "" + "Foundation; either version 2 of the License, or (at your option) any later " + "version.\n" + msgstr "" +-"Evince একটি মুক্ত সফ্টওয়্যার; Free Software Foundation দ্বারা প্রকাশিত GNU " +-"General " +-"Public License'র শর্তানুযায়ী এটি বিতরণ ও পরিবর্তন করা যাবে; লাইনসেন্সের " +-"সংস্করণ ২ " ++"Evince একটি মুক্ত সফ্টওয়্যার; Free Software Foundation দ্বারা প্রকাশিত GNU General " ++"Public License'র শর্তানুযায়ী এটি বিতরণ ও পরিবর্তন করা যাবে; লাইনসেন্সের সংস্করণ ২ " + "অথবা (আপনার সুবিধানুযায়ী) ঊর্ধ্বতন কোনো সংস্করণের অধীন।\n" + + #: ../shell/ev-application.c:999 +@@ -946,12 +925,9 @@ msgid "" + "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more " + "details.\n" + msgstr "" +-"Evince বিতরণ করার মূল উদ্দেশ্য যে ব্যবহারকারীরা এর দ্বারা উপকৃত হবেন, কিন্তু " +-"এটির " +-"জন্য কোনো সুস্পষ্ট ওয়ারেন্টি উপস্থিত নেই; বাণিজ্যিক ও কোনো সুনির্দিষ্ট কর্ম " +-"সাধনের জন্য " +-"অন্তর্নিহীত ওয়ারেন্টিও অনুপস্থিত। অধিক জানতে GNU General Public License " +-"পড়ুন।\n" ++"Evince বিতরণ করার মূল উদ্দেশ্য যে ব্যবহারকারীরা এর দ্বারা উপকৃত হবেন, কিন্তু এটির " ++"জন্য কোনো সুস্পষ্ট ওয়ারেন্টি উপস্থিত নেই; বাণিজ্যিক ও কোনো সুনির্দিষ্ট কর্ম সাধনের জন্য " ++"অন্তর্নিহীত ওয়ারেন্টিও অনুপস্থিত। অধিক জানতে GNU General Public License পড়ুন।\n" + + #: ../shell/ev-application.c:1003 + msgid "" +@@ -959,10 +935,8 @@ msgid "" + "Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " + "Street, Fifth Floor, Boston, MA 02110-1301 USA\n" + msgstr "" +-"Evince'র সাথে GNU General Public License'র একটি প্রতিলিপি উপলব্ধ হওয়া উচিত; " +-"না " +-"থাকলে নিম্নলিখিত ঠিকানায় লিখে তা সংগ্রহ করুন Free Software Foundation, Inc., " +-"51 " ++"Evince'র সাথে GNU General Public License'র একটি প্রতিলিপি উপলব্ধ হওয়া উচিত; না " ++"থাকলে নিম্নলিখিত ঠিকানায় লিখে তা সংগ্রহ করুন Free Software Foundation, Inc., 51 " + "Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n" + + #: ../shell/ev-application.c:1024 ../evince.appdata.xml.in.h:1 +@@ -970,7 +944,6 @@ msgid "Evince" + msgstr "Evince" + + #: ../shell/ev-application.c:1026 +-#| msgid "© 1996–2012 The Evince authors" + msgid "© 1996–2014 The Evince authors" + msgstr "© 1996–2014 The Evince authors" + +@@ -1005,8 +978,7 @@ msgid "" + "This document is locked and can only be read by entering the correct " + "password." + msgstr "" +-"ডকুমেন্ট বর্তমানে লক করা আছে ও শুধুমাত্র পাসওয়ার্ড উল্লেখ করা হলে সেটি মুক্ত " +-"করা হবে।" ++"ডকুমেন্ট বর্তমানে লক করা আছে ও শুধুমাত্র পাসওয়ার্ড উল্লেখ করা হলে সেটি মুক্ত করা হবে।" + + #: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 + msgid "_Unlock Document" +@@ -1021,8 +993,7 @@ msgstr "পাসওয়ার্ড ল� + msgid "" + "The document “%s” is locked and requires a password before it can be opened." + msgstr "" +-"“%s” ডকুমেন্ট বর্তমানে লক করা আছে ও মুক্ত করার জন্য পাসওয়ার্ড উল্লেখ করা " +-"আবশ্যক।" ++"“%s” ডকুমেন্ট বর্তমানে লক করা আছে ও মুক্ত করার জন্য পাসওয়ার্ড উল্লেখ করা আবশ্যক।" + + #: ../shell/ev-password-view.c:303 + msgid "Password required" +@@ -1159,12 +1130,10 @@ msgid "Find a word or phrase in the docu + msgstr "ডকুমেন্টের মধ্যে একটি শব্দ অথবা পংক্তি অনুসন্ধান করুন" + + #: ../shell/ev-toolbar.c:247 ../shell/ev-toolbar.c:248 +-#| msgid "Find options" + msgid "File options" + msgstr "ফাইল বিকল্প" + + #: ../shell/ev-toolbar.c:257 ../shell/ev-toolbar.c:258 +-#| msgid "Find options" + msgid "View options" + msgstr "দেখার বিকল্প" + +@@ -1182,7 +1151,6 @@ msgstr "ডকুমেন্টের � + + #: ../shell/ev-window.c:1822 ../shell/ev-window.c:1990 + #, c-format +-#| msgid "Unable to open document" + msgid "Unable to open document “%s”." + msgstr "“%s” নথি খুলতে ব্যর্থ।" + +@@ -1277,8 +1245,7 @@ msgid "" + "Document contains form fields that have been filled out. If you don't save a " + "copy, changes will be permanently lost." + msgstr "" +-"ডকুমেন্টের মধ্যে উপস্থিত ফর্মের ক্ষেত্রে মান পূরণ করা হয়েছে। প্রতিলিপি " +-"সংরক্ষণ না করা " ++"ডকুমেন্টের মধ্যে উপস্থিত ফর্মের ক্ষেত্রে মান পূরণ করা হয়েছে। প্রতিলিপি সংরক্ষণ না করা " + "হলে এই পরিবর্তনগুলি স্থায়ীরূপে বর্জিত হবে।" + + #: ../shell/ev-window.c:3587 +@@ -1286,8 +1253,7 @@ msgid "" + "Document contains new or modified annotations. If you don't save a copy, " + "changes will be permanently lost." + msgstr "" +-"ডকুমেন্টের মধ্যে নতুন ও পরিবর্তিত টিকা উপস্থিত রয়েছে। প্রতিলিপি সংরক্ষণ না " +-"করা হলে " ++"ডকুমেন্টের মধ্যে নতুন ও পরিবর্তিত টিকা উপস্থিত রয়েছে। প্রতিলিপি সংরক্ষণ না করা হলে " + "পরিবর্তনগুলি স্থায়ী রূপে মুছে যাবে।" + + #: ../shell/ev-window.c:3594 +@@ -1306,8 +1272,7 @@ msgstr "একটি প্রতিল� + #: ../shell/ev-window.c:3691 + #, c-format + msgid "Wait until print job “%s” finishes before closing?" +-msgstr "" +-"বন্ধ করার পূর্বে “%s” প্রিন্টের কাজ সমাপ্তি পর্যন্ত অপেক্ষা করা হবে কি?" ++msgstr "বন্ধ করার পূর্বে “%s” প্রিন্টের কাজ সমাপ্তি পর্যন্ত অপেক্ষা করা হবে কি?" + + #. TRANS: the singular form is not really used as n_print_jobs > 1 + #. but some languages distinguish between different plurals forms, +@@ -1318,18 +1283,15 @@ msgid "There is %d print job active. Wai + msgid_plural "" + "There are %d print jobs active. Wait until print finishes before closing?" + msgstr[0] "" +-"%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি " +-"পর্যন্ত " ++"%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি পর্যন্ত " + "অপেক্ষা করা হবে কি?" + msgstr[1] "" +-"%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি " +-"পর্যন্ত " ++"%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি পর্যন্ত " + "অপেক্ষা করা হবে কি?" + + #: ../shell/ev-window.c:3712 + msgid "If you close the window, pending print jobs will not be printed." +-msgstr "" +-"উইন্ডো বন্ধ করা হলে, প্রিন্টের জন্য অপেক্ষারত কাজগুলি প্রিন্ট করা হবে না।" ++msgstr "উইন্ডো বন্ধ করা হলে, প্রিন্টের জন্য অপেক্ষারত কাজগুলি প্রিন্ট করা হবে না।" + + #: ../shell/ev-window.c:3716 + msgid "Cancel _print and Close" +@@ -1376,10 +1338,10 @@ msgid "" + "moveable cursor in text pages, allowing you to move around and select text " + "with your keyboard. Do you want to enable the caret navigation?" + msgstr "" +-"F7 টেপা হলে তা ক্যারেট নেভিগেশন চালু বা বন্ধ করে। এই বৈশিষ্ট্য পাঠ্য " +-"পৃষ্ঠাগুলিতে একটি অবস্থান পরিবর্তনযোগ্য কার্সর রাখে, যার মাধ্যমে অাপনি " +-"অবস্থান পরিবর্তন করতে পারবেন এবং অাপনার কীবোর্ড দিয়ে পাঠ্য নির্বাচন করতে " +-"পারবেন। অাপনি কি ক্যারেট নেভিগেশন সক্রিয় করতে চান?" ++"F7 টেপা হলে তা ক্যারেট নেভিগেশন চালু বা বন্ধ করে। এই বৈশিষ্ট্য পাঠ্য পৃষ্ঠাগুলিতে " ++"একটি অবস্থান পরিবর্তনযোগ্য কার্সর রাখে, যার মাধ্যমে অাপনি অবস্থান পরিবর্তন করতে " ++"পারবেন এবং অাপনার কীবোর্ড দিয়ে পাঠ্য নির্বাচন করতে পারবেন। অাপনি কি ক্যারেট " ++"নেভিগেশন সক্রিয় করতে চান?" + + #: ../shell/ev-window.c:5522 + msgid "Don't show this message again" +@@ -1418,12 +1380,10 @@ msgid "Save Attachment" + msgstr "সংযুক্ত বস্তু সংরক্ষণ করুন" + + #: ../shell/ev-window-title.c:118 +-#| msgid "Open Document" + msgid "Recent Documents" + msgstr "সাম্প্রতিক নথিপত্র" + + #: ../shell/ev-window-title.c:153 ../shell/ev-window-title.c:157 +-#| msgid "Password required" + msgid "Password Required" + msgstr "পাসওয়ার্ড প্রয়োজন" + +@@ -1536,7 +1496,6 @@ msgid "[FILE…]" + msgstr "[FILE…]" + + #: ../shell/evince-menus.ui.h:1 +-#| msgid "Open in New _Window" + msgid "_New Window" + msgstr "নতুন উইন্ডো (_N)" + +@@ -1577,37 +1536,30 @@ msgid "Rotate _Right" + msgstr "ডানদিকে ঘোরানো হবে (_R)" + + #: ../shell/evince-menus.ui.h:11 +-#| msgid "_First Page" + msgid "First Page" + msgstr "প্রথম পৃষ্ঠা" + + #: ../shell/evince-menus.ui.h:12 +-#| msgid "_Previous Page" + msgid "Previous Page" + msgstr "পূর্ববর্তী পৃষ্ঠা" + + #: ../shell/evince-menus.ui.h:13 +-#| msgid "_Next Page" + msgid "Next Page" + msgstr "পরবর্তী পৃষ্ঠা" + + #: ../shell/evince-menus.ui.h:14 +-#| msgid "_Last Page" + msgid "Last Page" + msgstr "সর্বশেষ পৃষ্ঠা" + + #: ../shell/evince-menus.ui.h:15 +-#| msgid "Zoom In" + msgid "Zoom _In" + msgstr "বড় করে প্রদর্শন (_I)" + + #: ../shell/evince-menus.ui.h:16 +-#| msgid "Zoom Out" + msgid "Zoom _Out" + msgstr "ছোট করে প্রদর্শন (_O)" + + #: ../shell/evince-menus.ui.h:17 +-#| msgid "_Odd pages left" + msgid "_Odd Pages Left" + msgstr "অযুগ্ম পৃষ্ঠা অবশিষ্ট (_O)" + +@@ -1632,7 +1584,6 @@ msgid "_Save a Copy…" + msgstr "একটি প্রতিলিপি সংরক্ষণ করুন...(_S)" + + #: ../shell/evince-menus.ui.h:23 +-#| msgid "Send To" + msgid "Send _To…" + msgstr "এখানে পাঠান (_T)…" + +@@ -1645,7 +1596,6 @@ msgid "_Print…" + msgstr "প্রিন্ট করুন...(_P)" + + #: ../shell/evince-menus.ui.h:26 +-#| msgid "P_roperties" + msgid "P_roperties…" + msgstr "বৈশিষ্ট্যাবলী (_r)…" + +@@ -1666,7 +1616,6 @@ msgid "_Add Bookmark" + msgstr "বুকমার্ক যোগ করুন (_A)" + + #: ../shell/evince-menus.ui.h:31 +-#| msgid "Close" + msgid "_Close" + msgstr "বন্ধ করুন (_C)" + +@@ -1711,7 +1660,6 @@ msgid "Annotation Properties…" + msgstr "টিকার বৈশিষ্ট্য…" + + #: ../shell/evince-menus.ui.h:47 +-#| msgid "Annotations" + msgid "Remove Annotation" + msgstr "টীকা সরান" + +@@ -1728,8 +1676,8 @@ msgid "" + "It supports the following document formats: PDF, PS, EPS, XPS, DjVu, TIFF, " + "DVI (with SyncTeX), and Comic Books archives (CBR, CBT, CBZ, CB7)." + msgstr "" +-"এটি নিম্নলিখিত নথি ফর্ম্যাট সমর্থন করে: PDF, PS, EPS, XPS, DjVu, TIFF, " +-"DVI (SyncTeX সমেত), এবং কমিক বই সংরক্ষণাগার (CBR, CBT, CBZ, CB7)।" ++"এটি নিম্নলিখিত নথি ফর্ম্যাট সমর্থন করে: PDF, PS, EPS, XPS, DjVu, TIFF, DVI " ++"(SyncTeX সমেত), এবং কমিক বই সংরক্ষণাগার (CBR, CBT, CBZ, CB7)।" + + #~ msgid "File is not a valid .desktop file" + #~ msgstr "ফাইলটি বৈধ .desktop ফাইল নয়" +Index: new/po/ja.po +=================================================================== +--- new.orig/po/ja.po ++++ new/po/ja.po +@@ -13,7 +13,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: evince master\n" +-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=evince&keywords=I18N+L10N&component=general\n" ++"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" ++"product=evince&keywords=I18N+L10N&component=general\n" + "POT-Creation-Date: 2014-09-18 03:41+0000\n" + "PO-Revision-Date: 2014-09-18 22:47+0900\n" + "Last-Translator: Jiro Matsuzawa \n" +@@ -26,8 +27,11 @@ msgstr "" + + #: ../backend/comics/comics-document.c:210 + #, c-format +-msgid "Error launching the command “%s” in order to decompress the comic book: %s" +-msgstr "コミックブックを解凍するためコマンド “%s” を起動する際にエラーが発生しました: %s" ++msgid "" ++"Error launching the command “%s” in order to decompress the comic book: %s" ++msgstr "" ++"コミックブックを解凍するためコマンド “%s” を起動する際にエラーが発生しまし" ++"た: %s" + + #: ../backend/comics/comics-document.c:224 + #, c-format +@@ -85,8 +89,12 @@ msgid "DjVu document has incorrect forma + msgstr "DjVu ドキュメントの書式が壊れています" + + #: ../backend/djvu/djvu-document.c:262 +-msgid "The document is composed of several files. One or more of these files cannot be accessed." +-msgstr "そのドキュメントは複数のファイルを結合したものです。それらのファイルは個別にアクセスすることはできません。" ++msgid "" ++"The document is composed of several files. One or more of these files cannot " ++"be accessed." ++msgstr "" ++"そのドキュメントは複数のファイルを結合したものです。それらのファイルは個別に" ++"アクセスすることはできません。" + + #: ../backend/djvu/djvudocument.evince-backend.in.in.h:1 + #: ../backend/djvu/evince-djvudocument.metainfo.xml.in.in.h:1 +@@ -157,8 +165,14 @@ msgid "Unknown font type" + msgstr "不明なフォントの種類です" + + #: ../backend/pdf/ev-poppler.cc:1124 +-msgid "This document contains non-embedded fonts that are not from the PDF Standard 14 fonts. If the substitute fonts selected by fontconfig are not the same as the fonts used to create the PDF, the rendering may not be correct." +-msgstr "このドキュメントには、PDF 標準の 14 フォント以外に埋め込みでないフォントが含まれています。fontconfig による代替フォントが PDF 生成に使われたフォントと異なる場合、適切なレンダリングがおこなわれない可能性があります。" ++msgid "" ++"This document contains non-embedded fonts that are not from the PDF Standard " ++"14 fonts. If the substitute fonts selected by fontconfig are not the same as " ++"the fonts used to create the PDF, the rendering may not be correct." ++msgstr "" ++"このドキュメントには、PDF 標準の 14 フォント以外に埋め込みでないフォントが含" ++"まれています。fontconfig による代替フォントが PDF 生成に使われたフォントと異" ++"なる場合、適切なレンダリングがおこなわれない可能性があります。" + + #: ../backend/pdf/ev-poppler.cc:1129 + msgid "All fonts are either standard or embedded." +@@ -335,7 +349,9 @@ msgstr "複数ページのドキュメ� + + #: ../data/evince.desktop.in.in.h:3 + msgid "pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;" +-msgstr "pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;ポストスクリプト;ドキュメント;文書;プレゼンテーション;" ++msgstr "" ++"pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;ポストスクリプト;ド" ++"キュメント;文書;プレゼンテーション;" + + #: ../data/evince-previewer.desktop.in.in.h:1 + msgid "Print Preview" +@@ -374,16 +390,21 @@ msgid "Page cache size in MiB" + msgstr "ページキャッシュサイズ (MiB)" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:8 +-msgid "The maximum size that will be used to cache rendered pages, limits maximum zoom level." +-msgstr "描画ページのキャッシュに使用される最大サイズです。この値によって最大ズームレベルが制限されます。" ++msgid "" ++"The maximum size that will be used to cache rendered pages, limits maximum " ++"zoom level." ++msgstr "" ++"描画ページのキャッシュに使用される最大サイズです。この値によって最大ズームレ" ++"ベルが制限されます。" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:9 +-msgid "Show a dialog to confirm that the user wants to activate the caret navigation." ++msgid "" ++"Show a dialog to confirm that the user wants to activate the caret " ++"navigation." + msgstr "キャレット移動を有効にするかどうか確認ダイアログを表示する" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:10 + #, fuzzy +-#| msgid "Adjust the zoom level" + msgid "Allow links to change the zoom level." + msgstr "ズームレベルを調節します" + +@@ -515,37 +536,50 @@ msgstr "印刷可能な領域に合わ� + + #: ../libview/ev-print-operation.c:1972 + msgid "" +-"Scale document pages to fit the selected printer page. Select from one of the following:\n" ++"Scale document pages to fit the selected printer page. Select from one of " ++"the following:\n" + "\n" + "• \"None\": No page scaling is performed.\n" + "\n" +-"• \"Shrink to Printable Area\": Document pages larger than the printable area are reduced to fit the printable area of the printer page.\n" ++"• \"Shrink to Printable Area\": Document pages larger than the printable " ++"area are reduced to fit the printable area of the printer page.\n" + "\n" +-"• \"Fit to Printable Area\": Document pages are enlarged or reduced as required to fit the printable area of the printer page.\n" ++"• \"Fit to Printable Area\": Document pages are enlarged or reduced as " ++"required to fit the printable area of the printer page.\n" + msgstr "" +-"選択されたプリンターページに合わせてドキュメントページを拡大縮小します。以下から1つ選択してください:\n" ++"選択されたプリンターページに合わせてドキュメントページを拡大縮小します。以下" ++"から1つ選択してください:\n" + "\n" + "• \"なし\": ページの拡大縮小は行われません。\n" + "\n" +-"• \"印刷可能な領域に合わせて縮小\": 印刷可能な領域よりドキュメントページが大きな場合はプリンターページの印刷可能な領域に合わせて縮小します。\n" ++"• \"印刷可能な領域に合わせて縮小\": 印刷可能な領域よりドキュメントページが大" ++"きな場合はプリンターページの印刷可能な領域に合わせて縮小します。\n" + "\n" +-"• \"印刷可能な領域に合わせる\": 必要に応じてプリンターページの印刷可能な領域に合わせてドキュメントページの拡大または縮小を行います。\n" ++"• \"印刷可能な領域に合わせる\": 必要に応じてプリンターページの印刷可能な領域" ++"に合わせてドキュメントページの拡大または縮小を行います。\n" + + #: ../libview/ev-print-operation.c:1984 + msgid "Auto Rotate and Center" + msgstr "自動回転して中央揃え" + + #: ../libview/ev-print-operation.c:1987 +-msgid "Rotate printer page orientation of each page to match orientation of each document page. Document pages will be centered within the printer page." +-msgstr "各ページのプリンターページ方向を回転して各ドキュメントページの方向に合わせます。ドキュメントページはプリンターページ内の中央に配置されます。" ++msgid "" ++"Rotate printer page orientation of each page to match orientation of each " ++"document page. Document pages will be centered within the printer page." ++msgstr "" ++"各ページのプリンターページ方向を回転して各ドキュメントページの方向に合わせま" ++"す。ドキュメントページはプリンターページ内の中央に配置されます。" + + #: ../libview/ev-print-operation.c:1992 + msgid "Select page size using document page size" + msgstr "ドキュメントのページサイズを利用してページサイズを選択する" + + #: ../libview/ev-print-operation.c:1994 +-msgid "When enabled, each page will be printed on the same size paper as the document page." +-msgstr "有効にした場合、各ページはドキュメントページと同じサイズの紙に印刷されます。" ++msgid "" ++"When enabled, each page will be printed on the same size paper as the " ++"document page." ++msgstr "" ++"有効にした場合、各ページはドキュメントページと同じサイズの紙に印刷されます。" + + #: ../libview/ev-print-operation.c:2094 + msgid "Page Handling" +@@ -872,16 +906,36 @@ msgid "Close" + msgstr "閉じる" + + #: ../shell/ev-application.c:995 +-msgid "Evince 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 2 of the License, or (at your option) any later version.\n" +-msgstr "Evince はフリーソフトウェアです; フリーソフトウェア財団が発行する GNU 一般公衆利用許諾契約書の第二版、あるいはそれ以降の版が定める条項の下で本プログラムを再頒布または変更することができます。\n" ++msgid "" ++"Evince 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 2 of the License, or (at your option) any later " ++"version.\n" ++msgstr "" ++"Evince はフリーソフトウェアです; フリーソフトウェア財団が発行する GNU 一般公" ++"衆利用許諾契約書の第二版、あるいはそれ以降の版が定める条項の下で本プログラム" ++"を再頒布または変更することができます。\n" + + #: ../shell/ev-application.c:999 +-msgid "Evince 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.\n" +-msgstr "Evince は役立つものであることを期待して配布されていますが、完全に無保証です。商用利用または特定の目的における適合性の保証はありません。詳細は GNU 一般公衆利用許諾契約書をご覧ください。\n" ++msgid "" ++"Evince 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.\n" ++msgstr "" ++"Evince は役立つものであることを期待して配布されていますが、完全に無保証です。" ++"商用利用または特定の目的における適合性の保証はありません。詳細は GNU 一般公衆" ++"利用許諾契約書をご覧ください。\n" + + #: ../shell/ev-application.c:1003 +-msgid "You should have received a copy of the GNU General Public License along with Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" +-msgstr "あなたは、本プログラムと一緒に GNU 一般公衆利用許諾契約書の写しを受け取っているはずです。そうでない場合は、Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA まで手紙を書いてください。\n" ++msgid "" ++"You should have received a copy of the GNU General Public License along with " ++"Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " ++"Street, Fifth Floor, Boston, MA 02110-1301 USA\n" ++msgstr "" ++"あなたは、本プログラムと一緒に GNU 一般公衆利用許諾契約書の写しを受け取ってい" ++"るはずです。そうでない場合は、Free Software Foundation, Inc., 51 Franklin " ++"Street, Fifth Floor, Boston, MA 02110-1301 USA まで手紙を書いてください。\n" + + #: ../shell/ev-application.c:1024 ../evince.appdata.xml.in.h:1 + msgid "Evince" +@@ -923,8 +977,12 @@ msgid "Loading…" + msgstr "読み込み中です…" + + #: ../shell/ev-password-view.c:142 +-msgid "This document is locked and can only be read by entering the correct password." +-msgstr "このドキュメントはロックされているので、正しいパスワードを入力したときのみ読み込みが可能です。" ++msgid "" ++"This document is locked and can only be read by entering the correct " ++"password." ++msgstr "" ++"このドキュメントはロックされているので、正しいパスワードを入力したときのみ読" ++"み込みが可能です。" + + #: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 + msgid "_Unlock Document" +@@ -936,7 +994,8 @@ msgstr "パスワードの入力" + + #: ../shell/ev-password-view.c:300 + #, c-format +-msgid "The document “%s” is locked and requires a password before it can be opened." ++msgid "" ++"The document “%s” is locked and requires a password before it can be opened." + msgstr "ロックされているドキュメント \"%s\" を開くにはパスワードが必要です。" + + #: ../shell/ev-password-view.c:303 +@@ -1184,12 +1243,20 @@ msgid "Printing job “%s”" + msgstr "印刷ジョブ \"%s\"" + + #: ../shell/ev-window.c:3583 +-msgid "Document contains form fields that have been filled out. If you don't save a copy, changes will be permanently lost." +-msgstr "ドキュメントには内容を埋めたフォームフィールドが含まれています。名前を付けて保存しない場合は変更点は失われます。" ++msgid "" ++"Document contains form fields that have been filled out. If you don't save a " ++"copy, changes will be permanently lost." ++msgstr "" ++"ドキュメントには内容を埋めたフォームフィールドが含まれています。名前を付けて" ++"保存しない場合は変更点は失われます。" + + #: ../shell/ev-window.c:3587 +-msgid "Document contains new or modified annotations. If you don't save a copy, changes will be permanently lost." +-msgstr "ドキュメントには新規もしくは更新された注釈が含まれています。名前を付けて保存しない場合は変更点は失われます。" ++msgid "" ++"Document contains new or modified annotations. If you don't save a copy, " ++"changes will be permanently lost." ++msgstr "" ++"ドキュメントには新規もしくは更新された注釈が含まれています。名前を付けて保存" ++"しない場合は変更点は失われます。" + + #: ../shell/ev-window.c:3594 + #, c-format +@@ -1215,8 +1282,11 @@ msgstr "印刷ジョブの \"%s\" が完 + #: ../shell/ev-window.c:3697 + #, c-format + msgid "There is %d print job active. Wait until print finishes before closing?" +-msgid_plural "There are %d print jobs active. Wait until print finishes before closing?" +-msgstr[0] "現在 %d 個の印刷ジョブがあります。すべてのジョブが完了するまで、閉じずに待機しますか?" ++msgid_plural "" ++"There are %d print jobs active. Wait until print finishes before closing?" ++msgstr[0] "" ++"現在 %d 個の印刷ジョブがあります。すべてのジョブが完了するまで、閉じずに待機" ++"しますか?" + + #: ../shell/ev-window.c:3712 + msgid "If you close the window, pending print jobs will not be printed." +@@ -1261,8 +1331,14 @@ msgid "_Enable" + msgstr "有効(_E)" + + #: ../shell/ev-window.c:5517 +-msgid "Pressing F7 turns the caret navigation on or off. This feature places a moveable cursor in text pages, allowing you to move around and select text with your keyboard. Do you want to enable the caret navigation?" +-msgstr "F7 を押すとキャレット移動の有効無効を切り替えます。この機能を有効にすると、移動可能なカーソルがテキストページに表示され、キーボード操作で移動したり、テキストを選択したりできるようになります。キャレット移動を有効にしますか?" ++msgid "" ++"Pressing F7 turns the caret navigation on or off. This feature places a " ++"moveable cursor in text pages, allowing you to move around and select text " ++"with your keyboard. Do you want to enable the caret navigation?" ++msgstr "" ++"F7 を押すとキャレット移動の有効無効を切り替えます。この機能を有効にすると、移" ++"動可能なカーソルがテキストページに表示され、キーボード操作で移動したり、テキ" ++"ストを選択したりできるようになります。キャレット移動を有効にしますか?" + + #: ../shell/ev-window.c:5522 + msgid "Don't show this message again" +@@ -1593,11 +1669,14 @@ msgid "This is a document viewer for the + msgstr "" + + #: ../evince.appdata.xml.in.h:4 +-msgid "It supports the following document formats: PDF, PS, EPS, XPS, DjVu, TIFF, DVI (with SyncTeX), and Comic Books archives (CBR, CBT, CBZ, CB7)." ++msgid "" ++"It supports the following document formats: PDF, PS, EPS, XPS, DjVu, TIFF, " ++"DVI (with SyncTeX), and Comic Books archives (CBR, CBT, CBZ, CB7)." + msgstr "" + + #~ msgid "Toggle between view of recent items and open document" +-#~ msgstr "最近使用したドキュメント一覧画面と使用中のドキュメント画面を切り替えます" ++#~ msgstr "" ++#~ "最近使用したドキュメント一覧画面と使用中のドキュメント画面を切り替えます" + + #~ msgid "%s — Password Required" + #~ msgstr "%s — パスワードが必要です" +@@ -1715,7 +1794,8 @@ msgstr "" + #~ msgstr "起動オプションが認識できません: %d" + + #~ msgid "Can't pass document URIs to a 'Type=Link' desktop entry" +-#~ msgstr "ドキュメントの URI を 'Type=Link' という desktop エントリに渡せません" ++#~ msgstr "" ++#~ "ドキュメントの URI を 'Type=Link' という desktop エントリに渡せません" + + #~ msgid "Not a launchable item" + #~ msgstr "起動できないアイテムです" +Index: new/po/ta.po +=================================================================== +--- new.orig/po/ta.po ++++ new/po/ta.po +@@ -22,8 +22,7 @@ msgstr "" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" +-"Plural-Forms: nplurals=2; plural=(n!=1);\\n" +-"\n" ++"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n" + "\n" + "X-Generator: Lokalize 1.5\n" + +@@ -93,8 +92,7 @@ msgid "" + "The document is composed of several files. One or more of these files cannot " + "be accessed." + msgstr "" +-"இந்த ஆவணம் பல கோப்புக்களால் உருவானது. அதில் ஒன்றோ பலவோ கோப்புகளை அணுக " +-"இயலவில்லை." ++"இந்த ஆவணம் பல கோப்புக்களால் உருவானது. அதில் ஒன்றோ பலவோ கோப்புகளை அணுக இயலவில்லை." + + #: ../backend/djvu/djvudocument.evince-backend.in.in.h:1 + #: ../backend/djvu/evince-djvudocument.metainfo.xml.in.in.h:1 +@@ -171,8 +169,7 @@ msgid "" + "the fonts used to create the PDF, the rendering may not be correct." + msgstr "" + "இந்த ஆவணத்தில் பொதியப்படாத எழுத்துருக்கள் உள்ளன. அவை பிடிஎஃப் இன் செந்தர 14 " +-"எழுத்துருக்களில் ஒன்று இல்லை. பான்ட் கான்பிக் தேர்ந்தெடுத்த மாற்று " +-"எழுத்துருக்கள் பிடிஎஃப் ஐ " ++"எழுத்துருக்களில் ஒன்று இல்லை. பான்ட் கான்பிக் தேர்ந்தெடுத்த மாற்று எழுத்துருக்கள் பிடிஎஃப் ஐ " + "உருவாக்கிய எழுத்துருக்கள் இல்லையெனில் வரைதல் சரியாக இல்லாமல் போகலாம்." + + #: ../backend/pdf/ev-poppler.cc:1129 +@@ -331,12 +328,10 @@ msgid "Shrink the document" + msgstr "ஆவணத்தை சுருக்கவும்" + + #: ../browser-plugin/EvBrowserPluginToolbar.cpp:368 +-#| msgid "Downloading document (%d%%)" + msgid "Download document" + msgstr "ஆவணத்தை பதிவிறக்கு" + + #: ../browser-plugin/EvBrowserPluginToolbar.cpp:381 +-#| msgid "Print this document" + msgid "Print document" + msgstr "ஆவணத்தை அச்சிடு" + +@@ -380,8 +375,7 @@ msgstr "கோப்பு மாறி� + + #: ../data/org.gnome.Evince.gschema.xml.in.h:5 + msgid "The URI of the directory last used to open or save a document" +-msgstr "" +-"கடைசியாக ஒரு ஆவணத்தை திறக்க அல்லது சேமிக்க பயன்படுத்திய கோப்புறையின் URI" ++msgstr "கடைசியாக ஒரு ஆவணத்தை திறக்க அல்லது சேமிக்க பயன்படுத்திய கோப்புறையின் URI" + + #: ../data/org.gnome.Evince.gschema.xml.in.h:6 + msgid "The URI of the directory last used to save a picture" +@@ -396,8 +390,7 @@ msgid "" + "The maximum size that will be used to cache rendered pages, limits maximum " + "zoom level." + msgstr "" +-"ரென்டர் செய்யப்படும் பக்கங்களை தேக்ககப்படுத்த பயன்படுத்தப்படும் அதிகபட்ச " +-"அளவு, அதிகபட்ச ஜூம் " ++"ரென்டர் செய்யப்படும் பக்கங்களை தேக்ககப்படுத்த பயன்படுத்தப்படும் அதிகபட்ச அளவு, அதிகபட்ச ஜூம் " + "நிலையைக் கட்டுப்படுத்தும்." + + #: ../data/org.gnome.Evince.gschema.xml.in.h:9 +@@ -405,12 +398,10 @@ msgid "" + "Show a dialog to confirm that the user wants to activate the caret " + "navigation." + msgstr "" +-"பயனர் சுட்டி வழிசெலுத்தலை செயல்படுத்த விரும்புகிறரா என உறுதிப்படுத்த ஒரு " +-"உரையாடலைக் " ++"பயனர் சுட்டி வழிசெலுத்தலை செயல்படுத்த விரும்புகிறரா என உறுதிப்படுத்த ஒரு உரையாடலைக் " + "காட்டு." + + #: ../data/org.gnome.Evince.gschema.xml.in.h:10 +-#| msgid "Adjust the zoom level" + msgid "Allow links to change the zoom level." + msgstr "பெரிதாக்கல் நிலையை மாற்ற இணைப்புகளை அனுமதி" + +@@ -484,7 +475,6 @@ msgstr "பக்கத்தை அச� + + #. Initial state + #: ../libview/ev-print-operation.c:350 +-#| msgid "Preparing to print…" + msgid "Preparing preview…" + msgstr "முன்னோட்டத்தைத் தயார்செய்கிறது…" + +@@ -494,7 +484,6 @@ msgstr "முடிக்கிறத� + + #: ../libview/ev-print-operation.c:354 + #, c-format +-#| msgid "Printing page %d of %d…" + msgid "Generating preview: page %d of %d" + msgstr "முன்னோட்டத்தை உருவாக்குகிறது: பக்கம் %d / %d" + +@@ -509,7 +498,6 @@ msgid "Printing page %d of %d…" + msgstr "பக்கம் %d இல் %dஐ அச்சிடுகிறது" + + #: ../libview/ev-print-operation.c:1214 +-#| msgid "PostScript is not supported by this printer." + msgid "Requested format is not supported by this printer." + msgstr "கோரிய வடிவமைப்பை இந்த அச்சுப்பொறி ஆதரிக்கவில்லை." + +@@ -556,18 +544,15 @@ msgid "" + "• \"Fit to Printable Area\": Document pages are enlarged or reduced as " + "required to fit the printable area of the printer page.\n" + msgstr "" +-"தேர்ந்தெடுத்த அச்சுப்பொறிக்கு ஆவண பக்கங்களை பொருத்த மறு அளவீடு செய்க. கீழ் " +-"கண்டவற்றில் " ++"தேர்ந்தெடுத்த அச்சுப்பொறிக்கு ஆவண பக்கங்களை பொருத்த மறு அளவீடு செய்க. கீழ் கண்டவற்றில் " + "ஏதேனும் ஒன்றை தேர்வு செய்க:\n" + "\n" + "• \"ஏதுமில்லை\": மறு அளவீடு இல்லை.\n" + "\n" +-"• \"அச்சுப்பரப்புக்கு சுருக்கு\": அச்சிடக்கூடிய அளவுக்கு அதிகமாக ஆவண அளவு " +-"இருப்பின் " ++"• \"அச்சுப்பரப்புக்கு சுருக்கு\": அச்சிடக்கூடிய அளவுக்கு அதிகமாக ஆவண அளவு இருப்பின் " + "அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க அளவுக்கு மறு அளவு செய்யப்படும்..\n" + "\n" +-"• \"அச்சிடக்கூடிய பரப்புக்கு பொருத்துக\": அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க " +-"அளவுக்கு " ++"• \"அச்சிடக்கூடிய பரப்புக்கு பொருத்துக\": அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க அளவுக்கு " + "ஆவண பக்கம் சுருக்கவோ நீட்டவோ செய்யப்படும்.\n" + + #: ../libview/ev-print-operation.c:1984 +@@ -579,8 +564,7 @@ msgid "" + "Rotate printer page orientation of each page to match orientation of each " + "document page. Document pages will be centered within the printer page." + msgstr "" +-"ஒவ்வொரு ஆவண பக்கத்தின் திசையையும் ஒத்திசைய அச்சுப்பொறி பக்க திஅசை பொருத்தத்தை " +-"மாற்றுக. " ++"ஒவ்வொரு ஆவண பக்கத்தின் திசையையும் ஒத்திசைய அச்சுப்பொறி பக்க திஅசை பொருத்தத்தை மாற்றுக. " + "ஆவண பக்கங்கள் அச்சுப்பொறி பக்கத்திற்கு மையப்படுத்தப்படும்." + + #: ../libview/ev-print-operation.c:1992 +@@ -591,8 +575,7 @@ msgstr "ஆவண பக்க அளவ + msgid "" + "When enabled, each page will be printed on the same size paper as the " + "document page." +-msgstr "" +-"இயலுமை செய்யின் ஒவ்வொரு பக்கமும் ஆவண பக்கத்தின் அதே அளவில் அச்சிடப்படும்." ++msgstr "இயலுமை செய்யின் ஒவ்வொரு பக்கமும் ஆவண பக்கத்தின் அதே அளவில் அச்சிடப்படும்." + + #: ../libview/ev-print-operation.c:2094 + msgid "Page Handling" +@@ -921,12 +904,9 @@ msgid "" + "Foundation; either version 2 of the License, or (at your option) any later " + "version.\n" + msgstr "" +-"இவின்ஸ் ஒரு இலவச மென்பொருளாகும் நீங்கள் இதனை வேறு நபருக்கு கொடுக்கலாம்மற்றும் " +-"Free " +-"Software Foundation ஆல் வெளியிடப்பட்ட GNU General Public License " +-"ன்விதிமுறையின் " +-"அடிப்படையில் அங்கீகாரத்தின் பதிப்பு 2 அல்லது(உங்கள் விருப்பப்படி) அதற்கடுத்த " +-"பதிப்புகளில் " ++"இவின்ஸ் ஒரு இலவச மென்பொருளாகும் நீங்கள் இதனை வேறு நபருக்கு கொடுக்கலாம்மற்றும் Free " ++"Software Foundation ஆல் வெளியிடப்பட்ட GNU General Public License ன்விதிமுறையின் " ++"அடிப்படையில் அங்கீகாரத்தின் பதிப்பு 2 அல்லது(உங்கள் விருப்பப்படி) அதற்கடுத்த பதிப்புகளில் " + "மாற்றலாம்.\n" + + #: ../shell/ev-application.c:999 +@@ -936,10 +916,8 @@ msgid "" + "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more " + "details.\n" + msgstr "" +-"இவின்ஸ், பயனுள்ளதாக இருக்கும் என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளதுஆனால் " +-"எந்த உத்தரவாதமும் " +-"கிடையாது; குறிப்பிட்ட காரணங்களுக்காக வணிகஉத்தரவாதம் கூட " +-"செயல்படுத்தப்படவில்லை. மேலும் " ++"இவின்ஸ், பயனுள்ளதாக இருக்கும் என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளதுஆனால் எந்த உத்தரவாதமும் " ++"கிடையாது; குறிப்பிட்ட காரணங்களுக்காக வணிகஉத்தரவாதம் கூட செயல்படுத்தப்படவில்லை. மேலும் " + "விவரங்களுக்குGNU General Public License ஐ பார்க்கவும்.\n" + + #: ../shell/ev-application.c:1003 +@@ -948,8 +926,7 @@ msgid "" + "Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " + "Street, Fifth Floor, Boston, MA 02110-1301 USA\n" + msgstr "" +-"நீங்கள் GNU General Public Licenseன் ஒரு நகலை இவின்ஸுடன் பெற்றிருக்க " +-"வேண்டும். அவ்வாறு " ++"நீங்கள் GNU General Public Licenseன் ஒரு நகலை இவின்ஸுடன் பெற்றிருக்க வேண்டும். அவ்வாறு " + "பெறாவிட்டால், Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, " + "Boston, MA 02111-1301 USA என்பதற்கு எழுதவும்\n" + +@@ -958,7 +935,6 @@ msgid "Evince" + msgstr "இவின்ஸ்" + + #: ../shell/ev-application.c:1026 +-#| msgid "© 1996–2012 The Evince authors" + msgid "© 1996–2014 The Evince authors" + msgstr "© 1996–2014 The Evince authors" + +@@ -990,8 +966,7 @@ msgid "" + "This document is locked and can only be read by entering the correct " + "password." + msgstr "" +-"இந்த ஆவணம் பூட்டப்பட்டுள்ளது மற்றும் சரியான கடவுச்சொல்லை உள்ளிட்டால் தான் " +-"படிக்க முடியும்." ++"இந்த ஆவணம் பூட்டப்பட்டுள்ளது மற்றும் சரியான கடவுச்சொல்லை உள்ளிட்டால் தான் படிக்க முடியும்." + + #: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 + msgid "_Unlock Document" +@@ -1006,8 +981,7 @@ msgstr "கடவுச்சொல்� + msgid "" + "The document “%s” is locked and requires a password before it can be opened." + msgstr "" +-"ஆவணம் “%s” பூட்டப்பட்டுள்ளது மற்றும் அதனை திறப்பதற்கு முன் கடவுச்சொல் " +-"தேவைப்படுகிறது." ++"ஆவணம் “%s” பூட்டப்பட்டுள்ளது மற்றும் அதனை திறப்பதற்கு முன் கடவுச்சொல் தேவைப்படுகிறது." + + #: ../shell/ev-password-view.c:303 + msgid "Password required" +@@ -1144,12 +1118,10 @@ msgid "Find a word or phrase in the docu + msgstr "ஆவணத்தில் ஒரு சொல் அல்லது சொற்றொடரை தேடுகிறது" + + #: ../shell/ev-toolbar.c:247 ../shell/ev-toolbar.c:248 +-#| msgid "Find options" + msgid "File options" + msgstr "கோப்பு விருப்பங்கள்" + + #: ../shell/ev-toolbar.c:257 ../shell/ev-toolbar.c:258 +-#| msgid "Find options" + msgid "View options" + msgstr "காட்சி விருப்பங்கள்" + +@@ -1261,8 +1233,7 @@ msgid "" + "Document contains form fields that have been filled out. If you don't save a " + "copy, changes will be permanently lost." + msgstr "" +-"ஆவணத்தில் நிரப்பப்பட்ட படிவபுலங்கள் உள்ளன. நீங்கள் ஒரு பிரதியை " +-"சேமிக்காவிட்டால் மாற்றங்கள் " ++"ஆவணத்தில் நிரப்பப்பட்ட படிவபுலங்கள் உள்ளன. நீங்கள் ஒரு பிரதியை சேமிக்காவிட்டால் மாற்றங்கள் " + "நிரந்தரமாக இழக்கப்படும்." + + #: ../shell/ev-window.c:3587 +@@ -1270,8 +1241,7 @@ msgid "" + "Document contains new or modified annotations. If you don't save a copy, " + "changes will be permanently lost." + msgstr "" +-"ஆவணத்தில் புதிய அல்லது மாற்றப்பட்ட வியாக்கியானங்கள் உள்ளன. நீங்கள் ஒரு " +-"பிரதியை " ++"ஆவணத்தில் புதிய அல்லது மாற்றப்பட்ட வியாக்கியானங்கள் உள்ளன. நீங்கள் ஒரு பிரதியை " + "சேமிக்காவிட்டால் மாற்றங்கள் நிரந்தரமாக இழக்கப்படும்." + + #: ../shell/ev-window.c:3594 +@@ -1347,21 +1317,15 @@ msgid "_Enable" + msgstr "செயல்படுத்து (_E)" + + #: ../shell/ev-window.c:5517 +-#| msgid "" +-#| "Pressing F7 turns the caret navigation on or off. This feature places a " +-#| "moveable cursor in text pages, allowing you to move around and select " +-#| "text with your keyboard. Do you want to enable the caret navigation on?" + msgid "" + "Pressing F7 turns the caret navigation on or off. This feature places a " + "moveable cursor in text pages, allowing you to move around and select text " + "with your keyboard. Do you want to enable the caret navigation?" + msgstr "" +-"F7 ஐ அழுத்தினால், சுட்டி வழிசெலுத்தல் இயக்கப்படும் அல்லது அணைக்கப்படும். இந்த " +-"வசதியானது " +-"உரைப் பக்கங்களில் நகர்த்தக்கூடிய ஒரு சுட்டியை இடம்பெறச் செய்யும், இதைக் " +-"கொண்டு நீங்கள் " +-"தேர்ந்தெடுத்த உரையில் விசைப்பலகையைப் பயன்படுத்தி நகரலாம். சுட்டி வழிசெலுத்தலை " +-"இயக்க வேண்டுமா?" ++"F7 ஐ அழுத்தினால், சுட்டி வழிசெலுத்தல் இயக்கப்படும் அல்லது அணைக்கப்படும். இந்த வசதியானது " ++"உரைப் பக்கங்களில் நகர்த்தக்கூடிய ஒரு சுட்டியை இடம்பெறச் செய்யும், இதைக் கொண்டு நீங்கள் " ++"தேர்ந்தெடுத்த உரையில் விசைப்பலகையைப் பயன்படுத்தி நகரலாம். சுட்டி வழிசெலுத்தலை இயக்க " ++"வேண்டுமா?" + + #: ../shell/ev-window.c:5522 + msgid "Don't show this message again" +@@ -1400,12 +1364,10 @@ msgid "Save Attachment" + msgstr "இணைப்புகளை சேமி" + + #: ../shell/ev-window-title.c:118 +-#| msgid "Open Document" + msgid "Recent Documents" + msgstr "சமீபத்திய ஆவணங்கள்" + + #: ../shell/ev-window-title.c:153 ../shell/ev-window-title.c:157 +-#| msgid "Password required" + msgid "Password Required" + msgstr "கடவுச்சொல் தேவைப்படுகிறது" + +@@ -1518,7 +1480,6 @@ msgid "[FILE…]" + msgstr "[FILE...]" + + #: ../shell/evince-menus.ui.h:1 +-#| msgid "Open in New _Window" + msgid "_New Window" + msgstr "புதிய சாளரம் (_N)" + +@@ -1559,32 +1520,26 @@ msgid "Rotate _Right" + msgstr "வலப்பக்கம் சுழற்று (_R) " + + #: ../shell/evince-menus.ui.h:11 +-#| msgid "_First Page" + msgid "First Page" + msgstr "முதல் பக்கம்" + + #: ../shell/evince-menus.ui.h:12 +-#| msgid "_Previous Page" + msgid "Previous Page" + msgstr "முந்தைய பக்கம்" + + #: ../shell/evince-menus.ui.h:13 +-#| msgid "_Next Page" + msgid "Next Page" + msgstr "அடுத்த பக்கம்" + + #: ../shell/evince-menus.ui.h:14 +-#| msgid "_Last Page" + msgid "Last Page" + msgstr "கடைசி பக்கம்" + + #: ../shell/evince-menus.ui.h:15 +-#| msgid "Zoom In" + msgid "Zoom _In" + msgstr "பெரிதாக்கு (_I)" + + #: ../shell/evince-menus.ui.h:16 +-#| msgid "Zoom Out" + msgid "Zoom _Out" + msgstr "சிறிதாக்கு (_O)" + +@@ -1625,7 +1580,6 @@ msgid "_Print…" + msgstr "_P அச்சிடு." + + #: ../shell/evince-menus.ui.h:26 +-#| msgid "P_roperties" + msgid "P_roperties…" + msgstr "பண்புகள் (_r)…" + +@@ -1646,7 +1600,6 @@ msgid "_Add Bookmark" + msgstr "_A புத்தகக்குறியை சேர்" + + #: ../shell/evince-menus.ui.h:31 +-#| msgid "Close" + msgid "_Close" + msgstr "மூடு (_C)" + +@@ -1691,7 +1644,6 @@ msgid "Annotation Properties…" + msgstr "வியாக்கியான பண்புகள்..." + + #: ../shell/evince-menus.ui.h:47 +-#| msgid "Annotations" + msgid "Remove Annotation" + msgstr "வியாக்கியானத்தை நீக்கு" + +@@ -1708,8 +1660,8 @@ msgid "" + "It supports the following document formats: PDF, PS, EPS, XPS, DjVu, TIFF, " + "DVI (with SyncTeX), and Comic Books archives (CBR, CBT, CBZ, CB7)." + msgstr "" +-"இது இந்த ஆவண வடிவமைப்புகளை ஆதரிக்கிறது: PDF, PS, EPS, XPS, DjVu, TIFF, " +-"DVI (SyncTeX உடனானது) மற்றும் Comic Books காப்பகங்கள் (CBR, CBT, CBZ, CB7)." ++"இது இந்த ஆவண வடிவமைப்புகளை ஆதரிக்கிறது: PDF, PS, EPS, XPS, DjVu, TIFF, DVI " ++"(SyncTeX உடனானது) மற்றும் Comic Books காப்பகங்கள் (CBR, CBT, CBZ, CB7)." + + #~ msgid "File is not a valid .desktop file" + #~ msgstr "கோப்பு செல்லுபடியாகும் .desktop கோப்பு அல்ல" +@@ -1772,7 +1724,6 @@ msgstr "" + #~ msgid "Save a copy of the current document" + #~ msgstr "நடப்பு ஆவணத்தின் ஒரு நகலை சேமிக்கவும்" + +-#~| msgid "Send current document by mail, instant message..." + #~ msgid "Send current document by mail, instant message…" + #~ msgstr "நடப்பு ஆவணத்தை அஞ்சலில் அனுப்பு, உடனடி செய்தி மூலம் அனுப்பு...." + diff --git a/SOURCES/evince-3.8.3-get-selection-rectangles.patch b/SOURCES/evince-3.8.3-get-selection-rectangles.patch deleted file mode 100644 index 220d5bf..0000000 --- a/SOURCES/evince-3.8.3-get-selection-rectangles.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/libview/ev-view.c b/libview/ev-view.c -index 74b2781..085c9e3 100644 ---- a/libview/ev-view.c -+++ b/libview/ev-view.c -@@ -6342,20 +6342,22 @@ merge_selection_region (EvView *view, - region = NULL; - } else { - gint num_rectangles = cairo_region_num_rectangles (region); -- GdkRectangle r; -+ GdkRectangle r1, r2; - - /* We need to make the damage region a little bigger - * because the edges of the old selection might change - */ -- cairo_region_get_rectangle (region, 0, &r); -- r.x -= 5; -- r.width = 5; -- cairo_region_union_rectangle (region, &r); -- -- cairo_region_get_rectangle (region, num_rectangles - 1, &r); -- r.x += r.width; -- r.width = 5; -- cairo_region_union_rectangle (region, &r); -+ cairo_region_get_rectangle (region, 0, &r1); -+ cairo_region_get_rectangle (region, num_rectangles - 1, &r2); -+ -+ r1.x -= 5; -+ r1.width = 5; -+ -+ r2.x += r2.width; -+ r2.width = 5; -+ -+ cairo_region_union_rectangle (region, &r1); -+ cairo_region_union_rectangle (region, &r2); - } - } else if (old_sel->covered_region) { - region = cairo_region_copy (old_sel->covered_region); diff --git a/SOURCES/evince-3.8.3-sendto.patch b/SOURCES/evince-3.8.3-sendto.patch deleted file mode 100644 index ddd52c5..0000000 --- a/SOURCES/evince-3.8.3-sendto.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- evince-3.8.3/shell/ev-window.c -+++ evince-3.8.3/shell/ev-window.c -@@ -228,6 +228,9 @@ struct _EvWindowPrivate { - #endif - - guint presentation_mode_inhibit_id; -+ -+ /* Send to */ -+ gboolean has_mailto_handler; - }; - - #define EV_WINDOW_GET_PRIVATE(object) \ -@@ -456,7 +459,8 @@ ev_window_setup_action_sensitivity (EvWi - ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print); - ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties); - ev_window_set_action_sensitive (ev_window, "FileOpenContainingFolder", has_document); -- ev_window_set_action_sensitive (ev_window, "FileSendTo", has_document); -+ ev_window_set_action_sensitive (ev_window, "FileSendTo", -+ has_document && ev_window->priv->has_mailto_handler); - ev_window_set_action_sensitive (ev_window, "ViewPresentation", has_document); - - /* Edit menu */ -@@ -7025,6 +7029,7 @@ ev_window_init (EvWindow *ev_window) - GDBusConnection *connection; - static gint window_id = 0; - #endif -+ GAppInfo *app_info; - - g_signal_connect (ev_window, "configure_event", - G_CALLBACK (window_configure_event_cb), NULL); -@@ -7075,6 +7080,10 @@ ev_window_init (EvWindow *ev_window) - G_CALLBACK (activate_link_cb), - ev_window); - -+ app_info = g_app_info_get_default_for_uri_scheme ("mailto"); -+ ev_window->priv->has_mailto_handler = app_info != NULL; -+ g_clear_object (&app_info); -+ - ev_window->priv->main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (ev_window), ev_window->priv->main_box); - gtk_widget_show (ev_window->priv->main_box); diff --git a/SOURCES/evince-3.8.3-translation-updates.patch b/SOURCES/evince-3.8.3-translation-updates.patch deleted file mode 100644 index 4553ef0..0000000 --- a/SOURCES/evince-3.8.3-translation-updates.patch +++ /dev/null @@ -1,4474 +0,0 @@ -diff -urN a/evince-3.8.3/po/bn_IN.po b/evince-3.8.3/po/bn_IN.po ---- a/evince-3.8.3/po/bn_IN.po 2013-11-28 15:11:09.975890744 +0530 -+++ b/evince-3.8.3/po/bn_IN.po 2013-11-28 15:11:55.772298642 +0530 -@@ -2,28 +2,29 @@ - # Bengali India translation of Evince. - # Copyright (C) 1996-2006 The Evince authors. - # This file is distributed under the same license as the Evince package. --# -+# - # Progga , 2005-2006. - # Runa Bhattacharjee , 2006. - # Runa Bhattacharjee , 2008. - # Runa Bhattacharjee , 2009, 2010, 2011, 2012. -+# sray , 2013. #zanata - msgid "" - msgstr "" - "Project-Id-Version: bn_IN\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evince&keywords=I18N+L10N&component=general\n" -+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=" -+"evince&keywords=I18N+L10N&component=general\n" - "POT-Creation-Date: 2012-09-05 13:12+0000\n" --"PO-Revision-Date: 2012-09-21 00:29+0530\n" --"Last-Translator: Runa Bhattacharjee \n" -+"PO-Revision-Date: 2013-10-03 05:12-0400\n" -+"Last-Translator: sray \n" - "Language-Team: Bengali (India) \n" --"Language: \n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"Language: bn-IN\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" - "\n" - "\n" --"X-Generator: Lokalize 1.2\n" -+"X-Generator: Zanata 3.1.2\n" - - #: ../backend/comics/comics-document.c:210 - #, c-format -@@ -47,8 +48,10 @@ - msgstr "কমিক বইয়ের ধরনের MIME type নয়: %s" - - #: ../backend/comics/comics-document.c:433 --msgid "Can't find an appropriate command to decompress this type of comic book" --msgstr "এই প্রকৃতির কমিক বই ডিকম্প্রেস করার উদ্দেশ্যে যথাযত কমান্ড পাওয়া যায়নি" -+msgid "" -+"Can't find an appropriate command to decompress this type of comic book" -+msgstr "" -+"এই প্রকৃতির কমিক বই ডিকম্প্রেস করার উদ্দেশ্যে যথাযত কমান্ড পাওয়া যায়নি" - - #: ../backend/comics/comics-document.c:488 - msgid "File corrupted" -@@ -77,18 +80,17 @@ - msgid "Comic Books" - msgstr "কমিক-বই" - --#: ../backend/djvu/djvu-document.c:170 -+#: ../backend/djvu/djvu-document.c:168 - msgid "DjVu document has incorrect format" - msgstr "DjVu ডকুমেন্টের বিন্যাস সঠিক নয়" - --#: ../backend/djvu/djvu-document.c:247 -+#: ../backend/djvu/djvu-document.c:245 - msgid "" - "The document is composed of several files. One or more of these files cannot " - "be accessed." - msgstr "" - "একাধিক ফাইল একত্রিত করে এই ডকুমেন্ট নির্মিত হয়েছে ও এর মধ্যে এক অথবা একাধিক " --"ফাইল " --"ব্যবহার করা সম্ভব নয়।" -+"ফাইল ব্যবহার করা সম্ভব নয়।" - - #: ../backend/djvu/djvudocument.evince-backend.in.h:1 - msgid "DjVu Documents" -@@ -102,80 +104,121 @@ - msgid "DVI Documents" - msgstr "DVI ডকুমেন্ট" - --#: ../backend/pdf/ev-poppler.cc:639 -+#: ../backend/pdf/ev-poppler.cc:640 - msgid "This work is in the Public Domain" - msgstr "এই ডকুমেন্টের তথ্য সার্বজনীন রূপে উপলব্ধ রয়েছে" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:892 ../backend/pdf/ev-poppler.cc:898 -+#: ../backend/pdf/ev-poppler.cc:893 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "Yes" - msgstr "হ্যাঁ" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:895 ../backend/pdf/ev-poppler.cc:898 -+#: ../backend/pdf/ev-poppler.cc:896 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "No" - msgstr "না" - --#: ../backend/pdf/ev-poppler.cc:1032 -+#: ../backend/pdf/ev-poppler.cc:1033 - msgid "Type 1" - msgstr "Type 1" - --#: ../backend/pdf/ev-poppler.cc:1034 -+#: ../backend/pdf/ev-poppler.cc:1035 - msgid "Type 1C" - msgstr "Type 1C" - --#: ../backend/pdf/ev-poppler.cc:1036 -+#: ../backend/pdf/ev-poppler.cc:1037 - msgid "Type 3" - msgstr "Type 3" - --#: ../backend/pdf/ev-poppler.cc:1038 -+#: ../backend/pdf/ev-poppler.cc:1039 - msgid "TrueType" - msgstr "TrueType" - --#: ../backend/pdf/ev-poppler.cc:1040 -+#: ../backend/pdf/ev-poppler.cc:1041 - msgid "Type 1 (CID)" - msgstr "Type 1 (CID)" - --#: ../backend/pdf/ev-poppler.cc:1042 -+#: ../backend/pdf/ev-poppler.cc:1043 - msgid "Type 1C (CID)" - msgstr "Type 1C (CID)" - --#: ../backend/pdf/ev-poppler.cc:1044 -+#: ../backend/pdf/ev-poppler.cc:1045 - msgid "TrueType (CID)" - msgstr "TrueType (CID)" - --#: ../backend/pdf/ev-poppler.cc:1046 -+#: ../backend/pdf/ev-poppler.cc:1047 - msgid "Unknown font type" - msgstr "ফন্টের ধরন অজানা" - --#: ../backend/pdf/ev-poppler.cc:1077 -+#: ../backend/pdf/ev-poppler.cc:1091 -+msgid "" -+"This document contains non-embedded fonts that are not from the PDF Standard " -+"14 fonts. If the substitute fonts selected by fontconfig are not the same as " -+"the fonts used to create the PDF, the rendering may not be correct." -+msgstr "" -+"এই নথিতে নন-এম্বেড করা ফন্ট রয়েছে যা PDF স্ট্যান্ডার্ড 14 ফন্ট ভুক্ত নয়। " -+"fontconfig দ্বারা নির্বাচিত বিকল্প ফন্টগুলি এবং PDF তৈরি করতে ব্যবহৃত " -+"ফন্টগুলি এক না হলে, রেন্ডারিং সঠিক নাও হতে পারে।" -+ -+#: ../backend/pdf/ev-poppler.cc:1096 -+msgid "All fonts are either standard or embedded." -+msgstr "সকল ফন্ট হয় স্ট্যান্ডার্ড বা এম্বেড করা।" -+ -+#: ../backend/pdf/ev-poppler.cc:1128 - msgid "No name" - msgstr "নামবিহীন" - --#: ../backend/pdf/ev-poppler.cc:1082 ../properties/ev-properties-view.c:187 --#: ../libview/ev-print-operation.c:1893 -+#. translators: When a font type does not have -+#. encoding information or it is unknown. Example: -+#. Encoding: None -+#. translators: Value for 'Page Scaling:' to not scale the document pages on printing -+#. translators: This is used when a document property does -+#. not have a value. Examples: -+#. Author: None -+#. Keywords: None -+#: ../backend/pdf/ev-poppler.cc:1137 -+#: ../libview/ev-print-operation.c:1907 -+#: ../properties/ev-properties-view.c:192 - msgid "None" - msgstr "শূণ্য" - --#: ../backend/pdf/ev-poppler.cc:1089 -+#: ../backend/pdf/ev-poppler.cc:1145 - msgid "Embedded subset" - msgstr "এমবেড করা সাব-সেট" - --#: ../backend/pdf/ev-poppler.cc:1091 -+#: ../backend/pdf/ev-poppler.cc:1147 - msgid "Embedded" - msgstr "এমবেড করা" - --#: ../backend/pdf/ev-poppler.cc:1093 -+#: ../backend/pdf/ev-poppler.cc:1149 - msgid "Not embedded" - msgstr "এমবেড করা নয়" - --#: ../backend/pdf/ev-poppler.cc:1098 -+#. Translators: string starting with a space -+#. * because it is directly appended to the font -+#. * type. Example: -+#. * "Type 1 (One of the Standard 14 Fonts)" -+#: ../backend/pdf/ev-poppler.cc:1156 -+msgid " (One of the Standard 14 Fonts)" -+msgstr " (স্ট্যান্ডার্ড 14 ফন্টগুলির একটি)" -+ -+#. Translators: string starting with a space -+#. * because it is directly appended to the font -+#. * type. Example: -+#. * "TrueType (Not one of the Standard 14 Fonts)" -+#: ../backend/pdf/ev-poppler.cc:1163 -+msgid " (Not one of the Standard 14 Fonts)" -+msgstr " (স্ট্যান্ডার্ড 14 ফন্টের একটি নয়)" -+ -+#: ../backend/pdf/ev-poppler.cc:1170 - msgid "Encoding" - msgstr "এনকোডিং" - --#: ../backend/pdf/ev-poppler.cc:1099 --msgid "substituting with" --msgstr "প্রতিস্থাপনের তথ্য" -+#: ../backend/pdf/ev-poppler.cc:1171 -+msgid "Substituting with" -+msgstr "পরিবর্তে" - - #: ../backend/pdf/pdfdocument.evince-backend.in.h:1 - msgid "PDF Documents" -@@ -200,59 +243,13 @@ - msgstr "ডকুমেন্ট বৈধ নয়" - - #: ../backend/tiff/tiffdocument.evince-backend.in.h:1 --#| msgid "PDF Documents" - msgid "TIFF Documents" - msgstr "TIFF ডকুমেন্ট" - - #: ../backend/xps/xpsdocument.evince-backend.in.h:1 --#| msgid "PDF Documents" - msgid "XPS Documents" - msgstr "XPS ডকুমেন্ট" - --#: ../libdocument/ev-attachment.c:310 ../libdocument/ev-attachment.c:331 --#, c-format --msgid "Couldn't save attachment “%s”: %s" --msgstr "সংযুক্ত বস্তু “%s” সংরক্ষণ করতে ব্যর্থ: %s" -- --#: ../libdocument/ev-attachment.c:379 --#, c-format --msgid "Couldn't open attachment “%s”: %s" --msgstr "সংয়ুক্ত বস্তু “%s” খুলতে ব্যর্থ: %s" -- --#: ../libdocument/ev-attachment.c:414 --#, c-format --msgid "Couldn't open attachment “%s”" --msgstr "সংযুক্ত বস্তু “%s” খুলতে ব্যর্থ" -- --#: ../libdocument/ev-document-factory.c:101 --#, c-format --msgid "File type %s (%s) is not supported" --msgstr "%s (%s) ধরনের ফাইল সমর্থিত নয়" -- --#: ../libdocument/ev-document-factory.c:364 --#: ../libdocument/ev-file-helpers.c:490 ../libdocument/ev-file-helpers.c:536 --#: ../libdocument/ev-file-helpers.c:555 --msgid "Unknown MIME Type" --msgstr "অজানা MIME'র ধরন" -- --#: ../libdocument/ev-document-factory.c:552 --msgid "All Documents" --msgstr "সকল ডকুমেন্ট" -- --#: ../libdocument/ev-document-factory.c:579 --msgid "All Files" --msgstr "সকল ফাইল" -- --#: ../libdocument/ev-file-helpers.c:146 --#, c-format --msgid "Failed to create a temporary file: %s" --msgstr "অস্থায়ী ফাইল প্রস্তুত করতে ব্যর্থ: %s" -- --#: ../libdocument/ev-file-helpers.c:308 --#, c-format --msgid "Failed to create a temporary directory: %s" --msgstr "অস্থায়ী ডিরেক্টরি নির্মাণ করতে ব্যর্থ: %s" -- - #: ../cut-n-paste/smclient/eggdesktopfile.c:165 - #, c-format - msgid "File is not a valid .desktop file" -@@ -286,7 +283,8 @@ - #: ../cut-n-paste/smclient/eggdesktopfile.c:1391 - #, c-format - msgid "Can't pass document URIs to a 'Type=Link' desktop entry" --msgstr "'Type=Link' ডেস্কটপ এনট্রির ক্ষেত্রে নথিপত্রের URI উল্লেখ করা সম্ভব নয়" -+msgstr "" -+"'Type=Link' ডেস্কটপ এনট্রির ক্ষেত্রে নথিপত্রের URI উল্লেখ করা সম্ভব নয়" - - #: ../cut-n-paste/smclient/eggdesktopfile.c:1412 - #, c-format -@@ -301,7 +299,7 @@ - msgid "Specify file containing saved configuration" - msgstr "সংরক্ষিত কনফিগারেশন ধারণকারী ফাইল উল্লেখ করুন" - --#: ../cut-n-paste/smclient/eggsmclient.c:229 ../previewer/ev-previewer.c:45 -+#: ../cut-n-paste/smclient/eggsmclient.c:229 - #: ../previewer/ev-previewer.c:46 - msgid "FILE" - msgstr "FILE" -@@ -322,114 +320,11 @@ - msgid "Show session management options" - msgstr "সেশান পরিচালনা সংক্রান্ত বিকল্প প্রদর্শন করা হবে" - --#. Translaters: This string is for a toggle to display a toolbar. --#. * The name of the toolbar is automatically computed from the widgets --#. * on the toolbar, and is placed at the %s. Note the _ before the %s --#. * which is used to add mnemonics. We know that this is likely to --#. * produce duplicates, but don't worry about it. If your language --#. * normally has a mnemonic at the start, please use the _. If not, --#. * please remove. --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:992 --#, c-format --msgid "Show “_%s”" --msgstr "“%s” প্রদর্শন করা হবে" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1485 --msgid "_Move on Toolbar" --msgstr "টুল-বারের মধ্যে স্থান পরিবর্তন করুন (_M)" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1486 --msgid "Move the selected item on the toolbar" --msgstr "টুল-বারের মধ্যে নির্বাচিত বস্তুর স্থান পরিবর্তন করুন" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1487 --msgid "_Remove from Toolbar" --msgstr "টুল-বার থেকে মুছে ফেলুন (_R)" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1488 --msgid "Remove the selected item from the toolbar" --msgstr "টুল-বার থেকে নির্বাচিত বস্তু মুছে ফেলুন" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1489 --msgid "_Delete Toolbar" --msgstr "টুল-বার মুছে ফেলুন (_D)" -- --#: ../cut-n-paste/toolbar-editor/egg-editable-toolbar.c:1490 --msgid "Remove the selected toolbar" --msgstr "নির্বাচিত টুল-বার মুছে ফেলুন" -- --#: ../cut-n-paste/toolbar-editor/egg-toolbar-editor.c:489 --msgid "Separator" --msgstr "বিভাজক" -- --#. translators: this is the label for toolbar button --#: ../cut-n-paste/zoom-control/ephy-zoom.h:48 ../shell/ev-window.c:6263 --msgid "Best Fit" --msgstr "সর্বোত্তম মাপ" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:49 --msgid "Fit Page Width" --msgstr "পৃষ্ঠার প্রস্থ অনুযায়ী মাপ নির্ধারণ" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:51 --msgid "50%" --msgstr "৫০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:52 --msgid "70%" --msgstr "৭০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:53 --msgid "85%" --msgstr "৮৫%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:54 --msgid "100%" --msgstr "১০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:55 --msgid "125%" --msgstr "১২৫%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:56 --msgid "150%" --msgstr "১৫০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:57 --msgid "175%" --msgstr "১৭৫%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:58 --msgid "200%" --msgstr "২০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:59 --msgid "300%" --msgstr "৩০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:60 --msgid "400%" --msgstr "৪০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:61 --msgid "800%" --msgstr "৮০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:62 --msgid "1600%" --msgstr "১৬০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:63 --msgid "3200%" --msgstr "৩২০০%" -- --#: ../cut-n-paste/zoom-control/ephy-zoom.h:64 --msgid "6400%" --msgstr "৬৪০০%" -- - #. Manually set name and icon --#: ../data/evince.desktop.in.in.h:1 ../shell/ev-window.c:5009 --#: ../shell/ev-window-title.c:156 ../shell/main.c:312 -+#: ../data/evince.desktop.in.in.h:1 -+#: ../shell/ev-window.c:4867 -+#: ../shell/ev-window-title.c:156 -+#: ../shell/main.c:312 - #, c-format - msgid "Document Viewer" - msgstr "ডকুমেন্ট প্রদর্শন ব্যবস্থা" -@@ -438,6 +333,18 @@ - msgid "View multi-page documents" - msgstr "একাধিক পৃষ্ঠাবিশিষ্ট ডকুমেন্ট দেখুন" - -+#: ../data/evince.desktop.in.in.h:3 -+msgid "pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;" -+msgstr "pdf;ps;পোস্টস্ক্রীপ্ট;dvi;xps;djvu;tiff;নথি;উপস্থাপনা;" -+ -+#: ../data/evince-previewer.desktop.in.in.h:1 -+msgid "Print Preview" -+msgstr "প্রিন্টের পূর্বরূপ" -+ -+#: ../data/evince-previewer.desktop.in.in.h:2 -+msgid "Preview before printing" -+msgstr "প্রিন্ট করার অাগে দেখে নিন" -+ - #: ../data/org.gnome.Evince.gschema.xml.in.h:1 - msgid "Override document restrictions" - msgstr "ডকুমেন্টের ক্ষেত্র ধার্য নিষেধাজ্ঞা অগ্রাহ্য করা হবে" -@@ -445,11 +352,10 @@ - #: ../data/org.gnome.Evince.gschema.xml.in.h:2 - msgid "Override document restrictions, like restriction to copy or to print." - msgstr "" --"ডকুমেন্টের ক্ষেত্র ধার্য নিষেধাজ্ঞা যেমন কপি অথবা প্রিন্ট সংক্রান্ত, অগ্রাহ্য " --"করা হবে।" -+"ডকুমেন্টের ক্ষেত্র ধার্য নিষেধাজ্ঞা যেমন কপি অথবা প্রিন্ট সংক্রান্ত, " -+"অগ্রাহ্য করা হবে।" - - #: ../data/org.gnome.Evince.gschema.xml.in.h:3 --#| msgid "Reload the document" - msgid "Automatically reload the document" - msgstr "স্বয়ংক্রিয়ভাবে ডকুমেন্ট পুনরায় লোড করা হবে" - -@@ -465,246 +371,130 @@ - msgid "The URI of the directory last used to save a picture" - msgstr "ছবি সংরক্ষণের জন্য সর্বশেষ ব্যবহৃত ডিরেক্টরির URI" - --#: ../previewer/ev-previewer.c:44 --msgid "Delete the temporary file" --msgstr "অস্থায়ী ফাইল মুছে ফেলুন" -- --# প্রিন্টের বৈশিষ্ট্য সম্বলিত ফাইল --#: ../previewer/ev-previewer.c:45 --msgid "Print settings file" --msgstr "প্রিন্টের বৈশিষ্ট্য সম্বলিত ফাইল" -- --#: ../previewer/ev-previewer.c:140 ../previewer/ev-previewer.c:174 --msgid "GNOME Document Previewer" --msgstr "GNOME Document Previewer" -- --#: ../previewer/ev-previewer-window.c:91 ../shell/ev-window.c:3404 --msgid "Failed to print document" --msgstr "ডকুমেন্ট প্রিন্ট করতে ব্যর্থ" -- --#: ../previewer/ev-previewer-window.c:237 -+#: ../libdocument/ev-attachment.c:310 -+#: ../libdocument/ev-attachment.c:331 - #, c-format --msgid "The selected printer '%s' could not be found" --msgstr "নির্বাচিত প্রিন্টার '%s' পাওয়া যায়নি" -- --#. Go menu --#: ../previewer/ev-previewer-window.c:284 ../shell/ev-window.c:5947 --msgid "_Previous Page" --msgstr "পূর্ববর্তী পৃষ্ঠা (_P)" -- --#: ../previewer/ev-previewer-window.c:285 ../shell/ev-window.c:5948 --msgid "Go to the previous page" --msgstr "পূর্ববর্তী পৃষ্ঠায় চলুন" -- --#: ../previewer/ev-previewer-window.c:287 ../shell/ev-window.c:5950 --msgid "_Next Page" --msgstr "পরবর্তী পৃষ্ঠা (_N" -- --#: ../previewer/ev-previewer-window.c:288 ../shell/ev-window.c:5951 --msgid "Go to the next page" --msgstr "পরবর্তী পৃষ্ঠায় চলুন" -- --#: ../previewer/ev-previewer-window.c:291 ../shell/ev-window.c:5934 --msgid "Enlarge the document" --msgstr "ডকুমেন্টের মাপ বৃদ্ধি করুন" -- --#: ../previewer/ev-previewer-window.c:294 ../shell/ev-window.c:5937 --msgid "Shrink the document" --msgstr "ডকুমেন্টের মাপ হ্রাস করুন" -- --#: ../previewer/ev-previewer-window.c:297 ../libview/ev-print-operation.c:1309 --msgid "Print" --msgstr "প্রিন্ট করুন" -- --#: ../previewer/ev-previewer-window.c:298 ../shell/ev-window.c:5903 --msgid "Print this document" --msgstr "এই ডকুমেন্ট প্রিন্ট করুন" -- --#: ../previewer/ev-previewer-window.c:342 ../shell/ev-window.c:6064 --msgid "_Best Fit" --msgstr "সর্বোত্তম মাপ (_B)" -- --#: ../previewer/ev-previewer-window.c:343 ../shell/ev-window.c:6065 --msgid "Make the current document fill the window" --msgstr "সম্পূর্ণ উইন্ডোর মধ্যে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি করুন" -- --#: ../previewer/ev-previewer-window.c:345 ../shell/ev-window.c:6067 --msgid "Fit Page _Width" --msgstr "পৃষ্ঠার প্রস্থ অনুযায়ী মাপ নির্ধারণ (_W)" -- --#: ../previewer/ev-previewer-window.c:346 ../shell/ev-window.c:6068 --msgid "Make the current document fill the window width" --msgstr "" --"উইন্ডোর সম্পূর্ণ প্রস্থের মাপ অনুসারে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি " --"করুন" -- --#: ../previewer/ev-previewer-window.c:540 ../shell/ev-window.c:6176 --msgid "Page" --msgstr "পৃষ্ঠা" -- --#: ../previewer/ev-previewer-window.c:541 ../shell/ev-window.c:6177 --msgid "Select Page" --msgstr "পৃষ্ঠা নির্বাচন করুন" -- --#: ../properties/ev-properties-main.c:116 --msgid "Document" --msgstr "ডকুমেন্ট" -- --#: ../properties/ev-properties-view.c:60 --msgid "Title:" --msgstr "শিরোনাম:" -- --#: ../properties/ev-properties-view.c:61 --msgid "Location:" --msgstr "অবস্থান:" -- --#: ../properties/ev-properties-view.c:62 --msgid "Subject:" --msgstr "বিষয়:" -- --#: ../properties/ev-properties-view.c:63 --#: ../shell/ev-annotation-properties-dialog.c:154 --msgid "Author:" --msgstr "লেখক:" -- --#: ../properties/ev-properties-view.c:64 --msgid "Keywords:" --msgstr "অভিব্যক্তি:" -- --#: ../properties/ev-properties-view.c:65 --msgid "Producer:" --msgstr "প্রকাশক:" -- --#: ../properties/ev-properties-view.c:66 --msgid "Creator:" --msgstr "প্রস্তুতকারক:" -- --#: ../properties/ev-properties-view.c:67 --msgid "Created:" --msgstr "নির্মাণের তারিখ:" -- --# FIXME --#: ../properties/ev-properties-view.c:68 --msgid "Modified:" --msgstr "পরিবর্তনের তারিখ:" -- --#: ../properties/ev-properties-view.c:69 --msgid "Number of Pages:" --msgstr "পৃষ্ঠা সংখ্যা:" -- --# FIXME --#: ../properties/ev-properties-view.c:70 --msgid "Optimized:" --msgstr "সর্বোত্তম:" -+msgid "Couldn't save attachment “%s”: %s" -+msgstr "সংযুক্ত বস্তু “%s” সংরক্ষণ করতে ব্যর্থ: %s" - --#: ../properties/ev-properties-view.c:71 --msgid "Format:" --msgstr "বিন্যাস:" -+#: ../libdocument/ev-attachment.c:379 -+#, c-format -+msgid "Couldn't open attachment “%s”: %s" -+msgstr "সংয়ুক্ত বস্তু “%s” খুলতে ব্যর্থ: %s" - --#: ../properties/ev-properties-view.c:72 --msgid "Security:" --msgstr "নিরাপত্তা:" -+#: ../libdocument/ev-attachment.c:414 -+#, c-format -+msgid "Couldn't open attachment “%s”" -+msgstr "সংযুক্ত বস্তু “%s” খুলতে ব্যর্থ" - --# FIXME --#: ../properties/ev-properties-view.c:73 --msgid "Paper Size:" --msgstr "কাগজের মাপ:" -+#: ../libdocument/ev-document-factory.c:101 -+#, c-format -+msgid "File type %s (%s) is not supported" -+msgstr "%s (%s) ধরনের ফাইল সমর্থিত নয়" - --#. Translate to the default units to use for presenting --#. * lengths to the user. Translate to default:inch if you --#. * want inches, otherwise translate to default:mm. --#. * Do *not* translate it to "predefinito:mm", if it --#. * it isn't default:mm or default:inch it will not work --#. --#: ../properties/ev-properties-view.c:215 --msgid "default:mm" --msgstr "default:mm" -+#: ../libdocument/ev-document-factory.c:364 -+#: ../libdocument/ev-file-helpers.c:490 -+#: ../libdocument/ev-file-helpers.c:536 -+#: ../libdocument/ev-file-helpers.c:555 -+msgid "Unknown MIME Type" -+msgstr "অজানা MIME'র ধরন" - --#: ../properties/ev-properties-view.c:259 --#, c-format --msgid "%.0f × %.0f mm" --msgstr "%.0f × %.0f মিলিমিটার" -+#: ../libdocument/ev-document-factory.c:552 -+msgid "All Documents" -+msgstr "সকল ডকুমেন্ট" - --#: ../properties/ev-properties-view.c:263 --#, c-format --msgid "%.2f × %.2f inch" --msgstr "%.2f × %.2f ইঞ্চি" -+#: ../libdocument/ev-document-factory.c:579 -+msgid "All Files" -+msgstr "সকল ফাইল" - --#. Note to translators: first placeholder is the paper name (eg. --#. * A4), second placeholder is the paper size (eg. 297x210 mm) --#: ../properties/ev-properties-view.c:287 -+#: ../libdocument/ev-file-helpers.c:146 - #, c-format --msgid "%s, Portrait (%s)" --msgstr "%s, প্রতিকৃতি (%s)" -+msgid "Failed to create a temporary file: %s" -+msgstr "অস্থায়ী ফাইল প্রস্তুত করতে ব্যর্থ: %s" - --#. Note to translators: first placeholder is the paper name (eg. --#. * A4), second placeholder is the paper size (eg. 297x210 mm) --#: ../properties/ev-properties-view.c:294 -+#: ../libdocument/ev-file-helpers.c:308 - #, c-format --msgid "%s, Landscape (%s)" --msgstr "%s, ভূদৃশ্য (%s)" -+msgid "Failed to create a temporary directory: %s" -+msgstr "অস্থায়ী ডিরেক্টরি নির্মাণ করতে ব্যর্থ: %s" - --#: ../libmisc/ev-page-action-widget.c:68 -+#: ../libmisc/ev-page-action-widget.c:85 -+#: ../libmisc/ev-page-action-widget.c:124 - #, c-format - msgid "(%d of %d)" - msgstr "(%d, সর্বমোট %d)" - --#: ../libmisc/ev-page-action-widget.c:70 -+#: ../libmisc/ev-page-action-widget.c:87 -+#: ../libmisc/ev-page-action-widget.c:126 - #, c-format - msgid "of %d" - msgstr "সর্বমোট %d" - --#. Create tree view --#: ../libview/ev-loading-window.c:76 ../shell/ev-sidebar-annotations.c:131 --#: ../shell/ev-sidebar-layers.c:125 ../shell/ev-sidebar-links.c:261 --msgid "Loading…" --msgstr "লোড করা হচ্ছে..." -+#: ../libmisc/ev-page-action-widget.c:182 -+#: ../shell/ev-history.c:426 -+#: ../shell/ev-sidebar-bookmarks.c:312 -+#: ../shell/ev-window.c:888 -+#: ../shell/ev-window.c:4602 -+#, c-format -+msgid "Page %s" -+msgstr "পৃষ্ঠা %s" -+ -+#: ../libview/ev-jobs.c:1919 -+#, c-format -+msgid "Failed to print page %d: %s" -+msgstr "%d পৃষ্ঠা প্রিন্ট করতে ব্যর্থ: %s" - - #. Initial state --#: ../libview/ev-print-operation.c:335 -+#: ../libview/ev-print-operation.c:347 - msgid "Preparing to print…" - msgstr "প্রিন্টের প্রস্তুতি ..." - --#: ../libview/ev-print-operation.c:337 -+#: ../libview/ev-print-operation.c:349 - msgid "Finishing…" - msgstr "সমাপ্তি..." - --#: ../libview/ev-print-operation.c:339 -+#: ../libview/ev-print-operation.c:351 - #, c-format - msgid "Printing page %d of %d…" - msgstr "%d পৃষ্ঠা প্রদর্শন করা হচ্ছে, সর্বমোট %d..." - --#: ../libview/ev-print-operation.c:1163 --msgid "Printing is not supported on this printer." --msgstr "এই প্রিন্টারে প্রিন্ট করা সম্ভব নয়।" -+#: ../libview/ev-print-operation.c:1175 -+msgid "Postscript is not supported by this printer." -+msgstr "এই প্রিন্টারে পোস্টস্ক্রীপ্টের সুবিধা নেই।" - --#: ../libview/ev-print-operation.c:1228 -+#: ../libview/ev-print-operation.c:1240 - msgid "Invalid page selection" - msgstr "পৃষ্ঠা নির্বাচন বৈধ নয়" - --#: ../libview/ev-print-operation.c:1229 -+#: ../libview/ev-print-operation.c:1241 - msgid "Warning" - msgstr "সতর্কবার্তা" - --#: ../libview/ev-print-operation.c:1231 -+#: ../libview/ev-print-operation.c:1243 - msgid "Your print range selection does not include any pages" - msgstr "" - "প্রিন্টের উদ্দেশ্যে আপনার নির্বাচিত পৃষ্ঠার সীমার মধ্যে কোনো পৃষ্ঠা উপস্থিত " - "নেই" - --#: ../libview/ev-print-operation.c:1888 -+#. translators: Title of the print dialog -+#. translators: Print document currently shown in the Print Preview window -+#: ../libview/ev-print-operation.c:1322 -+#: ../previewer/ev-previewer-window.c:298 -+msgid "Print" -+msgstr "প্রিন্ট করুন" -+ -+#: ../libview/ev-print-operation.c:1901 - msgid "Page Scaling:" - msgstr "পৃষ্ঠা মাপ নির্ধারণ:" - --#: ../libview/ev-print-operation.c:1894 -+#: ../libview/ev-print-operation.c:1908 - msgid "Shrink to Printable Area" - msgstr "প্রিন্ট করার যোগ্য মাপে সংকুচন" - --#: ../libview/ev-print-operation.c:1895 -+#: ../libview/ev-print-operation.c:1909 - msgid "Fit to Printable Area" - msgstr "প্রিন্ট করার যোগ্য মাপে নির্ধারণ" - --#: ../libview/ev-print-operation.c:1898 -+#: ../libview/ev-print-operation.c:1912 - msgid "" - "Scale document pages to fit the selected printer page. Select from one of " - "the following:\n" -@@ -723,153 +513,322 @@ - "• \"শূণ্য\": পৃষ্ঠার মাপ পরিবর্তিত হবে না।\n" - "\n" - "• \"প্রিন্ট করার যোগ্য মাপে সংকুচন\": প্রিন্ট করার যোগ্য অংশের তুলনায় নথির " --"মধ্যে " --"উপস্থিত বড় মাপের পাতাগুলি, প্রিন্টারের পাতার মাপ অনুযায়ী সংকুচন করা হবে।\n" -+"মধ্যে উপস্থিত বড় মাপের পাতাগুলি, প্রিন্টারের পাতার মাপ অনুযায়ী সংকুচন করা " -+"হবে।\n" - "\n" - "• \"প্রিন্ট করার যোগ্য মাপে নির্ধারণ\": প্রিন্টারের পাতার মধ্যে প্রিন্ট করার " --"যোগ্য " --"অংশের মধ্যে সুসংগতভাবে নথির পাতাগুলি নির্ধারণের জন্য নথির পাতাগুলি মাপ বড় " --"অথবা ছোট " --"করা হবে।\n" -+"যোগ্য অংশের মধ্যে সুসংগতভাবে নথির পাতাগুলি নির্ধারণের জন্য নথির পাতাগুলি মাপ " -+"বড় অথবা ছোট করা হবে।\n" - --#: ../libview/ev-print-operation.c:1910 -+#: ../libview/ev-print-operation.c:1924 - msgid "Auto Rotate and Center" - msgstr "স্বয়ংক্রিয় আবর্তন ও কেন্দ্রস্থল নির্ধারণ" - --#: ../libview/ev-print-operation.c:1913 -+#: ../libview/ev-print-operation.c:1927 - msgid "" - "Rotate printer page orientation of each page to match orientation of each " - "document page. Document pages will be centered within the printer page." - msgstr "" - "নথির প্রত্যেকটি পৃষ্ঠার দিশার সাথে সামঞ্জস্য বজায় রাখার জন্য প্রিন্টারের " --"পৃষ্ঠার দিশা " --"আবর্তিত হবে। নথির পৃষ্ঠাগুলি প্রিন্টারের পৃষ্ঠার কেন্দ্রে অবস্থিত হবে।" -+"পৃষ্ঠার দিশা আবর্তিত হবে। নথির পৃষ্ঠাগুলি প্রিন্টারের পৃষ্ঠার কেন্দ্রে " -+"অবস্থিত হবে।" - --#: ../libview/ev-print-operation.c:1918 -+#: ../libview/ev-print-operation.c:1932 - msgid "Select page size using document page size" - msgstr "ডকুমেন্টের পৃষ্ঠার মাপ অনুযায়ী পৃষ্ঠার মাপ নির্বাচন করা হবে" - --#: ../libview/ev-print-operation.c:1920 -+#: ../libview/ev-print-operation.c:1934 - msgid "" - "When enabled, each page will be printed on the same size paper as the " - "document page." - msgstr "" - "সক্রিয় থাকলে, ডকুমেন্টের পৃষ্ঠার মাপের কাগজে প্রতিটি পৃষ্ঠা প্রিন্ট করা হবে।" - --#: ../libview/ev-print-operation.c:2002 -+#: ../libview/ev-print-operation.c:2023 - msgid "Page Handling" - msgstr "পৃষ্ঠার ব্যবস্থাপনা" - --#: ../libview/ev-jobs.c:1882 --#, c-format --msgid "Failed to print page %d: %s" --msgstr "%d পৃষ্ঠা প্রিন্ট করতে ব্যর্থ: %s" -- --#: ../libview/ev-view-accessible.c:46 -+#: ../libview/ev-view-accessible.c:45 - msgid "Scroll Up" - msgstr "উপরে চলুন" - --#: ../libview/ev-view-accessible.c:47 --msgid "Scroll Down" --msgstr "নীচে চলুন" -+#: ../libview/ev-view-accessible.c:46 -+msgid "Scroll Down" -+msgstr "নীচে চলুন" -+ -+# FIXME: দৃশ্য -+#: ../libview/ev-view-accessible.c:52 -+msgid "Scroll View Up" -+msgstr "প্রদর্শন ক্ষেত্রের উপরের অংশে চলুন" -+ -+# FIXME: দৃশ্য -+#: ../libview/ev-view-accessible.c:53 -+msgid "Scroll View Down" -+msgstr "প্রদর্শন ক্ষেত্রের নীচের অংশে চলুন" -+ -+# FIXME: দৃশ্য -+#: ../libview/ev-view-accessible.c:105 -+msgid "Document View" -+msgstr "ডকুমেন্ট অনুসারে প্রদর্শন" -+ -+#: ../libview/ev-view.c:1910 -+msgid "Go to first page" -+msgstr "প্রথম পৃষ্ঠায় চলুন" -+ -+#: ../libview/ev-view.c:1912 -+msgid "Go to previous page" -+msgstr "পূর্ববর্তী পৃষ্ঠায় চলুন" -+ -+#: ../libview/ev-view.c:1914 -+msgid "Go to next page" -+msgstr "পরবর্তী পৃষ্ঠায় চলুন" -+ -+#: ../libview/ev-view.c:1916 -+msgid "Go to last page" -+msgstr "সর্বশেষ পৃষ্ঠায় চলুন" -+ -+#: ../libview/ev-view.c:1918 -+msgid "Go to page" -+msgstr "চিহ্নিত পৃষ্ঠায় চলুন" -+ -+#: ../libview/ev-view.c:1920 -+msgid "Find" -+msgstr "অনুসন্ধান" -+ -+#: ../libview/ev-view.c:1948 -+#, c-format -+msgid "Go to page %s" -+msgstr "পৃষ্ঠা %s'এ চলুন" -+ -+#: ../libview/ev-view.c:1954 -+#, c-format -+msgid "Go to %s on file “%s”" -+msgstr "%s'এ চলুন, “%s”'র মধ্যে" -+ -+#: ../libview/ev-view.c:1957 -+#, c-format -+msgid "Go to file “%s”" -+msgstr "“%s” ফাইলে চলুন" -+ -+#: ../libview/ev-view.c:1965 -+#, c-format -+msgid "Launch %s" -+msgstr "%s আরম্ভ করুন" -+ -+#: ../libview/ev-view-presentation.c:710 -+msgid "Jump to page:" -+msgstr "চিহ্নিত পৃষ্ঠায় চলুন:" -+ -+#: ../libview/ev-view-presentation.c:1015 -+msgid "End of presentation. Click to exit." -+msgstr "উপস্থাপনার সমাপ্তি। ক্লিক করে প্রস্থান করুন।" -+ -+#: ../previewer/ev-previewer.c:45 -+msgid "Delete the temporary file" -+msgstr "অস্থায়ী ফাইল মুছে ফেলুন" -+ -+# প্রিন্টের বৈশিষ্ট্য সম্বলিত ফাইল -+#: ../previewer/ev-previewer.c:46 -+msgid "Print settings file" -+msgstr "প্রিন্টের বৈশিষ্ট্য সম্বলিত ফাইল" -+ -+#: ../previewer/ev-previewer.c:175 -+#: ../previewer/ev-previewer.c:207 -+msgid "GNOME Document Previewer" -+msgstr "GNOME Document Previewer" -+ -+#: ../previewer/ev-previewer-window.c:91 -+#: ../shell/ev-window.c:3329 -+msgid "Failed to print document" -+msgstr "ডকুমেন্ট প্রিন্ট করতে ব্যর্থ" -+ -+#: ../previewer/ev-previewer-window.c:237 -+#, c-format -+msgid "The selected printer '%s' could not be found" -+msgstr "নির্বাচিত প্রিন্টার '%s' পাওয়া যায়নি" -+ -+#. Go menu -+#: ../previewer/ev-previewer-window.c:284 -+#: ../shell/ev-window.c:5810 -+msgid "_Previous Page" -+msgstr "পূর্ববর্তী পৃষ্ঠা (_P)" -+ -+#: ../previewer/ev-previewer-window.c:285 -+#: ../shell/ev-window.c:5811 -+msgid "Go to the previous page" -+msgstr "পূর্ববর্তী পৃষ্ঠায় চলুন" -+ -+#: ../previewer/ev-previewer-window.c:287 -+#: ../shell/ev-window.c:5813 -+msgid "_Next Page" -+msgstr "পরবর্তী পৃষ্ঠা (_N" -+ -+#: ../previewer/ev-previewer-window.c:288 -+#: ../shell/ev-window.c:5814 -+msgid "Go to the next page" -+msgstr "পরবর্তী পৃষ্ঠায় চলুন" -+ -+#: ../previewer/ev-previewer-window.c:291 -+#: ../shell/ev-window.c:5797 -+msgid "Enlarge the document" -+msgstr "ডকুমেন্টের মাপ বৃদ্ধি করুন" -+ -+#: ../previewer/ev-previewer-window.c:294 -+#: ../shell/ev-window.c:5800 -+msgid "Shrink the document" -+msgstr "ডকুমেন্টের মাপ হ্রাস করুন" -+ -+#: ../previewer/ev-previewer-window.c:299 -+#: ../shell/ev-window.c:5775 -+msgid "Print this document" -+msgstr "এই ডকুমেন্ট প্রিন্ট করুন" -+ -+#: ../previewer/ev-previewer-window.c:343 -+#: ../shell/ev-window.c:5928 -+msgid "Fit Pa_ge" -+msgstr "পৃষ্ঠা সামঞ্জস্যকরণ (_g)" -+ -+#: ../previewer/ev-previewer-window.c:344 -+#: ../shell/ev-window.c:5929 -+msgid "Make the current document fill the window" -+msgstr "সম্পূর্ণ উইন্ডোর মধ্যে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি করুন" -+ -+#: ../previewer/ev-previewer-window.c:346 -+#: ../shell/ev-window.c:5931 -+msgid "Fit _Width" -+msgstr "প্রস্থ সামঞ্জস্যকরণ (_W)" -+ -+#: ../previewer/ev-previewer-window.c:347 -+#: ../shell/ev-window.c:5932 -+msgid "Make the current document fill the window width" -+msgstr "" -+"উইন্ডোর সম্পূর্ণ প্রস্থের মাপ অনুসারে প্রদর্শনের জন্য ডকুমেন্টের মাপ বৃদ্ধি " -+"করুন" -+ -+#: ../previewer/ev-previewer-window.c:540 -+#: ../shell/ev-window.c:6043 -+msgid "Page" -+msgstr "পৃষ্ঠা" -+ -+#: ../previewer/ev-previewer-window.c:541 -+#: ../shell/ev-window.c:6044 -+msgid "Select Page" -+msgstr "পৃষ্ঠা নির্বাচন করুন" -+ -+#: ../properties/ev-properties-main.c:116 -+msgid "Document" -+msgstr "ডকুমেন্ট" -+ -+#: ../properties/ev-properties-view.c:60 -+msgid "Title:" -+msgstr "শিরোনাম:" -+ -+#: ../properties/ev-properties-view.c:61 -+msgid "Location:" -+msgstr "অবস্থান:" -+ -+#: ../properties/ev-properties-view.c:62 -+msgid "Subject:" -+msgstr "বিষয়:" - --# FIXME: দৃশ্য --#: ../libview/ev-view-accessible.c:53 --msgid "Scroll View Up" --msgstr "প্রদর্শন ক্ষেত্রের উপরের অংশে চলুন" -+#: ../properties/ev-properties-view.c:63 -+#: ../shell/ev-annotation-properties-dialog.c:154 -+msgid "Author:" -+msgstr "লেখক:" - --# FIXME: দৃশ্য --#: ../libview/ev-view-accessible.c:54 --msgid "Scroll View Down" --msgstr "প্রদর্শন ক্ষেত্রের নীচের অংশে চলুন" -+#: ../properties/ev-properties-view.c:64 -+msgid "Keywords:" -+msgstr "অভিব্যক্তি:" - --# FIXME: দৃশ্য --#: ../libview/ev-view-accessible.c:883 --msgid "Document View" --msgstr "ডকুমেন্ট অনুসারে প্রদর্শন" -+#: ../properties/ev-properties-view.c:65 -+msgid "Producer:" -+msgstr "প্রকাশক:" - --#: ../libview/ev-view-presentation.c:692 --msgid "Jump to page:" --msgstr "চিহ্নিত পৃষ্ঠায় চলুন:" -+#: ../properties/ev-properties-view.c:66 -+msgid "Creator:" -+msgstr "প্রস্তুতকারক:" - --#: ../libview/ev-view-presentation.c:997 --msgid "End of presentation. Click to exit." --msgstr "উপস্থাপনার সমাপ্তি। ক্লিক করে প্রস্থান করুন।" -+#: ../properties/ev-properties-view.c:67 -+msgid "Created:" -+msgstr "নির্মাণের তারিখ:" - --#: ../libview/ev-view.c:1820 --msgid "Go to first page" --msgstr "প্রথম পৃষ্ঠায় চলুন" -+# FIXME -+#: ../properties/ev-properties-view.c:68 -+msgid "Modified:" -+msgstr "পরিবর্তনের তারিখ:" - --#: ../libview/ev-view.c:1822 --msgid "Go to previous page" --msgstr "পূর্ববর্তী পৃষ্ঠায় চলুন" -+#: ../properties/ev-properties-view.c:69 -+msgid "Number of Pages:" -+msgstr "পৃষ্ঠা সংখ্যা:" - --#: ../libview/ev-view.c:1824 --msgid "Go to next page" --msgstr "পরবর্তী পৃষ্ঠায় চলুন" -+# FIXME -+#: ../properties/ev-properties-view.c:70 -+msgid "Optimized:" -+msgstr "সর্বোত্তম:" - --#: ../libview/ev-view.c:1826 --msgid "Go to last page" --msgstr "সর্বশেষ পৃষ্ঠায় চলুন" -+#: ../properties/ev-properties-view.c:71 -+msgid "Format:" -+msgstr "বিন্যাস:" - --#: ../libview/ev-view.c:1828 --msgid "Go to page" --msgstr "চিহ্নিত পৃষ্ঠায় চলুন" -+#: ../properties/ev-properties-view.c:72 -+msgid "Security:" -+msgstr "নিরাপত্তা:" - --#: ../libview/ev-view.c:1830 --msgid "Find" --msgstr "অনুসন্ধান" -+# FIXME -+#: ../properties/ev-properties-view.c:73 -+msgid "Paper Size:" -+msgstr "কাগজের মাপ:" -+ -+#. Translate to the default units to use for presenting -+#. * lengths to the user. Translate to default:inch if you -+#. * want inches, otherwise translate to default:mm. -+#. * Do *not* translate it to "predefinito:mm", if it -+#. * it isn't default:mm or default:inch it will not work -+#: ../properties/ev-properties-view.c:220 -+msgid "default:mm" -+msgstr "default:mm" - --#: ../libview/ev-view.c:1858 -+#: ../properties/ev-properties-view.c:264 - #, c-format --msgid "Go to page %s" --msgstr "পৃষ্ঠা %s'এ চলুন" -+msgid "%.0f × %.0f mm" -+msgstr "%.0f × %.0f মিলিমিটার" - --#: ../libview/ev-view.c:1864 -+#: ../properties/ev-properties-view.c:268 - #, c-format --msgid "Go to %s on file “%s”" --msgstr "%s'এ চলুন, “%s”'র মধ্যে" -+msgid "%.2f × %.2f inch" -+msgstr "%.2f × %.2f ইঞ্চি" - --#: ../libview/ev-view.c:1867 -+#. Note to translators: first placeholder is the paper name (eg. -+#. * A4), second placeholder is the paper size (eg. 297x210 mm) -+#: ../properties/ev-properties-view.c:292 - #, c-format --msgid "Go to file “%s”" --msgstr "“%s” ফাইলে চলুন" -+msgid "%s, Portrait (%s)" -+msgstr "%s, প্রতিকৃতি (%s)" - --#: ../libview/ev-view.c:1875 -+#. Note to translators: first placeholder is the paper name (eg. -+#. * A4), second placeholder is the paper size (eg. 297x210 mm) -+#: ../properties/ev-properties-view.c:299 - #, c-format --msgid "Launch %s" --msgstr "%s আরম্ভ করুন" -+msgid "%s, Landscape (%s)" -+msgstr "%s, ভূদৃশ্য (%s)" - --#: ../shell/eggfindbar.c:282 -+#: ../shell/eggfindbar.c:281 - msgid "_Whole Words Only" - msgstr "শুধুমাত্র সম্পূর্ণ শব্দ (_W)" - --#: ../shell/eggfindbar.c:294 -+#: ../shell/eggfindbar.c:293 - msgid "C_ase Sensitive" - msgstr "হরফের ছাঁদ সম্পর্কে সচেতন (_a)" - --#: ../shell/eggfindbar.c:407 --msgid "Find:" --msgstr "অনুসন্ধান:" -- --#: ../shell/eggfindbar.c:423 --#| msgid "Find Pre_vious" -+#: ../shell/eggfindbar.c:416 - msgid "Find options" - msgstr "বিকল্প অনুসন্ধান করুন" - --#: ../shell/eggfindbar.c:427 ../shell/ev-window.c:5920 --msgid "Find Pre_vious" --msgstr "পূর্ববর্তী উপস্থিতি অনুসন্ধান (_v)" -- --#: ../shell/eggfindbar.c:431 -+#: ../shell/eggfindbar.c:425 - msgid "Find previous occurrence of the search string" - msgstr "অনুসন্ধানের জন্য চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন" - --#: ../shell/eggfindbar.c:435 ../shell/ev-window.c:5918 --msgid "Find Ne_xt" --msgstr "পরবর্তী উপস্থিতি অনুসন্ধান (_x)" -- --#: ../shell/eggfindbar.c:439 -+#: ../shell/eggfindbar.c:435 - msgid "Find next occurrence of the search string" - msgstr "অনুসন্ধানের জন্য চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন" - -@@ -949,11 +908,27 @@ - msgid "Close" - msgstr "বন্ধ করুন" - --#: ../shell/ev-keyring.c:102 -+#: ../shell/ev-history-action-widget.c:227 -+msgid "Go to previous history item" -+msgstr "পূর্ববর্তী ইতিহাস অাইটেমে যান" -+ -+#: ../shell/ev-history-action-widget.c:231 -+msgid "Go to next history item" -+msgstr "পরবর্তী ইতিহাস অাইটেমে যান" -+ -+#: ../shell/ev-keyring.c:86 - #, c-format - msgid "Password for document %s" - msgstr "%s ডকুমেন্টের পাসওয়ার্ড" - -+#. Create tree view -+#: ../shell/ev-loading-message.c:50 -+#: ../shell/ev-sidebar-annotations.c:131 -+#: ../shell/ev-sidebar-layers.c:125 -+#: ../shell/ev-sidebar-links.c:261 -+msgid "Loading…" -+msgstr "লোড করা হচ্ছে..." -+ - #: ../shell/ev-open-recent-action.c:72 - msgid "Open a recently used document" - msgstr "সম্প্রতি ব্যবহৃত ডকুমেন্ট খুলুন" -@@ -966,7 +941,8 @@ - "ডকুমেন্ট বর্তমানে লক করা আছে ও শুধুমাত্র পাসওয়ার্ড উল্লেখ করা হলে সেটি মুক্ত " - "করা হবে।" - --#: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 -+#: ../shell/ev-password-view.c:151 -+#: ../shell/ev-password-view.c:269 - msgid "_Unlock Document" - msgstr "ডকুমেন্ট মুক্ত করা হবে(_U)" - -@@ -1018,11 +994,11 @@ - msgid "Document License" - msgstr "ডকুমেন্টের লাইসেন্স" - --#: ../shell/ev-properties-fonts.c:132 -+#: ../shell/ev-properties-fonts.c:142 - msgid "Font" - msgstr "ফন্ট" - --#: ../shell/ev-properties-fonts.c:159 -+#: ../shell/ev-properties-fonts.c:169 - #, c-format - msgid "Gathering font information… %3d%%" - msgstr "ফন্ট সংক্রান্ত তথ্য সংগ্রহ করা হচ্ছে... %3d%%" -@@ -1043,7 +1019,8 @@ - msgid "List" - msgstr "তালিকা" - --#: ../shell/ev-sidebar-annotations.c:199 ../shell/ev-sidebar-annotations.c:527 -+#: ../shell/ev-sidebar-annotations.c:199 -+#: ../shell/ev-sidebar-annotations.c:527 - msgid "Annotations" - msgstr "টিকা" - -@@ -1084,12 +1061,6 @@ - msgid "_Remove Bookmark" - msgstr "বুকমার্ক মুছে ফেলুন (_R)" - --#: ../shell/ev-sidebar-bookmarks.c:312 ../shell/ev-window.c:931 --#: ../shell/ev-window.c:4737 --#, c-format --msgid "Page %s" --msgstr "পৃষ্ঠা %s" -- - #: ../shell/ev-sidebar-bookmarks.c:603 - msgid "Bookmarks" - msgstr "বুকমার্ক" -@@ -1102,150 +1073,149 @@ - msgid "Print…" - msgstr "প্রিন্ট করুন..." - --#: ../shell/ev-sidebar-links.c:719 -+#: ../shell/ev-sidebar-links.c:723 - msgid "Index" - msgstr "সূচিপত্র" - --#: ../shell/ev-sidebar-thumbnails.c:933 -+#: ../shell/ev-sidebar-thumbnails.c:958 - msgid "Thumbnails" - msgstr "থাম্ব-নেইল" - --#: ../shell/ev-window.c:928 --#, c-format --msgid "Page %s — %s" --msgstr "পৃষ্ঠা %s — %s" -+#: ../shell/ev-utils.c:318 -+msgid "By extension" -+msgstr "এক্সটেনশন অনুযায়ী" - --#: ../shell/ev-window.c:1538 -+#: ../shell/ev-window.c:1485 - msgid "The document contains no pages" - msgstr "ডকুমেন্টের মধ্যে কোনো পৃষ্ঠা উপস্থিত নেই" - --#: ../shell/ev-window.c:1541 -+#: ../shell/ev-window.c:1488 - msgid "The document contains only empty pages" - msgstr "ডকুমেন্টের মধ্যে শুধুমাত্র ফাঁকা পৃষ্ঠা উপস্থিত রয়েছে" - --#: ../shell/ev-window.c:1756 ../shell/ev-window.c:1922 -+#: ../shell/ev-window.c:1689 -+#: ../shell/ev-window.c:1851 - msgid "Unable to open document" - msgstr "ডকুমেন্ট খুলতে ব্যর্থ" - --#: ../shell/ev-window.c:1893 -+#: ../shell/ev-window.c:1822 - #, c-format - msgid "Loading document from “%s”" - msgstr "“%s” থেকে ডকুমেন্ট লোড করা হচ্ছে" - --#: ../shell/ev-window.c:2035 ../shell/ev-window.c:2329 -+#: ../shell/ev-window.c:1964 -+#: ../shell/ev-window.c:2254 - #, c-format - msgid "Downloading document (%d%%)" - msgstr "ডকুমেন্ট ডাউনলোড করা হচ্ছে (%d%%)" - --#: ../shell/ev-window.c:2068 -+#: ../shell/ev-window.c:1997 - msgid "Failed to load remote file." - msgstr "দূরবর্তী ফাইল লোড করতে বিফল।" - --#: ../shell/ev-window.c:2273 -+#: ../shell/ev-window.c:2198 - #, c-format - msgid "Reloading document from %s" - msgstr "%s থেকে ডকুমেন্ট পুনরায় লোড করুন" - --#: ../shell/ev-window.c:2305 -+#: ../shell/ev-window.c:2230 - msgid "Failed to reload document." - msgstr "ডকুমেন্ট পুনরায় লোড করতে ব্যর্থ" - --#: ../shell/ev-window.c:2518 -+#: ../shell/ev-window.c:2443 - msgid "Open Document" - msgstr "ডকুমেন্ট খুলুন" - --#: ../shell/ev-window.c:2791 -+#: ../shell/ev-window.c:2716 - #, c-format - msgid "Saving document to %s" - msgstr "%s-এ ডকুমেন্ট সংরক্ষণ করা হচ্ছে" - --#: ../shell/ev-window.c:2794 -+#: ../shell/ev-window.c:2719 - #, c-format - msgid "Saving attachment to %s" - msgstr "সংযুক্ত বস্তুটি %s-এ সংরক্ষণ করুন" - --#: ../shell/ev-window.c:2797 -+#: ../shell/ev-window.c:2722 - #, c-format - msgid "Saving image to %s" - msgstr "%s-এ ছবিটি সংরক্ষণ করুন" - --#: ../shell/ev-window.c:2841 ../shell/ev-window.c:2941 -+#: ../shell/ev-window.c:2766 -+#: ../shell/ev-window.c:2866 - #, c-format - msgid "The file could not be saved as “%s”." - msgstr "“%s”রূপে ফাইল সংরক্ষণ করতে ব্যর্থ।" - --#: ../shell/ev-window.c:2872 -+#: ../shell/ev-window.c:2797 - #, c-format - msgid "Uploading document (%d%%)" - msgstr "ডকুমেন্ট আপলোড করা হচ্ছে (%d%%)" - --#: ../shell/ev-window.c:2876 -+#: ../shell/ev-window.c:2801 - #, c-format - msgid "Uploading attachment (%d%%)" - msgstr "সংযুক্ত বস্তু আপলোড করা হচ্ছে (%d%%)" - --#: ../shell/ev-window.c:2880 -+#: ../shell/ev-window.c:2805 - #, c-format - msgid "Uploading image (%d%%)" - msgstr "ছবি আপলোড করা হচ্ছে (%d%%)" - --#: ../shell/ev-window.c:2992 -+#: ../shell/ev-window.c:2917 - msgid "Save a Copy" - msgstr "একটি প্রতিলিপি সংরক্ষণ করুন" - --#: ../shell/ev-window.c:3056 --#| msgid "Save a copy of the current document" -+#: ../shell/ev-window.c:2981 - msgid "Could not send current document" - msgstr "বর্তমান ডকুমেন্ট পাঠানো যায়নি" - --#: ../shell/ev-window.c:3087 -+#: ../shell/ev-window.c:3012 - msgid "Could not open the containing folder" - msgstr "ধারণকারী ফোল্ডার খুলতে ব্যর্থ" - --#: ../shell/ev-window.c:3348 -+#: ../shell/ev-window.c:3273 - #, c-format - msgid "%d pending job in queue" - msgid_plural "%d pending jobs in queue" - msgstr[0] "সারির মধ্যে %d-টি অপেক্ষারত কর্ম উপস্থিত" - msgstr[1] "সারির মধ্যে %d-টি অপেক্ষারত কর্ম উপস্থিত" - --#: ../shell/ev-window.c:3461 -+#: ../shell/ev-window.c:3386 - #, c-format - msgid "Printing job “%s”" - msgstr "কর্ম “%s” প্রিন্ট করা হচ্ছে" - --#: ../shell/ev-window.c:3638 -+#: ../shell/ev-window.c:3563 - msgid "" - "Document contains form fields that have been filled out. If you don't save a " - "copy, changes will be permanently lost." - msgstr "" - "ডকুমেন্টের মধ্যে উপস্থিত ফর্মের ক্ষেত্রে মান পূরণ করা হয়েছে। প্রতিলিপি " --"সংরক্ষণ না করা " --"হলে এই পরিবর্তনগুলি স্থায়ীরূপে বর্জিত হবে।" -+"সংরক্ষণ না করা হলে এই পরিবর্তনগুলি স্থায়ীরূপে বর্জিত হবে।" - --#: ../shell/ev-window.c:3642 -+#: ../shell/ev-window.c:3567 - msgid "" - "Document contains new or modified annotations. If you don't save a copy, " - "changes will be permanently lost." - msgstr "" - "ডকুমেন্টের মধ্যে নতুন ও পরিবর্তিত টিকা উপস্থিত রয়েছে। প্রতিলিপি সংরক্ষণ না " --"করা হলে " --"পরিবর্তনগুলি স্থায়ী রূপে মুছে যাবে।" -+"করা হলে পরিবর্তনগুলি স্থায়ী রূপে মুছে যাবে।" - --#: ../shell/ev-window.c:3649 -+#: ../shell/ev-window.c:3574 - #, c-format - msgid "Save a copy of document “%s” before closing?" - msgstr "বন্ধ করার পূর্বে “%s” ডকুমেন্টের প্রতিলিপি সংরক্ষণ করা হবে কি?" - --#: ../shell/ev-window.c:3668 -+#: ../shell/ev-window.c:3593 - msgid "Close _without Saving" - msgstr "সংরক্ষণ না করে বন্ধ হবে (_w)" - --#: ../shell/ev-window.c:3672 -+#: ../shell/ev-window.c:3597 - msgid "Save a _Copy" - msgstr "একটি প্রতিলিপি সংরক্ষণ করুন (_C)" - --#: ../shell/ev-window.c:3746 -+#: ../shell/ev-window.c:3671 - #, c-format - msgid "Wait until print job “%s” finishes before closing?" - msgstr "" -@@ -1254,57 +1224,44 @@ - #. TRANS: the singular form is not really used as n_print_jobs > 1 - #. but some languages distinguish between different plurals forms, - #. so the ngettext is needed. --#: ../shell/ev-window.c:3752 -+#: ../shell/ev-window.c:3677 - #, c-format --#| msgid "" --#| "There are %d print jobs active. Wait until print finishes before closing?" --msgid "There is %d print job active. Wait until print finishes before closing?" -+msgid "" -+"There is %d print job active. Wait until print finishes before closing?" - msgid_plural "" - "There are %d print jobs active. Wait until print finishes before closing?" - msgstr[0] "" - "%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি " --"পর্যন্ত " --"অপেক্ষা করা হবে কি?" -+"পর্যন্ত অপেক্ষা করা হবে কি?" - msgstr[1] "" - "%d-টি প্রিন্টের কাজ বর্তমানে সক্রিয় রয়েছে। বন্ধ করার পূর্বে এইগুলির সমাপ্তি " --"পর্যন্ত " --"অপেক্ষা করা হবে কি?" -+"পর্যন্ত অপেক্ষা করা হবে কি?" - --#: ../shell/ev-window.c:3767 -+#: ../shell/ev-window.c:3692 - msgid "If you close the window, pending print jobs will not be printed." - msgstr "" - "উইন্ডো বন্ধ করা হলে, প্রিন্টের জন্য অপেক্ষারত কাজগুলি প্রিন্ট করা হবে না।" - --#: ../shell/ev-window.c:3771 -+#: ../shell/ev-window.c:3696 - msgid "Cancel _print and Close" - msgstr "প্রিন্টের কাজ বাতিল করে বন্ধ করুন (_p)" - --#: ../shell/ev-window.c:3775 -+#: ../shell/ev-window.c:3700 - msgid "Close _after Printing" - msgstr "প্রিন্টের কাজ সঞ্চালনার পরে বন্ধ করুন (_a)" - --#: ../shell/ev-window.c:4132 -+#: ../shell/ev-window.c:4155 - msgid "Running in presentation mode" - msgstr "প্রেসেন্টেশন মোডে চলছে" - --#: ../shell/ev-window.c:4481 ../shell/ev-window.c:4767 --msgid "There was an error displaying help" --msgstr "সহায়তার তথ্য প্রদর্শন করতে সমস্যা" -- --#: ../shell/ev-window.c:4509 --msgid "Toolbar Editor" --msgstr "টুল-বার সম্পাদন ব্যবস্থা" -- --#: ../shell/ev-window.c:5005 -+#: ../shell/ev-window.c:4863 - #, c-format --msgid "" --"Document Viewer\n" -+msgid "Document Viewer\n" - "Using %s (%s)" --msgstr "" --"ডকুমেন্ট ফাইল প্রদর্শন ব্যবস্থা।\n" -+msgstr "ডকুমেন্ট ফাইল প্রদর্শন ব্যবস্থা।\n" - "%s (%s) ব্যবহৃত হয়" - --#: ../shell/ev-window.c:5038 -+#: ../shell/ev-window.c:4896 - msgid "" - "Evince 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 " -@@ -1312,12 +1269,11 @@ - "version.\n" - msgstr "" - "Evince একটি মুক্ত সফ্টওয়্যার; Free Software Foundation দ্বারা প্রকাশিত GNU " --"General " --"Public License'র শর্তানুযায়ী এটি বিতরণ ও পরিবর্তন করা যাবে; লাইনসেন্সের " --"সংস্করণ ২ " --"অথবা (আপনার সুবিধানুযায়ী) ঊর্ধ্বতন কোনো সংস্করণের অধীন।\n" -+"General Public License'র শর্তানুযায়ী এটি বিতরণ ও পরিবর্তন করা যাবে; " -+"লাইনসেন্সের সংস্করণ ২ অথবা (আপনার সুবিধানুযায়ী) ঊর্ধ্বতন কোনো সংস্করণের " -+"অধীন।\n" - --#: ../shell/ev-window.c:5042 -+#: ../shell/ev-window.c:4900 - msgid "" - "Evince is distributed in the hope that it will be useful, but WITHOUT ANY " - "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS " -@@ -1325,34 +1281,29 @@ - "details.\n" - msgstr "" - "Evince বিতরণ করার মূল উদ্দেশ্য যে ব্যবহারকারীরা এর দ্বারা উপকৃত হবেন, কিন্তু " --"এটির " --"জন্য কোনো সুস্পষ্ট ওয়ারেন্টি উপস্থিত নেই; বাণিজ্যিক ও কোনো সুনির্দিষ্ট কর্ম " --"সাধনের জন্য " --"অন্তর্নিহীত ওয়ারেন্টিও অনুপস্থিত। অধিক জানতে GNU General Public License " --"পড়ুন।\n" -+"এটির জন্য কোনো সুস্পষ্ট ওয়ারেন্টি উপস্থিত নেই; বাণিজ্যিক ও কোনো সুনির্দিষ্ট " -+"কর্ম সাধনের জন্য অন্তর্নিহীত ওয়ারেন্টিও অনুপস্থিত। অধিক জানতে GNU General " -+"Public License পড়ুন।\n" - --#: ../shell/ev-window.c:5046 -+#: ../shell/ev-window.c:4904 - msgid "" - "You should have received a copy of the GNU General Public License along with " - "Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " - "Street, Fifth Floor, Boston, MA 02110-1301 USA\n" - msgstr "" - "Evince'র সাথে GNU General Public License'র একটি প্রতিলিপি উপলব্ধ হওয়া উচিত; " --"না " --"থাকলে নিম্নলিখিত ঠিকানায় লিখে তা সংগ্রহ করুন Free Software Foundation, Inc., " --"51 " --"Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n" -+"না থাকলে নিম্নলিখিত ঠিকানায় লিখে তা সংগ্রহ করুন Free Software Foundation, " -+"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n" - --#: ../shell/ev-window.c:5071 -+#: ../shell/ev-window.c:4929 - msgid "Evince" - msgstr "Evince" - --#: ../shell/ev-window.c:5074 --#| msgid "© 1996–2010 The Evince authors" -+#: ../shell/ev-window.c:4932 - msgid "© 1996–2012 The Evince authors" - msgstr "© ১৯৯৬-২০১২ Evince নির্মাতাবৃন্দ" - --#: ../shell/ev-window.c:5080 -+#: ../shell/ev-window.c:4938 - msgid "translator-credits" - msgstr "" - "অঙ্কুর প্রকল্পের পক্ষে, \n" -@@ -1362,386 +1313,350 @@ - #. TRANS: Sometimes this could be better translated as - #. "%d hit(s) on this page". Therefore this string - #. contains plural cases. --#: ../shell/ev-window.c:5348 -+#: ../shell/ev-window.c:5200 - #, c-format - msgid "%d found on this page" - msgid_plural "%d found on this page" - msgstr[0] "এই পৃষ্ঠায় %d-টি মিল সনাক্ত করা হয়েছে" - msgstr[1] "এই পৃষ্ঠায় %d-টি মিল সনাক্ত করা হয়েছে" - --#: ../shell/ev-window.c:5353 -+#: ../shell/ev-window.c:5205 - msgid "Not found" - msgstr "পাওয়া যায়নি" - --#: ../shell/ev-window.c:5359 -+#: ../shell/ev-window.c:5211 - #, c-format - msgid "%3d%% remaining to search" - msgstr "%3d%% অনুসন্ধান অবশিষ্ট রয়েছে" - --#: ../shell/ev-window.c:5879 --msgid "_File" --msgstr "ফাইল (_F)" -- --#: ../shell/ev-window.c:5880 --msgid "_Edit" --msgstr "সম্পাদনা (_E)" -- --#: ../shell/ev-window.c:5881 --msgid "_View" --msgstr "প্রদর্শন (_V)" -- --#: ../shell/ev-window.c:5882 --msgid "_Go" --msgstr "গন্তব্য (_G)" -- --#: ../shell/ev-window.c:5883 -+#: ../shell/ev-window.c:5755 - msgid "_Bookmarks" - msgstr "বুকমার্ক (_B)" - --#: ../shell/ev-window.c:5884 --msgid "_Help" --msgstr "সহায়তা (_H)" -+#: ../shell/ev-window.c:5756 -+msgid "_Recent" -+msgstr "সাম্প্রতিক (_R)" - - #. File menu --#: ../shell/ev-window.c:5887 ../shell/ev-window.c:6216 -+#: ../shell/ev-window.c:5759 -+#: ../shell/ev-window.c:6079 - msgid "_Open…" - msgstr "খুলুন...(_O)" - --#: ../shell/ev-window.c:5888 ../shell/ev-window.c:6217 -+#: ../shell/ev-window.c:5760 -+#: ../shell/ev-window.c:6080 - msgid "Open an existing document" - msgstr "কোনো উপস্থিত ডকুমেন্ট খুলুন" - --#: ../shell/ev-window.c:5890 -+#: ../shell/ev-window.c:5762 - msgid "Op_en a Copy" - msgstr "একটি প্রতিলিপি সংরক্ষণ করুন (_e)" - --#: ../shell/ev-window.c:5891 -+#: ../shell/ev-window.c:5763 - msgid "Open a copy of the current document in a new window" - msgstr "বর্তমান ডকুমেন্টের একটি প্রতিলিপি পৃথক উইন্ডোর মধ্যে প্রদর্শন করা হবে" - --#: ../shell/ev-window.c:5893 -+#: ../shell/ev-window.c:5765 - msgid "_Save a Copy…" - msgstr "একটি প্রতিলিপি সংরক্ষণ করুন...(_S)" - --#: ../shell/ev-window.c:5894 -+#: ../shell/ev-window.c:5766 - msgid "Save a copy of the current document" - msgstr "বর্তমান ডকুমেন্টের একটি প্রতিলিপি সংরক্ষণ করুন" - --#: ../shell/ev-window.c:5896 -+#: ../shell/ev-window.c:5768 - msgid "Send _To..." - msgstr "উদ্দিষ্ট স্থান...(_T)" - --#: ../shell/ev-window.c:5897 -+#: ../shell/ev-window.c:5769 - msgid "Send current document by mail, instant message..." - msgstr "বর্তমান ডকুমেন্টটি মেইল, ইনস্ট্যান্ট বার্তার মাধ্যমে পাঠানো হবে..." - --#: ../shell/ev-window.c:5899 -+#: ../shell/ev-window.c:5771 - msgid "Open Containing _Folder" - msgstr "ধারণকারী ফোল্ডার খুলুন (_F)" - --#: ../shell/ev-window.c:5900 -+#: ../shell/ev-window.c:5772 - msgid "Show the folder which contains this file in the file manager" - msgstr "" - "এই ফাইল ধারণকারী ফোল্ডারটি ফাইল পরিচালনব্যবস্থার মধ্যে প্রদর্শন করা হবে" - --#: ../shell/ev-window.c:5902 -+#: ../shell/ev-window.c:5774 - msgid "_Print…" - msgstr "প্রিন্ট করুন...(_P)" - --#: ../shell/ev-window.c:5905 -+#: ../shell/ev-window.c:5777 - msgid "P_roperties" - msgstr "বৈশিষ্ট্যাবলী (_r)" - --#: ../shell/ev-window.c:5913 -+#: ../shell/ev-window.c:5785 - msgid "Select _All" - msgstr "সমগ্র নির্বাচন করুন (_A)" - --#: ../shell/ev-window.c:5915 --msgid "_Find…" --msgstr "অনুসন্ধান...(_F)" -- --#: ../shell/ev-window.c:5916 --msgid "Find a word or phrase in the document" --msgstr "ডকুমেন্টের মধ্যে একটি শব্দ অথবা পংক্তি অনুসন্ধান করুন" -- --#: ../shell/ev-window.c:5922 --msgid "T_oolbar" --msgstr "টুল-বার(_o)" -- --#: ../shell/ev-window.c:5924 -+#: ../shell/ev-window.c:5787 - msgid "Rotate _Left" - msgstr "বাঁদিকে ঘোরানো হবে (_L)" - --#: ../shell/ev-window.c:5926 -+#: ../shell/ev-window.c:5789 - msgid "Rotate _Right" - msgstr "ডানদিকে ঘোরানো হবে (_R)" - --#: ../shell/ev-window.c:5928 -+#: ../shell/ev-window.c:5791 - msgid "Save Current Settings as _Default" - msgstr "ডিফল্ট রূপে বর্তমান বৈশিষ্ট্যগুলি সংরক্ষণ করা হবে (_D)" - --#: ../shell/ev-window.c:5939 -+#: ../shell/ev-window.c:5802 - msgid "_Reload" - msgstr "পুনরায় লোড করুন (_R)" - --#: ../shell/ev-window.c:5940 -+#: ../shell/ev-window.c:5803 - msgid "Reload the document" - msgstr "ডকুমেন্ট পুনরায় লোড করুন" - --#: ../shell/ev-window.c:5943 -+#: ../shell/ev-window.c:5806 - msgid "Auto_scroll" - msgstr "স্বয়ংক্রিয় স্ক্রোল (_s)" - --#: ../shell/ev-window.c:5953 -+#: ../shell/ev-window.c:5816 - msgid "_First Page" - msgstr "প্রথম পৃষ্ঠা (_F)" - --#: ../shell/ev-window.c:5954 -+#: ../shell/ev-window.c:5817 - msgid "Go to the first page" - msgstr "প্রথম পৃষ্ঠায় চলুন" - --#: ../shell/ev-window.c:5956 -+#: ../shell/ev-window.c:5819 - msgid "_Last Page" - msgstr "সর্বশেষ পৃষ্ঠা (_L)" - --#: ../shell/ev-window.c:5957 -+#: ../shell/ev-window.c:5820 - msgid "Go to the last page" - msgstr "সর্বশেষ পৃষ্ঠায় চলুন" - --#: ../shell/ev-window.c:5959 --#| msgid "Go to page" -+#: ../shell/ev-window.c:5822 - msgid "Go to Pa_ge" - msgstr "চিহ্নিত পৃষ্ঠায় চলুন (_g)" - --#: ../shell/ev-window.c:5960 --#| msgid "Go to page" -+#: ../shell/ev-window.c:5823 - msgid "Go to Page" - msgstr "চিহ্নিত পৃষ্ঠায় চলুন" - - #. Bookmarks menu --#: ../shell/ev-window.c:5964 -+#: ../shell/ev-window.c:5827 - msgid "_Add Bookmark" - msgstr "বুকমার্ক যোগ করুন (_A)" - --#: ../shell/ev-window.c:5965 -+#: ../shell/ev-window.c:5828 - msgid "Add a bookmark for the current page" - msgstr "বর্তমান পৃষ্ঠার জন্য একটি বুকমার্ক যোগ করুন" - --#. Help menu --#: ../shell/ev-window.c:5969 --msgid "_Contents" --msgstr "সূচি (_C)" -- --#: ../shell/ev-window.c:5972 -+#: ../shell/ev-window.c:5831 - msgid "_About" - msgstr "পরিচিতি (_A)" - - #. Toolbar-only --#: ../shell/ev-window.c:5976 -+#: ../shell/ev-window.c:5835 - msgid "Leave Fullscreen" - msgstr "সম্পূর্ণ পর্দায় প্রদর্শন বন্ধ করা হবে" - --#: ../shell/ev-window.c:5977 -+#: ../shell/ev-window.c:5836 - msgid "Leave fullscreen mode" - msgstr "সম্পূর্ণ পর্দায় প্রদর্শন বন্ধ করুন" - --#: ../shell/ev-window.c:5979 -+#: ../shell/ev-window.c:5838 - msgid "Start Presentation" - msgstr "উপস্থাপনা প্রারম্ভ করা হবে" - --#: ../shell/ev-window.c:5980 -+#: ../shell/ev-window.c:5839 - msgid "Start a presentation" - msgstr "উপস্থাপনা প্রারম্ভ করা হবে" - - #. View Menu --#: ../shell/ev-window.c:6043 --msgid "_Toolbar" --msgstr "টুল-বার (_T)" -- --#: ../shell/ev-window.c:6044 --msgid "Show or hide the toolbar" --msgstr "টুল-বার প্রদর্শন অথবা আড়াল করা হবে" -- --#: ../shell/ev-window.c:6046 -+#: ../shell/ev-window.c:5910 - msgid "Side _Pane" - msgstr "পার্শ্ববর্তী পেইন (_P)" - --#: ../shell/ev-window.c:6047 -+#: ../shell/ev-window.c:5911 - msgid "Show or hide the side pane" - msgstr "পার্শ্ববর্তী পেইন প্রদর্শন অথবা আড়াল করা হবে" - --#: ../shell/ev-window.c:6049 -+#: ../shell/ev-window.c:5913 - msgid "_Continuous" - msgstr "নিরবিচ্ছিন্ন (_C)" - --#: ../shell/ev-window.c:6050 -+#: ../shell/ev-window.c:5914 - msgid "Show the entire document" - msgstr "সম্পূর্ণ ডকুমেন্ট প্রদর্শন করা হবে" - --#: ../shell/ev-window.c:6052 --msgid "_Dual (Even pages left)" --msgstr "দুটি (জোড় সংখ্যক পৃষ্ঠা বাঁদিকে) (_D)" -- --#: ../shell/ev-window.c:6053 --#| msgid "Show two pages at once" --msgid "Show two pages at once with even pages on the left" --msgstr "একযোগে দুটি পৃষ্ঠা প্রদর্শিত হবে ও জোড় সংখ্যক পৃষ্ঠা বাঁদিকে থাকবে" -- --#: ../shell/ev-window.c:6055 --msgid "Dual (_Odd pages left)" --msgstr "দুটি (বেজোড় সংখ্যক পৃষ্ঠা বাঁদিকে) (_D)" -- --#: ../shell/ev-window.c:6056 --#| msgid "Show two pages at once" --msgid "Show two pages at once with odd pages on the left" --msgstr "একযোগে দুটি পৃষ্ঠা প্রদর্শিত হবে ও বেজোড় সংখ্যক পৃষ্ঠা বাঁদিকে থাকবে" -+#: ../shell/ev-window.c:5916 -+msgid "_Dual" -+msgstr "দ্বৈত (_D)" -+ -+#: ../shell/ev-window.c:5917 -+msgid "Show two pages at once" -+msgstr "একবারে দুইটি পৃষ্ঠা দেখুন" -+ -+#: ../shell/ev-window.c:5919 -+msgid "_Odd pages left" -+msgstr "অযুগ্ম পৃষ্ঠা অবশিষ্ট (_O)" -+ -+#: ../shell/ev-window.c:5920 -+msgid "Show odd pages on the left in dual mode" -+msgstr "দ্বৈত মোডে বাম দিকে অযুগ্ম পৃষ্ঠাগুলি দেখান" - --#: ../shell/ev-window.c:6058 -+#: ../shell/ev-window.c:5922 - msgid "_Fullscreen" - msgstr "সম্পূর্ণ পর্দায় প্রদর্শন (_F)" - --#: ../shell/ev-window.c:6059 -+#: ../shell/ev-window.c:5923 - msgid "Expand the window to fill the screen" - msgstr "পর্দার সম্পূর্ণ মাপ অনুযায়ী প্রদর্শনের জন্য উইন্ডোর মাপ বৃদ্ধি করুন" - --#: ../shell/ev-window.c:6061 -+#: ../shell/ev-window.c:5925 - msgid "Pre_sentation" - msgstr "উপস্থাপনা (_P)" - --#: ../shell/ev-window.c:6062 -+#: ../shell/ev-window.c:5926 - msgid "Run document as a presentation" - msgstr "উপস্থাপনা রূপে ডকুমেন্ট প্রদর্শিত হবে" - --#: ../shell/ev-window.c:6070 -+#: ../shell/ev-window.c:5934 - msgid "_Inverted Colors" - msgstr "বিপরীত রং (_I)" - --#: ../shell/ev-window.c:6071 -+#: ../shell/ev-window.c:5935 - msgid "Show page contents with the colors inverted" - msgstr "বিপরীত রং সহ পৃষ্ঠার তথ্য প্রদর্শন করা হবে" - -+#: ../shell/ev-window.c:5938 -+msgid "_Find…" -+msgstr "অনুসন্ধান...(_F)" -+ -+#: ../shell/ev-window.c:5939 -+msgid "Find a word or phrase in the document" -+msgstr "ডকুমেন্টের মধ্যে একটি শব্দ অথবা পংক্তি অনুসন্ধান করুন" -+ - #. Links --#: ../shell/ev-window.c:6079 -+#: ../shell/ev-window.c:5947 - msgid "_Open Link" - msgstr "লিঙ্ক খুলুন (_O)" - --#: ../shell/ev-window.c:6081 -+#: ../shell/ev-window.c:5949 - msgid "_Go To" - msgstr "গন্তব্য (_G)" - --#: ../shell/ev-window.c:6083 -+#: ../shell/ev-window.c:5951 - msgid "Open in New _Window" - msgstr "নতুন উইন্ডোর মধ্যে প্রদর্শন করা হবে (_W)" - --#: ../shell/ev-window.c:6085 -+#: ../shell/ev-window.c:5953 - msgid "_Copy Link Address" - msgstr "লিঙ্কের ঠিকানা কপি করুন (_C)" - --#: ../shell/ev-window.c:6087 -+#: ../shell/ev-window.c:5955 - msgid "_Save Image As…" - msgstr "নতুন রূপে ছবি সংরক্ষণ করুন...(_S)" - --#: ../shell/ev-window.c:6089 -+#: ../shell/ev-window.c:5957 - msgid "Copy _Image" - msgstr "ছবি কপি করুন (_I)" - --#: ../shell/ev-window.c:6091 -+#: ../shell/ev-window.c:5959 - msgid "Annotation Properties…" - msgstr "টিকার বৈশিষ্ট্য…" - --#: ../shell/ev-window.c:6096 -+#: ../shell/ev-window.c:5964 - msgid "_Open Attachment" - msgstr "সংযুক্ত বস্তু খুলুন...(_O)" - --#: ../shell/ev-window.c:6098 -+#: ../shell/ev-window.c:5966 - msgid "_Save Attachment As…" - msgstr "সংযুক্ত বস্তু সংরক্ষণ করুন...(_S)" - --#: ../shell/ev-window.c:6190 -+#: ../shell/ev-window.c:6057 - msgid "Zoom" - msgstr "প্রদর্শনের মাপ" - --#: ../shell/ev-window.c:6192 -+#: ../shell/ev-window.c:6059 - msgid "Adjust the zoom level" - msgstr "প্রদর্শনের মাত্রা পরিবর্তন করুন" - --#: ../shell/ev-window.c:6202 --msgid "Navigation" --msgstr "পরিদর্শন" -- --#: ../shell/ev-window.c:6204 --msgid "Back" --msgstr "পূর্ববর্তী" -- --#. translators: this is the history action --#: ../shell/ev-window.c:6207 --msgid "Move across visited pages" --msgstr "পরিদর্শিত পৃষ্ঠাগুলির মধ্যে চলাচল করুন" -+#: ../shell/ev-window.c:6070 -+msgid "History" -+msgstr "ইতিহাস" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6236 -+#: ../shell/ev-window.c:6099 - msgid "Open Folder" - msgstr "ফোল্ডার খুলুন" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6240 -+#: ../shell/ev-window.c:6103 - msgid "Send To" - msgstr "চিহ্নিত স্থানে প্রেরণ" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6246 -+#: ../shell/ev-window.c:6109 - msgid "Previous" - msgstr "পূর্ববর্তী" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6251 -+#: ../shell/ev-window.c:6114 - msgid "Next" - msgstr "পরবর্তী" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6255 -+#: ../shell/ev-window.c:6118 - msgid "Zoom In" - msgstr "বড় করে প্রদর্শন" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6259 -+#: ../shell/ev-window.c:6122 - msgid "Zoom Out" - msgstr "ছোট করে প্রদর্শন" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6267 -+#: ../shell/ev-window.c:6126 -+#: ../shell/ev-zoom-action-widget.c:42 -+msgid "Fit Page" -+msgstr "পৃষ্ঠা সামঞ্জস্যকরণ" -+ -+#. translators: this is the label for toolbar button -+#: ../shell/ev-window.c:6130 -+#: ../shell/ev-zoom-action-widget.c:43 - msgid "Fit Width" - msgstr "প্রস্থ অনুযায়ী নির্ধারণ" - --#: ../shell/ev-window.c:6414 ../shell/ev-window.c:6430 -+#: ../shell/ev-window.c:6276 -+#: ../shell/ev-window.c:6292 - msgid "Unable to launch external application." - msgstr "বহিস্থিত অ্যাপ্লিকেশন আরম্ভ করতে ব্যর্থ।" - --#: ../shell/ev-window.c:6487 -+#: ../shell/ev-window.c:6349 - msgid "Unable to open external link" - msgstr "বহিস্থিত লিঙ্ক খুলতে ব্যর্থ" - --#: ../shell/ev-window.c:6680 -+#: ../shell/ev-window.c:6542 - msgid "Couldn't find appropriate format to save image" - msgstr "ছবি সংরক্ষণের জন্য যথাযত বিন্যাস পাওয়া যায়নি" - --#: ../shell/ev-window.c:6712 -+#: ../shell/ev-window.c:6574 - msgid "The image could not be saved." - msgstr "ছবি সংরক্ষণ করতে ব্যর্থ।" - --#: ../shell/ev-window.c:6744 -+#: ../shell/ev-window.c:6606 - msgid "Save Image" - msgstr "ছবি সংরক্ষণ করুন" - --#: ../shell/ev-window.c:6875 -+#: ../shell/ev-window.c:6737 - msgid "Unable to open attachment" - msgstr "সংযুক্ত বস্তু খুলতে ব্যর্থ" - --#: ../shell/ev-window.c:6931 -+#: ../shell/ev-window.c:6793 - msgid "The attachment could not be saved." - msgstr "সংযুক্ত বস্তু সংরক্ষণ করতে ব্যর্থ।" - --#: ../shell/ev-window.c:6976 -+#: ../shell/ev-window.c:6838 - msgid "Save Attachment" - msgstr "সংযুক্ত বস্তু সংরক্ষণ করুন" - -@@ -1750,11 +1665,64 @@ - msgid "%s — Password Required" - msgstr "%s - পাসওয়ার্ড আবশ্যক" - --#: ../shell/ev-utils.c:318 --msgid "By extension" --msgstr "এক্সটেনশন অনুযায়ী" -+#: ../shell/ev-zoom-action-widget.c:45 -+msgid "50%" -+msgstr "৫০%" -+ -+#: ../shell/ev-zoom-action-widget.c:46 -+msgid "70%" -+msgstr "৭০%" -+ -+#: ../shell/ev-zoom-action-widget.c:47 -+msgid "85%" -+msgstr "৮৫%" -+ -+#: ../shell/ev-zoom-action-widget.c:48 -+msgid "100%" -+msgstr "১০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:49 -+msgid "125%" -+msgstr "১২৫%" -+ -+#: ../shell/ev-zoom-action-widget.c:50 -+msgid "150%" -+msgstr "১৫০%" - --#: ../shell/main.c:70 ../shell/main.c:276 -+#: ../shell/ev-zoom-action-widget.c:51 -+msgid "175%" -+msgstr "১৭৫%" -+ -+#: ../shell/ev-zoom-action-widget.c:52 -+msgid "200%" -+msgstr "২০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:53 -+msgid "300%" -+msgstr "৩০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:54 -+msgid "400%" -+msgstr "৪০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:55 -+msgid "800%" -+msgstr "৮০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:56 -+msgid "1600%" -+msgstr "১৬০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:57 -+msgid "3200%" -+msgstr "৩২০০%" -+ -+#: ../shell/ev-zoom-action-widget.c:58 -+msgid "6400%" -+msgstr "৬৪০০%" -+ -+#: ../shell/main.c:70 -+#: ../shell/main.c:276 - msgid "GNOME Document Viewer" - msgstr "GNOME Document Viewer" - -@@ -1806,140 +1774,6 @@ - msgid "[FILE…]" - msgstr "[FILE…]" - --#~ msgid "Toggle case sensitive search" --#~ msgstr "অনুসন্ধানের সময় হরফের ছাঁদ গণ্য করা হবে অথবা হবে না" -- --#~ msgid "_Dual" --#~ msgstr "দ্বৈত (_D)" -- --#~ msgid "Impress Slides" --#~ msgstr "Impress স্লাইড" -- --#~ msgid "No error" --#~ msgstr "ত্রুটিমুক্ত" -- --#~ msgid "Not enough memory" --#~ msgstr "পর্যাপ্ত মেমরি অনুপস্থি" -- --#, fuzzy --#~ msgid "Cannot find ZIP signature" --#~ msgstr "zip স্বাক্ষর পাওয়া যায়নি" -- --#, fuzzy --#~ msgid "Invalid ZIP file" --#~ msgstr "অবৈধ zip ফাইল" -- --#, fuzzy --#~ msgid "Multi file ZIPs are not supported" --#~ msgstr "একাধিক ফাইল zip সমর্থিত নয়" -- --#~ msgid "Cannot read data from file" --#~ msgstr "ফাইল থেকে তথ্য পড়তে ব্যর্থ" -- --#, fuzzy --#~ msgid "Cannot find file in the ZIP archive" --#~ msgstr "zip আর্কাইভের মধ্যে ফাইল সনাক্ত করতে ব্যর্থ" -- --#, fuzzy --#~ msgid "Converting %s" --#~ msgstr "%s আরম্ভ করা হচ্ছে" -- --#, fuzzy --#~ msgid "" --#~ "Boolean options available: true enables thumbnailing and false disables " --#~ "the creation of new thumbnails" --#~ msgstr "" --#~ "বুলিয়াল মান প্রযোজ্য, true (সত্য) হলে থাম্ব-নেইল সক্রিয় করা হবে ও মান false " --#~ "(সত্য নয়) হলে নতুন থাম্ব-নেইল নির্মাণ বন্ধ করা হবে" -- --#~ msgid "Enable thumbnailing of PDF Documents" --#~ msgstr "PDF ডকুমেন্টের থাম্ব-নেইল নির্মাণ সক্রিয় করা হবে" -- --#~ msgid "Thumbnail command for PDF Documents" --#~ msgstr "PDF ডকুমেন্টের জন্য ব্যবহারযোগ্য থাম্ব-নেইল কমান্ড" -- --#, fuzzy --#~ msgid "" --#~ "Valid command plus arguments for the PDF Document thumbnailer. See " --#~ "Nautilus thumbnailer documentation for more information." --#~ msgstr "" --#~ "PDF ডকুমেন্টেরর জন্য থাম্ব-নেইল নির্মাণে ব্যবহৃত বৈধ কমান্ড ও আর্গুমেন্ট। অধিক জানতে " --#~ "nautilus thumbnailer সংক্রান্ত নথিপত্র পড়ুন।" -- --#~ msgid "DJVU document has incorrect format" --#~ msgstr "DJVU ডকুমেন্টের বিন্যাস সঠিক নয়" -- --#~ msgid "Failed to create file “%s”: %s" --#~ msgstr "“%s” ফাইল নির্মাণ করতে ব্যর্থ: %s" -- --#~ msgid "Search string" --#~ msgstr "পংক্তি অনুসন্ধান" -- --#~ msgid "The name of the string to be found" --#~ msgstr "অনুসন্ধানের উদ্দেশ্যে চিহ্নিত পংক্তি" -- --#~ msgid "Case sensitive" --#~ msgstr "হরফের ছাঁদ সম্পর্কে সচেতন" -- --#~ msgid "TRUE for a case sensitive search" --#~ msgstr "মান TRUE (সত্য) হলে অনুসন্ধানের সময় হরফের ছাঁদ গণ্য করা হবে" -- --#~ msgid "Highlight color" --#~ msgstr "ঔজ্জ্বল্যের রং" -- --#~ msgid "Color of highlight for all matches" --#~ msgstr "সব মিল উজ্জ্বল করে দর্শানোর জন্য ব্যবহৃত রং" -- --#~ msgid "Current color" --#~ msgstr "বর্তমানের নির্বাচিত রং" -- --#~ msgid "Color of highlight for the current match" --#~ msgstr "বর্তমান মিল উজ্জ্বল করে দর্শানোর জন্য ব্যবহৃত রং" -- --#~ msgid "Recover previous documents?" --#~ msgstr "পূর্ববর্তী নথিপত্র পুনরুদ্ধার করা হবে কি?" -- --#~ msgid "" --#~ "Evince appears to have exited unexpectedly the last time it was run. You " --#~ "can recover the opened documents." --#~ msgstr "" --#~ "সর্বশেষ Evince সঞ্চালনার সময় সম্ভবত এটি অপ্রত্যাশিতভাবে বন্ধ হয়েছিল এবং প্রদর্শিত " --#~ "ডকুমেন্টগুলি পুনরুদ্ধার করা যাবে।" -- --#~ msgid "_Don't Recover" --#~ msgstr "পুনরুদ্ধার করা হবে না (_D)" -- --#~ msgid "_Recover" --#~ msgstr "পুনরুদ্ধার করুন (_R)" -- --#~ msgid "Crash Recovery" --#~ msgstr "বিপর্যয় থেকে পুনরুদ্ধার" -- --#~ msgid "Print..." --#~ msgstr "প্রিন্ট করুন..." -- --#~ msgid "Couldn't create symlink “%s”: " --#~ msgstr "“%s” সিম-লিংক নির্মাণ করা যায়নি: " -- --#~ msgid "Cannot open a copy." --#~ msgstr "প্রতিলিপি খুলতে ব্যর্থ।" -- --#~ msgid "The document doesn't support search" --#~ msgstr "এই ডকুমেন্টের অনুসন্ধানের কোনো ব্যবস্থা নেই" -- --#~ msgid "_Save a Copy..." --#~ msgstr "প্রতিলিপি সংরক্ষণ করুন...(_S)" -- --#, fuzzy --#~ msgid "Page Set_up..." --#~ msgstr "পৃষ্ঠার প্রস্তুতি...(_u)" -- --#, fuzzy --#~ msgid "Setup the page settings for printing" --#~ msgstr "প্রিন্ট করার জন্য পৃষ্ঠার বৈশিষ্ট্য নির্ধারণ করুন" -- --#~ msgid "_Print..." --#~ msgstr "প্রিন্ট করুন...(_P)" -- --#~ msgid "_Find..." --#~ msgstr "অনুসন্ধান...(_F)" -+#: ../shell/evince-appmenu.ui.h:1 -+msgid "_Help" -+msgstr "সহায়তা (_H)" -diff -urN a/evince-3.8.3/po/ja.po b/evince-3.8.3/po/ja.po ---- a/evince-3.8.3/po/ja.po 2013-11-28 15:11:09.980890789 +0530 -+++ b/evince-3.8.3/po/ja.po 2013-11-28 15:11:55.772298642 +0530 -@@ -9,24 +9,25 @@ - # Hideki Yamane , 2011. - # Jiro Matsuzawa , 2011, 2013. - # Ikuya Awashiro , 2012. --# - msgid "" - msgstr "" --"Project-Id-Version: evince master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=evince&keywords=I18N+L10N&component=general\n" --"POT-Creation-Date: 2013-05-07 16:57+0000\n" --"PO-Revision-Date: 2013-05-06 21:26+0900\n" --"Last-Translator: OKANO Takayoshi \n" -+"Project-Id-Version: PACKAGE VERSION\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2013-08-06 14:46+0530\n" -+"PO-Revision-Date: 2013-09-17 12:15-0400\n" -+"Last-Translator: Jiro Matsuzawa \n" - "Language-Team: Japanese \n" --"Language: ja\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"Language: ja\n" - "Plural-Forms: nplurals=1; plural=0;\n" -+"X-Generator: Zanata 3.1.2\n" - - #: ../backend/comics/comics-document.c:210 - #, c-format --msgid "Error launching the command “%s” in order to decompress the comic book: %s" -+msgid "" -+"Error launching the command “%s” in order to decompress the comic book: %s" - msgstr "コミックブックを解凍するためコマンド “%s” を起動する際にエラーが発生しました: %s" - - #: ../backend/comics/comics-document.c:224 -@@ -45,7 +46,8 @@ - msgstr "コミックブックの MIME 型ではありません: %s" - - #: ../backend/comics/comics-document.c:433 --msgid "Can't find an appropriate command to decompress this type of comic book" -+msgid "" -+"Can't find an appropriate command to decompress this type of comic book" - msgstr "このタイプのコミックブックを解凍するのに適したコマンドが見つかりません" - - #: ../backend/comics/comics-document.c:488 -@@ -80,7 +82,9 @@ - msgstr "DjVu ドキュメントの書式が壊れています" - - #: ../backend/djvu/djvu-document.c:245 --msgid "The document is composed of several files. One or more of these files cannot be accessed." -+msgid "" -+"The document is composed of several files. One or more of these files cannot " -+"be accessed." - msgstr "そのドキュメントは複数のファイルを結合したものです。それらのファイルは個別にアクセスすることはできません。" - - #: ../backend/djvu/djvudocument.evince-backend.in.h:1 -@@ -100,12 +104,14 @@ - msgstr "この作品はパブリックドメインです" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:893 ../backend/pdf/ev-poppler.cc:899 -+#: ../backend/pdf/ev-poppler.cc:893 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "Yes" - msgstr "はい" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:896 ../backend/pdf/ev-poppler.cc:899 -+#: ../backend/pdf/ev-poppler.cc:896 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "No" - msgstr "いいえ" - -@@ -142,8 +148,13 @@ - msgstr "不明なフォントの種類です" - - #: ../backend/pdf/ev-poppler.cc:1091 --msgid "This document contains non-embedded fonts that are not from the PDF Standard 14 fonts. If the substitute fonts selected by fontconfig are not the same as the fonts used to create the PDF, the rendering may not be correct." --msgstr "このドキュメントには、PDF 標準の 14 フォント以外に埋め込みでないフォントが含まれています。fontconfig による代替フォントが PDF 生成に使われたフォントと異なる場合、適切なレンダリングがおこなわれない可能性があります。" -+msgid "" -+"This document contains non-embedded fonts that are not from the PDF Standard " -+"14 fonts. If the substitute fonts selected by fontconfig are not the same as " -+"the fonts used to create the PDF, the rendering may not be correct." -+msgstr "" -+"このドキュメントには、PDF 標準の 14 フォント以外に埋め込みでないフォントが含まれています。fontconfig による代替フォントが PDF " -+"生成に使われたフォントと異なる場合、適切なレンダリングがおこなわれない可能性があります。" - - #: ../backend/pdf/ev-poppler.cc:1096 - msgid "All fonts are either standard or embedded." -@@ -156,14 +167,13 @@ - #. translators: When a font type does not have - #. encoding information or it is unknown. Example: - #. Encoding: None --#. - #. translators: Value for 'Page Scaling:' to not scale the document pages on printing - #. translators: This is used when a document property does - #. not have a value. Examples: - #. Author: None - #. Keywords: None --#. --#: ../backend/pdf/ev-poppler.cc:1137 ../libview/ev-print-operation.c:1907 -+#: ../backend/pdf/ev-poppler.cc:1137 -+#: ../libview/ev-print-operation.c:1907 - #: ../properties/ev-properties-view.c:192 - msgid "None" - msgstr "なし" -@@ -184,7 +194,6 @@ - #. * because it is directly appended to the font - #. * type. Example: - #. * "Type 1 (One of the Standard 14 Fonts)" --#. - #: ../backend/pdf/ev-poppler.cc:1156 - msgid " (One of the Standard 14 Fonts)" - msgstr " (標準 14 フォントのひとつ)" -@@ -193,7 +202,6 @@ - #. * because it is directly appended to the font - #. * type. Example: - #. * "TrueType (Not one of the Standard 14 Fonts)" --#. - #: ../backend/pdf/ev-poppler.cc:1163 - msgid " (Not one of the Standard 14 Fonts)" - msgstr " (標準 14 フォントのひとつではない)" -@@ -284,7 +292,8 @@ - msgid "Specify file containing saved configuration" - msgstr "設定が保存されているファイルを指定する" - --#: ../cut-n-paste/smclient/eggsmclient.c:229 ../previewer/ev-previewer.c:46 -+#: ../cut-n-paste/smclient/eggsmclient.c:229 -+#: ../previewer/ev-previewer.c:46 - msgid "FILE" - msgstr "FILE" - -@@ -305,8 +314,10 @@ - msgstr "セッション管理用のオプションを表示する" - - #. Manually set name and icon --#: ../data/evince.desktop.in.in.h:1 ../shell/ev-window.c:4867 --#: ../shell/ev-window-title.c:156 ../shell/main.c:312 -+#: ../data/evince.desktop.in.in.h:1 -+#: ../shell/ev-window.c:4867 -+#: ../shell/ev-window-title.c:156 -+#: ../shell/main.c:312 - #, c-format - msgid "Document Viewer" - msgstr "ドキュメントビューアー" -@@ -317,7 +328,8 @@ - - #: ../data/evince.desktop.in.in.h:3 - msgid "pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;" --msgstr "pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;ポストスクリプト;ドキュメント;文書;プレゼンテーション;" -+msgstr "" -+"pdf;ps;postscript;dvi;xps;djvu;tiff;document;presentation;ポストスクリプト;ドキュメント;文書;プレゼンテーション;" - - #: ../data/evince-previewer.desktop.in.in.h:1 - msgid "Print Preview" -@@ -351,7 +363,8 @@ - msgid "The URI of the directory last used to save a picture" - msgstr "最後に画像を保存したディレクトリのURI" - --#: ../libdocument/ev-attachment.c:310 ../libdocument/ev-attachment.c:331 -+#: ../libdocument/ev-attachment.c:310 -+#: ../libdocument/ev-attachment.c:331 - #, c-format - msgid "Couldn't save attachment “%s”: %s" - msgstr "添付ファイル \"%s\" を保存できませんでした: %s" -@@ -372,7 +385,8 @@ - msgstr "ファイルタイプ %s (%s) はサポートしていません" - - #: ../libdocument/ev-document-factory.c:364 --#: ../libdocument/ev-file-helpers.c:490 ../libdocument/ev-file-helpers.c:536 -+#: ../libdocument/ev-file-helpers.c:490 -+#: ../libdocument/ev-file-helpers.c:536 - #: ../libdocument/ev-file-helpers.c:555 - msgid "Unknown MIME Type" - msgstr "不明な MIME 型です" -@@ -407,8 +421,10 @@ - msgid "of %d" - msgstr "/ %d" - --#: ../libmisc/ev-page-action-widget.c:182 ../shell/ev-history.c:372 --#: ../shell/ev-sidebar-bookmarks.c:312 ../shell/ev-window.c:888 -+#: ../libmisc/ev-page-action-widget.c:182 -+#: ../shell/ev-history.c:426 -+#: ../shell/ev-sidebar-bookmarks.c:312 -+#: ../shell/ev-window.c:888 - #: ../shell/ev-window.c:4602 - #, c-format - msgid "Page %s" -@@ -451,7 +467,8 @@ - - #. translators: Title of the print dialog - #. translators: Print document currently shown in the Print Preview window --#: ../libview/ev-print-operation.c:1322 ../previewer/ev-previewer-window.c:298 -+#: ../libview/ev-print-operation.c:1322 -+#: ../previewer/ev-previewer-window.c:298 - msgid "Print" - msgstr "印刷" - -@@ -469,13 +486,16 @@ - - #: ../libview/ev-print-operation.c:1912 - msgid "" --"Scale document pages to fit the selected printer page. Select from one of the following:\n" -+"Scale document pages to fit the selected printer page. Select from one of " -+"the following:\n" - "\n" - "• \"None\": No page scaling is performed.\n" - "\n" --"• \"Shrink to Printable Area\": Document pages larger than the printable area are reduced to fit the printable area of the printer page.\n" -+"• \"Shrink to Printable Area\": Document pages larger than the printable " -+"area are reduced to fit the printable area of the printer page.\n" - "\n" --"• \"Fit to Printable Area\": Document pages are enlarged or reduced as required to fit the printable area of the printer page.\n" -+"• \"Fit to Printable Area\": Document pages are enlarged or reduced as " -+"required to fit the printable area of the printer page.\n" - msgstr "" - "選択されたプリンターページに合わせてドキュメントページを拡大縮小します。以下から1つ選択してください:\n" - "\n" -@@ -490,15 +510,20 @@ - msgstr "自動回転して中央揃え" - - #: ../libview/ev-print-operation.c:1927 --msgid "Rotate printer page orientation of each page to match orientation of each document page. Document pages will be centered within the printer page." --msgstr "各ページのプリンターページ方向を回転して各ドキュメントページの方向に合わせます。ドキュメントページはプリンターページ内の中央に配置されます。" -+msgid "" -+"Rotate printer page orientation of each page to match orientation of each " -+"document page. Document pages will be centered within the printer page." -+msgstr "" -+"各ページのプリンターページ方向を回転して各ドキュメントページの方向に合わせます。ドキュメントページはプリンターページ内の中央に配置されます。" - - #: ../libview/ev-print-operation.c:1932 - msgid "Select page size using document page size" - msgstr "ドキュメントのページサイズを利用してページサイズを選択する" - - #: ../libview/ev-print-operation.c:1934 --msgid "When enabled, each page will be printed on the same size paper as the document page." -+msgid "" -+"When enabled, each page will be printed on the same size paper as the " -+"document page." - msgstr "有効にした場合、各ページはドキュメントページと同じサイズの紙に印刷されます。" - - #: ../libview/ev-print-operation.c:2023 -@@ -529,46 +554,46 @@ - msgid "Document View" - msgstr "ドキュメントビューアー" - --#: ../libview/ev-view.c:1903 -+#: ../libview/ev-view.c:1910 - msgid "Go to first page" - msgstr "先頭ページへ移動します" - --#: ../libview/ev-view.c:1905 -+#: ../libview/ev-view.c:1912 - msgid "Go to previous page" - msgstr "前のページへ移動します" - --#: ../libview/ev-view.c:1907 -+#: ../libview/ev-view.c:1914 - msgid "Go to next page" - msgstr "次のページへ移動します" - --#: ../libview/ev-view.c:1909 -+#: ../libview/ev-view.c:1916 - msgid "Go to last page" - msgstr "最後のページへ移動します" - --#: ../libview/ev-view.c:1911 -+#: ../libview/ev-view.c:1918 - msgid "Go to page" - msgstr "指定したページに移動します" - --#: ../libview/ev-view.c:1913 -+#: ../libview/ev-view.c:1920 - msgid "Find" - msgstr "検索" - --#: ../libview/ev-view.c:1941 -+#: ../libview/ev-view.c:1948 - #, c-format - msgid "Go to page %s" - msgstr "%s ページへ移動します" - --#: ../libview/ev-view.c:1947 -+#: ../libview/ev-view.c:1954 - #, c-format - msgid "Go to %s on file “%s”" - msgstr "ファイル \"%2$s\" の %1$s へ移動します" - --#: ../libview/ev-view.c:1950 -+#: ../libview/ev-view.c:1957 - #, c-format - msgid "Go to file “%s”" - msgstr "ファイル \"%s\" へ移動します" - --#: ../libview/ev-view.c:1958 -+#: ../libview/ev-view.c:1965 - #, c-format - msgid "Launch %s" - msgstr "%s の起動" -@@ -589,11 +614,13 @@ - msgid "Print settings file" - msgstr "プリンター設定ファイル" - --#: ../previewer/ev-previewer.c:175 ../previewer/ev-previewer.c:207 -+#: ../previewer/ev-previewer.c:175 -+#: ../previewer/ev-previewer.c:207 - msgid "GNOME Document Previewer" - msgstr "GNOME ドキュメントプレビューアー" - --#: ../previewer/ev-previewer-window.c:91 ../shell/ev-window.c:3329 -+#: ../previewer/ev-previewer-window.c:91 -+#: ../shell/ev-window.c:3329 - msgid "Failed to print document" - msgstr "ドキュメントの印刷に失敗しました" - -@@ -603,55 +630,68 @@ - msgstr "選択したプリンター '%s' が見つかりませんでした" - - #. Go menu --#: ../previewer/ev-previewer-window.c:284 ../shell/ev-window.c:5810 -+#: ../previewer/ev-previewer-window.c:284 -+#: ../shell/ev-window.c:5810 - msgid "_Previous Page" - msgstr "前のページ(_P)" - --#: ../previewer/ev-previewer-window.c:285 ../shell/ev-window.c:5811 -+#: ../previewer/ev-previewer-window.c:285 -+#: ../shell/ev-window.c:5811 - msgid "Go to the previous page" - msgstr "前のページに移動します" - --#: ../previewer/ev-previewer-window.c:287 ../shell/ev-window.c:5813 -+#: ../previewer/ev-previewer-window.c:287 -+#: ../shell/ev-window.c:5813 - msgid "_Next Page" - msgstr "次のページ(_N)" - --#: ../previewer/ev-previewer-window.c:288 ../shell/ev-window.c:5814 -+#: ../previewer/ev-previewer-window.c:288 -+#: ../shell/ev-window.c:5814 - msgid "Go to the next page" - msgstr "次のページに移動します" - --#: ../previewer/ev-previewer-window.c:291 ../shell/ev-window.c:5797 -+#: ../previewer/ev-previewer-window.c:291 -+#: ../shell/ev-window.c:5797 - msgid "Enlarge the document" - msgstr "このドキュメントを拡大します" - --#: ../previewer/ev-previewer-window.c:294 ../shell/ev-window.c:5800 -+#: ../previewer/ev-previewer-window.c:294 -+#: ../shell/ev-window.c:5800 - msgid "Shrink the document" - msgstr "このドキュメントを縮小します" - --#: ../previewer/ev-previewer-window.c:299 ../shell/ev-window.c:5775 -+#: ../previewer/ev-previewer-window.c:299 -+#: ../shell/ev-window.c:5775 - msgid "Print this document" - msgstr "このドキュメントを印刷します" - --#: ../previewer/ev-previewer-window.c:343 ../shell/ev-window.c:5928 -+#: ../previewer/ev-previewer-window.c:343 -+#: ../shell/ev-window.c:5928 - msgid "Fit Pa_ge" - msgstr "ページに合わせる(_G)" - --#: ../previewer/ev-previewer-window.c:344 ../shell/ev-window.c:5929 -+#: ../previewer/ev-previewer-window.c:344 -+#: ../shell/ev-window.c:5929 - msgid "Make the current document fill the window" - msgstr "このドキュメント全体がウィンドウに収まるように表示します" - --#: ../previewer/ev-previewer-window.c:346 ../shell/ev-window.c:5931 -+#: ../previewer/ev-previewer-window.c:346 -+#: ../shell/ev-window.c:5931 - msgid "Fit _Width" - msgstr "幅に合わせる(_W)" - --#: ../previewer/ev-previewer-window.c:347 ../shell/ev-window.c:5932 -+#: ../previewer/ev-previewer-window.c:347 -+#: ../shell/ev-window.c:5932 - msgid "Make the current document fill the window width" - msgstr "このドキュメントの幅をウィンドウの幅に合わせます" - --#: ../previewer/ev-previewer-window.c:540 ../shell/ev-window.c:6043 -+#: ../previewer/ev-previewer-window.c:540 -+#: ../shell/ev-window.c:6043 - msgid "Page" - msgstr "ページ" - --#: ../previewer/ev-previewer-window.c:541 ../shell/ev-window.c:6044 -+#: ../previewer/ev-previewer-window.c:541 -+#: ../shell/ev-window.c:6044 - msgid "Select Page" - msgstr "直接ページを指定します" - -@@ -721,7 +761,6 @@ - #. * want inches, otherwise translate to default:mm. - #. * Do *not* translate it to "predefinito:mm", if it - #. * it isn't default:mm or default:inch it will not work --#. - #: ../properties/ev-properties-view.c:220 - msgid "default:mm" - msgstr "default:mm" -@@ -846,11 +885,11 @@ - msgid "Close" - msgstr "閉じる" - --#: ../shell/ev-history-action-widget.c:223 -+#: ../shell/ev-history-action-widget.c:227 - msgid "Go to previous history item" - msgstr "前の履歴へ移動します" - --#: ../shell/ev-history-action-widget.c:227 -+#: ../shell/ev-history-action-widget.c:231 - msgid "Go to next history item" - msgstr "次の履歴へ移動します" - -@@ -860,8 +899,10 @@ - msgstr "ドキュメント %s のパスワード" - - #. Create tree view --#: ../shell/ev-loading-message.c:50 ../shell/ev-sidebar-annotations.c:131 --#: ../shell/ev-sidebar-layers.c:125 ../shell/ev-sidebar-links.c:261 -+#: ../shell/ev-loading-message.c:50 -+#: ../shell/ev-sidebar-annotations.c:131 -+#: ../shell/ev-sidebar-layers.c:125 -+#: ../shell/ev-sidebar-links.c:261 - msgid "Loading…" - msgstr "読み込み中です…" - -@@ -870,10 +911,13 @@ - msgstr "最近開いたドキュメントを再び開きます" - - #: ../shell/ev-password-view.c:142 --msgid "This document is locked and can only be read by entering the correct password." -+msgid "" -+"This document is locked and can only be read by entering the correct " -+"password." - msgstr "このドキュメントはロックされているので、正しいパスワードを入力したときのみ読み込みが可能です。" - --#: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 -+#: ../shell/ev-password-view.c:151 -+#: ../shell/ev-password-view.c:269 - msgid "_Unlock Document" - msgstr "ドキュメントのロックを解除(_U)" - -@@ -887,7 +931,8 @@ - - #: ../shell/ev-password-view.c:302 - #, c-format --msgid "The document “%s” is locked and requires a password before it can be opened." -+msgid "" -+"The document “%s” is locked and requires a password before it can be opened." - msgstr "ロックされているドキュメント \"%s\" を開くにはパスワードが必要です。" - - #: ../shell/ev-password-view.c:332 -@@ -947,7 +992,8 @@ - msgid "List" - msgstr "リスト" - --#: ../shell/ev-sidebar-annotations.c:199 ../shell/ev-sidebar-annotations.c:527 -+#: ../shell/ev-sidebar-annotations.c:199 -+#: ../shell/ev-sidebar-annotations.c:527 - msgid "Annotations" - msgstr "注釈" - -@@ -1020,7 +1066,8 @@ - msgid "The document contains only empty pages" - msgstr "ドキュメントには空のページしかありません" - --#: ../shell/ev-window.c:1689 ../shell/ev-window.c:1851 -+#: ../shell/ev-window.c:1689 -+#: ../shell/ev-window.c:1851 - msgid "Unable to open document" - msgstr "ドキュメントを開けません" - -@@ -1029,7 +1076,8 @@ - msgid "Loading document from “%s”" - msgstr "“%s” からドキュメントを読み込んでいます" - --#: ../shell/ev-window.c:1964 ../shell/ev-window.c:2254 -+#: ../shell/ev-window.c:1964 -+#: ../shell/ev-window.c:2254 - #, c-format - msgid "Downloading document (%d%%)" - msgstr "ドキュメントのダウンロード中 (%d%%)" -@@ -1066,7 +1114,8 @@ - msgid "Saving image to %s" - msgstr "%s に画像を保存しています" - --#: ../shell/ev-window.c:2766 ../shell/ev-window.c:2866 -+#: ../shell/ev-window.c:2766 -+#: ../shell/ev-window.c:2866 - #, c-format - msgid "The file could not be saved as “%s”." - msgstr "ファイルを \"%s\" として保存できませんでした。" -@@ -1088,7 +1137,7 @@ - - #: ../shell/ev-window.c:2917 - msgid "Save a Copy" --msgstr "別名で保存" -+msgstr "名前を付けて保存" - - #: ../shell/ev-window.c:2981 - msgid "Could not send current document" -@@ -1110,17 +1159,21 @@ - msgstr "印刷ジョブ \"%s\"" - - #: ../shell/ev-window.c:3563 --msgid "Document contains form fields that have been filled out. If you don't save a copy, changes will be permanently lost." --msgstr "ドキュメントには内容を埋めたフォームフィールドが含まれています。別名で保存しない場合は変更点は失われます。" -+msgid "" -+"Document contains form fields that have been filled out. If you don't save a " -+"copy, changes will be permanently lost." -+msgstr "ドキュメントには内容を埋めたフォームフィールドが含まれています。名前を付けて保存しない場合は変更点は失われます。" - - #: ../shell/ev-window.c:3567 --msgid "Document contains new or modified annotations. If you don't save a copy, changes will be permanently lost." --msgstr "ドキュメントには新規もしくは更新された注釈が含まれています。別名で保存しない場合は変更点は失われます。" -+msgid "" -+"Document contains new or modified annotations. If you don't save a copy, " -+"changes will be permanently lost." -+msgstr "ドキュメントには新規もしくは更新された注釈が含まれています。名前を付けて保存しない場合は変更点は失われます。" - - #: ../shell/ev-window.c:3574 - #, c-format - msgid "Save a copy of document “%s” before closing?" --msgstr "ドキュメント \"%s\" を閉じる前に別名で保存しますか?" -+msgstr "ドキュメント \"%s\" を閉じる前に名前を付けて保存しますか?" - - #: ../shell/ev-window.c:3593 - msgid "Close _without Saving" -@@ -1128,7 +1181,7 @@ - - #: ../shell/ev-window.c:3597 - msgid "Save a _Copy" --msgstr "別名で保存(_C)" -+msgstr "名前を付けて保存(_C)" - - #: ../shell/ev-window.c:3671 - #, c-format -@@ -1140,8 +1193,10 @@ - #. so the ngettext is needed. - #: ../shell/ev-window.c:3677 - #, c-format --msgid "There is %d print job active. Wait until print finishes before closing?" --msgid_plural "There are %d print jobs active. Wait until print finishes before closing?" -+msgid "" -+"There is %d print job active. Wait until print finishes before closing?" -+msgid_plural "" -+"There are %d print jobs active. Wait until print finishes before closing?" - msgstr[0] "現在 %d 個の印刷ジョブがあります。すべてのジョブが完了するまで、閉じずに待機しますか?" - - #: ../shell/ev-window.c:3692 -@@ -1162,24 +1217,40 @@ - - #: ../shell/ev-window.c:4863 - #, c-format --msgid "" --"Document Viewer\n" -+msgid "Document Viewer\n" - "Using %s (%s)" --msgstr "" --"ドキュメントビューアー\n" -+msgstr "ドキュメントビューアー\n" - "%s (%s) を利用" - - #: ../shell/ev-window.c:4896 --msgid "Evince 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 2 of the License, or (at your option) any later version.\n" --msgstr "Evince はフリーソフトウェアです; フリーソフトウェア財団が発行する GNU 一般公衆利用許諾契約書の第二版、あるいはそれ以降の版が定める条項の下で本プログラムを再頒布または変更することができます。\n" -+msgid "" -+"Evince 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 2 of the License, or (at your option) any later " -+"version.\n" -+msgstr "" -+"Evince はフリーソフトウェアです; フリーソフトウェア財団が発行する GNU " -+"一般公衆利用許諾契約書の第二版、あるいはそれ以降の版が定める条項の下で本プログラムを再頒布または変更することができます。\n" - - #: ../shell/ev-window.c:4900 --msgid "Evince 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.\n" --msgstr "Evince は役立つものであることを期待して配布されていますが、完全に無保証です。商用利用または特定の目的における適合性の保証はありません。詳細は GNU 一般公衆利用許諾契約書をご覧ください。\n" -+msgid "" -+"Evince 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.\n" -+msgstr "" -+"Evince は役立つものであることを期待して配布されていますが、完全に無保証です。商用利用または特定の目的における適合性の保証はありません。詳細は " -+"GNU 一般公衆利用許諾契約書をご覧ください。\n" - - #: ../shell/ev-window.c:4904 --msgid "You should have received a copy of the GNU General Public License along with Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" --msgstr "あなたは、本プログラムと一緒に GNU 一般公衆利用許諾契約書の写しを受け取っているはずです。そうでない場合は、Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA まで手紙を書いてください。\n" -+msgid "" -+"You should have received a copy of the GNU General Public License along with " -+"Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " -+"Street, Fifth Floor, Boston, MA 02110-1301 USA\n" -+msgstr "" -+"あなたは、本プログラムと一緒に GNU 一般公衆利用許諾契約書の写しを受け取っているはずです。そうでない場合は、Free Software " -+"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 " -+"USA まで手紙を書いてください。\n" - - #: ../shell/ev-window.c:4929 - msgid "Evince" -@@ -1228,11 +1299,13 @@ - msgstr "最近開いたファイル(_R)" - - #. File menu --#: ../shell/ev-window.c:5759 ../shell/ev-window.c:6079 -+#: ../shell/ev-window.c:5759 -+#: ../shell/ev-window.c:6079 - msgid "_Open…" - msgstr "開く(_O)…" - --#: ../shell/ev-window.c:5760 ../shell/ev-window.c:6080 -+#: ../shell/ev-window.c:5760 -+#: ../shell/ev-window.c:6080 - msgid "Open an existing document" - msgstr "既存のドキュメントを開きます" - -@@ -1246,11 +1319,11 @@ - - #: ../shell/ev-window.c:5765 - msgid "_Save a Copy…" --msgstr "別名で保存(_S)…" -+msgstr "名前を付けて保存(_S)…" - - #: ../shell/ev-window.c:5766 - msgid "Save a copy of the current document" --msgstr "このドキュメントを別名で保存します" -+msgstr "名前を付けてこのドキュメントを保存します" - - #: ../shell/ev-window.c:5768 - msgid "Send _To..." -@@ -1442,7 +1515,7 @@ - - #: ../shell/ev-window.c:5955 - msgid "_Save Image As…" --msgstr "画像を別名で保存(_S)…" -+msgstr "名前を付けて画像を保存(_S)…" - - #: ../shell/ev-window.c:5957 - msgid "Copy _Image" -@@ -1458,7 +1531,7 @@ - - #: ../shell/ev-window.c:5966 - msgid "_Save Attachment As…" --msgstr "添付ファイルを別名で保存(_S)…" -+msgstr "名前を付けて添付ファイルを保存(_S)…" - - #: ../shell/ev-window.c:6057 - msgid "Zoom" -@@ -1470,7 +1543,7 @@ - - #: ../shell/ev-window.c:6070 - msgid "History" --msgstr "" -+msgstr "履歴" - - #. translators: this is the label for toolbar button - #: ../shell/ev-window.c:6099 -@@ -1503,16 +1576,19 @@ - msgstr "縮小" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6126 ../shell/ev-zoom-action-widget.c:42 -+#: ../shell/ev-window.c:6126 -+#: ../shell/ev-zoom-action-widget.c:42 - msgid "Fit Page" - msgstr "ページに合わせる" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6130 ../shell/ev-zoom-action-widget.c:43 -+#: ../shell/ev-window.c:6130 -+#: ../shell/ev-zoom-action-widget.c:43 - msgid "Fit Width" - msgstr "幅に合わせる" - --#: ../shell/ev-window.c:6276 ../shell/ev-window.c:6292 -+#: ../shell/ev-window.c:6276 -+#: ../shell/ev-window.c:6292 - msgid "Unable to launch external application." - msgstr "外部のアプリケーションを起動できませんでした。" - -@@ -1605,7 +1681,8 @@ - msgid "6400%" - msgstr "6400%" - --#: ../shell/main.c:70 ../shell/main.c:276 -+#: ../shell/main.c:70 -+#: ../shell/main.c:276 - msgid "GNOME Document Viewer" - msgstr "GNOME ドキュメントビューアー" - -@@ -1660,99 +1737,3 @@ - #: ../shell/evince-appmenu.ui.h:1 - msgid "_Help" - msgstr "ヘルプ(_H)" -- --#~ msgid "Show “_%s”" --#~ msgstr "\"%s\" の表示" -- --#~ msgid "_Move on Toolbar" --#~ msgstr "ツールバー上で移動(_M)" -- --#~ msgid "Move the selected item on the toolbar" --#~ msgstr "選択したアイテムをツールバー上で移動します" -- --#~ msgid "_Remove from Toolbar" --#~ msgstr "ツールバーから削除(_R)" -- --#~ msgid "Remove the selected item from the toolbar" --#~ msgstr "選択したアイテムをツールバーから削除します" -- --#~ msgid "_Delete Toolbar" --#~ msgstr "ツールバーの削除(_D)" -- --#~ msgid "Remove the selected toolbar" --#~ msgstr "選択したツールバーを削除します" -- --#~ msgid "Separator" --#~ msgstr "セパレーター" -- --#~ msgid "Best Fit" --#~ msgstr "全体に合わせる" -- --#~ msgid "Fit Page Width" --#~ msgstr "幅に合わせる" -- --#~ msgid "_Best Fit" --#~ msgstr "全体に合わせる(_B)" -- --#~ msgid "Fit Page _Width" --#~ msgstr "幅に合わせる(_W)" -- --#~ msgid "Find:" --#~ msgstr "検索:" -- --#~ msgid "Find Pre_vious" --#~ msgstr "前を検索(_V)" -- --#~ msgid "Find Ne_xt" --#~ msgstr "次を検索(_X)" -- --#~ msgid "Page %s — %s" --#~ msgstr "%s - %s ページ" -- --#~ msgid "There was an error displaying help" --#~ msgstr "ヘルプを表示する際にエラーが発生しました" -- --#~ msgid "Toolbar Editor" --#~ msgstr "ツールバーの編集" -- --#~ msgid "_File" --#~ msgstr "ファイル(_F)" -- --#~ msgid "_Edit" --#~ msgstr "編集(_E)" -- --#~ msgid "_View" --#~ msgstr "表示(_V)" -- --#~ msgid "_Go" --#~ msgstr "移動(_G)" -- --#~ msgid "T_oolbar" --#~ msgstr "ツールバー(_O)" -- --#~ msgid "_Contents" --#~ msgstr "目次(_C)" -- --#~ msgid "_Toolbar" --#~ msgstr "ツールバー(_T)" -- --#~ msgid "Show or hide the toolbar" --#~ msgstr "ツールバーの表示を ON/OFF します" -- --#~ msgid "_Dual (Even pages left)" --#~ msgstr "見開きページ (偶数ページを左に)(_D)" -- --#~ msgid "Show two pages at once with even pages on the left" --#~ msgstr "偶数ページを左にして一度に2ページ表示します" -- --#~ msgid "Navigation" --#~ msgstr "ナビゲーション" -- --#~ msgid "Back" --#~ msgstr "戻る" -- --#~ msgid "Move across visited pages" --#~ msgstr "表示したページへ移動します" -- --#~ msgid "Toggle case sensitive search" --#~ msgstr "大小文字を区別して検索します" -diff -urN a/evince-3.8.3/po/ta.po b/evince-3.8.3/po/ta.po ---- a/evince-3.8.3/po/ta.po 2013-11-28 15:11:09.976890753 +0530 -+++ b/evince-3.8.3/po/ta.po 2013-11-28 15:11:55.772298642 +0530 -@@ -1,29 +1,29 @@ - # translation of evince.master.ta.po to Tamil - # This file is distributed under the same license as the PACKAGE package. - # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER. --# -+# - # Felix , 2006. - # Dr.T.Vasudevan , 2007, 2008, 2009, 2010, 2011, 2012, 2013. - # I. Felix , 2009. - # Dr.T.vasudevan , 2009. - # Dr.T.Vaasudevan , 2009. - # Dr,T,Vasudevan , 2010, 2011. -+# shkumar , 2013. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evince.master.ta\n" - "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2013-03-20 17:03+0530\n" --"PO-Revision-Date: 2013-03-20 17:12+0530\n" --"Last-Translator: Dr.T.Vasudevan \n" -+"PO-Revision-Date: 2013-11-12 01:49-0500\n" -+"Last-Translator: shkumar \n" - "Language-Team: Tamil <>\n" --"Language: en_US\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"Plural-Forms: nplurals=2; plural=(n!=1);\\n" -+"Language: ta\n" -+"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n" - "\n" --"\n" --"X-Generator: Lokalize 1.5\n" -+"X-Generator: Zanata 3.1.2\n" - - #: ../backend/comics/comics-document.c:210 - #, c-format -@@ -47,7 +47,8 @@ - msgstr "ஒரு காமிக் புத்தக MIME வகை இல்லை: %s" - - #: ../backend/comics/comics-document.c:433 --msgid "Can't find an appropriate command to decompress this type of comic book" -+msgid "" -+"Can't find an appropriate command to decompress this type of comic book" - msgstr "இந்த வகை காமிக் புத்தகத்தை பிரிக்க சரியான கட்டளையை காண முடியவில்லை" - - #: ../backend/comics/comics-document.c:488 -@@ -106,12 +107,14 @@ - msgstr "இந்த பணி பொது உரிமத்திலுள்ளது" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:893 ../backend/pdf/ev-poppler.cc:899 -+#: ../backend/pdf/ev-poppler.cc:893 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "Yes" - msgstr "ஆம்" - - #. translators: this is the document security state --#: ../backend/pdf/ev-poppler.cc:896 ../backend/pdf/ev-poppler.cc:899 -+#: ../backend/pdf/ev-poppler.cc:896 -+#: ../backend/pdf/ev-poppler.cc:899 - msgid "No" - msgstr "இல்லை" - -@@ -155,8 +158,8 @@ - msgstr "" - "இந்த ஆவணத்தில் பொதியப்படாத எழுத்துருக்கள் உள்ளன. அவை பிடிஎஃப் இன் செந்தர 14 " - "எழுத்துருக்களில் ஒன்று இல்லை. பான்ட் கான்பிக் தேர்ந்தெடுத்த மாற்று " --"எழுத்துருக்கள் பிடிஎஃப் ஐ உருவாக்கிய எழுத்துருக்கள் இல்லையெனில் வரைதல் சரியாக " --"இல்லாமல் போகலாம்." -+"எழுத்துருக்கள் பிடிஎஃப் ஐ உருவாக்கிய எழுத்துருக்கள் இல்லையெனில் வரைதல் " -+"சரியாக இல்லாமல் போகலாம்." - - #: ../backend/pdf/ev-poppler.cc:1096 - msgid "All fonts are either standard or embedded." -@@ -169,14 +172,13 @@ - #. translators: When a font type does not have - #. encoding information or it is unknown. Example: - #. Encoding: None --#. - #. translators: Value for 'Page Scaling:' to not scale the document pages on printing - #. translators: This is used when a document property does - #. not have a value. Examples: - #. Author: None - #. Keywords: None --#. --#: ../backend/pdf/ev-poppler.cc:1137 ../libview/ev-print-operation.c:1907 -+#: ../backend/pdf/ev-poppler.cc:1137 -+#: ../libview/ev-print-operation.c:1907 - #: ../properties/ev-properties-view.c:192 - msgid "None" - msgstr "இல்லை" -@@ -197,7 +199,6 @@ - #. * because it is directly appended to the font - #. * type. Example: - #. * "Type 1 (One of the Standard 14 Fonts)" --#. - #: ../backend/pdf/ev-poppler.cc:1156 - msgid " (One of the Standard 14 Fonts)" - msgstr " (செந்தர 14 எழுத்துருக்களில் ஒன்று )" -@@ -206,7 +207,6 @@ - #. * because it is directly appended to the font - #. * type. Example: - #. * "TrueType (Not one of the Standard 14 Fonts)" --#. - #: ../backend/pdf/ev-poppler.cc:1163 - msgid " (Not one of the Standard 14 Fonts)" - msgstr " (செந்தர 14 எழுத்துருக்களில் ஒன்று இல்லை)" -@@ -282,7 +282,7 @@ - #: ../cut-n-paste/smclient/eggdesktopfile.c:1391 - #, c-format - msgid "Can't pass document URIs to a 'Type=Link' desktop entry" --msgstr "'Type=Link' மேல்மேசை உள்ளீடுக்கு ஆவண யூஆர்ஐ ஐ கொடுக்க இயலாது" -+msgstr "'Type=Link' மேல்மேசை உள்ளீடுக்கு ஆவண URI ஐ கொடுக்க இயலாது" - - #: ../cut-n-paste/smclient/eggdesktopfile.c:1412 - #, c-format -@@ -297,7 +297,8 @@ - msgid "Specify file containing saved configuration" - msgstr "சேமித்த வடிவமைப்பு கூடிய கோப்பை குறிப்பிடுக" - --#: ../cut-n-paste/smclient/eggsmclient.c:229 ../previewer/ev-previewer.c:46 -+#: ../cut-n-paste/smclient/eggsmclient.c:229 -+#: ../previewer/ev-previewer.c:46 - msgid "FILE" - msgstr "FILE" - -@@ -318,8 +319,10 @@ - msgstr "அமர்வு மேலாண்மை தேர்வுகளை காட்டு" - - #. Manually set name and icon --#: ../data/evince.desktop.in.in.h:1 ../shell/ev-window.c:4870 --#: ../shell/ev-window-title.c:156 ../shell/main.c:312 -+#: ../data/evince.desktop.in.in.h:1 -+#: ../shell/ev-window.c:4867 -+#: ../shell/ev-window-title.c:156 -+#: ../shell/main.c:312 - #, c-format - msgid "Document Viewer" - msgstr "ஆவண காட்டி" -@@ -365,7 +368,8 @@ - msgid "The URI of the directory last used to save a picture" - msgstr "கடைசியாக ஒரு படத்தைச் சேமிக்க பயன்படுத்திய கோப்புறையின் URI" - --#: ../libdocument/ev-attachment.c:310 ../libdocument/ev-attachment.c:331 -+#: ../libdocument/ev-attachment.c:310 -+#: ../libdocument/ev-attachment.c:331 - #, c-format - msgid "Couldn't save attachment “%s”: %s" - msgstr "இணைப்பினை சேமிக்க முடியவில்லை “%s”: %s" -@@ -386,7 +390,8 @@ - msgstr "கோப்பு வகை %s (%s) க்கு ஆதரவு இல்லை" - - #: ../libdocument/ev-document-factory.c:364 --#: ../libdocument/ev-file-helpers.c:490 ../libdocument/ev-file-helpers.c:536 -+#: ../libdocument/ev-file-helpers.c:490 -+#: ../libdocument/ev-file-helpers.c:536 - #: ../libdocument/ev-file-helpers.c:555 - msgid "Unknown MIME Type" - msgstr "தெரியாத MIME வகை" -@@ -421,9 +426,11 @@ - msgid "of %d" - msgstr "of %d" - --#: ../libmisc/ev-page-action-widget.c:182 ../shell/ev-history.c:345 --#: ../shell/ev-sidebar-bookmarks.c:312 ../shell/ev-window.c:888 --#: ../shell/ev-window.c:4605 -+#: ../libmisc/ev-page-action-widget.c:182 -+#: ../shell/ev-history.c:426 -+#: ../shell/ev-sidebar-bookmarks.c:312 -+#: ../shell/ev-window.c:888 -+#: ../shell/ev-window.c:4602 - #, c-format - msgid "Page %s" - msgstr "பக்கம் %s" -@@ -465,7 +472,8 @@ - - #. translators: Title of the print dialog - #. translators: Print document currently shown in the Print Preview window --#: ../libview/ev-print-operation.c:1322 ../previewer/ev-previewer-window.c:298 -+#: ../libview/ev-print-operation.c:1322 -+#: ../previewer/ev-previewer-window.c:298 - msgid "Print" - msgstr "அச்சிடு" - -@@ -495,18 +503,16 @@ - "required to fit the printable area of the printer page.\n" - msgstr "" - "தேர்ந்தெடுத்த அச்சுப்பொறிக்கு ஆவண பக்கங்களை பொருத்த மறு அளவீடு செய்க. கீழ் " --"கண்டவற்றில் " --"ஏதேனும் ஒன்றை தேர்வு செய்க:\n" -+"கண்டவற்றில் ஏதேனும் ஒன்றை தேர்வு செய்க:\n" - "\n" - "• \"ஏதுமில்லை\": மறு அளவீடு இல்லை.\n" - "\n" - "• \"அச்சுப்பரப்புக்கு சுருக்கு\": அச்சிடக்கூடிய அளவுக்கு அதிகமாக ஆவண அளவு " --"இருப்பின் " --"அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க அளவுக்கு மறு அளவு செய்யப்படும்..\n" -+"இருப்பின் அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க அளவுக்கு மறு அளவு செய்யப்படும்.." -+"\n" - "\n" - "• \"அச்சிடக்கூடிய பரப்புக்கு பொருத்துக\": அச்சுப்பொறியின் அச்சிடக்கூடிய பக்க " --"அளவுக்கு " --"ஆவண பக்கம் சுருக்கவோ நீட்டவோ செய்யப்படும்.\n" -+"அளவுக்கு ஆவண பக்கம் சுருக்கவோ நீட்டவோ செய்யப்படும்.\n" - - #: ../libview/ev-print-operation.c:1924 - msgid "Auto Rotate and Center" -@@ -517,9 +523,9 @@ - "Rotate printer page orientation of each page to match orientation of each " - "document page. Document pages will be centered within the printer page." - msgstr "" --"ஒவ்வொரு ஆவண பக்கத்தின் திசையையும் ஒத்திசைய அச்சுப்பொறி பக்க திஅசை பொருத்தத்தை " --"மாற்றுக. " --"ஆவண பக்கங்கள் அச்சுப்பொறி பக்கத்திற்கு மையப்படுத்தப்படும்." -+"ஒவ்வொரு ஆவண பக்கத்தின் திசையையும் ஒத்திசைய அச்சுப்பொறி பக்க திஅசை " -+"பொருத்தத்தை மாற்றுக. ஆவண பக்கங்கள் அச்சுப்பொறி பக்கத்திற்கு " -+"மையப்படுத்தப்படும்." - - #: ../libview/ev-print-operation.c:1932 - msgid "Select page size using document page size" -@@ -556,46 +562,46 @@ - msgid "Document View" - msgstr "ஆவணப்பார்வை" - --#: ../libview/ev-view.c:1873 -+#: ../libview/ev-view.c:1910 - msgid "Go to first page" - msgstr "முதல் பக்கத்திற்கு செல்லவும்" - --#: ../libview/ev-view.c:1875 -+#: ../libview/ev-view.c:1912 - msgid "Go to previous page" - msgstr "முந்தைய பக்கத்திற்கு செல்லவும்" - --#: ../libview/ev-view.c:1877 -+#: ../libview/ev-view.c:1914 - msgid "Go to next page" - msgstr "அடுத்த பக்கத்திற்கு செல்லவும்" - --#: ../libview/ev-view.c:1879 -+#: ../libview/ev-view.c:1916 - msgid "Go to last page" - msgstr "கடைசி பக்கத்திற்கு செல்லவும்" - --#: ../libview/ev-view.c:1881 -+#: ../libview/ev-view.c:1918 - msgid "Go to page" - msgstr "பக்கத்திற்கு செல்" - --#: ../libview/ev-view.c:1883 -+#: ../libview/ev-view.c:1920 - msgid "Find" - msgstr "தேடு" - --#: ../libview/ev-view.c:1911 -+#: ../libview/ev-view.c:1948 - #, c-format - msgid "Go to page %s" - msgstr "பக்கத்திற்கு செல் %s" - --#: ../libview/ev-view.c:1917 -+#: ../libview/ev-view.c:1954 - #, c-format - msgid "Go to %s on file “%s”" - msgstr "“%s” கோப்பில் %s க்கு செல்லவும்" - --#: ../libview/ev-view.c:1920 -+#: ../libview/ev-view.c:1957 - #, c-format - msgid "Go to file “%s”" - msgstr "“%s” கோப்பிற்கு செல்" - --#: ../libview/ev-view.c:1928 -+#: ../libview/ev-view.c:1965 - #, c-format - msgid "Launch %s" - msgstr "%sஐ செயல்படுத்து" -@@ -616,11 +622,13 @@ - msgid "Print settings file" - msgstr "அச்சு அமைப்பு கோப்பு" - --#: ../previewer/ev-previewer.c:175 ../previewer/ev-previewer.c:207 -+#: ../previewer/ev-previewer.c:175 -+#: ../previewer/ev-previewer.c:207 - msgid "GNOME Document Previewer" - msgstr "க்னோம் ஆவண முன் பார்வை கருவி" - --#: ../previewer/ev-previewer-window.c:91 ../shell/ev-window.c:3332 -+#: ../previewer/ev-previewer-window.c:91 -+#: ../shell/ev-window.c:3329 - msgid "Failed to print document" - msgstr "ஆவணத்தை அச்சிட முடியவில்லை" - -@@ -630,55 +638,68 @@ - msgstr "தேர்ந்தெடுக்கப்பட்ட அச்சு இயந்திரம் '%s' ஐ கண்டு பிடிக்க முடியவில்லை" - - #. Go menu --#: ../previewer/ev-previewer-window.c:284 ../shell/ev-window.c:5809 -+#: ../previewer/ev-previewer-window.c:284 -+#: ../shell/ev-window.c:5810 - msgid "_Previous Page" - msgstr "முந்தைய பக்கம் (_P)" - --#: ../previewer/ev-previewer-window.c:285 ../shell/ev-window.c:5810 -+#: ../previewer/ev-previewer-window.c:285 -+#: ../shell/ev-window.c:5811 - msgid "Go to the previous page" - msgstr "முந்தைய பக்கத்திற்கு செல்லவும்" - --#: ../previewer/ev-previewer-window.c:287 ../shell/ev-window.c:5812 -+#: ../previewer/ev-previewer-window.c:287 -+#: ../shell/ev-window.c:5813 - msgid "_Next Page" - msgstr "அடுத்த பக்கம் (_N)" - --#: ../previewer/ev-previewer-window.c:288 ../shell/ev-window.c:5813 -+#: ../previewer/ev-previewer-window.c:288 -+#: ../shell/ev-window.c:5814 - msgid "Go to the next page" - msgstr "அடுத்த பக்கத்திற்கு செல்லவும்" - --#: ../previewer/ev-previewer-window.c:291 ../shell/ev-window.c:5796 -+#: ../previewer/ev-previewer-window.c:291 -+#: ../shell/ev-window.c:5797 - msgid "Enlarge the document" - msgstr "ஆவணத்தை பெரிதாக்கவும்" - --#: ../previewer/ev-previewer-window.c:294 ../shell/ev-window.c:5799 -+#: ../previewer/ev-previewer-window.c:294 -+#: ../shell/ev-window.c:5800 - msgid "Shrink the document" - msgstr "ஆவணத்தை சுருக்கவும்" - --#: ../previewer/ev-previewer-window.c:299 ../shell/ev-window.c:5774 -+#: ../previewer/ev-previewer-window.c:299 -+#: ../shell/ev-window.c:5775 - msgid "Print this document" - msgstr "இந்த ஆவணத்தை அச்சிடவும்" - --#: ../previewer/ev-previewer-window.c:343 ../shell/ev-window.c:5927 -+#: ../previewer/ev-previewer-window.c:343 -+#: ../shell/ev-window.c:5928 - msgid "Fit Pa_ge" - msgstr "_g பக்கத்துக்கு பொருத்து" - --#: ../previewer/ev-previewer-window.c:344 ../shell/ev-window.c:5928 -+#: ../previewer/ev-previewer-window.c:344 -+#: ../shell/ev-window.c:5929 - msgid "Make the current document fill the window" - msgstr "நடப்பு ஆவணத்தை சாளர முழுமைக்கும் நிரப்பவும்" - --#: ../previewer/ev-previewer-window.c:346 ../shell/ev-window.c:5930 -+#: ../previewer/ev-previewer-window.c:346 -+#: ../shell/ev-window.c:5931 - msgid "Fit _Width" - msgstr "_W அகலத்தை பொருத்து" - --#: ../previewer/ev-previewer-window.c:347 ../shell/ev-window.c:5931 -+#: ../previewer/ev-previewer-window.c:347 -+#: ../shell/ev-window.c:5932 - msgid "Make the current document fill the window width" - msgstr "நடப்பு ஆவணத்தை சாளர அகலத்திற்கு நிரப்பவும்" - --#: ../previewer/ev-previewer-window.c:540 ../shell/ev-window.c:6042 -+#: ../previewer/ev-previewer-window.c:540 -+#: ../shell/ev-window.c:6043 - msgid "Page" - msgstr "பக்கம்" - --#: ../previewer/ev-previewer-window.c:541 ../shell/ev-window.c:6043 -+#: ../previewer/ev-previewer-window.c:541 -+#: ../shell/ev-window.c:6044 - msgid "Select Page" - msgstr "பக்கத்தை தேரந்தெடு" - -@@ -748,7 +769,6 @@ - #. * want inches, otherwise translate to default:mm. - #. * Do *not* translate it to "predefinito:mm", if it - #. * it isn't default:mm or default:inch it will not work --#. - #: ../properties/ev-properties-view.c:220 - msgid "default:mm" - msgstr "முன்னிருப்பு:mm" -@@ -873,11 +893,11 @@ - msgid "Close" - msgstr "மூடு" - --#: ../shell/ev-history-action-widget.c:223 -+#: ../shell/ev-history-action-widget.c:227 - msgid "Go to previous history item" - msgstr "முந்தைய சரித்திர உருப்படிக்கு செல்லவும்" - --#: ../shell/ev-history-action-widget.c:227 -+#: ../shell/ev-history-action-widget.c:231 - msgid "Go to next history item" - msgstr "அடுத்த சரித்திர உருப்படிக்கு செல்லவும்" - -@@ -887,8 +907,10 @@ - msgstr "ஆவணத்தின் கடவுச்சொல் %s" - - #. Create tree view --#: ../shell/ev-loading-message.c:50 ../shell/ev-sidebar-annotations.c:131 --#: ../shell/ev-sidebar-layers.c:125 ../shell/ev-sidebar-links.c:261 -+#: ../shell/ev-loading-message.c:50 -+#: ../shell/ev-sidebar-annotations.c:131 -+#: ../shell/ev-sidebar-layers.c:125 -+#: ../shell/ev-sidebar-links.c:261 - msgid "Loading…" - msgstr "ஏற்றுகிறது" - -@@ -904,7 +926,8 @@ - "இந்த ஆவணம் பூட்டப்பட்டுள்ளது மற்றும் சரியான கடவுச்சொல்லை உள்ளிட்டால் தான் " - "படிக்க முடியும்." - --#: ../shell/ev-password-view.c:151 ../shell/ev-password-view.c:269 -+#: ../shell/ev-password-view.c:151 -+#: ../shell/ev-password-view.c:269 - msgid "_Unlock Document" - msgstr "ஆவணத்தை பூட்டு நீக்கு (_U)" - -@@ -981,7 +1004,8 @@ - msgid "List" - msgstr "பட்டியல்" - --#: ../shell/ev-sidebar-annotations.c:199 ../shell/ev-sidebar-annotations.c:527 -+#: ../shell/ev-sidebar-annotations.c:199 -+#: ../shell/ev-sidebar-annotations.c:527 - msgid "Annotations" - msgstr "வியாக்கியானம்" - -@@ -1046,136 +1070,137 @@ - msgid "By extension" - msgstr "நீட்சியால்" - --#: ../shell/ev-window.c:1477 -+#: ../shell/ev-window.c:1485 - msgid "The document contains no pages" - msgstr "ஆவணத்தில் பக்கங்கள் ஏதும் இல்லை " - --#: ../shell/ev-window.c:1480 -+#: ../shell/ev-window.c:1488 - msgid "The document contains only empty pages" - msgstr "ஆவணத்தில் உள்ளது வெற்று பக்கங்களே" - --#: ../shell/ev-window.c:1691 ../shell/ev-window.c:1853 -+#: ../shell/ev-window.c:1689 -+#: ../shell/ev-window.c:1851 - msgid "Unable to open document" - msgstr "ஆவணத்தை திறக்க முடியவில்லை" - --#: ../shell/ev-window.c:1824 -+#: ../shell/ev-window.c:1822 - #, c-format - msgid "Loading document from “%s”" - msgstr "“%s” இலிருந்து ஆவணத்தை ஏற்றுகிறது" - --#: ../shell/ev-window.c:1966 ../shell/ev-window.c:2257 -+#: ../shell/ev-window.c:1964 -+#: ../shell/ev-window.c:2254 - #, c-format - msgid "Downloading document (%d%%)" - msgstr "ஆவணத்தை பதிவிறக்குகிறது (%d%%)" - --#: ../shell/ev-window.c:1999 -+#: ../shell/ev-window.c:1997 - msgid "Failed to load remote file." - msgstr "தொலை கோப்பை ஏற்ற முடியவில்லை." - --#: ../shell/ev-window.c:2201 -+#: ../shell/ev-window.c:2198 - #, c-format - msgid "Reloading document from %s" - msgstr "%sஇலிருந்து ஆவணத்தை மீண்டும் ஏற்றுகிறது" - --#: ../shell/ev-window.c:2233 -+#: ../shell/ev-window.c:2230 - msgid "Failed to reload document." - msgstr "ஆவணத்தை மீளேற்ற முடியவில்லை." - --#: ../shell/ev-window.c:2446 -+#: ../shell/ev-window.c:2443 - msgid "Open Document" - msgstr "ஆவணத்தை திற" - --#: ../shell/ev-window.c:2719 -+#: ../shell/ev-window.c:2716 - #, c-format - msgid "Saving document to %s" - msgstr "%sக்கு ஆவணத்தை சேமிக்கிறது" - --#: ../shell/ev-window.c:2722 -+#: ../shell/ev-window.c:2719 - #, c-format - msgid "Saving attachment to %s" - msgstr "%sக்கு இணைப்பை சேமிக்கிறது" - --#: ../shell/ev-window.c:2725 -+#: ../shell/ev-window.c:2722 - #, c-format - msgid "Saving image to %s" - msgstr "%sக்கு ஆவணத்தை சேமிக்கிறது" - --#: ../shell/ev-window.c:2769 ../shell/ev-window.c:2869 -+#: ../shell/ev-window.c:2766 -+#: ../shell/ev-window.c:2866 - #, c-format - msgid "The file could not be saved as “%s”." - msgstr "“%s” ஆக கோப்பினை சேமிக்க முடியவில்லை." - --#: ../shell/ev-window.c:2800 -+#: ../shell/ev-window.c:2797 - #, c-format - msgid "Uploading document (%d%%)" - msgstr "ஆவணத்தை ஏற்றுகிறது (%d%%)" - --#: ../shell/ev-window.c:2804 -+#: ../shell/ev-window.c:2801 - #, c-format - msgid "Uploading attachment (%d%%)" - msgstr "இணைப்பை பதிவேற்றுகிறது (%d%%)" - --#: ../shell/ev-window.c:2808 -+#: ../shell/ev-window.c:2805 - #, c-format - msgid "Uploading image (%d%%)" - msgstr "படத்தை பதிவேற்றுகிறது (%d%%)" - --#: ../shell/ev-window.c:2920 -+#: ../shell/ev-window.c:2917 - msgid "Save a Copy" - msgstr "நகலாக சேமி" - --#: ../shell/ev-window.c:2984 -+#: ../shell/ev-window.c:2981 - msgid "Could not send current document" - msgstr "நடப்பு ஆவணத்தை அனுப்ப முடியவில்லை" - --#: ../shell/ev-window.c:3015 -+#: ../shell/ev-window.c:3012 - msgid "Could not open the containing folder" - msgstr "அடைவை திறக்க இயலவில்லை" - --#: ../shell/ev-window.c:3276 -+#: ../shell/ev-window.c:3273 - #, c-format - msgid "%d pending job in queue" - msgid_plural "%d pending jobs in queue" - msgstr[0] "%d மீதமுள்ள பணி வரிசையில் உள்ளது" - msgstr[1] "%d மீதமுள்ள பணிகள் வரிசையில் உள்ளன" - --#: ../shell/ev-window.c:3389 -+#: ../shell/ev-window.c:3386 - #, c-format - msgid "Printing job “%s”" - msgstr "அச்சிடும் பணி “%s”" - --#: ../shell/ev-window.c:3566 -+#: ../shell/ev-window.c:3563 - msgid "" - "Document contains form fields that have been filled out. If you don't save a " - "copy, changes will be permanently lost." - msgstr "" - "ஆவணத்தில் நிரப்பப்பட்ட படிவபுலங்கள் உள்ளன. நீங்கள் ஒரு பிரதியை " --"சேமிக்காவிட்டால் மாற்றங்கள் " --"நிரந்தரமாக இழக்கப்படும்." -+"சேமிக்காவிட்டால் மாற்றங்கள் நிரந்தரமாக இழக்கப்படும்." - --#: ../shell/ev-window.c:3570 -+#: ../shell/ev-window.c:3567 - msgid "" - "Document contains new or modified annotations. If you don't save a copy, " - "changes will be permanently lost." - msgstr "" - "ஆவணத்தில் புதிய அல்லது மாற்றப்பட்ட வியாக்கியானங்கள் உள்ளன. நீங்கள் ஒரு " --"பிரதியை " --"சேமிக்காவிட்டால் மாற்றங்கள் நிரந்தரமாக இழக்கப்படும்." -+"பிரதியை சேமிக்காவிட்டால் மாற்றங்கள் நிரந்தரமாக இழக்கப்படும்." - --#: ../shell/ev-window.c:3577 -+#: ../shell/ev-window.c:3574 - #, c-format - msgid "Save a copy of document “%s” before closing?" - msgstr "“%s” ஆவணத்தின் ஒரு நகலை சேமிக்கவா?" - --#: ../shell/ev-window.c:3596 -+#: ../shell/ev-window.c:3593 - msgid "Close _without Saving" - msgstr "சேமிக்காமல் மூடு (_w)" - --#: ../shell/ev-window.c:3600 -+#: ../shell/ev-window.c:3597 - msgid "Save a _Copy" - msgstr "_C ஒரு நகல் சேமி" - --#: ../shell/ev-window.c:3674 -+#: ../shell/ev-window.c:3671 - #, c-format - msgid "Wait until print job “%s” finishes before closing?" - msgstr "அச்சு பணி “%s” முடியும் வரை காத்திருக்க வேண்டுமா?" -@@ -1183,55 +1208,51 @@ - #. TRANS: the singular form is not really used as n_print_jobs > 1 - #. but some languages distinguish between different plurals forms, - #. so the ngettext is needed. --#: ../shell/ev-window.c:3680 -+#: ../shell/ev-window.c:3677 - #, c-format --msgid "There is %d print job active. Wait until print finishes before closing?" -+msgid "" -+"There is %d print job active. Wait until print finishes before closing?" - msgid_plural "" - "There are %d print jobs active. Wait until print finishes before closing?" - msgstr[0] "%d அச்சு பணி செயலிலுள்ளது. அச்சிட்டு முடியும் வரை காத்திருக்கவா?" - msgstr[1] "%d அச்சு பணிகள் செயலிலுள்ளன. அச்சிட்டு முடியும் வரை காத்திருக்கவா?" - --#: ../shell/ev-window.c:3695 -+#: ../shell/ev-window.c:3692 - msgid "If you close the window, pending print jobs will not be printed." - msgstr "சாளரத்தை மூடினால், மீதமுள்ள அச்சு பணிகள் அச்சிடப்படாது." - --#: ../shell/ev-window.c:3699 -+#: ../shell/ev-window.c:3696 - msgid "Cancel _print and Close" - msgstr "அச்சிடுதலை ரத்து செய்து மூடுகிறது (_p)" - --#: ../shell/ev-window.c:3703 -+#: ../shell/ev-window.c:3700 - msgid "Close _after Printing" - msgstr "அச்சிட்ட பின் மூடுகிறது (_a)" - --#: ../shell/ev-window.c:4158 -+#: ../shell/ev-window.c:4155 - msgid "Running in presentation mode" - msgstr "காட்சி அளிப்பு பாங்கில் இயங்குகிறது" - --#: ../shell/ev-window.c:4866 -+#: ../shell/ev-window.c:4863 - #, c-format --msgid "" --"Document Viewer\n" -+msgid "Document Viewer\n" - "Using %s (%s)" --msgstr "" --"ஆவண காட்டி.\n" -+msgstr "ஆவண காட்டி.\n" - " %s ஐ பயன்படுத்துகிறது (%s)" - --#: ../shell/ev-window.c:4899 -+#: ../shell/ev-window.c:4896 - msgid "" - "Evince 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 2 of the License, or (at your option) any later " - "version.\n" - msgstr "" --"இவின்ஸ் ஒரு இலவச மென்பொருளாகும் நீங்கள் இதனை வேறு நபருக்கு கொடுக்கலாம்மற்றும் " --"Free " --"Software Foundation ஆல் வெளியிடப்பட்ட GNU General Public License " --"ன்விதிமுறையின் " --"அடிப்படையில் அங்கீகாரத்தின் பதிப்பு 2 அல்லது(உங்கள் விருப்பப்படி) அதற்கடுத்த " --"பதிப்புகளில் " --"மாற்றலாம்.\n" -+"இவின்ஸ் ஒரு இலவச மென்பொருளாகும் நீங்கள் இதனை வேறு நபருக்கு " -+"கொடுக்கலாம்மற்றும் Free Software Foundation ஆல் வெளியிடப்பட்ட GNU General " -+"Public License ன்விதிமுறையின் அடிப்படையில் அங்கீகாரத்தின் பதிப்பு 2 " -+"அல்லது(உங்கள் விருப்பப்படி) அதற்கடுத்த பதிப்புகளில் மாற்றலாம்.\n" - --#: ../shell/ev-window.c:4903 -+#: ../shell/ev-window.c:4900 - msgid "" - "Evince is distributed in the hope that it will be useful, but WITHOUT ANY " - "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS " -@@ -1239,375 +1260,378 @@ - "details.\n" - msgstr "" - "இவின்ஸ், பயனுள்ளதாக இருக்கும் என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளதுஆனால் " --"எந்த உத்தரவாதமும் " --"கிடையாது; குறிப்பிட்ட காரணங்களுக்காக வணிகஉத்தரவாதம் கூட " --"செயல்படுத்தப்படவில்லை. மேலும் " --"விவரங்களுக்குGNU General Public License ஐ பார்க்கவும்.\n" -+"எந்த உத்தரவாதமும் கிடையாது; குறிப்பிட்ட காரணங்களுக்காக வணிகஉத்தரவாதம் கூட " -+"செயல்படுத்தப்படவில்லை. மேலும் விவரங்களுக்குGNU General Public License ஐ " -+"பார்க்கவும்.\n" - --#: ../shell/ev-window.c:4907 -+#: ../shell/ev-window.c:4904 - msgid "" - "You should have received a copy of the GNU General Public License along with " - "Evince; if not, write to the Free Software Foundation, Inc., 51 Franklin " - "Street, Fifth Floor, Boston, MA 02110-1301 USA\n" - msgstr "" - "நீங்கள் GNU General Public Licenseன் ஒரு நகலை இவின்ஸுடன் பெற்றிருக்க " --"வேண்டும். அவ்வாறு " --"பெறாவிட்டால், Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, " --"Boston, MA 02111-1301 USA என்பதற்கு எழுதவும்\n" -+"வேண்டும். அவ்வாறு பெறாவிட்டால், Free Software Foundation, Inc.,51 Franklin " -+"Street, Fifth Floor, Boston, MA 02111-1301 USA என்பதற்கு எழுதவும்\n" - --#: ../shell/ev-window.c:4932 -+#: ../shell/ev-window.c:4929 - msgid "Evince" - msgstr "இவின்ஸ்" - --#: ../shell/ev-window.c:4935 -+#: ../shell/ev-window.c:4932 - msgid "© 1996–2012 The Evince authors" - msgstr "© 1996–2012 எவின்ஸ் ஆசிரியர்கள்" - --#: ../shell/ev-window.c:4941 -+#: ../shell/ev-window.c:4938 - msgid "translator-credits" - msgstr "I. Felix Dr. T. Vasudevan " - - #. TRANS: Sometimes this could be better translated as - #. "%d hit(s) on this page". Therefore this string - #. contains plural cases. --#: ../shell/ev-window.c:5203 -+#: ../shell/ev-window.c:5200 - #, c-format - msgid "%d found on this page" - msgid_plural "%d found on this page" - msgstr[0] "%d இந்தப் பக்கத்தில் கண்டுபிடிக்கப்பட்டது" - msgstr[1] "%d இந்தப் பக்கத்தில் கண்டுபிடிக்கப்பட்டது" - --#: ../shell/ev-window.c:5208 -+#: ../shell/ev-window.c:5205 - msgid "Not found" - msgstr "காணவில்லை" - --#: ../shell/ev-window.c:5214 -+#: ../shell/ev-window.c:5211 - #, c-format - msgid "%3d%% remaining to search" - msgstr "%3d%% மீதி தேட வேண்டியவை" - --#: ../shell/ev-window.c:5754 -+#: ../shell/ev-window.c:5755 - msgid "_Bookmarks" - msgstr "புத்தகக்குறிகள் (_B)" - --#: ../shell/ev-window.c:5755 -+#: ../shell/ev-window.c:5756 - msgid "_Recent" - msgstr "_R சமீபத்திய" - - #. File menu --#: ../shell/ev-window.c:5758 ../shell/ev-window.c:6078 -+#: ../shell/ev-window.c:5759 -+#: ../shell/ev-window.c:6079 - msgid "_Open…" - msgstr "(_O) திற" - --#: ../shell/ev-window.c:5759 ../shell/ev-window.c:6079 -+#: ../shell/ev-window.c:5760 -+#: ../shell/ev-window.c:6080 - msgid "Open an existing document" - msgstr "ஏற்கனவே உள்ள ஆவணத்தை திறக்கவும்" - --#: ../shell/ev-window.c:5761 -+#: ../shell/ev-window.c:5762 - msgid "Op_en a Copy" - msgstr "நகலை திறக்கவும்" - --#: ../shell/ev-window.c:5762 -+#: ../shell/ev-window.c:5763 - msgid "Open a copy of the current document in a new window" - msgstr "நடப்பு ஆவணத்தின் ஒரு நகலை புதிய சாளரத்தில் திறக்கவும்" - --#: ../shell/ev-window.c:5764 -+#: ../shell/ev-window.c:5765 - msgid "_Save a Copy…" - msgstr "ஒரு நகலை சேமி... (_S)" - --#: ../shell/ev-window.c:5765 -+#: ../shell/ev-window.c:5766 - msgid "Save a copy of the current document" - msgstr "நடப்பு ஆவணத்தின் ஒரு நகலை சேமிக்கவும்" - --#: ../shell/ev-window.c:5767 -+#: ../shell/ev-window.c:5768 - msgid "Send _To..." - msgstr "_T இதற்கு அனுப்புக..." - --#: ../shell/ev-window.c:5768 -+#: ../shell/ev-window.c:5769 - msgid "Send current document by mail, instant message..." - msgstr "நடப்பு ஆவணத்தை அஞ்சல், உடனடி செய்தியாளர் மூலம் அனுப்புக...." - --#: ../shell/ev-window.c:5770 -+#: ../shell/ev-window.c:5771 - msgid "Open Containing _Folder" - msgstr "_F கோப்புள்ள அடைவை திற" - --#: ../shell/ev-window.c:5771 -+#: ../shell/ev-window.c:5772 - msgid "Show the folder which contains this file in the file manager" - msgstr "கோப்பு மேலாளரில் இந்த கோப்பு எந்த அடைவில் எனக்காட்டு" - --#: ../shell/ev-window.c:5773 -+#: ../shell/ev-window.c:5774 - msgid "_Print…" - msgstr "_P அச்சிடு." - --#: ../shell/ev-window.c:5776 -+#: ../shell/ev-window.c:5777 - msgid "P_roperties" - msgstr "பண்புகள் (_R)" - --#: ../shell/ev-window.c:5784 -+#: ../shell/ev-window.c:5785 - msgid "Select _All" - msgstr "அனைத்தையும் தேர்ந்தெடு (_A)" - --#: ../shell/ev-window.c:5786 -+#: ../shell/ev-window.c:5787 - msgid "Rotate _Left" - msgstr "இடப்பக்கம் சுழற்று (_L)" - --#: ../shell/ev-window.c:5788 -+#: ../shell/ev-window.c:5789 - msgid "Rotate _Right" - msgstr "வலப்பக்கம் சுழற்று (_R) " - --#: ../shell/ev-window.c:5790 -+#: ../shell/ev-window.c:5791 - msgid "Save Current Settings as _Default" - msgstr "_D தற்போதைய அமைப்புகளை முன்னிருப்பாக வைக்கவும்" - --#: ../shell/ev-window.c:5801 -+#: ../shell/ev-window.c:5802 - msgid "_Reload" - msgstr "மீண்டும் ஏற்று (_R)" - --#: ../shell/ev-window.c:5802 -+#: ../shell/ev-window.c:5803 - msgid "Reload the document" - msgstr "ஆவணத்தை மீண்டும் ஏற்றவும்" - --#: ../shell/ev-window.c:5805 -+#: ../shell/ev-window.c:5806 - msgid "Auto_scroll" - msgstr "தானியங்கி உருளல் (_s)" - --#: ../shell/ev-window.c:5815 -+#: ../shell/ev-window.c:5816 - msgid "_First Page" - msgstr "முதல் பக்கம் (_F)" - --#: ../shell/ev-window.c:5816 -+#: ../shell/ev-window.c:5817 - msgid "Go to the first page" - msgstr "முதல் பக்கத்திற்கு செல்லவும்" - --#: ../shell/ev-window.c:5818 -+#: ../shell/ev-window.c:5819 - msgid "_Last Page" - msgstr "கடைசி பக்கம் (_L)" - --#: ../shell/ev-window.c:5819 -+#: ../shell/ev-window.c:5820 - msgid "Go to the last page" - msgstr "கடைசி பக்கத்திற்கு செல்லவும்" - --#: ../shell/ev-window.c:5821 -+#: ../shell/ev-window.c:5822 - msgid "Go to Pa_ge" - msgstr "_g பக்கத்திற்கு செல்" - --#: ../shell/ev-window.c:5822 -+#: ../shell/ev-window.c:5823 - msgid "Go to Page" - msgstr "இந்த பக்கத்திற்கு செல்" - - #. Bookmarks menu --#: ../shell/ev-window.c:5826 -+#: ../shell/ev-window.c:5827 - msgid "_Add Bookmark" - msgstr "_A புத்தகக்குறியை சேர்" - --#: ../shell/ev-window.c:5827 -+#: ../shell/ev-window.c:5828 - msgid "Add a bookmark for the current page" - msgstr "இந்தப் பக்கத்துக்கு ஒரு புத்தகக்குறி சேர்க்கவும்" - --#: ../shell/ev-window.c:5830 -+#: ../shell/ev-window.c:5831 - msgid "_About" - msgstr "இதனை பற்றி (_A)" - - #. Toolbar-only --#: ../shell/ev-window.c:5834 -+#: ../shell/ev-window.c:5835 - msgid "Leave Fullscreen" - msgstr "முழுத்திரையாக விடவும்" - --#: ../shell/ev-window.c:5835 -+#: ../shell/ev-window.c:5836 - msgid "Leave fullscreen mode" - msgstr "முழுத்திரை முறையில் விடவும்" - --#: ../shell/ev-window.c:5837 -+#: ../shell/ev-window.c:5838 - msgid "Start Presentation" - msgstr "காட்சியை ஆரம்பிக்கவும்" - --#: ../shell/ev-window.c:5838 -+#: ../shell/ev-window.c:5839 - msgid "Start a presentation" - msgstr "முன் வைப்பு காட்சியாக துவக்கவும்" - - #. View Menu --#: ../shell/ev-window.c:5909 -+#: ../shell/ev-window.c:5910 - msgid "Side _Pane" - msgstr "பக்க பலகம் (_P)" - --#: ../shell/ev-window.c:5910 -+#: ../shell/ev-window.c:5911 - msgid "Show or hide the side pane" - msgstr "பக்க பலகத்தை காட்டு அல்லது மறை" - --#: ../shell/ev-window.c:5912 -+#: ../shell/ev-window.c:5913 - msgid "_Continuous" - msgstr "தொடர்ச்சி (_C)" - --#: ../shell/ev-window.c:5913 -+#: ../shell/ev-window.c:5914 - msgid "Show the entire document" - msgstr "முழு ஆவணத்தையும் காட்டவும்" - --#: ../shell/ev-window.c:5915 -+#: ../shell/ev-window.c:5916 - msgid "_Dual" - msgstr "இரட்டை (_D)" - --#: ../shell/ev-window.c:5916 -+#: ../shell/ev-window.c:5917 - msgid "Show two pages at once" - msgstr "ஒரே நேரத்தில் இரண்டு பக்கங்களை காட்டவும்" - --#: ../shell/ev-window.c:5918 -+#: ../shell/ev-window.c:5919 - msgid "_Odd pages left" - msgstr "ஒற்றைப்படை பக்கம் இடது (_O)" - --#: ../shell/ev-window.c:5919 -+#: ../shell/ev-window.c:5920 - msgid "Show odd pages on the left in dual mode" - msgstr "இரட்டை பாங்கில் ஒற்றைப்படை பக்கங்களை இடது பக்கம் காட்டு" - --#: ../shell/ev-window.c:5921 -+#: ../shell/ev-window.c:5922 - msgid "_Fullscreen" - msgstr "முழுத்திரை (_F)" - --#: ../shell/ev-window.c:5922 -+#: ../shell/ev-window.c:5923 - msgid "Expand the window to fill the screen" - msgstr "திரையை நிரப்ப சாளரத்தை நிரப்பவும்" - --#: ../shell/ev-window.c:5924 -+#: ../shell/ev-window.c:5925 - msgid "Pre_sentation" - msgstr "(_s) காட்சி முன்வைப்பு" - --#: ../shell/ev-window.c:5925 -+#: ../shell/ev-window.c:5926 - msgid "Run document as a presentation" - msgstr "ஆவணத்தை காட்சியாக இயக்கவும்" - --#: ../shell/ev-window.c:5933 -+#: ../shell/ev-window.c:5934 - msgid "_Inverted Colors" - msgstr "_I தலைகீழ் மாற்றிய நிறங்கள்" - --#: ../shell/ev-window.c:5934 -+#: ../shell/ev-window.c:5935 - msgid "Show page contents with the colors inverted" - msgstr "பக்க உள்ளடகத்தை தலைகீழ் மாற்றிய நிறங்களுடன் காட்டுக" - --#: ../shell/ev-window.c:5937 -+#: ../shell/ev-window.c:5938 - msgid "_Find…" - msgstr "(_F) தேடுக..." - --#: ../shell/ev-window.c:5938 -+#: ../shell/ev-window.c:5939 - msgid "Find a word or phrase in the document" - msgstr "ஆவணத்தில் ஒரு சொல் அல்லது சொற்றொடரை தேடுகிறது" - - #. Links --#: ../shell/ev-window.c:5946 -+#: ../shell/ev-window.c:5947 - msgid "_Open Link" - msgstr "இணைப்பினை திற (_O)" - --#: ../shell/ev-window.c:5948 -+#: ../shell/ev-window.c:5949 - msgid "_Go To" - msgstr "செல் (_G)" - --#: ../shell/ev-window.c:5950 -+#: ../shell/ev-window.c:5951 - msgid "Open in New _Window" - msgstr "புது _சாளரத்தில் திறக்கவும்" - --#: ../shell/ev-window.c:5952 -+#: ../shell/ev-window.c:5953 - msgid "_Copy Link Address" - msgstr "இணைப்பு முகவரியை நகலெடு (_C)" - --#: ../shell/ev-window.c:5954 -+#: ../shell/ev-window.c:5955 - msgid "_Save Image As…" - msgstr "(_S) பிம்பத்தை இப்படிச் சேமி" - --#: ../shell/ev-window.c:5956 -+#: ../shell/ev-window.c:5957 - msgid "Copy _Image" - msgstr "_ப பிம்பத்தை பிரதி எடுக்கவும்" - --#: ../shell/ev-window.c:5958 -+#: ../shell/ev-window.c:5959 - msgid "Annotation Properties…" - msgstr "வியாக்கியான பண்புகள்..." - --#: ../shell/ev-window.c:5963 -+#: ../shell/ev-window.c:5964 - msgid "_Open Attachment" - msgstr "_O இணைப்பை திற" - --#: ../shell/ev-window.c:5965 -+#: ../shell/ev-window.c:5966 - msgid "_Save Attachment As…" - msgstr "_S இணைப்புகளை இப்படிச் சேமி" - --#: ../shell/ev-window.c:6056 -+#: ../shell/ev-window.c:6057 - msgid "Zoom" - msgstr "பெரிதாக்கு" - --#: ../shell/ev-window.c:6058 -+#: ../shell/ev-window.c:6059 - msgid "Adjust the zoom level" - msgstr "பெரிதாக்கும் நிலையை மாற்று" - --#: ../shell/ev-window.c:6069 -+#: ../shell/ev-window.c:6070 - msgid "History" - msgstr "வரலாறு" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6098 -+#: ../shell/ev-window.c:6099 - msgid "Open Folder" - msgstr "அடைவினை திற" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6102 -+#: ../shell/ev-window.c:6103 - msgid "Send To" - msgstr "இதற்கு அனுப்பு:" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6108 -+#: ../shell/ev-window.c:6109 - msgid "Previous" - msgstr "முந்தைய" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6113 -+#: ../shell/ev-window.c:6114 - msgid "Next" - msgstr "அடுத்து" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6117 -+#: ../shell/ev-window.c:6118 - msgid "Zoom In" - msgstr "சிறிதாக்கு" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6121 -+#: ../shell/ev-window.c:6122 - msgid "Zoom Out" - msgstr "பெரிதாக்கு" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6125 ../shell/ev-zoom-action-widget.c:42 -+#: ../shell/ev-window.c:6126 -+#: ../shell/ev-zoom-action-widget.c:42 - msgid "Fit Page" - msgstr "பக்கத்துக்கு பொருத்து" - - #. translators: this is the label for toolbar button --#: ../shell/ev-window.c:6129 ../shell/ev-zoom-action-widget.c:43 -+#: ../shell/ev-window.c:6130 -+#: ../shell/ev-zoom-action-widget.c:43 - msgid "Fit Width" - msgstr "அகலத்தை பொருத்து" - --#: ../shell/ev-window.c:6275 ../shell/ev-window.c:6291 -+#: ../shell/ev-window.c:6276 -+#: ../shell/ev-window.c:6292 - msgid "Unable to launch external application." - msgstr "புற பயன்பாட்டை திறக்க இயலவில்லை" - --#: ../shell/ev-window.c:6348 -+#: ../shell/ev-window.c:6349 - msgid "Unable to open external link" - msgstr "புற இணைப்பினை திறக்க இயலவில்லை" - --#: ../shell/ev-window.c:6541 -+#: ../shell/ev-window.c:6542 - msgid "Couldn't find appropriate format to save image" - msgstr "சேமிக்க பொருத்தமான ஒழுங்கை காண முடியவில்லை" - --#: ../shell/ev-window.c:6573 -+#: ../shell/ev-window.c:6574 - msgid "The image could not be saved." - msgstr "பிம்பத்தை சேமிக்க இயலவில்லை." - --#: ../shell/ev-window.c:6605 -+#: ../shell/ev-window.c:6606 - msgid "Save Image" - msgstr "பிம்பத்தை சேமி" - --#: ../shell/ev-window.c:6736 -+#: ../shell/ev-window.c:6737 - msgid "Unable to open attachment" - msgstr "இணைப்பினை திறக்க இயலவில்லை" - --#: ../shell/ev-window.c:6792 -+#: ../shell/ev-window.c:6793 - msgid "The attachment could not be saved." - msgstr "இணைப்பினை சேமிக்க இயலவில்லை." - --#: ../shell/ev-window.c:6837 -+#: ../shell/ev-window.c:6838 - msgid "Save Attachment" - msgstr "இணைப்புகளை சேமி" - -@@ -1672,7 +1696,8 @@ - msgid "6400%" - msgstr "6400%" - --#: ../shell/main.c:70 ../shell/main.c:276 -+#: ../shell/main.c:70 -+#: ../shell/main.c:276 - msgid "GNOME Document Viewer" - msgstr "GNOME ஆவண காட்டி" - -@@ -1727,233 +1752,3 @@ - #: ../shell/evince-appmenu.ui.h:1 - msgid "_Help" - msgstr "உதவி (_H)" -- --#~ msgid "Show “_%s”" --#~ msgstr "“_%s”காட்டு" -- --#~ msgid "_Move on Toolbar" --#~ msgstr "கருவிப்பட்டியை நகர்த்து(_M)" -- --#~ msgid "Move the selected item on the toolbar" --#~ msgstr "கருவிப்பட்டையில் தேர்ந்தெடுக்கப்பட்ட உருப்படியை நகர்த்து" -- --#~ msgid "_Remove from Toolbar" --#~ msgstr "கருவிப்பட்டியிலிருந்து நீக்கு(_R)" -- --#~ msgid "Remove the selected item from the toolbar" --#~ msgstr "கருவிப்பட்டையிலிருந்து தேர்ந்தெடுக்கப்பட்டதை நீக்கு" -- --#~ msgid "_Delete Toolbar" --#~ msgstr "கருவிப்பட்டியை அழி (_D)" -- --#~ msgid "Remove the selected toolbar" --#~ msgstr "தேர்ந்தெடுக்கப்பட்ட கருவிப்பட்டியை நீக்கு" -- --#~ msgid "Separator" --#~ msgstr "பிரிப்பி" -- --#~ msgid "Best Fit" --#~ msgstr "சரியாக பொருந்துதல்" -- --#~ msgid "Fit Page Width" --#~ msgstr "பக்க அகலத்தை பொருத்து" -- --#~ msgid "_Best Fit" --#~ msgstr "சரியான பொருந்து (_B)" -- --#~ msgid "Fit Page _Width" --#~ msgstr "பக்க அகலத்தை பொருத்து (_W)" -- --#~ msgid "Find:" --#~ msgstr "தேடுக:" -- --#~ msgid "Find Pre_vious" --#~ msgstr "முந்தையதை தேடு (_v)" -- --#~ msgid "Find Ne_xt" --#~ msgstr "அடுத்ததை தேடு (_x)" -- --#~ msgid "Page %s — %s" --#~ msgstr "பக்கம் %s — %s" -- --#~ msgid "There was an error displaying help" --#~ msgstr "உதவியை காட்டுவதில் பிழை" -- --#~ msgid "Toolbar Editor" --#~ msgstr "கருவிப்பட்டி தொகுப்பி" -- --#~ msgid "_File" --#~ msgstr "கோப்பு (_F)" -- --#~ msgid "_Edit" --#~ msgstr "தொகு (_E)" -- --#~ msgid "_View" --#~ msgstr "பார்வை (_V)" -- --#~ msgid "_Go" --#~ msgstr "செல் (_G)" -- --#~ msgid "T_oolbar" --#~ msgstr "கருவிப்பட்டை (_o)" -- --#~ msgid "_Contents" --#~ msgstr "உள்ளடக்கங்கள் (_C)" -- --#~ msgid "_Toolbar" --#~ msgstr "கருவிப்பட்டை (_T)" -- --#~ msgid "Show or hide the toolbar" --#~ msgstr "கருவிப்பட்டையை காட்டு அல்லது மறை" -- --#~ msgid "_Dual (Even pages left)" --#~ msgstr "இரட்டை இரட்டைப்படை பக்கம் இடது (_O)" -- --#~ msgid "Show two pages at once with even pages on the left" --#~ msgstr "ஒரே நேரத்தில் இரட்டைப்படை எண் பக்கங்களை இடது பக்கமாக இரண்டு பக்கங்களை காட்டவும்" -- --#~ msgid "Navigation" --#~ msgstr "உலாவல்" -- --#~ msgid "Back" --#~ msgstr "பின்" -- --#~ msgid "Move across visited pages" --#~ msgstr "முன்பு சென்ற பக்கங்கள் ஊடாக உலாவுக" -- --#~ msgid "Toggle case sensitive search" --#~ msgstr "எழுத்துணர்வு தேடுதலை மாற்றுக" -- --#~ msgid "Converting %s" --#~ msgstr "%s ஐ மாற்றுகிறது" -- --#~ msgid "%d of %d documents converted" --#~ msgstr "%d ஆவது ஆவணம் %d ஆவணங்களில் மாற்றப்பட்டது" -- --#~ msgid "Converting metadata" --#~ msgstr "மெடாதரவை ஐ மாற்றுகிறது" -- --#~ msgid "" --#~ "The metadata format used by Evince has changed, and hence it needs to be " --#~ "migrated. If the migration is cancelled the metadata storage will not " --#~ "work." --#~ msgstr "" --#~ "எவின்ஸ் பயன்படுத்தும் மெடா தரவு ஒழுங்கு மாறிவிட்டது. ஆகவே அதை வேறிடம் கொண்டு செல்ல " --#~ "வேண்டும். இதை மறுத்தால் மெடாதரவு சேமிப்பு நடவாது." -- --#~ msgid "" --#~ "Boolean options available: true enables thumbnailing and false disables " --#~ "the creation of new thumbnails" --#~ msgstr "" --#~ "பூலியன் விருப்பங்கள் உள்ளன: சரி சிறுபடத்தை செயல்படுத்துகிறது மற்றும் தவறு புதிய " --#~ "சிறுபடங்கள்உருவாக்கத்தை செயல்நீக்குகிறது" -- --#~ msgid "Enable thumbnailing of PDF Documents" --#~ msgstr "PDF ஆவணங்களுக்கு சிறுபடத்தை செயல்படுத்துகிறது" -- --#~ msgid "Thumbnail command for PDF Documents" --#~ msgstr "PDF ஆவணங்களுக்கான சிறுபட கட்டளைகள்" -- --#~ msgid "" --#~ "Valid command plus arguments for the PDF Document thumbnailer. See " --#~ "Nautilus thumbnailer documentation for more information." --#~ msgstr "" --#~ "PDF ஆவண சிறு படங்களுக்கு சரியான கட்டளை மற்றும் மதிப்புகள் உள்ளன. மேலும் தகவல்களுக்கு " --#~ "nautilus சிறுபட ஆவணமாக்கத்தை பார்க்கவும்." -- --#~ msgid "Impress Slides" --#~ msgstr "பட வில்லையை பொறிக்கவும்" -- --#~ msgid "No error" --#~ msgstr "பிழை இல்லை" -- --#~ msgid "Not enough memory" --#~ msgstr "நினைவகம் போதாது" -- --#~ msgid "Cannot find ZIP signature" --#~ msgstr "ஜிப் கையொப்பத்தை காணவில்லை" -- --#~ msgid "Invalid ZIP file" --#~ msgstr "செல்லுபடியாகாத ஜிப் கோப்பு" -- --#~ msgid "Multi file ZIPs are not supported" --#~ msgstr "பல் கோப்பு ஜிப் க்கு ஆதரவு இல்லை" -- --#~ msgid "Cannot read data from file" --#~ msgstr "கோப்பிலிருந்து தரவை படிக்க முடியவில்லை." -- --#~ msgid "Cannot find file in the ZIP archive" --#~ msgstr "கோப்பை ஜிப் காப்பகத்தில் கண்டு பிடிக்க முடியவில்லை" -- --#~ msgid "Unknown error" --#~ msgstr "தெரியாத பிழை" -- --#~ msgid "Page Set_up…" --#~ msgstr "(_u) பக்க அமைப்பு" -- --#~ msgid "Set up the page settings for printing" --#~ msgstr "அச்சிடுவதற்கான பக்க அமைப்புகளை அமைக்கவும்" -- --#~ msgid "DJVU document has incorrect format" --#~ msgstr "DJVU ஆவணம் தவறான முறையை கொண்டுள்ளது" -- --#~ msgid "Print..." --#~ msgstr "அச்சிடு..." -- --#~ msgid "_Save a Copy..." --#~ msgstr "ஒரு நகலாக சேமி... (_S)" -- --#~ msgid "_Print..." --#~ msgstr "அச்சிடு... (_P)" -- --#~ msgid "_Find..." --#~ msgstr "தேடு... (_F)" -- --#~ msgid "Search string" --#~ msgstr "சரத்தை தேடு" -- --#~ msgid "The name of the string to be found" --#~ msgstr "சரத்தின் பெயரை காண முடியவில்லை" -- --#~ msgid "Case sensitive" --#~ msgstr "எழுத்துணர்வு" -- --#~ msgid "TRUE for a case sensitive search" --#~ msgstr "எழுத்துணர்வு தேடுதல் சரி ஆகும்" -- --#~ msgid "Highlight color" --#~ msgstr "முன்னிலைப்படுத்தும் நிறம்" -- --#~ msgid "Color of highlight for all matches" --#~ msgstr "அனைத்து ஒப்பீடுகளின் முன்னிலைப்படுத்தப்படும் நிறம்" -- --#~ msgid "Current color" --#~ msgstr "நடப்பு நிறம்" -- --#~ msgid "Color of highlight for the current match" --#~ msgstr "நடப்பு ஒப்பீட்டின் முன்னிலைப்படுத்தப்படும் நிறம்" -- --#~ msgid "Failed to create file “%s”: %s" --#~ msgstr "“%s” ஆவணத்தை உருவாக்க முடியவில்லை:%s" -- --#~ msgid "Recover previous documents?" --#~ msgstr "முந்தைய ஆவணத்தை மீட்கவா?" -- --#~ msgid "" --#~ "Evince appears to have exited unexpectedly the last time it was run. You " --#~ "can recover the opened documents." --#~ msgstr "" --#~ "கடைசியாக இயக்கியபோது எவின்ஸ் எதிர்பாராத விதமாக வெளியேறியது போல் உள்ளது. நீங்கள் " --#~ "திறந்த ஆவணங்களை மீட்க இயலும்." -- --#~ msgid "_Don't Recover" --#~ msgstr "_D மீட்காதே" -- --#~ msgid "Crash Recovery" --#~ msgstr "சிதைவு மீட்பு" -- --#~ msgid "Couldn't create symlink “%s”: " --#~ msgstr "சிம்லின்க் “%s” ஐ உருவாக்க முடியவில்லை " -- --#~ msgid "Cannot open a copy." --#~ msgstr "ஒரு பிரதியை திறக்க இயலவில்லை" diff --git a/SPECS/evince.spec b/SPECS/evince.spec index 838868f..ea9e64f 100644 --- a/SPECS/evince.spec +++ b/SPECS/evince.spec @@ -1,32 +1,25 @@ -%global poppler_version 0.20.0 -%global glib2_version 2.25.9 -%global dbus_version 0.70 -%global theme_version 2.17.1 +%global poppler_version 0.24.0 +%global glib2_version 2.36.0 +%global gtk3_version 3.14.0 %global gxps_version 0.2.1 Name: evince -Version: 3.8.3 -Release: 8%{?dist} +Version: 3.14.2 +Release: 5%{?dist} Summary: Document viewer License: GPLv2+ and GPLv3+ and LGPLv2+ and MIT and Afmparse Group: Applications/Publishing URL: http://projects.gnome.org/evince/ -Source0: http://download.gnome.org/sources/%{name}/3.8/%{name}-%{version}.tar.xz - -# https://bugzilla.redhat.com/show_bug.cgi?id=1030325 -Patch0: evince-3.8.3-translation-updates.patch - -# https://bugzilla.redhat.com/show_bug.cgi?id=1037788 -Patch1: evince-3.8.3-sendto.patch - -# https://bugzilla.redhat.com/show_bug.cgi?id=1066458 -Patch2: evince-3.8.3-get-selection-rectangles.patch +Source0: http://download.gnome.org/sources/%{name}/3.14/%{name}-%{version}.tar.xz +Patch0: evince-3.14.2-translations.patch +Patch1: evince-3.14.2-smclient.patch +Patch2: evince-3.14.2-copy-permissions.patch Obsoletes: evince-djvu <= 3.8.3-2 -BuildRequires: gtk3-devel BuildRequires: glib2-devel >= %{glib2_version} +BuildRequires: gtk3-devel >= %{gtk3_version} BuildRequires: poppler-glib-devel >= %{poppler_version} BuildRequires: libXt-devel BuildRequires: libsecret-devel @@ -36,13 +29,14 @@ BuildRequires: libspectre-devel BuildRequires: libxml2-devel BuildRequires: gettext BuildRequires: desktop-file-utils -BuildRequires: gnome-icon-theme >= %{theme_version} BuildRequires: libtool BuildRequires: gtk-doc BuildRequires: yelp-tools BuildRequires: intltool BuildRequires: t1lib-devel BuildRequires: gobject-introspection-devel +BuildRequires: adwaita-icon-theme-devel +BuildRequires: gnome-desktop3-devel # For autoconf.sh BuildRequires: gnome-common >= 2.26 @@ -54,6 +48,8 @@ BuildRequires: kpathsea-devel BuildRequires: libgxps-devel >= %{gxps_version} Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: glib2%{?_isa} >= %{glib2_version} +Requires: gtk3%{?_isa} >= %{gtk3_version} %description Evince is simple multi-page document viewer. It can display and print @@ -102,25 +98,27 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release} Requires: nautilus%{?_isa} %description nautilus -This package contains the evince extension for the nautilus file manger. +This package contains the evince extension for the nautilus file manager. It adds an additional tab called "Document" to the file properties dialog. %prep %setup -q -%patch0 -p2 -b .translation-updates -%patch1 -p1 -b .sendto -%patch2 -p1 -b .get-selection-rectangles +%patch0 -p1 -b .translations +%patch1 -p1 -b .smclient +%patch2 -p1 -b .copy-permissions %build -./autogen.sh +autoreconf -vif %configure \ --disable-static \ --enable-introspection \ --enable-comics=yes \ --enable-dvi=yes \ --disable-djvu \ + --enable-libgnome-desktop \ --enable-xps=yes \ - --enable-t1lib=yes + --enable-t1lib=yes \ + --disable-browser-plugin make %{?_smp_mflags} V=1 LIBTOOL=/usr/bin/libtool %install @@ -165,6 +163,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas >&/dev/null ||: %files -f evince.lang %{_bindir}/* %{_datadir}/%{name}/ +%{_datadir}/appdata/evince.appdata.xml %{_datadir}/applications/%{name}.desktop %{_datadir}/applications/evince-previewer.desktop %{_datadir}/icons/hicolor/*/apps/evince.* @@ -184,14 +183,24 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas >&/dev/null ||: %dir %{_libdir}/evince/4/backends %{_libdir}/evince/4/backends/libpdfdocument.so %{_libdir}/evince/4/backends/pdfdocument.evince-backend +%{_datadir}/appdata/evince-pdfdocument.metainfo.xml + %{_libdir}/evince/4/backends/libpsdocument.so %{_libdir}/evince/4/backends/psdocument.evince-backend +%{_datadir}/appdata/evince-psdocument.metainfo.xml + %{_libdir}/evince/4/backends/libtiffdocument.so %{_libdir}/evince/4/backends/tiffdocument.evince-backend +%{_datadir}/appdata/evince-tiffdocument.metainfo.xml + %{_libdir}/evince/4/backends/libcomicsdocument.so %{_libdir}/evince/4/backends/comicsdocument.evince-backend +%{_datadir}/appdata/evince-comicsdocument.metainfo.xml + %{_libdir}/evince/4/backends/libxpsdocument.so %{_libdir}/evince/4/backends/xpsdocument.evince-backend +%{_datadir}/appdata/evince-xpsdocument.metainfo.xml + %{_libdir}/girepository-1.0/EvinceDocument-3.0.typelib %{_libdir}/girepository-1.0/EvinceView-3.0.typelib @@ -211,11 +220,37 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas >&/dev/null ||: %files dvi %{_libdir}/evince/4/backends/libdvidocument.so* %{_libdir}/evince/4/backends/dvidocument.evince-backend +%{_datadir}/appdata/evince-dvidocument.metainfo.xml %files nautilus %{_libdir}/nautilus/extensions-3.0/libevince-properties-page.so %changelog +* Wed Sep 2 2015 Marek Kasik - 3.14.2-5 +- Don't copy permissions from original file +- Resolves: #1259390 + +* Tue Aug 18 2015 Marek Kasik - 3.14.2-4 +- Backport SMClient back to enable session saving +- Resolves: #1251572 + +* Thu Apr 30 2015 Marek Kasik - 3.14.2-3 +- Translations update from translation team +- Resolves: #1204902 + +* Wed Mar 25 2015 Marek Kasik - 3.14.2-2 +- Remove unused patches +- Disable browser plugin explicitly +- Resolves: #1204902 + +* Mon Mar 23 2015 Richard Hughes > - 3.14.2-1 +- Update to 3.14.2 +- Resolves: #1204902 + +* Tue Aug 19 2014 Peter Robinson - 3.8.3-9 +- Fix build on ppc64le/aarch64 +- Resolves: #1125497 + * Tue Feb 18 2014 Marek Kasik - 3.8.3-8 - Get selection rectangles at once when redrawing a selection - Resolves: #1066458