diff options
35 files changed, 3356 insertions, 839 deletions
@@ -1,3 +1,53 @@ +Overview of Changes in GTK+ 3.23.0 +================================== + +* Dependency bumps: + - Require libepoxy 1.4 + - Require pango 1.41 + +* New font chooser features: + - Allow setting OpenType font features + - Show examples for OpenType font features + - Allow selecting OpenType font variations + - Support levels of details for selection + +* New Emoji features: + - Support a completion popup for Emoji + - Drop Ctrl-Shift-e shortcut + +* Bugs fixed: + #85 widgetDragDestFindTarget introspection data does not show nullable... + #154 Documentation: Lifecycle of Editables inside GtkCellRenderers is no... + #193 Document that GtkUIManager is deprecated by GtkBuilder + #199 MenuButton not notified when its Popover is destroyed, still access... + #292 GtkRanges should send ::change-value even if not realized + #450 Menu navigation triangle doesn't work anymore + #792 Focus events are not always matched + #898 emoji-chooser: search for flags doesn't work + #1053 Scroll cursor gets left behind if a child widget steals the scroll + #1059 -Wparentheses warnings in GTK+ headers when compiling C++ code with... + #1065 GtkScrollbar horizontal mouse wheel scroll direction is wrong + #1069 Thread 1 "glade" received signal SIGFPE, Arithmetic exception. + #1115 gtk icon theme searches system dirs before user dirs + 407242 GtkScale: Up/Down keys decrease/increase value, which is opposite... + 686109 gtk_print_context_get_hard_margins should return page size specif... + 765327 GtkPlug scaled to half the expected size on HiDPI screens + 772817 File Chooser: Path arrow button frames are reversed and detached ... + 775279 early calls to libepoxy cause all gtk3 programs to abort when the... + 786524 ocument GTK_OVERLAY_SCROLLING environment variable + 787867 OSX macports pango text size appears to vary between version 1.40... + 789215 GtkScrolledWindow and GtkIconView atk objects can cause a segfaul... + 791542 GDK 3 Selections documentation makes references to X + 791802 Fix direction value moves on scroll/keypress over RTL/inverted ra... + +* Translation updates: + Catalan + Finnish + Polish + Russian + Spanish + + Overview of Changes in GTK+ 3.22.30 =================================== diff --git a/configure.ac b/configure.ac index 9171ae0ae3..994e7689d3 100644 --- a/configure.ac +++ b/configure.ac @@ -9,9 +9,9 @@ # set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0. m4_define([gtk_major_version], [3]) -m4_define([gtk_minor_version], [22]) -m4_define([gtk_micro_version], [30]) -m4_define([gtk_interface_age], [30]) +m4_define([gtk_minor_version], [23]) +m4_define([gtk_micro_version], [0]) +m4_define([gtk_interface_age], [0]) m4_define([gtk_binary_age], [m4_eval(100 * gtk_minor_version + gtk_micro_version)]) m4_define([gtk_version], diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui index 2d7426f16c..ad847df23e 100644 --- a/demos/widget-factory/widget-factory.ui +++ b/demos/widget-factory/widget-factory.ui @@ -493,6 +493,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property> <object class="GtkEntry" id="entry1"> <property name="visible">1</property> <property name="can_focus">1</property> + <property name="enable-emoji-completion">1</property> <property name="invisible_char">•</property> <property name="placeholder-text" translatable="yes">Click icon to change mode</property> <property name="secondary_icon_name">view-refresh-symbolic</property> diff --git a/docs/reference/gdk/gdk-docs.sgml b/docs/reference/gdk/gdk-docs.sgml index bc102c2dc1..54c295546e 100644 --- a/docs/reference/gdk/gdk-docs.sgml +++ b/docs/reference/gdk/gdk-docs.sgml @@ -113,6 +113,10 @@ <title>Index of new symbols in 3.22</title> <xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include> </index> + <index id="api-index-3-24" role="3.24"> + <title>Index of new symbols in 3.24</title> + <xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include> + </index> <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include> diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index 4e5c403670..344f257028 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -386,6 +386,7 @@ gdk_window_move gdk_window_resize gdk_window_move_resize gdk_window_scroll +gdk_window_move_to_rect gdk_window_move_region gdk_window_flush gdk_window_has_native diff --git a/docs/reference/gtk/gtk-docs.sgml b/docs/reference/gtk/gtk-docs.sgml index 1c3a12e804..ef315f8984 100644 --- a/docs/reference/gtk/gtk-docs.sgml +++ b/docs/reference/gtk/gtk-docs.sgml @@ -494,6 +494,10 @@ <title>Index of new symbols in 3.22</title> <xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include> </index> + <index id="api-index-3-24" role="3.24"> + <title>Index of new symbols in 3.24</title> + <xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include> + </index> <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include> diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 974d8ca6dc..718976af6d 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -1665,6 +1665,11 @@ GtkFontFilterFunc gtk_font_chooser_set_filter_func gtk_font_chooser_set_font_map gtk_font_chooser_get_font_map +gtk_font_chooser_set_level +gtk_font_chooser_get_level +gtk_font_chooser_get_font_features +gtk_font_chooser_set_language +gtk_font_chooser_get_language <SUBSECTION Standard> GtkFontChooserIface diff --git a/gdk/gdk-private.c b/gdk/gdk-private.c index 37a4ee60c3..98a0b15b0d 100644 --- a/gdk/gdk-private.c +++ b/gdk/gdk-private.c @@ -17,7 +17,6 @@ gdk__private__ (void) gdk_display_set_rendering_mode, gdk_display_get_debug_updates, gdk_display_set_debug_updates, - gdk_window_move_to_rect }; return &table; diff --git a/gdk/gdk-private.h b/gdk/gdk-private.h index e292429fd4..5d35eb54d8 100644 --- a/gdk/gdk-private.h +++ b/gdk/gdk-private.h @@ -31,14 +31,6 @@ gboolean gdk_display_get_debug_updates (GdkDisplay *display); void gdk_display_set_debug_updates (GdkDisplay *display, gboolean debug_updates); -void gdk_window_move_to_rect (GdkWindow *window, - const GdkRectangle *rect, - GdkGravity rect_anchor, - GdkGravity window_anchor, - GdkAnchorHints anchor_hints, - gint rect_anchor_dx, - gint rect_anchor_dy); - typedef struct { /* add all private functions here, initialize them in gdk-private.c */ gboolean (* gdk_device_grab_info) (GdkDisplay *display, @@ -64,14 +56,6 @@ typedef struct { gboolean (* gdk_display_get_debug_updates) (GdkDisplay *display); void (* gdk_display_set_debug_updates) (GdkDisplay *display, gboolean debug_updates); - - void (* gdk_window_move_to_rect) (GdkWindow *window, - const GdkRectangle *rect, - GdkGravity rect_anchor, - GdkGravity window_anchor, - GdkAnchorHints anchor_hints, - gint rect_anchor_dx, - gint rect_anchor_dy); } GdkPrivateVTable; GDK_AVAILABLE_IN_ALL diff --git a/gdk/gdkversionmacros.h.in b/gdk/gdkversionmacros.h.in index bc2365df3d..410abcbe6a 100644 --- a/gdk/gdkversionmacros.h.in +++ b/gdk/gdkversionmacros.h.in @@ -172,6 +172,16 @@ */ #define GDK_VERSION_3_22 (G_ENCODE_VERSION (3, 22)) +/** + * GDK_VERSION_3_24: + * + * A macro that evaluates to the 3.24 version of GDK, in a format + * that can be used by the C pre-processor. + * + * Since: 3.24 + */ +#define GDK_VERSION_3_24 (G_ENCODE_VERSION (3, 24)) + /* evaluates to the current stable version; for development cycles, * this means the next stable target */ @@ -412,5 +422,11 @@ # define GDK_AVAILABLE_IN_3_22 _GDK_EXTERN #endif +#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_24 +# define GDK_AVAILABLE_IN_3_24 GDK_UNAVAILABLE(3, 24) +#else +# define GDK_AVAILABLE_IN_3_24 _GDK_EXTERN +#endif + #endif /* __GDK_VERSION_MACROS_H__ */ diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 5ac1a69b4c..6b231f067e 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -6233,8 +6233,7 @@ gdk_window_move_resize (GdkWindow *window, * Connect to the #GdkWindow::moved-to-rect signal to find out how it was * actually positioned. * - * Since: 3.22 - * Stability: Private + * Since: 3.24 */ void gdk_window_move_to_rect (GdkWindow *window, diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index 3614a76b9f..b1efbb984e 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -550,6 +550,15 @@ void gdk_window_move_resize (GdkWindow *window, gint y, gint width, gint height); + +GDK_AVAILABLE_IN_3_24 +void gdk_window_move_to_rect (GdkWindow *window, + const GdkRectangle *rect, + GdkGravity rect_anchor, + GdkGravity window_anchor, + GdkAnchorHints anchor_hints, + gint rect_anchor_dx, + gint rect_anchor_dy); GDK_AVAILABLE_IN_ALL void gdk_window_reparent (GdkWindow *window, GdkWindow *new_parent, diff --git a/gtk/Makefile.am b/gtk/Makefile.am index a903078efa..54a2ca4908 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -469,6 +469,7 @@ gtk_private_h_sources = \ gtkdialogprivate.h \ gtkdndprivate.h \ gtkemojichooser.h \ + gtkemojicompletion.h \ gtkentryprivate.h \ gtkeventcontrollerprivate.h \ gtkfilechooserembed.h \ @@ -747,6 +748,7 @@ gtk_base_c_sources = \ gtkdrawingarea.c \ gtkeditable.c \ gtkemojichooser.c \ + gtkemojicompletion.c \ gtkentry.c \ gtkentrybuffer.c \ gtkentrycompletion.c \ diff --git a/gtk/gtkcssgadget.c b/gtk/gtkcssgadget.c index 7d4ba9c73b..09e9fdfa38 100644 --- a/gtk/gtkcssgadget.c +++ b/gtk/gtkcssgadget.c @@ -459,6 +459,14 @@ get_number (GtkCssStyle *style, return floor (d); } +/* Special-case min-width|height to round upwards, to avoid underalloc by 1px */ +static int +get_number_ceil (GtkCssStyle *style, + guint property) +{ + return ceil (_gtk_css_number_value_get (gtk_css_style_get_value (style, property), 100)); +} + static void get_box_margin (GtkCssStyle *style, GtkBorder *margin) @@ -643,16 +651,16 @@ gtk_css_gadget_get_preferred_size (GtkCssGadget *gadget, extra_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right; extra_opposite = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom; extra_baseline = margin.left + border.left + padding.left; - min_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH); - min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT); + min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH); + min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT); } else { extra_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom; extra_opposite = margin.left + margin.right + border.left + border.right + padding.left + padding.right; extra_baseline = margin.top + border.top + padding.top; - min_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT); - min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH); + min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT); + min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH); } if (for_size > -1) diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index 9697dad4b6..64ec1959ce 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -35,6 +35,8 @@ #include "gtkintl.h" #include "gtkprivate.h" +#define BOX_SPACE 6 + typedef struct { GtkWidget *box; GtkWidget *heading; @@ -124,7 +126,7 @@ scroll_to_section (GtkButton *button, if (section->heading) gtk_widget_get_allocation (section->heading, &alloc); - gtk_adjustment_animate_to_value (adj, alloc.y); + gtk_adjustment_animate_to_value (adj, alloc.y - BOX_SPACE); } static void @@ -142,6 +144,7 @@ populate_recent_section (GtkEmojiChooser *chooser) GVariant *variant; GVariant *item; GVariantIter iter; + gboolean empty = FALSE; variant = g_settings_get_value (chooser->settings, "recent-emoji"); g_variant_iter_init (&iter, variant); @@ -155,6 +158,13 @@ populate_recent_section (GtkEmojiChooser *chooser) add_emoji (chooser->recent.box, FALSE, emoji_data, modifier, chooser); g_variant_unref (emoji_data); g_variant_unref (item); + empty = FALSE; + } + + if (!empty) + { + gtk_widget_show (chooser->recent.box); + gtk_widget_set_sensitive (chooser->recent.button, TRUE); } g_variant_unref (variant); } @@ -197,6 +207,10 @@ add_recent_item (GtkEmojiChooser *chooser, add_emoji (chooser->recent.box, TRUE, item, modifier, chooser); + /* Enable recent */ + gtk_widget_show (chooser->recent.box); + gtk_widget_set_sensitive (chooser->recent.button, TRUE); + g_settings_set_value (chooser->settings, "recent-emoji", g_variant_builder_end (&builder)); g_variant_unref (item); @@ -493,7 +507,7 @@ adj_value_changed (GtkAdjustment *adj, else gtk_widget_get_allocation (section->box, &alloc); - if (value < alloc.y) + if (value < alloc.y - BOX_SPACE) break; select_section = section; diff --git a/gtk/gtkemojicompletion.c b/gtk/gtkemojicompletion.c new file mode 100644 index 0000000000..664629be49 --- /dev/null +++ b/gtk/gtkemojicompletion.c @@ -0,0 +1,699 @@ +/* gtkemojicompletion.c: An Emoji picker widget + * Copyright 2017, Red Hat, 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, see <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include "gtkemojicompletion.h" + +#include "gtkentryprivate.h" +#include "gtkbox.h" +#include "gtkcssprovider.h" +#include "gtklistbox.h" +#include "gtklabel.h" +#include "gtkpopover.h" +#include "gtkintl.h" +#include "gtkprivate.h" +#include "gtkgesturelongpress.h" +#include "gtkflowbox.h" +#include "gtkstack.h" + +struct _GtkEmojiCompletion +{ + GtkPopover parent_instance; + + GtkEntry *entry; + char *text; + guint length; + guint offset; + gulong changed_id; + guint n_matches; + + GtkWidget *list; + GtkWidget *active; + GtkWidget *active_variation; + + GVariant *data; + + GtkGesture *long_press; +}; + +struct _GtkEmojiCompletionClass { + GtkPopoverClass parent_class; +}; + +static void connect_signals (GtkEmojiCompletion *completion, + GtkEntry *entry); +static void disconnect_signals (GtkEmojiCompletion *completion); +static int populate_completion (GtkEmojiCompletion *completion, + const char *text, + guint offset); + +#define MAX_ROWS 5 + +G_DEFINE_TYPE (GtkEmojiCompletion, gtk_emoji_completion, GTK_TYPE_POPOVER) + +static void +gtk_emoji_completion_finalize (GObject *object) +{ + GtkEmojiCompletion *completion = GTK_EMOJI_COMPLETION (object); + + disconnect_signals (completion); + + g_free (completion->text); + g_variant_unref (completion->data); + + g_clear_object (&completion->long_press); + + G_OBJECT_CLASS (gtk_emoji_completion_parent_class)->finalize (object); +} + +static void +update_completion (GtkEmojiCompletion *completion) +{ + const char *text; + guint length; + guint n_matches; + + n_matches = 0; + + text = gtk_entry_get_text (GTK_ENTRY (completion->entry)); + length = strlen (text); + + if (length > 0) + { + gboolean found_candidate = FALSE; + const char *p; + + p = text + length; + do + { +next: + p = g_utf8_prev_char (p); + if (*p == ':') + { + if (p + 1 == text + length) + goto next; + + if (p == text || !g_unichar_isalnum (g_utf8_get_char (p - 1))) + { + found_candidate = TRUE; + } + + break; + } + } + while (g_unichar_isalnum (g_utf8_get_char (p)) || *p == '_'); + + if (found_candidate) + n_matches = populate_completion (completion, p, 0); + } + + if (n_matches > 0) + gtk_popover_popup (GTK_POPOVER (completion)); + else + gtk_popover_popdown (GTK_POPOVER (completion)); +} + +static void +entry_changed (GtkEntry *entry, GtkEmojiCompletion *completion) +{ + update_completion (completion); +} + +static void +emoji_activated (GtkWidget *row, + GtkEmojiCompletion *completion) +{ + const char *emoji; + guint length; + + gtk_popover_popdown (GTK_POPOVER (completion)); + + emoji = (const char *)g_object_get_data (G_OBJECT (row), "text"); + + g_signal_handler_block (completion->entry, completion->changed_id); + + length = g_utf8_strlen (gtk_entry_get_text (completion->entry), -1); + gtk_entry_set_positions (completion->entry, length - completion->length, length); + gtk_entry_enter_text (completion->entry, emoji); + + g_signal_handler_unblock (completion->entry, completion->changed_id); +} + +static void +row_activated (GtkListBox *list, + GtkListBoxRow *row, + gpointer data) +{ + GtkEmojiCompletion *completion = data; + + emoji_activated (GTK_WIDGET (row), completion); +} + +static void +child_activated (GtkFlowBox *box, + GtkFlowBoxChild *child, + gpointer data) +{ + GtkEmojiCompletion *completion = data; + + emoji_activated (GTK_WIDGET (child), completion); +} + +static void +move_active_row (GtkEmojiCompletion *completion, + int direction) +{ + GtkWidget *child; + GtkWidget *base; + GList *children, *l, *active, *last; + + active = NULL; + last = NULL; + children = gtk_container_get_children (GTK_CONTAINER (completion->list)); + for (l = children; l; l = l->next) + { + child = l->data; + + if (completion->active == child) + active = l; + + if (l->next == NULL) + last = l; + + gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_PRELIGHT); + base = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "base")); + gtk_widget_unset_state_flags (base, GTK_STATE_FLAG_PRELIGHT); + } + + if (completion->active != NULL) + { + if (direction == 1) + completion->active = (active && active->next) ? active->next->data : NULL; + else + completion->active = (active && active->prev) ? active->prev->data : NULL; + } + + if (completion->active == NULL) + { + if (direction == 1) + completion->active = children->data; + else + completion->active = last->data; + } + + if (completion->active != NULL) + gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE); + + if (completion->active_variation) + { + gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT); + completion->active_variation = NULL; + } + + g_list_free (children); +} + +static void +activate_active_row (GtkEmojiCompletion *completion) +{ + if (GTK_IS_FLOW_BOX_CHILD (completion->active_variation)) + emoji_activated (completion->active_variation, completion); + else if (completion->active != NULL) + emoji_activated (completion->active, completion); +} + +static void +show_variations (GtkEmojiCompletion *completion, + GtkWidget *row, + gboolean visible) +{ + GtkWidget *stack; + GtkWidget *box; + gboolean is_visible; + + if (!row) + return; + + stack = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "stack")); + box = gtk_stack_get_child_by_name (GTK_STACK (stack), "variations"); + if (!box) + return; + + is_visible = gtk_stack_get_visible_child (GTK_STACK (stack)) == box; + if (is_visible == visible) + return; + + if (visible) + gtk_widget_unset_state_flags (row, GTK_STATE_FLAG_PRELIGHT); + else + gtk_widget_set_state_flags (row, GTK_STATE_FLAG_PRELIGHT, FALSE); + + gtk_stack_set_visible_child_name (GTK_STACK (stack), visible ? "variations" : "text"); + if (completion->active_variation) + { + gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT); + completion->active_variation = NULL; + } +} + +static gboolean +move_active_variation (GtkEmojiCompletion *completion, + int direction) +{ + GtkWidget *base; + GtkWidget *stack; + GtkWidget *box; + GtkWidget *next; + GList *children, *l, *active; + + if (!completion->active) + return FALSE; + + base = GTK_WIDGET (g_object_get_data (G_OBJECT (completion->active), "base")); + stack = GTK_WIDGET (g_object_get_data (G_OBJECT (completion->active), "stack")); + box = gtk_stack_get_child_by_name (GTK_STACK (stack), "variations"); + + if (gtk_stack_get_visible_child (GTK_STACK (stack)) != box) + return FALSE; + + next = NULL; + + active = NULL; + children = gtk_container_get_children (GTK_CONTAINER (box)); + for (l = children; l; l = l->next) + { + if (l->data == completion->active_variation) + active = l; + } + + if (!completion->active_variation) + next = base; + else if (completion->active_variation == base && direction == 1) + next = children->data; + else if (completion->active_variation == children->data && direction == -1) + next = base; + else if (direction == 1) + next = (active && active->next) ? active->next->data : NULL; + else if (direction == -1) + next = (active && active->prev) ? active->prev->data : NULL; + + if (next) + { + if (completion->active_variation) + gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT); + completion->active_variation = next; + gtk_widget_set_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT, FALSE); + } + + g_list_free (children); + + return next != NULL; +} + +static gboolean +entry_key_press (GtkEntry *entry, + GdkEventKey *event, + GtkEmojiCompletion *completion) +{ + guint keyval; + + if (!gtk_widget_get_visible (GTK_WIDGET (completion))) + return FALSE; + + gdk_event_get_keyval ((GdkEvent*)event, &keyval); + + if (keyval == GDK_KEY_Escape) + { + gtk_popover_popdown (GTK_POPOVER (completion)); + return TRUE; + } + + if (keyval == GDK_KEY_Tab) + { + show_variations (completion, completion->active, FALSE); + + guint offset = completion->offset + MAX_ROWS; + if (offset >= completion->n_matches) + offset = 0; + populate_completion (completion, completion->text, offset); + return TRUE; + } + + if (keyval == GDK_KEY_Up) + { + show_variations (completion, completion->active, FALSE); + + move_active_row (completion, -1); + return TRUE; + } + + if (keyval == GDK_KEY_Down) + { + show_variations (completion, completion->active, FALSE); + + move_active_row (completion, 1); + return TRUE; + } + + if (keyval == GDK_KEY_Return || + keyval == GDK_KEY_KP_Enter || + keyval == GDK_KEY_ISO_Enter) + { + activate_active_row (completion); + return TRUE; + } + + if (keyval == GDK_KEY_Right) + { + show_variations (completion, completion->active, TRUE); + move_active_variation (completion, 1); + return TRUE; + } + + if (keyval == GDK_KEY_Left) + { + if (!move_active_variation (completion, -1)) + show_variations (completion, completion->active, FALSE); + return TRUE; + } + + return FALSE; +} + +static gboolean +entry_focus_out (GtkWidget *entry, + GParamSpec *pspec, + GtkEmojiCompletion *completion) +{ + if (!gtk_widget_has_focus (entry)) + gtk_popover_popdown (GTK_POPOVER (completion)); + return FALSE; +} + +static void +connect_signals (GtkEmojiCompletion *completion, + GtkEntry *entry) +{ + completion->entry = entry; + + completion->changed_id = g_signal_connect (entry, "changed", G_CALLBACK (entry_changed), completion); + g_signal_connect (entry, "key-press-event", G_CALLBACK (entry_key_press), completion); + g_signal_connect (entry, "notify::has-focus", G_CALLBACK (entry_focus_out), completion); +} + +static void +disconnect_signals (GtkEmojiCompletion *completion) +{ + g_signal_handlers_disconnect_by_func (completion->entry, entry_changed, completion); + g_signal_handlers_disconnect_by_func (completion->entry, entry_key_press, completion); + g_signal_handlers_disconnect_by_func (completion->entry, entry_focus_out, completion); + + completion->entry = NULL; +} + +static gboolean +has_variations (GVariant *emoji_data) +{ + GVariant *codes; + int i; + gboolean has_variations; + + has_variations = FALSE; + codes = g_variant_get_child_value (emoji_data, 0); + for (i = 0; i < g_variant_n_children (codes); i++) + { + gunichar code; + g_variant_get_child (codes, i, "u", &code); + if (code == 0) + { + has_variations = TRUE; + break; + } + } + g_variant_unref (codes); + + return has_variations; +} + +static void +get_text (GVariant *emoji_data, + gunichar modifier, + char *text, + gsize length) +{ + GVariant *codes; + int i; + char *p; + + p = text; + codes = g_variant_get_child_value (emoji_data, 0); + for (i = 0; i < g_variant_n_children (codes); i++) + { + gunichar code; + + g_variant_get_child (codes, i, "u", &code); + if (code == 0) + code = modifier; + if (code != 0) + p += g_unichar_to_utf8 (code, p); + } + g_variant_unref (codes); + p[0] = 0; +} + +static void +add_emoji_variation (GtkWidget *box, + GVariant *emoji_data, + gunichar modifier) +{ + GtkWidget *child; + GtkWidget *label; + PangoAttrList *attrs; + char text[64]; + + get_text (emoji_data, modifier, text, 64); + + label = gtk_label_new (text); + gtk_widget_show (label); + attrs = pango_attr_list_new (); + pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE)); + gtk_label_set_attributes (GTK_LABEL (label), attrs); + pango_attr_list_unref (attrs); + + child = gtk_flow_box_child_new (); + gtk_widget_show (child); + gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji"); + g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free); + g_object_set_data_full (G_OBJECT (child), "emoji-data", + g_variant_ref (emoji_data), + (GDestroyNotify)g_variant_unref); + if (modifier != 0) + g_object_set_data (G_OBJECT (child), "modifier", GUINT_TO_POINTER (modifier)); + + gtk_container_add (GTK_CONTAINER (child), label); + gtk_flow_box_insert (GTK_FLOW_BOX (box), child, -1); +} + +static void +add_emoji (GtkWidget *list, + GVariant *emoji_data, + GtkEmojiCompletion *completion) +{ + GtkWidget *child; + GtkWidget *label; + GtkWidget *box; + PangoAttrList *attrs; + char text[64]; + const char *shortname; + GtkWidget *stack; + gunichar modifier; + + get_text (emoji_data, 0, text, 64); + + label = gtk_label_new (text); + gtk_widget_show (label); + attrs = pango_attr_list_new (); + pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE)); + gtk_label_set_attributes (GTK_LABEL (label), attrs); + pango_attr_list_unref (attrs); + gtk_style_context_add_class (gtk_widget_get_style_context (label), "emoji"); + + child = gtk_list_box_row_new (); + gtk_widget_show (child); + gtk_widget_set_focus_on_click (child, FALSE); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (child), box); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + g_object_set_data (G_OBJECT (child), "base", label); + + stack = gtk_stack_new (); + gtk_widget_show (stack); + gtk_stack_set_homogeneous (GTK_STACK (stack), TRUE); + gtk_stack_set_transition_type (GTK_STACK (stack), GTK_STACK_TRANSITION_TYPE_OVER_RIGHT_LEFT); + gtk_box_pack_start (GTK_BOX (box), stack, FALSE, FALSE, 0); + g_object_set_data (G_OBJECT (child), "stack", stack); + + g_variant_get_child (emoji_data, 2, "&s", &shortname); + label = gtk_label_new (shortname); + gtk_widget_show (label); + gtk_label_set_xalign (GTK_LABEL (label), 0); + + gtk_stack_add_named (GTK_STACK (stack), label, "text"); + + if (has_variations (emoji_data)) + { + box = gtk_flow_box_new (); + gtk_widget_show (box); + gtk_flow_box_set_homogeneous (GTK_FLOW_BOX (box), TRUE); + gtk_flow_box_set_min_children_per_line (GTK_FLOW_BOX (box), 5); + gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (box), 5); + gtk_flow_box_set_activate_on_single_click (GTK_FLOW_BOX (box), TRUE); + gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (box), GTK_SELECTION_NONE); + g_signal_connect (box, "child-activated", G_CALLBACK (child_activated), completion); + for (modifier = 0x1f3fb; modifier <= 0x1f3ff; modifier++) + add_emoji_variation (box, emoji_data, modifier); + + gtk_stack_add_named (GTK_STACK (stack), box, "variations"); + } + + g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free); + g_object_set_data_full (G_OBJECT (child), "emoji-data", + g_variant_ref (emoji_data), (GDestroyNotify)g_variant_unref); + gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji-completion-row"); + + gtk_list_box_insert (GTK_LIST_BOX (list), child, -1); +} + +static int +populate_completion (GtkEmojiCompletion *completion, + const char *text, + guint offset) +{ + GList *children, *l; + int n_matches; + int n_added; + GVariantIter iter; + GVariant *item; + + text = g_strdup (text); + g_free (completion->text); + completion->text = g_strdup (text); + completion->length = g_utf8_strlen (text, -1); + completion->offset = offset; + + children = gtk_container_get_children (GTK_CONTAINER (completion->list)); + for (l = children; l; l = l->next) + gtk_widget_destroy (GTK_WIDGET (l->data)); + g_list_free (children); + + completion->active = NULL; + + n_matches = 0; + n_added = 0; + g_variant_iter_init (&iter, completion->data); + while ((item = g_variant_iter_next_value (&iter))) + { + const char *shortname; + + g_variant_get_child (item, 2, "&s", &shortname); + if (g_str_has_prefix (shortname, text)) + { + n_matches++; + + if (n_matches > offset && n_added < MAX_ROWS) + { + add_emoji (completion->list, item, completion); + n_added++; + } + } + } + + completion->n_matches = n_matches; + + if (n_added > 0) + { + GList *children; + + children = gtk_container_get_children (GTK_CONTAINER (completion->list)); + completion->active = children->data; + g_list_free (children); + gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE); + } + + return n_added; +} + +static void +long_pressed_cb (GtkGesture *gesture, + double x, + double y, + gpointer data) +{ + GtkEmojiCompletion *completion = data; + GtkWidget *row; + + row = GTK_WIDGET (gtk_list_box_get_row_at_y (GTK_LIST_BOX (completion->list), y)); + if (!row) + return; + + show_variations (completion, row, TRUE); +} + +static void +gtk_emoji_completion_init (GtkEmojiCompletion *completion) +{ + g_autoptr(GBytes) bytes = NULL; + + gtk_widget_init_template (GTK_WIDGET (completion)); + + bytes = g_resources_lookup_data ("/org/gtk/libgtk/emoji/emoji.data", 0, NULL); + completion->data = g_variant_ref_sink (g_variant_new_from_bytes (G_VARIANT_TYPE ("a(auss)"), bytes, TRUE)); + + completion->long_press = gtk_gesture_long_press_new (completion->list); + g_signal_connect (completion->long_press, "pressed", G_CALLBACK (long_pressed_cb), completion); +} + +static void +gtk_emoji_completion_class_init (GtkEmojiCompletionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = gtk_emoji_completion_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkemojicompletion.ui"); + + gtk_widget_class_bind_template_child (widget_class, GtkEmojiCompletion, list); + + gtk_widget_class_bind_template_callback (widget_class, row_activated); +} + +GtkWidget * +gtk_emoji_completion_new (GtkEntry *entry) +{ + GtkEmojiCompletion *completion; + + completion = GTK_EMOJI_COMPLETION (g_object_new (GTK_TYPE_EMOJI_COMPLETION, + "relative-to", entry, + NULL)); + + connect_signals (completion, entry); + + return GTK_WIDGET (completion); +} diff --git a/gtk/gtkemojicompletion.h b/gtk/gtkemojicompletion.h new file mode 100644 index 0000000000..ff7cb1fa63 --- /dev/null +++ b/gtk/gtkemojicompletion.h @@ -0,0 +1,41 @@ +/* gtkemojicompletion.h: An Emoji picker widget + * Copyright 2017, Red Hat, 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, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only <gtk/gtk.h> can be included directly." +#endif + +#include <gtk/gtkentry.h> + +G_BEGIN_DECLS + +#define GTK_TYPE_EMOJI_COMPLETION (gtk_emoji_completion_get_type ()) +#define GTK_EMOJI_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletion)) +#define GTK_EMOJI_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletionClass)) +#define GTK_IS_EMOJI_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_EMOJI_COMPLETION)) +#define GTK_IS_EMOJI_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_EMOJI_COMPLETION)) +#define GTK_EMOJI_COMPLETION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletionClass)) + +typedef struct _GtkEmojiCompletion GtkEmojiCompletion; +typedef struct _GtkEmojiCompletionClass GtkEmojiCompletionClass; + +GType gtk_emoji_completion_get_type (void) G_GNUC_CONST; +GtkWidget *gtk_emoji_completion_new (GtkEntry *entry); + +G_END_DECLS diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index a01684101f..35995d84bb 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -39,6 +39,9 @@ #include "gtkentry.h" #include "gtkentrybuffer.h" #include "gtkiconhelperprivate.h" +#include "gtkemojichooser.h" +#include "gtkemojicompletion.h" +#include "gtkentrybuffer.h" #include "gtkimcontextsimple.h" #include "gtkimmulticontext.h" #include "gtkintl.h" @@ -72,6 +75,7 @@ #include "gtkcsscustomgadgetprivate.h" #include "gtkprogresstrackerprivate.h" #include "gtkemojichooser.h" +#include "gtkwindow.h" #include "a11y/gtkentryaccessible.h" @@ -250,6 +254,7 @@ struct _GtkEntryPrivate guint shadow_type : 4; guint editable : 1; guint show_emoji_icon : 1; + guint enable_emoji_completion : 1; guint in_drag : 1; guint overwrite_mode : 1; guint visible : 1; @@ -378,6 +383,7 @@ enum { PROP_POPULATE_ALL, PROP_TABS, PROP_SHOW_EMOJI_ICON, + PROP_ENABLE_EMOJI_COMPLETION, PROP_EDITING_CANCELED, NUM_PROPERTIES = PROP_EDITING_CANCELED }; @@ -589,11 +595,6 @@ static void gtk_entry_drag_gesture_end (GtkGestureDrag *gesture, /* Internal routines */ -static void gtk_entry_enter_text (GtkEntry *entry, - const gchar *str); -static void gtk_entry_set_positions (GtkEntry *entry, - gint current_pos, - gint selection_bound); static void gtk_entry_draw_text (GtkEntry *entry, cairo_t *cr); static void gtk_entry_draw_cursor (GtkEntry *entry, @@ -703,6 +704,8 @@ static void buffer_disconnect_signals (GtkEntry *entry); static GtkEntryBuffer *get_buffer (GtkEntry *entry); static void set_show_emoji_icon (GtkEntry *entry, gboolean value); +static void set_enable_emoji_completion (GtkEntry *entry, + gboolean value); static void gtk_entry_measure (GtkCssGadget *gadget, GtkOrientation orientation, @@ -1536,6 +1539,13 @@ gtk_entry_class_init (GtkEntryClass *class) FALSE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + entry_props[PROP_ENABLE_EMOJI_COMPLETION] = + g_param_spec_boolean ("enable-emoji-completion", + P_("Enable Emoji completion"), + P_("Whether to suggest Emoji replacements"), + FALSE, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (gobject_class, NUM_PROPERTIES, entry_props); /** @@ -2446,6 +2456,10 @@ gtk_entry_set_property (GObject *object, set_show_emoji_icon (entry, g_value_get_boolean (value)); break; + case PROP_ENABLE_EMOJI_COMPLETION: + set_enable_emoji_completion (entry, g_value_get_boolean (value)); + break; + case PROP_SCROLL_OFFSET: case PROP_CURSOR_POSITION: default: @@ -2702,6 +2716,10 @@ gtk_entry_get_property (GObject *object, g_value_set_boolean (value, priv->show_emoji_icon); break; + case PROP_ENABLE_EMOJI_COMPLETION: + g_value_set_boolean (value, priv->enable_emoji_completion); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -6109,7 +6127,7 @@ gtk_entry_delete_surrounding_cb (GtkIMContext *slave, */ /* Used for im_commit_cb and inserting Unicode chars */ -static void +void gtk_entry_enter_text (GtkEntry *entry, const gchar *str) { @@ -6144,7 +6162,7 @@ gtk_entry_enter_text (GtkEntry *entry, /* All changes to priv->current_pos and priv->selection_bound * should go through this function. */ -static void +void gtk_entry_set_positions (GtkEntry *entry, gint current_pos, gint selection_bound) @@ -11143,3 +11161,23 @@ set_show_emoji_icon (GtkEntry *entry, g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_SHOW_EMOJI_ICON]); gtk_widget_queue_resize (GTK_WIDGET (entry)); } + +static void +set_enable_emoji_completion (GtkEntry *entry, + gboolean value) +{ + GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + + if (priv->enable_emoji_completion == value) + return; + + priv->enable_emoji_completion = value; + + if (priv->enable_emoji_completion) + g_object_set_data (G_OBJECT (entry), "emoji-completion-popup", + gtk_emoji_completion_new (entry)); + else + g_object_set_data (G_OBJECT (entry), "emoji-completion-popup", NULL); + + g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_ENABLE_EMOJI_COMPLETION]); +} diff --git a/gtk/gtkentryprivate.h b/gtk/gtkentryprivate.h index 53a90785d6..048d92aacf 100644 --- a/gtk/gtkentryprivate.h +++ b/gtk/gtkentryprivate.h @@ -95,6 +95,12 @@ void _gtk_entry_grab_focus (GtkEntry *entry, /* in gtkspinbutton.c (because I'm too lazy to create gtkspinbuttonprivate.h) */ gint gtk_spin_button_get_text_width (GtkSpinButton *spin_button); +void gtk_entry_enter_text (GtkEntry *entry, + const char *text); +void gtk_entry_set_positions (GtkEntry *entry, + int current_pos, + int selection_bound); + G_END_DECLS #endif /* __GTK_ENTRY_PRIVATE_H__ */ diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c index e36c000f91..0964c516bc 100644 --- a/gtk/gtkfontbutton.c +++ b/gtk/gtkfontbutton.c @@ -85,7 +85,7 @@ struct _GtkFontButtonPrivate PangoFontMap *font_map; gint font_size; char *font_features; - char *language; + PangoLanguage *language; gchar *preview_text; GtkFontFilterFunc font_filter; gpointer font_filter_data; @@ -137,11 +137,12 @@ static void dialog_destroy (GtkWidget *widget, static void gtk_font_button_label_use_font (GtkFontButton *gfs); static void gtk_font_button_update_font_info (GtkFontButton *gfs); -static void font_button_set_font_name (GtkFontButton *font_button, - const char *fontname); -static void gtk_font_button_set_level (GtkFontButton *font_button, - GtkFontChooserLevel level); - +static void font_button_set_font_name (GtkFontButton *button, + const char *fontname); +static void gtk_font_button_set_level (GtkFontButton *font_button, + GtkFontChooserLevel level); +static void gtk_font_button_set_language (GtkFontButton *button, + const char *language); static guint font_button_signals[LAST_SIGNAL] = { 0 }; @@ -167,9 +168,6 @@ clear_font_data (GtkFontButton *font_button) g_free (priv->font_features); priv->font_features = NULL; - - g_free (priv->language); - priv->language = NULL; } static void @@ -581,7 +579,7 @@ gtk_font_button_class_init (GtkFontButtonClass *klass) * @widget: the object which received the signal. * * The ::font-set signal is emitted when the user selects a font. - * When handling this signal, use gtk_font_button_get_font_name() + * When handling this signal, use gtk_font_chooser_get_font() * to find out which font was just selected. * * Note that this signal is only emitted when the user @@ -629,6 +627,7 @@ gtk_font_button_init (GtkFontButton *font_button) font_button->priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY | GTK_FONT_CHOOSER_LEVEL_STYLE | GTK_FONT_CHOOSER_LEVEL_SIZE; + font_button->priv->language = pango_language_get_default (); gtk_widget_init_template (GTK_WIDGET (font_button)); @@ -681,6 +680,9 @@ gtk_font_button_set_property (GObject *object, case GTK_FONT_CHOOSER_PROP_FONT_DESC: gtk_font_button_take_font_desc (font_button, g_value_dup_boxed (value)); break; + case GTK_FONT_CHOOSER_PROP_LANGUAGE: + gtk_font_button_set_language (font_button, g_value_get_string (value)); + break; case GTK_FONT_CHOOSER_PROP_LEVEL: gtk_font_button_set_level (font_button, g_value_get_flags (value)); break; @@ -733,7 +735,7 @@ gtk_font_button_get_property (GObject *object, g_value_set_string (value, priv->font_features); break; case GTK_FONT_CHOOSER_PROP_LANGUAGE: - g_value_set_string (value, priv->language); + g_value_set_string (value, pango_language_to_string (priv->language)); break; case GTK_FONT_CHOOSER_PROP_LEVEL: g_value_set_flags (value, priv->level); @@ -1100,7 +1102,9 @@ gtk_font_button_clicked (GtkButton *button) if (priv->font_map) gtk_font_chooser_set_font_map (font_dialog, priv->font_map); gtk_font_chooser_set_show_preview_entry (font_dialog, priv->show_preview_entry); - g_object_set (font_dialog, "level", priv->level, NULL); + gtk_font_chooser_set_level (GTK_FONT_CHOOSER (font_dialog), priv->level); + gtk_font_chooser_set_language (GTK_FONT_CHOOSER (font_dialog), pango_language_to_string +(priv->language)); if (priv->preview_text) { @@ -1185,9 +1189,8 @@ response_cb (GtkDialog *dialog, g_object_ref (priv->font_face); priv->font_size = gtk_font_chooser_get_font_size (font_chooser); g_free (priv->font_features); - g_object_get (font_chooser, "font-features", &priv->font_features, NULL); - g_free (priv->language); - g_object_get (font_chooser, "language", &priv->language, NULL); + priv->font_features = gtk_font_chooser_get_font_features (font_chooser); + priv->language = pango_language_from_string (gtk_font_chooser_get_language (font_chooser)); /* Set label font */ gtk_font_button_update_font_info (font_button); @@ -1438,3 +1441,16 @@ gtk_font_button_set_level (GtkFontButton *button, g_object_notify (G_OBJECT (button), "level"); } +static void +gtk_font_button_set_language (GtkFontButton *button, + const char *language) +{ + GtkFontButtonPrivate *priv = button->priv; + + priv->language = pango_language_from_string (language); + + if (priv->font_dialog) + gtk_font_chooser_set_language (GTK_FONT_CHOOSER (priv->font_dialog), language); + + g_object_notify (G_OBJECT (button), "language"); +} diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c index c5dbb6177b..16df10bd7c 100644 --- a/gtk/gtkfontchooser.c +++ b/gtk/gtkfontchooser.c @@ -154,7 +154,7 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface) P_("Language"), P_("Language for which features have been selected"), "", - GTK_PARAM_READABLE)); + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); /** * GtkFontChooser::font-activated: @@ -532,3 +532,105 @@ gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser) return fontmap; } + +/** + * gtk_font_chooser_set_level: + * @fontchooser: a #GtkFontChooser + * @level: the desired level of granularity + * + * Sets the desired level of granularity for selecting fonts. + * + * Since: 3.24 + */ +void +gtk_font_chooser_set_level (GtkFontChooser *fontchooser, + GtkFontChooserLevel level) +{ + g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser)); + + g_object_set (fontchooser, "level", level, NULL); +} + +/** + * gtk_font_chooser_get_level: + * @fontchooser: a #GtkFontChooser + * + * Returns the current level of granularity for selecting fonts. + * + * Returns: the current granularity level + * + * Since: 3.24 + */ +GtkFontChooserLevel +gtk_font_chooser_get_level (GtkFontChooser *fontchooser) +{ + GtkFontChooserLevel level; + + g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), 0); + + g_object_get (fontchooser, "level", &level, NULL); + + return level; +} + +/** + * gtk_font_chooser_get_font_features: + * @fontchooser: a #GtkFontChooser + * + * Gets the currently-selected font features. + * + * Returns: the currently selected font features + * + * Since: 3.24 + */ +char * +gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser) +{ + char *text; + + g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL); + + g_object_get (fontchooser, "font-features", &text, NULL); + + return text; +} + +/** + * gtk_font_chooser_get_language: + * @fontchooser: a #GtkFontChooser + * + * Gets the language that is used for font features. + * + * Returns: the currently selected language + * + * Since: 3.24 + */ +char * +gtk_font_chooser_get_language (GtkFontChooser *fontchooser) +{ + char *text; + + g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL); + + g_object_get (fontchooser, "language", &text, NULL); + + return text; +} + +/** + * gtk_font_chooser_set_language: + * @fontchooser: a #GtkFontChooser + * @language: a language + * + * Sets the language to use for font features. + * + * Since: 3.24 + */ +void +gtk_font_chooser_set_language (GtkFontChooser *fontchooser, + const char *language) +{ + g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser)); + + g_object_set (fontchooser, "language", language, NULL); +} diff --git a/gtk/gtkfontchooser.h b/gtk/gtkfontchooser.h index f4bdaae2c4..73ed983af3 100644 --- a/gtk/gtkfontchooser.h +++ b/gtk/gtkfontchooser.h @@ -145,7 +145,19 @@ void gtk_font_chooser_set_font_map (GtkFontChooser *fo GDK_AVAILABLE_IN_3_18 PangoFontMap * gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser); - +GDK_AVAILABLE_IN_3_24 +void gtk_font_chooser_set_level (GtkFontChooser *fontchooser, + GtkFontChooserLevel level); +GDK_AVAILABLE_IN_3_24 +GtkFontChooserLevel + gtk_font_chooser_get_level (GtkFontChooser *fontchooser); +GDK_AVAILABLE_IN_3_24 +char * gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser); +GDK_AVAILABLE_IN_3_24 +char * gtk_font_chooser_get_language (GtkFontChooser *fontchooser); +GDK_AVAILABLE_IN_3_24 +void gtk_font_chooser_set_language (GtkFontChooser *fontchooser, + const char *language); G_END_DECLS diff --git a/gtk/gtkfontchooserdialog.c b/gtk/gtkfontchooserdialog.c index 7d9a9471c4..723412f2a8 100644 --- a/gtk/gtkfontchooserdialog.c +++ b/gtk/gtkfontchooserdialog.c @@ -222,7 +222,7 @@ gtk_font_chooser_dialog_class_init (GtkFontChooserDialogClass *klass) /* Bind class to template */ gtk_widget_class_set_template_from_resource (widget_class, - "/org/gtk/libgtk/ui/gtkfontchooserdialog.ui"); + "/org/gtk/libgtk/ui/gtkfontchooserdialog.ui"); gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, fontchooser); gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, select_button); diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c index 3749e8968c..b34f28fcda 100644 --- a/gtk/gtkfontchooserwidget.c +++ b/gtk/gtkfontchooserwidget.c @@ -118,13 +118,12 @@ struct _GtkFontChooserWidgetPrivate GtkWidget *axis_grid; GtkWidget *feature_box; - GtkWidget *feature_language_combo; PangoFontMap *font_map; PangoFontDescription *font_desc; char *font_features; - PangoLanguage *font_language; + PangoLanguage *language; GtkTreeIter font_iter; /* invalid if font not available or pointer into model (not filter_model) to the row containing font */ GtkFontFilterFunc filter_func; @@ -222,14 +221,16 @@ static void gtk_font_chooser_widget_cell_data_func (GtkTreeViewColum static void selection_changed (GtkTreeSelection *selection, GtkFontChooserWidget *fontchooser); static void update_font_features (GtkFontChooserWidget *fontchooser); -static void update_language (GtkFontChooserWidget *fontchooser); static void gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser, GtkFontChooserLevel level); static GtkFontChooserLevel gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser); +static void gtk_font_chooser_widget_set_language (GtkFontChooserWidget *fontchooser, + const char *language); static void selection_changed (GtkTreeSelection *selection, GtkFontChooserWidget *fontchooser); +static void update_font_features (GtkFontChooserWidget *fontchooser); static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface); @@ -320,6 +321,9 @@ gtk_font_chooser_widget_set_property (GObject *object, case GTK_FONT_CHOOSER_PROP_LEVEL: gtk_font_chooser_widget_set_level (fontchooser, g_value_get_flags (value)); break; + case GTK_FONT_CHOOSER_PROP_LANGUAGE: + gtk_font_chooser_widget_set_language (fontchooser, g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -358,7 +362,7 @@ gtk_font_chooser_widget_get_property (GObject *object, g_value_set_string (value, fontchooser->priv->font_features); break; case GTK_FONT_CHOOSER_PROP_LANGUAGE: - g_value_set_string (value, pango_language_to_string (fontchooser->priv->font_language)); + g_value_set_string (value, pango_language_to_string (fontchooser->priv->language)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -617,8 +621,8 @@ gtk_font_chooser_widget_update_preview_attributes (GtkFontChooserWidget *fontcho pango_attr_list_insert (attrs, pango_attr_font_desc_new (priv->font_desc)); if (priv->font_features) pango_attr_list_insert (attrs, pango_attr_font_features_new (priv->font_features)); - if (priv->font_language) - pango_attr_list_insert (attrs, pango_attr_language_new (priv->font_language)); + if (priv->language) + pango_attr_list_insert (attrs, pango_attr_language_new (priv->language)); gtk_entry_set_attributes (GTK_ENTRY (priv->preview), attrs); pango_attr_list_unref (attrs); @@ -717,7 +721,6 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass) gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, stack); gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, font_name_label); gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, feature_box); - gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, feature_language_combo); gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, axis_grid); gtk_widget_class_bind_template_callback (widget_class, text_changed_cb); @@ -732,9 +735,8 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass) gtk_widget_class_bind_template_callback (widget_class, size_change_cb); gtk_widget_class_bind_template_callback (widget_class, output_cb); gtk_widget_class_bind_template_callback (widget_class, selection_changed); - gtk_widget_class_bind_template_callback (widget_class, update_language); - gtk_widget_class_set_css_name (widget_class, "fontchooser"); + gtk_widget_class_set_css_name (widget_class, I_("fontchooser")); } static void @@ -827,6 +829,10 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser) priv->preview_text = g_strdup (pango_language_get_sample_string (NULL)); priv->show_preview_entry = TRUE; priv->font_desc = pango_font_description_new (); + priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY | + GTK_FONT_CHOOSER_LEVEL_STYLE | + GTK_FONT_CHOOSER_LEVEL_SIZE; + priv->language = pango_language_get_default (); /* Set default preview text */ gtk_entry_set_text (GTK_ENTRY (priv->preview), priv->preview_text); @@ -1644,102 +1650,28 @@ gtk_font_chooser_widget_update_font_variations (GtkFontChooserWidget *fontchoose /* OpenType features */ +/* look for a lang / script combination that matches the + * language property and is supported by the hb_face. If + * none is found, return the default lang / script tags. + */ static void -add_script (GtkListStore *store, - guint script_index, - hb_tag_t script, - guint lang_index, - hb_tag_t lang) -{ - char langbuf[5]; - const char *langname; - - if (lang == HB_OT_TAG_DEFAULT_LANGUAGE) - langname = C_("Language", "Default"); - else - { - langname = get_language_name_for_tag (lang); - if (!langname) - { - hb_tag_to_string (lang, langbuf); - langbuf[4] = 0; - langname = langbuf; - } - } - - gtk_list_store_insert_with_values (store, NULL, -1, - 0, langname, - 1, script_index, - 2, lang_index, - 3, lang, - -1); -} - -static int -feature_language_sort_func (GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data) -{ - char *sa, *sb; - int ret; - - gtk_tree_model_get (model, a, 0, &sa, -1); - gtk_tree_model_get (model, b, 0, &sb, -1); - - ret = strcmp (sa, sb); - - g_free (sa); - g_free (sb); - - return ret; -} - -typedef struct { - hb_tag_t script_tag; - hb_tag_t lang_tag; - unsigned int script_index; - unsigned int lang_index; -} TagPair; - -static guint -tag_pair_hash (gconstpointer data) -{ - const TagPair *pair = data; - - return pair->script_tag + pair->lang_tag; -} - -static gboolean -tag_pair_equal (gconstpointer a, gconstpointer b) -{ - const TagPair *pair_a = a; - const TagPair *pair_b = b; - - return pair_a->script_tag == pair_b->script_tag && pair_a->lang_tag == pair_b->lang_tag; -} - -static void -update_language_combo (GtkFontChooserWidget *fontchooser, - hb_face_t *hb_face) +find_language_and_script (GtkFontChooserWidget *fontchooser, + hb_face_t *hb_face, + hb_tag_t *lang_tag, + hb_tag_t *script_tag) { GtkFontChooserWidgetPrivate *priv = fontchooser->priv; - GtkListStore *store; gint i, j, k; hb_tag_t scripts[80]; unsigned int n_scripts; unsigned int count; hb_tag_t table[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS }; - GHashTable *tags; - GHashTableIter iter; - TagPair *pair; + hb_language_t lang; + const char *langname, *p; - tags = g_hash_table_new_full (tag_pair_hash, tag_pair_equal, g_free, NULL); - - pair = g_new (TagPair, 1); - pair->script_tag = HB_OT_TAG_DEFAULT_SCRIPT; - pair->lang_tag = HB_OT_TAG_DEFAULT_LANGUAGE; - g_hash_table_add (tags, pair); + langname = pango_language_to_string (priv->language); + p = strchr (langname, '-'); + lang = hb_language_from_string (langname, p ? p - langname : -1); n_scripts = 0; for (i = 0; i < 2; i++) @@ -1764,36 +1696,25 @@ update_language_combo (GtkFontChooserWidget *fontchooser, for (k = 0; k < n_languages; k++) { - pair = g_new (TagPair, 1); - pair->script_tag = scripts[j]; - pair->lang_tag = languages[k]; - pair->script_index = j; - pair->lang_index = k; - g_hash_table_add (tags, pair); + if (lang == hb_ot_tag_to_language (languages[k])) + { + *script_tag = scripts[j]; + *lang_tag = languages[k]; + return; + } } } - store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); - - g_hash_table_iter_init (&iter, tags); - while (g_hash_table_iter_next (&iter, (gpointer *)&pair, NULL)) - add_script (store, pair->script_index, pair->script_tag, pair->lang_index, pair->lang_tag); - - g_hash_table_unref (tags); - - gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store), - feature_language_sort_func, NULL, NULL); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), - GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, - GTK_SORT_ASCENDING); - gtk_combo_box_set_model (GTK_COMBO_BOX (priv->feature_language_combo), GTK_TREE_MODEL (store)); - gtk_combo_box_set_active (GTK_COMBO_BOX (priv->feature_language_combo), 0); + *lang_tag = HB_OT_TAG_DEFAULT_LANGUAGE; + *script_tag = HB_OT_TAG_DEFAULT_SCRIPT; } typedef struct { hb_tag_t tag; const char *name; + GtkWidget *top; GtkWidget *feat; + GtkWidget *example; } FeatureItem; static const char * @@ -1849,6 +1770,180 @@ feat_pressed (GtkGesture *gesture, set_inconsistent (GTK_CHECK_BUTTON (feat), !inconsistent); } +static char * +find_affected_text (hb_tag_t feature_tag, + hb_face_t *hb_face, + hb_tag_t script_tag, + hb_tag_t lang_tag, + int max_chars) +{ + unsigned int script_index = 0; + unsigned int lang_index = 0; + unsigned int feature_index = 0; + GString *chars; + + chars = g_string_new (""); + + hb_ot_layout_table_find_script (hb_face, HB_OT_TAG_GSUB, script_tag, &script_index); + hb_ot_layout_script_find_language (hb_face, HB_OT_TAG_GSUB, script_index, lang_tag, &lang_index); + if (hb_ot_layout_language_find_feature (hb_face, HB_OT_TAG_GSUB, script_index, lang_index, feature_tag, &feature_index)) + { + unsigned int lookup_indexes[32]; + unsigned int lookup_count = 32; + int count; + int n_chars = 0; + + count = hb_ot_layout_feature_get_lookups (hb_face, + HB_OT_TAG_GSUB, + feature_index, + 0, + &lookup_count, + lookup_indexes); + if (count > 0) + { + hb_set_t* glyphs_before = NULL; + hb_set_t* glyphs_input = NULL; + hb_set_t* glyphs_after = NULL; + hb_set_t* glyphs_output = NULL; + hb_font_t *hb_font = NULL; + hb_codepoint_t gid; + + glyphs_input = hb_set_create (); + + // XXX For now, just look at first index + hb_ot_layout_lookup_collect_glyphs (hb_face, + HB_OT_TAG_GSUB, + lookup_indexes[0], + glyphs_before, + glyphs_input, + glyphs_after, + glyphs_output); + + hb_font = hb_font_create (hb_face); + hb_ft_font_set_funcs (hb_font); + + gid = -1; + while (hb_set_next (glyphs_input, &gid)) { + hb_codepoint_t ch; + if (n_chars == max_chars) + { + g_string_append (chars, "…"); + break; + } + for (ch = 0; ch < 0xffff; ch++) { + hb_codepoint_t glyph = 0; + hb_font_get_nominal_glyph (hb_font, ch, &glyph); + if (glyph == gid) { + g_string_append_unichar (chars, (gunichar)ch); + n_chars++; + break; + } + } + } + hb_set_destroy (glyphs_input); + hb_font_destroy (hb_font); + } + } + + return g_string_free (chars, FALSE); +} + +static void +update_feature_example (FeatureItem *item, + hb_face_t *hb_face, + hb_tag_t script_tag, + hb_tag_t lang_tag, + PangoFontDescription *font_desc) +{ + const char *letter_case[] = { "smcp", "c2sc", "pcap", "c2pc", "unic", "cpsp", "case", NULL }; + const char *number_case[] = { "xxxx", "lnum", "onum", NULL }; + const char *number_spacing[] = { "xxxx", "pnum", "tnum", NULL }; + const char *number_formatting[] = { "zero", "nalt", NULL }; + const char *char_variants[] = { + "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand", + "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10", + "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20", + NULL }; + + if (g_strv_contains (number_case, item->name) || + g_strv_contains (number_spacing, item->name)) + { + PangoAttrList *attrs; + PangoAttribute *attr; + PangoFontDescription *desc; + char *str; + + attrs = pango_attr_list_new (); + + desc = pango_font_description_copy (font_desc); + pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE); + pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc)); + pango_font_description_free (desc); + str = g_strconcat (item->name, " 1", NULL); + attr = pango_attr_font_features_new (str); + pango_attr_list_insert (attrs, attr); + + gtk_label_set_text (GTK_LABEL (item->example), "0123456789"); + gtk_label_set_attributes (GTK_LABEL (item->example), attrs); + + pango_attr_list_unref (attrs); + } + else if (g_strv_contains (letter_case, item->name) || + g_strv_contains (number_formatting, item->name) || + g_strv_contains (char_variants, item->name)) + { + char *input = NULL; + char *text; + + if (strcmp (item->name, "case") == 0) + input = g_strdup ("A-B[Cq]"); + else if (g_strv_contains (letter_case, item->name)) + input = g_strdup ("AaBbCc…"); + else if (strcmp (item->name, "zero") == 0) + input = g_strdup ("0"); + else if (strcmp (item->name, "nalt") == 0) + input = find_affected_text (item->tag, hb_face, script_tag, lang_tag, 3); + else + input = find_affected_text (item->tag, hb_face, script_tag, lang_tag, 10); + + if (input[0] != '\0') + { + PangoAttrList *attrs; + PangoAttribute *attr; + PangoFontDescription *desc; + char *str; + + text = g_strconcat (input, " ⟶ ", input, NULL); + + attrs = pango_attr_list_new (); + + desc = pango_font_description_copy (font_desc); + pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE); + pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc)); + pango_font_description_free (desc); + str = g_strconcat (item->name, " 0", NULL); + attr = pango_attr_font_features_new (str); + attr->start_index = 0; + attr->end_index = strlen (input); + pango_attr_list_insert (attrs, attr); + str = g_strconcat (item->name, " 1", NULL); + attr = pango_attr_font_features_new (str); + attr->start_index = strlen (input) + strlen (" ⟶ "); + attr->end_index = attr->start_index + strlen (input); + pango_attr_list_insert (attrs, attr); + + gtk_label_set_text (GTK_LABEL (item->example), text); + gtk_label_set_attributes (GTK_LABEL (item->example), attrs); + + g_free (text); + pango_attr_list_unref (attrs); + } + else + gtk_label_set_markup (GTK_LABEL (item->example), ""); + g_free (input); + } +} + static void add_check_group (GtkFontChooserWidget *fontchooser, const char *title, @@ -1861,7 +1956,8 @@ add_check_group (GtkFontChooserWidget *fontchooser, int i; group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_halign (group, GTK_ALIGN_START); + gtk_widget_show (group); + gtk_widget_set_halign (group, GTK_ALIGN_FILL); label = gtk_label_new (title); gtk_widget_show (label); @@ -1880,12 +1976,14 @@ add_check_group (GtkFontChooserWidget *fontchooser, GtkWidget *feat; FeatureItem *item; GtkGesture *gesture; + GtkWidget *box; + GtkWidget *example; tag = hb_tag_from_string (tags[i], -1); feat = gtk_check_button_new_with_label (get_feature_display_name (tag)); + gtk_widget_show (feat); set_inconsistent (GTK_CHECK_BUTTON (feat), TRUE); - g_signal_connect_swapped (feat, "notify::active", G_CALLBACK (update_font_features), fontchooser); g_signal_connect_swapped (feat, "notify::inconsistent", G_CALLBACK (update_font_features), fontchooser); g_signal_connect (feat, "clicked", G_CALLBACK (feat_clicked), NULL); @@ -1896,12 +1994,24 @@ add_check_group (GtkFontChooserWidget *fontchooser, gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); g_signal_connect (gesture, "pressed", G_CALLBACK (feat_pressed), feat); - gtk_container_add (GTK_CONTAINER (group), feat); + example = gtk_label_new (""); + gtk_widget_show (example); + gtk_label_set_selectable (GTK_LABEL (example), TRUE); + gtk_widget_set_halign (example, GTK_ALIGN_START); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); + gtk_widget_show (box); + gtk_box_set_homogeneous (GTK_BOX (box), TRUE); + gtk_container_add (GTK_CONTAINER (box), feat); + gtk_container_add (GTK_CONTAINER (box), example); + gtk_container_add (GTK_CONTAINER (group), box); item = g_new (FeatureItem, 1); item->name = tags[i]; item->tag = tag; + item->top = box; item->feat = feat; + item->example = example; priv->feature_items = g_list_prepend (priv->feature_items, item); } @@ -1922,7 +2032,8 @@ add_radio_group (GtkFontChooserWidget *fontchooser, PangoAttrList *attrs; group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_halign (group, GTK_ALIGN_START); + gtk_widget_show (group); + gtk_widget_set_halign (group, GTK_ALIGN_FILL); label = gtk_label_new (title); gtk_widget_show (label); @@ -1941,24 +2052,39 @@ add_radio_group (GtkFontChooserWidget *fontchooser, GtkWidget *feat; FeatureItem *item; const char *name; + GtkWidget *box; + GtkWidget *example; tag = hb_tag_from_string (tags[i], -1); name = get_feature_display_name (tag); feat = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (group_button), name ? name : _("Default")); + gtk_widget_show (feat); if (group_button == NULL) group_button = feat; g_signal_connect_swapped (feat, "notify::active", G_CALLBACK (update_font_features), fontchooser); g_object_set_data (G_OBJECT (feat), "default", group_button); - gtk_container_add (GTK_CONTAINER (group), feat); + example = gtk_label_new (""); + gtk_widget_show (example); + gtk_label_set_selectable (GTK_LABEL (example), TRUE); + gtk_widget_set_halign (example, GTK_ALIGN_START); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); + gtk_widget_show (box); + gtk_box_set_homogeneous (GTK_BOX (box), TRUE); + gtk_container_add (GTK_CONTAINER (box), feat); + gtk_container_add (GTK_CONTAINER (box), example); + gtk_container_add (GTK_CONTAINER (group), box); item = g_new (FeatureItem, 1); item->name = tags[i]; item->tag = tag; + item->top = box; item->feat = feat; + item->example = example; priv->feature_items = g_list_prepend (priv->feature_items, item); } @@ -1974,7 +2100,11 @@ gtk_font_chooser_widget_populate_features (GtkFontChooserWidget *fontchooser) const char *number_case[] = { "xxxx", "lnum", "onum", NULL }; const char *number_spacing[] = { "xxxx", "pnum", "tnum", NULL }; const char *number_formatting[] = { "zero", "nalt", NULL }; - const char *char_variants[] = { "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand", NULL }; + const char *char_variants[] = { + "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand", + "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10", + "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20", + NULL }; add_check_group (fontchooser, _("Ligatures"), ligatures); add_check_group (fontchooser, _("Letter Case"), letter_case); @@ -1993,21 +2123,19 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser) PangoFont *pango_font; FT_Face ft_face; hb_font_t *hb_font; - hb_tag_t script_tag = FT_MAKE_TAG('l','a','t','n'); - hb_tag_t lang_tag = FT_MAKE_TAG('D','E','U',' '); + hb_tag_t script_tag; + hb_tag_t lang_tag; guint script_index = 0; guint lang_index = 0; int i, j; GList *l; gboolean has_feature = FALSE; - gtk_widget_hide (priv->feature_language_combo); - for (l = priv->feature_items; l; l = l->next) { FeatureItem *item = l->data; - gtk_widget_hide (item->feat); - gtk_widget_hide (gtk_widget_get_parent (item->feat)); + gtk_widget_hide (item->top); + gtk_widget_hide (gtk_widget_get_parent (item->top)); } if ((priv->level & GTK_FONT_CHOOSER_LEVEL_FEATURES) == 0) @@ -2028,7 +2156,7 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser) hb_face = hb_font_get_face (hb_font); - update_language_combo (fontchooser, hb_face); + find_language_and_script (fontchooser, hb_face, &lang_tag, &script_tag); n_features = 0; for (i = 0; i < 2; i++) @@ -2055,14 +2183,15 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser) continue; has_feature = TRUE; - gtk_widget_show (item->feat); - gtk_widget_show (gtk_widget_get_parent (item->feat)); - gtk_widget_show (priv->feature_language_combo); + gtk_widget_show (item->top); + gtk_widget_show (gtk_widget_get_parent (item->top)); + + update_feature_example (item, hb_face, script_tag, lang_tag, priv->font_desc); if (GTK_IS_RADIO_BUTTON (item->feat)) { GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default")); - gtk_widget_show (def); + gtk_widget_show (gtk_widget_get_parent (def)); } else if (GTK_IS_CHECK_BUTTON (item->feat)) { @@ -2127,33 +2256,6 @@ update_font_features (GtkFontChooserWidget *fontchooser) gtk_font_chooser_widget_update_preview_attributes (fontchooser); } -static void -update_language (GtkFontChooserWidget *fontchooser) -{ - GtkFontChooserWidgetPrivate *priv = fontchooser->priv; - GtkTreeIter iter; - - if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->feature_language_combo), &iter)) - { - GtkTreeModel *model; - PangoLanguage *lang; - hb_tag_t lang_tag; - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->feature_language_combo)); - gtk_tree_model_get (model, &iter, - 3, &lang_tag, - -1); - lang = pango_language_from_string (hb_language_to_string (hb_ot_tag_to_language (lang_tag))); - if (priv->font_language != lang) - { - priv->font_language = lang; - g_object_notify (G_OBJECT (fontchooser), "language"); - } - } - - gtk_font_chooser_widget_update_preview_attributes (fontchooser); -} - #endif static void @@ -2383,6 +2485,23 @@ gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser) } static void +gtk_font_chooser_widget_set_language (GtkFontChooserWidget *fontchooser, + const char *language) +{ + GtkFontChooserWidgetPrivate *priv = fontchooser->priv; + PangoLanguage *lang; + + lang = pango_language_from_string (language); + if (priv->language == lang) + return; + + priv->language = lang; + g_object_notify (G_OBJECT (fontchooser), "language"); + + gtk_font_chooser_widget_update_preview_attributes (fontchooser); +} + +static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface) { iface->get_font_family = gtk_font_chooser_widget_get_family; diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index ae62ac81b8..6ec29dd193 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -59,63 +59,19 @@ * Compose file). The syntax of these files is described in the Compose(5) * manual page. * - * ## Unicode characters - * * GtkIMContextSimple also supports numeric entry of Unicode characters * by typing Ctrl-Shift-u, followed by a hexadecimal Unicode codepoint. * For example, Ctrl-Shift-u 1 2 3 Enter yields U+0123 LATIN SMALL LETTER * G WITH CEDILLA, i.e. ģ. - * - * ## Emoji - * - * GtkIMContextSimple also supports entry of Emoji by their name. - * This works by first typing Ctrl-Shift-e, followed by an Emoji name. - * - * The following names are supported: - * - :-) 🙂 - * - 8-) 😍 - * - <3 ❤ - * - kiss 💋 - * - grin 😁 - * - joy 😂 - * - :-* 😚 - * - xD 😆 - * - like 👍 - * - dislike 👎 - * - up 👆 - * - v ✌ - * - ok 👌 - * - B-) 😎 - * - ;-) 😉 - * - ;-P 😜 - * - :-p 😋 - * - 3( 😔 - * - :-( 😞 - * - :] 😏 - * - :'( 😢 - * - :_( 😭 - * - :(( 😩 - * - :o 😨 - * - :| 😐 - * - 3-) 😌 - * - >( 😠 - * - >(( 😡 - * - O:) 😇 - * - ;o 😰 - * - 8| 😳 - * - 8o 😲 - * - :X 😷 - * - }:) 😈 */ struct _GtkIMContextSimplePrivate { - guint16 compose_buffer[MAX(GTK_MAX_COMPOSE_LEN + 1, 9)]; + guint16 compose_buffer[GTK_MAX_COMPOSE_LEN + 1]; gunichar tentative_match; gint tentative_match_len; guint in_hex_sequence : 1; - guint in_emoji_sequence : 1; guint modifiers_dropped : 1; }; @@ -339,10 +295,9 @@ gtk_im_context_simple_commit_char (GtkIMContext *context, len = g_unichar_to_utf8 (ch, buf); buf[len] = '\0'; - if (priv->tentative_match || priv->in_hex_sequence || priv->in_emoji_sequence) + if (priv->tentative_match || priv->in_hex_sequence) { priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; priv->tentative_match = 0; priv->tentative_match_len = 0; g_signal_emit_by_name (context_simple, "preedit-changed"); @@ -910,110 +865,6 @@ check_hex (GtkIMContextSimple *context_simple, return TRUE; } -typedef struct { - const char *name; - gunichar ch; -} EmojiItem; - -static EmojiItem emoji[] = { - { ":-)", 0x1f642 }, - { "8-)", 0x1f60d }, - { "<3", 0x02764 }, - { "kiss", 0x1f48b }, - { "grin", 0x1f601 }, - { "joy", 0x1f602 }, - { ":-*", 0x1f61a }, - { "xD", 0x1f606 }, - { "like", 0x1f44d }, - { "dislike", 0x1f44e }, - { "up", 0x1f446 }, - { "v", 0x0270c }, - { "ok", 0x1f44c }, - { "B-)", 0x1f60e }, - { ":-D", 0x1f603 }, - { ";-)", 0x1f609 }, - { ";-P", 0x1f61c }, - { ":-p", 0x1f60b }, - { "3(", 0x1f614 }, - { ":-(", 0x1f61e }, - { ":]", 0x1f60f }, - { ":'(", 0x1f622 }, - { ":_(", 0x1f62d }, - { ":((", 0x1f629 }, - { ":o", 0x1f628 }, - { ":|", 0x1f610 }, - { "3-)", 0x1f60c }, - { ">(", 0x1f620 }, - { ">((", 0x1f621 }, - { "O:)", 0x1f607 }, - { ";o", 0x1f630 }, - { "8|", 0x1f633 }, - { "8o", 0x1f632 }, - { ":X", 0x1f637 }, - { "}:)", 0x1f608 }, - { NULL, 0 } -}; - -static gboolean -check_emoji (GtkIMContextSimple *context_simple, - gint n_compose) -{ - GtkIMContextSimplePrivate *priv = context_simple->priv; - GString *str; - gint i; - gchar buf[7]; - char *lower; - gboolean has_completion; - - priv->tentative_match = 0; - priv->tentative_match_len = 0; - - str = g_string_new (NULL); - - i = 0; - while (i < n_compose) - { - gunichar ch; - - ch = gdk_keyval_to_unicode (priv->compose_buffer[i]); - - if (ch == 0) - return FALSE; - - buf[g_unichar_to_utf8 (ch, buf)] = '\0'; - - g_string_append (str, buf); - - ++i; - } - - lower = g_utf8_strdown (str->str, str->len); - - has_completion = FALSE; - for (i = 0; emoji[i].name; i++) - { - if (strcmp (str->str, emoji[i].name) == 0 || - strcmp (lower, emoji[i].name) == 0) - { - priv->tentative_match = emoji[i].ch; - priv->tentative_match_len = n_compose; - break; - } - - if (!has_completion && - (g_str_has_prefix (emoji[i].name, str->str) || - g_str_has_prefix (emoji[i].name, lower))) - { - has_completion = TRUE; - } - } - - g_string_free (str, TRUE); - g_free (lower); - - return priv->tentative_match != 0 || has_completion; -} - static void beep_window (GdkWindow *window) { @@ -1133,12 +984,6 @@ canonical_hex_keyval (GdkEventKey *event) return 0; } -static guint -canonical_emoji_keyval (GdkEventKey *event) -{ - return event->keyval; -} - static gboolean gtk_im_context_simple_filter_keypress (GtkIMContext *context, GdkEventKey *event) @@ -1146,17 +991,15 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context); GtkIMContextSimplePrivate *priv = context_simple->priv; GdkDisplay *display = gdk_window_get_display (event->window); - GSList *tmp_list; + GSList *tmp_list; int n_compose = 0; GdkModifierType hex_mod_mask; gboolean have_hex_mods; gboolean is_hex_start; - gboolean is_end; - gboolean is_emoji_start; + gboolean is_hex_end; gboolean is_backspace; gboolean is_escape; guint hex_keyval; - guint emoji_keyval; int i; gboolean compose_finish; gboolean compose_match; @@ -1167,43 +1010,38 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, if (event->type == GDK_KEY_RELEASE) { - if ((event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R || + if (priv->in_hex_sequence && + (event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R)) { - if ((priv->in_hex_sequence || priv->in_emoji_sequence) && - priv->tentative_match && + if (priv->tentative_match && g_unichar_validate (priv->tentative_match)) { gtk_im_context_simple_commit_char (context, priv->tentative_match); priv->compose_buffer[0] = 0; - return TRUE; } - else if (priv->in_emoji_sequence || - (priv->in_hex_sequence && n_compose == 0)) + else if (n_compose == 0) { priv->modifiers_dropped = TRUE; - - return TRUE; } - else if (priv->in_hex_sequence) + else { /* invalid hex sequence */ beep_window (event->window); - + priv->tentative_match = 0; priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; priv->compose_buffer[0] = 0; - + g_signal_emit_by_name (context_simple, "preedit-changed"); g_signal_emit_by_name (context_simple, "preedit-end"); - - return TRUE; } - } - return FALSE; + return TRUE; + } + else + return FALSE; } /* Ignore modifier key presses */ @@ -1215,21 +1053,19 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR); hex_mod_mask |= GDK_SHIFT_MASK; - if ((priv->in_hex_sequence || priv->in_emoji_sequence) && priv->modifiers_dropped) + if (priv->in_hex_sequence && priv->modifiers_dropped) have_hex_mods = TRUE; else have_hex_mods = (event->state & (hex_mod_mask)) == hex_mod_mask; is_hex_start = event->keyval == GDK_KEY_U; - is_emoji_start = (event->keyval == GDK_KEY_E) && !priv->in_hex_sequence; - is_end = (event->keyval == GDK_KEY_space || - event->keyval == GDK_KEY_KP_Space || - event->keyval == GDK_KEY_Return || - event->keyval == GDK_KEY_ISO_Enter || - event->keyval == GDK_KEY_KP_Enter); + is_hex_end = (event->keyval == GDK_KEY_space || + event->keyval == GDK_KEY_KP_Space || + event->keyval == GDK_KEY_Return || + event->keyval == GDK_KEY_ISO_Enter || + event->keyval == GDK_KEY_KP_Enter); is_backspace = event->keyval == GDK_KEY_BackSpace; is_escape = event->keyval == GDK_KEY_Escape; hex_keyval = canonical_hex_keyval (event); - emoji_keyval = canonical_emoji_keyval (event); /* If we are already in a non-hex sequence, or * this keystroke is not hex modifiers + hex digit, don't filter @@ -1239,11 +1075,10 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, * ISO_Level3_Switch. */ if (!have_hex_mods || - (n_compose > 0 && !priv->in_hex_sequence && !priv->in_emoji_sequence) || - (n_compose == 0 && !priv->in_hex_sequence && !priv->in_emoji_sequence && - !is_hex_start && !is_emoji_start) || + (n_compose > 0 && !priv->in_hex_sequence) || + (n_compose == 0 && !priv->in_hex_sequence && !is_hex_start) || (priv->in_hex_sequence && !hex_keyval && - !is_hex_start && !is_end && !is_escape && !is_backspace)) + !is_hex_start && !is_hex_end && !is_escape && !is_backspace)) { GdkModifierType no_text_input_mask; @@ -1252,7 +1087,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, GDK_MODIFIER_INTENT_NO_TEXT_INPUT); if (event->state & no_text_input_mask || - ((priv->in_hex_sequence || priv->in_emoji_sequence) && priv->modifiers_dropped && + (priv->in_hex_sequence && priv->modifiers_dropped && (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_ISO_Enter || event->keyval == GDK_KEY_KP_Enter))) @@ -1262,21 +1097,17 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, } /* Handle backspace */ - if ((priv->in_hex_sequence || priv->in_emoji_sequence) && have_hex_mods && is_backspace) + if (priv->in_hex_sequence && have_hex_mods && is_backspace) { if (n_compose > 0) { n_compose--; priv->compose_buffer[n_compose] = 0; - if (priv->in_hex_sequence) - check_hex (context_simple, n_compose); - else if (priv->in_emoji_sequence) - check_emoji (context_simple, n_compose); + check_hex (context_simple, n_compose); } else { priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; } g_signal_emit_by_name (context_simple, "preedit-changed"); @@ -1296,7 +1127,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, gtk_im_context_simple_commit_char (context, priv->tentative_match); priv->compose_buffer[0] = 0; } - else + else { /* invalid hex sequence */ if (n_compose > 0) @@ -1322,20 +1153,6 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, return TRUE; } - /* Check for emoji sequence start */ - if (!priv->in_emoji_sequence && have_hex_mods && is_emoji_start) - { - priv->compose_buffer[0] = 0; - priv->in_emoji_sequence = TRUE; - priv->modifiers_dropped = FALSE; - priv->tentative_match = 0; - - g_signal_emit_by_name (context_simple, "preedit-start"); - g_signal_emit_by_name (context_simple, "preedit-changed"); - - return TRUE; - } - /* Then, check for compose sequences */ if (priv->in_hex_sequence) { @@ -1344,54 +1161,29 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, else if (is_escape) { gtk_im_context_simple_reset (context); + return TRUE; } - else if (!is_end) + else if (!is_hex_end) { /* non-hex character in hex sequence */ beep_window (event->window); + return TRUE; } } - else if (priv->in_emoji_sequence) - { - if (emoji_keyval) - priv->compose_buffer[n_compose++] = emoji_keyval; - else if (is_escape) - { - gtk_im_context_simple_reset (context); - return TRUE; - } - else - { - beep_window (event->window); - return TRUE; - } - } else priv->compose_buffer[n_compose++] = event->keyval; - if (n_compose == MAX(GTK_MAX_COMPOSE_LEN + 1, 9)) - { - beep_window (event->window); - priv->tentative_match = 0; - priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; - priv->compose_buffer[0] = 0; - g_signal_emit_by_name (context_simple, "preedit-changed"); - - return TRUE; - } - priv->compose_buffer[n_compose] = 0; - if (priv->in_hex_sequence || priv->in_emoji_sequence) + if (priv->in_hex_sequence) { /* If the modifiers are still held down, consider the sequence again */ if (have_hex_mods) { /* space or return ends the sequence, and we eat the key */ - if (n_compose > 0 && is_end) + if (n_compose > 0 && is_hex_end) { if (priv->tentative_match && g_unichar_validate (priv->tentative_match)) @@ -1406,17 +1198,15 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, priv->tentative_match = 0; priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; priv->compose_buffer[0] = 0; } } - else if ((priv->in_hex_sequence && !check_hex (context_simple, n_compose)) || - (priv->in_emoji_sequence && !check_emoji (context_simple, n_compose))) + else if (!check_hex (context_simple, n_compose)) beep_window (event->window); - + g_signal_emit_by_name (context_simple, "preedit-changed"); - if (!priv->in_hex_sequence && !priv->in_emoji_sequence) + if (!priv->in_hex_sequence) g_signal_emit_by_name (context_simple, "preedit-end"); return TRUE; @@ -1540,10 +1330,9 @@ gtk_im_context_simple_reset (GtkIMContext *context) priv->compose_buffer[0] = 0; - if (priv->tentative_match || priv->in_hex_sequence || priv->in_emoji_sequence) + if (priv->tentative_match || priv->in_hex_sequence) { priv->in_hex_sequence = FALSE; - priv->in_emoji_sequence = FALSE; priv->tentative_match = 0; priv->tentative_match_len = 0; g_signal_emit_by_name (context_simple, "preedit-changed"); @@ -1562,11 +1351,11 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context, char outbuf[37]; /* up to 6 hex digits */ int len = 0; - if (priv->in_hex_sequence || priv->in_emoji_sequence) + if (priv->in_hex_sequence) { int hexchars = 0; - outbuf[0] = priv->in_hex_sequence ? 'u' : 'e'; + outbuf[0] = 'u'; len = 1; while (priv->compose_buffer[hexchars] != 0) @@ -1580,8 +1369,8 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context, } else if (priv->tentative_match) len = g_unichar_to_utf8 (priv->tentative_match, outbuf); - - outbuf[len] = '\0'; + + outbuf[len] = '\0'; if (str) *str = g_strdup (outbuf); diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 8f7715022f..8ab4634878 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -602,7 +602,6 @@ gtk_menu_class_init (GtkMenuClass *class) * #GtkMenu:menu-type-hint. * * Since: 3.22 - * Stability: Unstable */ menu_signals[POPPED_UP] = g_signal_new_class_handler (I_("popped-up"), @@ -770,7 +769,6 @@ gtk_menu_class_init (GtkMenuClass *class) * #GtkMenu:rect-anchor-dy, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up. * * Since: 3.22 - * Stability: Unstable */ g_object_class_install_property (gobject_class, PROP_ANCHOR_HINTS, @@ -799,7 +797,6 @@ gtk_menu_class_init (GtkMenuClass *class) * #GtkMenu:rect-anchor-dy, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up. * * Since: 3.22 - * Stability: Unstable */ g_object_class_install_property (gobject_class, PROP_RECT_ANCHOR_DX, @@ -826,7 +823,6 @@ gtk_menu_class_init (GtkMenuClass *class) * #GtkMenu:rect-anchor-dx, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up. * * Since: 3.22 - * Stability: Unstable */ g_object_class_install_property (gobject_class, PROP_RECT_ANCHOR_DY, @@ -853,7 +849,6 @@ gtk_menu_class_init (GtkMenuClass *class) * #GtkMenu:rect-anchor-dx, #GtkMenu:rect-anchor-dy, and #GtkMenu::popped-up. * * Since: 3.22 - * Stability: Unstable */ g_object_class_install_property (gobject_class, PROP_MENU_TYPE_HINT, @@ -2213,7 +2208,6 @@ get_device_for_event (const GdkEvent *event) * #GtkMenu::popped-up signal to find out how it was actually positioned. * * Since: 3.22 - * Stability: Unstable */ void gtk_menu_popup_at_rect (GtkMenu *menu, @@ -2299,7 +2293,6 @@ gtk_menu_popup_at_rect (GtkMenu *menu, * #GtkMenu::popped-up signal to find out how it was actually positioned. * * Since: 3.22 - * Stability: Unstable */ void gtk_menu_popup_at_widget (GtkMenu *menu, @@ -2381,7 +2374,6 @@ gtk_menu_popup_at_widget (GtkMenu *menu, * out how it was actually positioned. * * Since: 3.22 - * Stability: Unstable */ void gtk_menu_popup_at_pointer (GtkMenu *menu, @@ -5282,13 +5274,13 @@ gtk_menu_position (GtkMenu *menu, g_signal_connect (toplevel, "moved-to-rect", G_CALLBACK (moved_to_rect_cb), menu); - GDK_PRIVATE_CALL (gdk_window_move_to_rect) (toplevel, - &rect, - rect_anchor, - menu_anchor, - anchor_hints, - rect_anchor_dx, - rect_anchor_dy); + gdk_window_move_to_rect (toplevel, + &rect, + rect_anchor, + menu_anchor, + anchor_hints, + rect_anchor_dx, + rect_anchor_dy); } static void diff --git a/gtk/gtkstyleprovider.h b/gtk/gtkstyleprovider.h index cbfd9df2a2..2223b1767d 100644 --- a/gtk/gtkstyleprovider.h +++ b/gtk/gtkstyleprovider.h @@ -79,7 +79,7 @@ G_BEGIN_DECLS * GTK_STYLE_PROVIDER_PRIORITY_USER: * * The priority used for the style information from - * `~/.gtk-3.0.css`. + * `XDG_CONFIG_HOME/gtk-3.0/gtk.css`. * * You should not use priorities higher than this, to * give the user the last word. diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 758e3e2168..44ae4fad91 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -10296,11 +10296,13 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view, gint x2; gint vertical_separator; GtkCellRendererState flags = 0; + gint expander_size; widget = GTK_WIDGET (tree_view); context = gtk_widget_get_style_context (widget); gtk_widget_style_get (widget, + "expander-size", &expander_size, "vertical-separator", &vertical_separator, NULL); @@ -10335,6 +10337,21 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view, gtk_style_context_set_state (context, state); gtk_style_context_add_class (context, GTK_STYLE_CLASS_EXPANDER); + if (expander_size > 0) + { + if (expander_size < area.width && area.width % expander_size != 0) + { + area.x += (area.width % expander_size) / 2; + area.width = expander_size; + } + + if (expander_size < area.height && area.height % expander_size != 0) + { + area.y += (area.height % expander_size) / 2; + area.height = expander_size; + } + } + gtk_render_expander (context, cr, area.x, area.y, area.width, area.height); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index dd353998b5..ca0281cdd9 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -292,7 +292,7 @@ * * An example of a UI definition fragment specifying an accessible: * |[ - * <object class="GtkButton" id="label1"/> + * <object class="GtkLabel" id="label1"/> * <property name="label">I am a Label for a Button</property> * </object> * <object class="GtkButton" id="button1"> diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index c6aa5425ff..b5f4b5af3d 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4576,7 +4576,8 @@ icon_from_list (GList *list, for (l = list; l; l = l->next) { pixbuf = list->data; - if (gdk_pixbuf_get_width (pixbuf) <= size) + if (gdk_pixbuf_get_width (pixbuf) <= size && + gdk_pixbuf_get_height (pixbuf) <= size) { best = g_object_ref (pixbuf); break; diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss index 85c60c41de..f095083b8f 100644 --- a/gtk/theme/Adwaita/_common.scss +++ b/gtk/theme/Adwaita/_common.scss @@ -4557,7 +4557,7 @@ button.emoji-section { &:checked label { opacity: 1; } } -.emoji { +popover.emoji-picker .emoji { font-size: x-large; padding: 6px; border-radius: 6px; @@ -4566,3 +4566,17 @@ button.emoji-section { background: $selected_bg_color; } } + +popover.emoji-completion arrow { + border: none; + background: none; +} + +popover.emoji-completion contents row box { + border-spacing: 10px; + padding: 2px 10px; +} + +popover.emoji-completion .emoji:hover { + background: $popover_hover_color; +} diff --git a/gtk/ui/gtkemojicompletion.ui b/gtk/ui/gtkemojicompletion.ui new file mode 100644 index 0000000000..7f5f3ef49a --- /dev/null +++ b/gtk/ui/gtkemojicompletion.ui @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface domain="gtk40"> + <template class="GtkEmojiCompletion" parent="GtkPopover"> + <property name="modal">0</property> + <style> + <class name="emoji-completion"/> + </style> + <child> + <object class="GtkListBox" id="list"> + <property name="visible">1</property> + <property name="selection-mode">none</property> + <property name="activate-on-single-click">1</property> + <signal name="row-activated" handler="row_activated"/> + </object> + </child> + </template> +</interface> diff --git a/gtk/ui/gtkfontchooserwidget.ui b/gtk/ui/gtkfontchooserwidget.ui index 9c5e3c90a1..f1b003cf95 100644 --- a/gtk/ui/gtkfontchooserwidget.ui +++ b/gtk/ui/gtkfontchooserwidget.ui @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<interface domain="gtk30"> +<interface domain="gtk40"> <!-- interface-requires gtk+ 3.10 --> <object class="GtkListStore" id="model"> <columns> @@ -35,7 +35,7 @@ <object class="GtkStack" id="stack"> <property name="visible">1</property> <child> - <object class="GtkGrid" id="grid1"> + <object class="GtkGrid" id="grid"> <property name="visible">1</property> <property name="row-spacing">6</property> <property name="column-spacing">6</property> @@ -57,22 +57,21 @@ <packing> <property name="left-attach">0</property> <property name="top-attach">0</property> - <property name="width">2</property> </packing> </child> <child> <object class="GtkStack" id="list_stack"> <property name="visible">1</property> <child> - <object class="GtkGrid"> + <object class="GtkGrid" id="font_grid"> <property name="visible">1</property> <property name="row-spacing">6</property> <property name="column-spacing">6</property> <child> <object class="GtkScrolledWindow" id="list_scrolled_window"> + <property name="visible">1</property> <property name="width-request">400</property> <property name="height-request">300</property> - <property name="visible">1</property> <property name="can-focus">1</property> <property name="hexpand">1</property> <property name="vexpand">1</property> @@ -112,21 +111,33 @@ <packing> <property name="left-attach">0</property> <property name="top-attach">1</property> - <property name="width">2</property> + <property name="width">3</property> </packing> </child> <child> <object class="GtkEntry" id="preview"> <property name="visible">1</property> <property name="can-focus">1</property> - <property name="invisible-char">•</property> <property name="placeholder-text" translatable="yes">Preview text</property> + <property name="valign">baseline</property> <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/> </object> <packing> <property name="left-attach">0</property> <property name="top-attach">2</property> - <property name="width">2</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="size_label"> + <property name="visible">1</property> + <property name="label" translatable="yes">Size</property> + <property name="xalign">0</property> + <property name="valign">baseline</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> </packing> </child> <child> @@ -137,11 +148,10 @@ <property name="adjustment">slider_adjustment</property> <property name="draw-value">0</property> <property name="round-digits">0</property> - <property name="valign">baseline</property> <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/> </object> <packing> - <property name="left-attach">0</property> + <property name="left-attach">1</property> <property name="top-attach">3</property> </packing> </child> @@ -149,13 +159,12 @@ <object class="GtkSpinButton" id="size_spin"> <property name="visible">1</property> <property name="can-focus">1</property> - <property name="invisible-char">•</property> - <property name="valign">baseline</property> <property name="adjustment">spin_adjustment</property> + <property name="valign">center</property> <signal name="output" handler="output_cb"/> </object> <packing> - <property name="left-attach">1</property> + <property name="left-attach">2</property> <property name="top-attach">3</property> </packing> </child> @@ -209,7 +218,6 @@ <packing> <property name="left-attach">0</property> <property name="top-attach">1</property> - <property name="width">2</property> </packing> </child> </object> @@ -221,92 +229,95 @@ <object class="GtkBox"> <property name="visible">1</property> <property name="orientation">vertical</property> - <property name="spacing">12</property> - <property name="margin">12</property> - - <child> -- <object class="GtkLabel" id="font_name_label"> - <property name="visible">1</property> -- <property name="margin-top">6</property> -- <property name="margin-bottom">6</property> -- <property name="margin-start">12</property> -- <property name="margin-end">12</property> -- <property name="ellipsize">end</property> -- <property name="xalign">0</property> -- </object> -- </child> -- <child> -- <object class="GtkEntry" id="preview2"> - <property name="visible">1</property> -- <property name="can-focus">1</property> -- <property name="placeholder-text" translatable="yes">Preview text</property> -- <property name="text" bind-source="preview" bind-property="text" bind-flags="bidirectional"/> -- <property name="attributes" bind-source="preview" bind-property="attributes" bind-flags="bidirectional"/> - </object> - </child> + <property name="spacing">6</property> <child> - <object class="GtkGrid" id="axis_grid"> - <property name="row-spacing">6</property> - <property name="column-spacing">12</property> + <object class="GtkLabel" id="font_name_label"> <property name="visible">1</property> - <child> - <object class="GtkLabel" id="size_label2"> - <property name="visible">1</property> - <property name="label" translatable="yes">Size</property> - <property name="xalign">0</property> - <property name="valign">baseline</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object class="GtkScale" id="size_slider2"> - <property name="visible">1</property> - <property name="can-focus">1</property> - <property name="hexpand">1</property> - <property name="adjustment">slider_adjustment</property> - <property name="draw-value">0</property> - <property name="round-digits">0</property> - <property name="valign">baseline</property> - <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object class="GtkSpinButton" id="size_spin2"> - <property name="visible">1</property> - <property name="can-focus">1</property> - <property name="adjustment">spin_adjustment</property> - <property name="valign">baseline</property> - <signal name="output" handler="output_cb"/> - </object> - <packing> - <property name="left-attach">2</property> - <property name="top-attach">0</property> - </packing> - </child> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="ellipsize">end</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkEntry" id="preview2"> + <property name="visible">1</property> + <property name="can-focus">1</property> + <property name="placeholder-text" translatable="yes">Preview text</property> + <property name="text" bind-source="preview" bind-property="text" bind-flags="bidirectional"/> + <property name="attributes" bind-source="preview" bind-property="attributes" bind-flags="bidirectional"/> </object> </child> <child> - <object class="GtkBox" id="feature_box"> + <object class="GtkScrolledWindow"> <property name="visible">1</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> + <property name="hscrollbar-policy">never</property> + <property name="shadow-type">in</property> + <property name="vexpand">1</property> + <style> + <class name="view"/> + </style> <child> - <object class="GtkComboBox" id="feature_language_combo"> - <property name="halign">start</property> - <property name="margin-top">10</property> - <signal name="changed" handler="update_language" swapped="yes"/> + <object class="GtkBox"> + <property name="visible">1</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <property name="margin">12</property> <child> - <object class="GtkCellRendererText"/> - <attributes> - <attribute name="text">0</attribute> - </attributes> + <object class="GtkGrid" id="axis_grid"> + <property name="visible">1</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="size_label2"> + <property name="visible">1</property> + <property name="label" translatable="yes">Size</property> + <property name="xalign">0</property> + <property name="valign">baseline</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkScale" id="size_slider2"> + <property name="visible">1</property> + <property name="can-focus">1</property> + <property name="hexpand">1</property> + <property name="adjustment">slider_adjustment</property> + <property name="draw-value">0</property> + <property name="round-digits">0</property> + <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="size_spin2"> + <property name="visible">1</property> + <property name="can-focus">1</property> + <property name="adjustment">spin_adjustment</property> + <property name="valign">center</property> + <signal name="output" handler="output_cb"/> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + </child> + <child> + <object class="GtkBox" id="feature_box"> + <property name="visible">1</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + </object> </child> </object> </child> diff --git a/po/POTFILES.in b/po/POTFILES.in index b72b837f29..a2cd6f5c86 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -136,6 +136,7 @@ gtk/gtkdragsource.c gtk/gtkdrawingarea.c gtk/gtkeditable.c gtk/gtkemojichooser.c +gtk/gtkemojicompletion.c gtk/gtkentrybuffer.c gtk/gtkentry.c gtk/gtkentrycompletion.c @@ -357,6 +358,7 @@ gtk/ui/gtkcoloreditor.ui gtk/ui/gtkdialog.ui gtk/ui/gtkemojichooser.ui gtk/ui/gtkfilechooserbutton.ui +gtk/ui/gtkemojicompletion.ui gtk/ui/gtkfilechooserdialog.ui gtk/ui/gtkfilechooserwidget.ui gtk/ui/gtkfontbutton.ui @@ -11,7 +11,7 @@ # Gil Forcada <gilforcada@guifi.net>, 2012, 2013, 2014. # Jordi Serratosa <jordis@softcatala.cat>, 2012. # Josep Sànchez <papapep@gmx.com>, 2013. -# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2015-2016 +# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2015-2018 # # Recull de termes # @@ -34,9 +34,9 @@ msgid "" msgstr "" "Project-Id-Version: gtk+ 2.8.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-31 11:29+0000\n" -"PO-Revision-Date: 2018-03-31 20:22+0200\n" -"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" +"POT-Creation-Date: 2018-05-31 20:42+0000\n" +"PO-Revision-Date: 2018-06-03 11:58+0200\n" +"Last-Translator: Jordi Mas <jmas@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language: ca\n" "MIME-Version: 1.0\n" @@ -499,7 +499,7 @@ msgstr "Atura temporalment" #: gdk/mir/gdkmirglcontext.c:48 gdk/mir/gdkmirwindowimpl.c:2226 #: gdk/wayland/gdkglcontext-wayland.c:468 gdk/win32/gdkglcontext-win32.c:814 -#: gdk/x11/gdkglcontext-x11.c:1274 +#: gdk/x11/gdkglcontext-x11.c:1277 msgid "No GL implementation is available" msgstr "No hi ha cap implementació GL disponible" @@ -512,7 +512,7 @@ msgstr "No s'ha pogut crear el context GL" #: gdk/mir/gdkmirwindowimpl.c:2188 gdk/mir/gdkmirwindowimpl.c:2198 #: gdk/wayland/gdkglcontext-wayland.c:418 #: gdk/wayland/gdkglcontext-wayland.c:428 gdk/win32/gdkglcontext-win32.c:719 -#: gdk/x11/gdkglcontext-x11.c:968 +#: gdk/x11/gdkglcontext-x11.c:971 msgid "No available configurations for the given pixel format" msgstr "" "No hi ha cap configuració disponible pel tipus de format de píxel donat" @@ -577,7 +577,7 @@ msgid_plural "Opening %d Items" msgstr[0] "S'està obrint %d element" msgstr[1] "S'estan obrint %d elements" -#: gdk/x11/gdkglcontext-x11.c:996 +#: gdk/x11/gdkglcontext-x11.c:999 #, c-format msgid "No available configurations for the given RGBA pixel format" msgstr "" @@ -683,32 +683,32 @@ msgstr "Activa l'expansor" #. FIXME these need accelerators when appropriate, and #. * need the mnemonics to be rationalized #. -#: gtk/a11y/gtkimageaccessible.c:53 gtk/deprecated/gtkstock.c:341 +#: gtk/a11y/gtkimageaccessible.c:53 gtk/deprecated/gtkstock.c:345 msgctxt "Stock label" msgid "_About" msgstr "_Quant a" -#: gtk/a11y/gtkimageaccessible.c:54 gtk/deprecated/gtkstock.c:342 +#: gtk/a11y/gtkimageaccessible.c:54 gtk/deprecated/gtkstock.c:346 msgctxt "Stock label" msgid "_Add" msgstr "_Afegeix" -#: gtk/a11y/gtkimageaccessible.c:55 gtk/deprecated/gtkstock.c:344 +#: gtk/a11y/gtkimageaccessible.c:55 gtk/deprecated/gtkstock.c:348 msgctxt "Stock label" msgid "_Bold" msgstr "_Negreta" -#: gtk/a11y/gtkimageaccessible.c:56 gtk/deprecated/gtkstock.c:346 +#: gtk/a11y/gtkimageaccessible.c:56 gtk/deprecated/gtkstock.c:350 msgctxt "Stock label" msgid "_CD-ROM" msgstr "_CD-ROM" -#: gtk/a11y/gtkimageaccessible.c:57 gtk/deprecated/gtkstock.c:347 +#: gtk/a11y/gtkimageaccessible.c:57 gtk/deprecated/gtkstock.c:351 msgctxt "Stock label" msgid "_Clear" msgstr "_Neteja" -#: gtk/a11y/gtkimageaccessible.c:58 gtk/deprecated/gtkstock.c:348 +#: gtk/a11y/gtkimageaccessible.c:58 gtk/deprecated/gtkstock.c:352 msgctxt "Stock label" msgid "_Close" msgstr "_Tanca" @@ -725,364 +725,364 @@ msgstr "Maximitza" msgid "Restore" msgstr "Restaura" -#: gtk/a11y/gtkimageaccessible.c:62 gtk/deprecated/gtkstock.c:351 +#: gtk/a11y/gtkimageaccessible.c:62 gtk/deprecated/gtkstock.c:355 msgctxt "Stock label" msgid "_Copy" msgstr "_Copia" -#: gtk/a11y/gtkimageaccessible.c:63 gtk/deprecated/gtkstock.c:352 +#: gtk/a11y/gtkimageaccessible.c:63 gtk/deprecated/gtkstock.c:356 msgctxt "Stock label" msgid "Cu_t" msgstr "Re_talla" -#: gtk/a11y/gtkimageaccessible.c:64 gtk/deprecated/gtkstock.c:353 +#: gtk/a11y/gtkimageaccessible.c:64 gtk/deprecated/gtkstock.c:357 msgctxt "Stock label" msgid "_Delete" msgstr "_Suprimeix" -#: gtk/a11y/gtkimageaccessible.c:65 gtk/deprecated/gtkstock.c:335 +#: gtk/a11y/gtkimageaccessible.c:65 gtk/deprecated/gtkstock.c:339 msgctxt "Stock label" msgid "Error" msgstr "Error" #. KEEP IN SYNC with gtkiconfactory.c stock icons, when appropriate -#: gtk/a11y/gtkimageaccessible.c:66 gtk/deprecated/gtkstock.c:333 +#: gtk/a11y/gtkimageaccessible.c:66 gtk/deprecated/gtkstock.c:337 msgctxt "Stock label" msgid "Information" msgstr "Informació" -#: gtk/a11y/gtkimageaccessible.c:67 gtk/deprecated/gtkstock.c:336 +#: gtk/a11y/gtkimageaccessible.c:67 gtk/deprecated/gtkstock.c:340 msgctxt "Stock label" msgid "Question" msgstr "Pregunta" -#: gtk/a11y/gtkimageaccessible.c:68 gtk/deprecated/gtkstock.c:334 +#: gtk/a11y/gtkimageaccessible.c:68 gtk/deprecated/gtkstock.c:338 msgctxt "Stock label" msgid "Warning" msgstr "Avís" -#: gtk/a11y/gtkimageaccessible.c:69 gtk/deprecated/gtkstock.c:356 +#: gtk/a11y/gtkimageaccessible.c:69 gtk/deprecated/gtkstock.c:360 msgctxt "Stock label" msgid "_Execute" msgstr "_Executa" -#: gtk/a11y/gtkimageaccessible.c:70 gtk/deprecated/gtkstock.c:358 +#: gtk/a11y/gtkimageaccessible.c:70 gtk/deprecated/gtkstock.c:362 msgctxt "Stock label" msgid "_File" msgstr "_Fitxer" -#: gtk/a11y/gtkimageaccessible.c:71 gtk/deprecated/gtkstock.c:359 +#: gtk/a11y/gtkimageaccessible.c:71 gtk/deprecated/gtkstock.c:363 msgctxt "Stock label" msgid "_Find" msgstr "_Cerca" -#: gtk/a11y/gtkimageaccessible.c:72 gtk/deprecated/gtkstock.c:360 +#: gtk/a11y/gtkimageaccessible.c:72 gtk/deprecated/gtkstock.c:364 msgctxt "Stock label" msgid "Find and _Replace" msgstr "Cerca i _reemplaça" -#: gtk/a11y/gtkimageaccessible.c:73 gtk/deprecated/gtkstock.c:361 +#: gtk/a11y/gtkimageaccessible.c:73 gtk/deprecated/gtkstock.c:365 msgctxt "Stock label" msgid "_Floppy" msgstr "_Disquet" -#: gtk/a11y/gtkimageaccessible.c:74 gtk/deprecated/gtkstock.c:362 +#: gtk/a11y/gtkimageaccessible.c:74 gtk/deprecated/gtkstock.c:366 msgctxt "Stock label" msgid "_Fullscreen" msgstr "_Pantalla completa" #. This is a navigation label as in "go to the bottom of the page" -#: gtk/a11y/gtkimageaccessible.c:75 gtk/deprecated/gtkstock.c:365 +#: gtk/a11y/gtkimageaccessible.c:75 gtk/deprecated/gtkstock.c:369 msgctxt "Stock label, navigation" msgid "_Bottom" msgstr "_Inferior" #. This is a navigation label as in "go to the first page" -#: gtk/a11y/gtkimageaccessible.c:76 gtk/deprecated/gtkstock.c:367 +#: gtk/a11y/gtkimageaccessible.c:76 gtk/deprecated/gtkstock.c:371 msgctxt "Stock label, navigation" msgid "_First" msgstr "_Primer" #. This is a navigation label as in "go to the last page" -#: gtk/a11y/gtkimageaccessible.c:77 gtk/deprecated/gtkstock.c:369 +#: gtk/a11y/gtkimageaccessible.c:77 gtk/deprecated/gtkstock.c:373 msgctxt "Stock label, navigation" msgid "_Last" msgstr "Ú_ltim" #. This is a navigation label as in "go to the top of the page" -#: gtk/a11y/gtkimageaccessible.c:78 gtk/deprecated/gtkstock.c:371 +#: gtk/a11y/gtkimageaccessible.c:78 gtk/deprecated/gtkstock.c:375 msgctxt "Stock label, navigation" msgid "_Top" msgstr "_Superior" #. This is a navigation label as in "go back" -#: gtk/a11y/gtkimageaccessible.c:79 gtk/deprecated/gtkstock.c:373 +#: gtk/a11y/gtkimageaccessible.c:79 gtk/deprecated/gtkstock.c:377 msgctxt "Stock label, navigation" msgid "_Back" msgstr "_Enrere" #. This is a navigation label as in "go down" -#: gtk/a11y/gtkimageaccessible.c:80 gtk/deprecated/gtkstock.c:375 +#: gtk/a11y/gtkimageaccessible.c:80 gtk/deprecated/gtkstock.c:379 msgctxt "Stock label, navigation" msgid "_Down" msgstr "A_vall" #. This is a navigation label as in "go forward" -#: gtk/a11y/gtkimageaccessible.c:81 gtk/deprecated/gtkstock.c:377 +#: gtk/a11y/gtkimageaccessible.c:81 gtk/deprecated/gtkstock.c:381 msgctxt "Stock label, navigation" msgid "_Forward" msgstr "E_ndavant" #. This is a navigation label as in "go up" -#: gtk/a11y/gtkimageaccessible.c:82 gtk/deprecated/gtkstock.c:379 +#: gtk/a11y/gtkimageaccessible.c:82 gtk/deprecated/gtkstock.c:383 msgctxt "Stock label, navigation" msgid "_Up" msgstr "A_munt" -#: gtk/a11y/gtkimageaccessible.c:83 gtk/deprecated/gtkstock.c:380 +#: gtk/a11y/gtkimageaccessible.c:83 gtk/deprecated/gtkstock.c:384 msgctxt "Stock label" msgid "_Hard Disk" msgstr "_Disc dur" -#: gtk/a11y/gtkimageaccessible.c:84 gtk/deprecated/gtkstock.c:381 +#: gtk/a11y/gtkimageaccessible.c:84 gtk/deprecated/gtkstock.c:385 msgctxt "Stock label" msgid "_Help" msgstr "A_juda" -#: gtk/a11y/gtkimageaccessible.c:85 gtk/deprecated/gtkstock.c:382 +#: gtk/a11y/gtkimageaccessible.c:85 gtk/deprecated/gtkstock.c:386 msgctxt "Stock label" msgid "_Home" msgstr "_Inici" -#: gtk/a11y/gtkimageaccessible.c:86 gtk/deprecated/gtkstock.c:383 +#: gtk/a11y/gtkimageaccessible.c:86 gtk/deprecated/gtkstock.c:387 msgctxt "Stock label" msgid "Increase Indent" msgstr "Augmenta el sagnat" -#: gtk/a11y/gtkimageaccessible.c:87 gtk/deprecated/gtkstock.c:387 +#: gtk/a11y/gtkimageaccessible.c:87 gtk/deprecated/gtkstock.c:391 msgctxt "Stock label" msgid "_Italic" msgstr "Curs_iva" -#: gtk/a11y/gtkimageaccessible.c:88 gtk/deprecated/gtkstock.c:388 +#: gtk/a11y/gtkimageaccessible.c:88 gtk/deprecated/gtkstock.c:392 msgctxt "Stock label" msgid "_Jump to" msgstr "_Vés-hi" #. This is about text justification, "centered text" -#: gtk/a11y/gtkimageaccessible.c:89 gtk/deprecated/gtkstock.c:390 +#: gtk/a11y/gtkimageaccessible.c:89 gtk/deprecated/gtkstock.c:394 msgctxt "Stock label" msgid "_Center" msgstr "_Centrat" #. This is about text justification -#: gtk/a11y/gtkimageaccessible.c:90 gtk/deprecated/gtkstock.c:392 +#: gtk/a11y/gtkimageaccessible.c:90 gtk/deprecated/gtkstock.c:396 msgctxt "Stock label" msgid "_Fill" msgstr "_Justificat" #. This is about text justification, "left-justified text" -#: gtk/a11y/gtkimageaccessible.c:91 gtk/deprecated/gtkstock.c:394 +#: gtk/a11y/gtkimageaccessible.c:91 gtk/deprecated/gtkstock.c:398 msgctxt "Stock label" msgid "_Left" msgstr "_Esquerra" #. This is about text justification, "right-justified text" -#: gtk/a11y/gtkimageaccessible.c:92 gtk/deprecated/gtkstock.c:396 +#: gtk/a11y/gtkimageaccessible.c:92 gtk/deprecated/gtkstock.c:400 msgctxt "Stock label" msgid "_Right" msgstr "_Dreta" -#: gtk/a11y/gtkimageaccessible.c:93 gtk/deprecated/gtkstock.c:363 +#: gtk/a11y/gtkimageaccessible.c:93 gtk/deprecated/gtkstock.c:367 msgctxt "Stock label" msgid "_Leave Fullscreen" msgstr "_Surt de la pantalla completa" #. Media label, as in "fast forward" -#: gtk/a11y/gtkimageaccessible.c:94 gtk/deprecated/gtkstock.c:399 +#: gtk/a11y/gtkimageaccessible.c:94 gtk/deprecated/gtkstock.c:403 msgctxt "Stock label, media" msgid "_Forward" msgstr "E_ndavant" #. Media label, as in "next song" -#: gtk/a11y/gtkimageaccessible.c:95 gtk/deprecated/gtkstock.c:401 +#: gtk/a11y/gtkimageaccessible.c:95 gtk/deprecated/gtkstock.c:405 msgctxt "Stock label, media" msgid "_Next" msgstr "_Següent" #. Media label, as in "pause music" -#: gtk/a11y/gtkimageaccessible.c:96 gtk/deprecated/gtkstock.c:403 +#: gtk/a11y/gtkimageaccessible.c:96 gtk/deprecated/gtkstock.c:407 msgctxt "Stock label, media" msgid "P_ause" msgstr "En _pausa" #. Media label, as in "play music" -#: gtk/a11y/gtkimageaccessible.c:97 gtk/deprecated/gtkstock.c:405 +#: gtk/a11y/gtkimageaccessible.c:97 gtk/deprecated/gtkstock.c:409 msgctxt "Stock label, media" msgid "_Play" msgstr "_Reprodueix" #. Media label, as in "previous song" -#: gtk/a11y/gtkimageaccessible.c:98 gtk/deprecated/gtkstock.c:407 +#: gtk/a11y/gtkimageaccessible.c:98 gtk/deprecated/gtkstock.c:411 msgctxt "Stock label, media" msgid "Pre_vious" msgstr "An_terior" #. Media label -#: gtk/a11y/gtkimageaccessible.c:99 gtk/deprecated/gtkstock.c:409 +#: gtk/a11y/gtkimageaccessible.c:99 gtk/deprecated/gtkstock.c:413 msgctxt "Stock label, media" msgid "_Record" msgstr "En_registra" #. Media label -#: gtk/a11y/gtkimageaccessible.c:100 gtk/deprecated/gtkstock.c:411 +#: gtk/a11y/gtkimageaccessible.c:100 gtk/deprecated/gtkstock.c:415 msgctxt "Stock label, media" msgid "R_ewind" msgstr "R_ebobina" #. Media label -#: gtk/a11y/gtkimageaccessible.c:101 gtk/deprecated/gtkstock.c:413 +#: gtk/a11y/gtkimageaccessible.c:101 gtk/deprecated/gtkstock.c:417 msgctxt "Stock label, media" msgid "_Stop" msgstr "_Atura" -#: gtk/a11y/gtkimageaccessible.c:102 gtk/deprecated/gtkstock.c:414 +#: gtk/a11y/gtkimageaccessible.c:102 gtk/deprecated/gtkstock.c:418 msgctxt "Stock label" msgid "_Network" msgstr "_Xarxa" -#: gtk/a11y/gtkimageaccessible.c:103 gtk/deprecated/gtkstock.c:415 +#: gtk/a11y/gtkimageaccessible.c:103 gtk/deprecated/gtkstock.c:419 msgctxt "Stock label" msgid "_New" msgstr "_Nou" -#: gtk/a11y/gtkimageaccessible.c:104 gtk/deprecated/gtkstock.c:418 +#: gtk/a11y/gtkimageaccessible.c:104 gtk/deprecated/gtkstock.c:422 msgctxt "Stock label" msgid "_Open" msgstr "_Obre" -#: gtk/a11y/gtkimageaccessible.c:105 gtk/deprecated/gtkstock.c:428 +#: gtk/a11y/gtkimageaccessible.c:105 gtk/deprecated/gtkstock.c:432 msgctxt "Stock label" msgid "_Paste" msgstr "_Enganxa" -#: gtk/a11y/gtkimageaccessible.c:106 gtk/deprecated/gtkstock.c:430 +#: gtk/a11y/gtkimageaccessible.c:106 gtk/deprecated/gtkstock.c:434 msgctxt "Stock label" msgid "_Print" msgstr "_Imprimeix" -#: gtk/a11y/gtkimageaccessible.c:107 gtk/deprecated/gtkstock.c:431 +#: gtk/a11y/gtkimageaccessible.c:107 gtk/deprecated/gtkstock.c:435 msgctxt "Stock label" msgid "Print Pre_view" msgstr "Pre_visualització de la impressió" -#: gtk/a11y/gtkimageaccessible.c:108 gtk/deprecated/gtkstock.c:432 +#: gtk/a11y/gtkimageaccessible.c:108 gtk/deprecated/gtkstock.c:436 msgctxt "Stock label" msgid "_Properties" msgstr "_Propietats" -#: gtk/a11y/gtkimageaccessible.c:109 gtk/deprecated/gtkstock.c:433 +#: gtk/a11y/gtkimageaccessible.c:109 gtk/deprecated/gtkstock.c:437 msgctxt "Stock label" msgid "_Quit" msgstr "_Surt" -#: gtk/a11y/gtkimageaccessible.c:110 gtk/deprecated/gtkstock.c:434 +#: gtk/a11y/gtkimageaccessible.c:110 gtk/deprecated/gtkstock.c:438 msgctxt "Stock label" msgid "_Redo" msgstr "_Refés" -#: gtk/a11y/gtkimageaccessible.c:111 gtk/deprecated/gtkstock.c:435 +#: gtk/a11y/gtkimageaccessible.c:111 gtk/deprecated/gtkstock.c:439 msgctxt "Stock label" msgid "_Refresh" msgstr "_Actualitza" -#: gtk/a11y/gtkimageaccessible.c:112 gtk/deprecated/gtkstock.c:436 +#: gtk/a11y/gtkimageaccessible.c:112 gtk/deprecated/gtkstock.c:440 msgctxt "Stock label" msgid "_Remove" msgstr "_Suprimeix" -#: gtk/a11y/gtkimageaccessible.c:113 gtk/deprecated/gtkstock.c:437 +#: gtk/a11y/gtkimageaccessible.c:113 gtk/deprecated/gtkstock.c:441 msgctxt "Stock label" msgid "_Revert" msgstr "_Restaura" -#: gtk/a11y/gtkimageaccessible.c:114 gtk/deprecated/gtkstock.c:438 +#: gtk/a11y/gtkimageaccessible.c:114 gtk/deprecated/gtkstock.c:442 msgctxt "Stock label" msgid "_Save" msgstr "_Desa" -#: gtk/a11y/gtkimageaccessible.c:115 gtk/deprecated/gtkstock.c:439 +#: gtk/a11y/gtkimageaccessible.c:115 gtk/deprecated/gtkstock.c:443 msgctxt "Stock label" msgid "Save _As" msgstr "_Anomena i desa" -#: gtk/a11y/gtkimageaccessible.c:116 gtk/deprecated/gtkstock.c:440 +#: gtk/a11y/gtkimageaccessible.c:116 gtk/deprecated/gtkstock.c:444 msgctxt "Stock label" msgid "Select _All" msgstr "Seleccion_a-ho tot" #. Sorting direction -#: gtk/a11y/gtkimageaccessible.c:117 gtk/deprecated/gtkstock.c:444 +#: gtk/a11y/gtkimageaccessible.c:117 gtk/deprecated/gtkstock.c:448 msgctxt "Stock label" msgid "_Ascending" msgstr "_Ascendent" #. Sorting direction -#: gtk/a11y/gtkimageaccessible.c:118 gtk/deprecated/gtkstock.c:446 +#: gtk/a11y/gtkimageaccessible.c:118 gtk/deprecated/gtkstock.c:450 msgctxt "Stock label" msgid "_Descending" msgstr "_Descendent" -#: gtk/a11y/gtkimageaccessible.c:119 gtk/deprecated/gtkstock.c:447 +#: gtk/a11y/gtkimageaccessible.c:119 gtk/deprecated/gtkstock.c:451 msgctxt "Stock label" msgid "_Spell Check" msgstr "_Verifica l'ortografia" -#: gtk/a11y/gtkimageaccessible.c:120 gtk/deprecated/gtkstock.c:448 +#: gtk/a11y/gtkimageaccessible.c:120 gtk/deprecated/gtkstock.c:452 msgctxt "Stock label" msgid "_Stop" msgstr "_Atura" #. Font variant -#: gtk/a11y/gtkimageaccessible.c:121 gtk/deprecated/gtkstock.c:450 +#: gtk/a11y/gtkimageaccessible.c:121 gtk/deprecated/gtkstock.c:454 msgctxt "Stock label" msgid "_Strikethrough" msgstr "_Barrat" #. Font variant -#: gtk/a11y/gtkimageaccessible.c:122 gtk/deprecated/gtkstock.c:453 +#: gtk/a11y/gtkimageaccessible.c:122 gtk/deprecated/gtkstock.c:457 msgctxt "Stock label" msgid "_Underline" msgstr "S_ubratlla" -#: gtk/a11y/gtkimageaccessible.c:123 gtk/deprecated/gtkstock.c:454 +#: gtk/a11y/gtkimageaccessible.c:123 gtk/deprecated/gtkstock.c:458 msgctxt "Stock label" msgid "_Undo" msgstr "_Desfés" -#: gtk/a11y/gtkimageaccessible.c:124 gtk/deprecated/gtkstock.c:384 +#: gtk/a11y/gtkimageaccessible.c:124 gtk/deprecated/gtkstock.c:388 msgctxt "Stock label" msgid "Decrease Indent" msgstr "Disminueix el sagnat" #. Zoom -#: gtk/a11y/gtkimageaccessible.c:125 gtk/deprecated/gtkstock.c:457 +#: gtk/a11y/gtkimageaccessible.c:125 gtk/deprecated/gtkstock.c:461 msgctxt "Stock label" msgid "_Normal Size" msgstr "Mida _normal" #. Zoom -#: gtk/a11y/gtkimageaccessible.c:126 gtk/deprecated/gtkstock.c:459 +#: gtk/a11y/gtkimageaccessible.c:126 gtk/deprecated/gtkstock.c:463 msgctxt "Stock label" msgid "Best _Fit" msgstr "Millor a_just" -#: gtk/a11y/gtkimageaccessible.c:127 gtk/deprecated/gtkstock.c:460 +#: gtk/a11y/gtkimageaccessible.c:127 gtk/deprecated/gtkstock.c:464 msgctxt "Stock label" msgid "Zoom _In" msgstr "_Amplia" -#: gtk/a11y/gtkimageaccessible.c:128 gtk/deprecated/gtkstock.c:461 +#: gtk/a11y/gtkimageaccessible.c:128 gtk/deprecated/gtkstock.c:465 msgctxt "Stock label" msgid "Zoom _Out" msgstr "_Redueix" @@ -1271,7 +1271,7 @@ msgstr "" #: gtk/gtkfilechooserwidget.c:1475 gtk/gtkfilechooserwidget.c:6330 #: gtk/gtkmessagedialog.c:952 gtk/gtkmessagedialog.c:965 #: gtk/gtkmountoperation.c:545 gtk/gtkpagesetupunixdialog.c:196 -#: gtk/gtkprintbackend.c:763 gtk/gtkprinteroptionwidget.c:545 +#: gtk/gtkprintbackend.c:781 gtk/gtkprinteroptionwidget.c:545 #: gtk/gtkprintunixdialog.c:673 gtk/gtkprintunixdialog.c:746 #: gtk/gtkwindow.c:12698 gtk/inspector/css-editor.c:201 #: gtk/ui/gtkappchooserdialog.ui:61 gtk/ui/gtkassistant.ui:125 @@ -1322,7 +1322,7 @@ msgid "_Apply" msgstr "_Aplica" #: gtk/deprecated/gtkfontsel.c:1698 gtk/gtkmessagedialog.c:944 -#: gtk/gtkmessagedialog.c:966 gtk/gtkprintbackend.c:764 gtk/gtkwindow.c:12699 +#: gtk/gtkmessagedialog.c:966 gtk/gtkprintbackend.c:782 gtk/gtkwindow.c:12699 msgid "_OK" msgstr "_D'acord" @@ -1339,127 +1339,127 @@ msgctxt "Number format" msgid "%d" msgstr "%d" -#: gtk/deprecated/gtkstock.c:343 +#: gtk/deprecated/gtkstock.c:347 msgctxt "Stock label" msgid "_Apply" msgstr "_Aplica" -#: gtk/deprecated/gtkstock.c:345 +#: gtk/deprecated/gtkstock.c:349 msgctxt "Stock label" msgid "_Cancel" msgstr "_Cancel·la" -#: gtk/deprecated/gtkstock.c:349 +#: gtk/deprecated/gtkstock.c:353 msgctxt "Stock label" msgid "C_onnect" msgstr "C_onnecta" -#: gtk/deprecated/gtkstock.c:350 +#: gtk/deprecated/gtkstock.c:354 msgctxt "Stock label" msgid "_Convert" msgstr "_Converteix" -#: gtk/deprecated/gtkstock.c:354 +#: gtk/deprecated/gtkstock.c:358 msgctxt "Stock label" msgid "_Discard" msgstr "_Descarta" -#: gtk/deprecated/gtkstock.c:355 +#: gtk/deprecated/gtkstock.c:359 msgctxt "Stock label" msgid "_Disconnect" msgstr "_Desconnecta" -#: gtk/deprecated/gtkstock.c:357 +#: gtk/deprecated/gtkstock.c:361 msgctxt "Stock label" msgid "_Edit" msgstr "_Edita" -#: gtk/deprecated/gtkstock.c:385 +#: gtk/deprecated/gtkstock.c:389 msgctxt "Stock label" msgid "_Index" msgstr "Índe_x" -#: gtk/deprecated/gtkstock.c:386 +#: gtk/deprecated/gtkstock.c:390 msgctxt "Stock label" msgid "_Information" msgstr "_Informació" -#: gtk/deprecated/gtkstock.c:416 +#: gtk/deprecated/gtkstock.c:420 msgctxt "Stock label" msgid "_No" msgstr "_No" -#: gtk/deprecated/gtkstock.c:417 +#: gtk/deprecated/gtkstock.c:421 msgctxt "Stock label" msgid "_OK" msgstr "_D'acord" #. Page orientation -#: gtk/deprecated/gtkstock.c:420 +#: gtk/deprecated/gtkstock.c:424 msgctxt "Stock label" msgid "Landscape" msgstr "Apaïsat" #. Page orientation -#: gtk/deprecated/gtkstock.c:422 +#: gtk/deprecated/gtkstock.c:426 msgctxt "Stock label" msgid "Portrait" msgstr "Vertical" #. Page orientation -#: gtk/deprecated/gtkstock.c:424 +#: gtk/deprecated/gtkstock.c:428 msgctxt "Stock label" msgid "Reverse landscape" msgstr "Apaïsat del revés" #. Page orientation -#: gtk/deprecated/gtkstock.c:426 +#: gtk/deprecated/gtkstock.c:430 msgctxt "Stock label" msgid "Reverse portrait" msgstr "Vertical del revés" -#: gtk/deprecated/gtkstock.c:427 +#: gtk/deprecated/gtkstock.c:431 msgctxt "Stock label" msgid "Page Set_up" msgstr "Confi_guració de la pàgina" -#: gtk/deprecated/gtkstock.c:429 +#: gtk/deprecated/gtkstock.c:433 msgctxt "Stock label" msgid "_Preferences" msgstr "_Preferències" -#: gtk/deprecated/gtkstock.c:441 +#: gtk/deprecated/gtkstock.c:445 msgctxt "Stock label" msgid "_Color" msgstr "_Color" -#: gtk/deprecated/gtkstock.c:442 +#: gtk/deprecated/gtkstock.c:446 msgctxt "Stock label" msgid "_Font" msgstr "_Tipus de lletra" -#: gtk/deprecated/gtkstock.c:451 +#: gtk/deprecated/gtkstock.c:455 msgctxt "Stock label" msgid "_Undelete" msgstr "Rec_upera" -#: gtk/deprecated/gtkstock.c:455 +#: gtk/deprecated/gtkstock.c:459 msgctxt "Stock label" msgid "_Yes" msgstr "_Sí" -#: gtk/deprecated/gtkuimanager.c:1776 +#: gtk/deprecated/gtkuimanager.c:1782 #, c-format msgid "Unexpected start tag '%s' on line %d char %d" msgstr "" "S'ha trobat una etiqueta d'inici «%s» inesperada a la línia %d, caràcter %d" -#: gtk/deprecated/gtkuimanager.c:1866 +#: gtk/deprecated/gtkuimanager.c:1872 #, c-format msgid "Unexpected character data on line %d char %d" msgstr "S'han trobat dades de caràcter inesperades a la línia %d, caràcter %d" -#: gtk/deprecated/gtkuimanager.c:2703 +#: gtk/deprecated/gtkuimanager.c:2709 msgid "Empty" msgstr "Buit" @@ -1546,10 +1546,8 @@ msgid "GNU Affero General Public License, version 3 or later" msgstr "Llicència Pública General GNU Affero, versió 3 o posterior" #: gtk/gtkaboutdialog.c:128 -#, fuzzy -#| msgid "GNU General Public License, version 3 only" msgid "GNU Affero General Public License, version 3 only" -msgstr "Llicència Pública General GNU, només versió 3" +msgstr "Llicència Pública General GNU Affero, només versió 3" #: gtk/gtkaboutdialog.c:697 msgid "C_redits" @@ -1742,7 +1740,7 @@ msgstr "Aplicacions relacionades" msgid "Other Applications" msgstr "Altres aplicacions" -#: gtk/gtkapplicationwindow.c:345 gtk/gtkprintoperation-unix.c:484 +#: gtk/gtkapplicationwindow.c:345 gtk/gtkprintoperation-unix.c:485 #: gtk/gtkprintoperation-win32.c:1453 gtk/inspector/prop-editor.c:1686 msgid "Application" msgstr "Aplicació" @@ -2246,44 +2244,44 @@ msgstr "_Dret:" msgid "Paper Margins" msgstr "Marges del paper" -#: gtk/gtkentry.c:9564 gtk/gtklabel.c:6680 gtk/gtktextview.c:9491 +#: gtk/gtkentry.c:9564 gtk/gtklabel.c:6680 gtk/gtktextview.c:9493 msgid "Cu_t" msgstr "Re_talla" -#: gtk/gtkentry.c:9568 gtk/gtklabel.c:6681 gtk/gtktextview.c:9495 +#: gtk/gtkentry.c:9568 gtk/gtklabel.c:6681 gtk/gtktextview.c:9497 msgid "_Copy" msgstr "_Copia" -#: gtk/gtkentry.c:9572 gtk/gtklabel.c:6682 gtk/gtktextview.c:9497 +#: gtk/gtkentry.c:9572 gtk/gtklabel.c:6682 gtk/gtktextview.c:9499 msgid "_Paste" msgstr "_Enganxa" #: gtk/gtkentry.c:9575 gtk/gtkfilechooserwidget.c:1476 -#: gtk/gtkfilechooserwidget.c:2276 gtk/gtklabel.c:6684 gtk/gtktextview.c:9500 +#: gtk/gtkfilechooserwidget.c:2276 gtk/gtklabel.c:6684 gtk/gtktextview.c:9502 msgid "_Delete" msgstr "_Suprimeix" -#: gtk/gtkentry.c:9586 gtk/gtklabel.c:6693 gtk/gtktextview.c:9514 +#: gtk/gtkentry.c:9586 gtk/gtklabel.c:6693 gtk/gtktextview.c:9516 msgid "Select _All" msgstr "Seleccion_a-ho tot" -#: gtk/gtkentry.c:9596 gtk/gtktextview.c:9524 +#: gtk/gtkentry.c:9596 gtk/gtktextview.c:9526 msgid "Insert _Emoji" msgstr "_Insereix Emoji" -#: gtk/gtkentry.c:9772 gtk/gtktextview.c:9749 +#: gtk/gtkentry.c:9772 gtk/gtktextview.c:9746 msgid "Select all" msgstr "Selecciona-ho tot" -#: gtk/gtkentry.c:9775 gtk/gtktextview.c:9752 +#: gtk/gtkentry.c:9775 gtk/gtktextview.c:9749 msgid "Cut" msgstr "Retalla" -#: gtk/gtkentry.c:9778 gtk/gtktextview.c:9755 +#: gtk/gtkentry.c:9778 gtk/gtktextview.c:9752 msgid "Copy" msgstr "Copia" -#: gtk/gtkentry.c:9781 gtk/gtktextview.c:9758 +#: gtk/gtkentry.c:9781 gtk/gtktextview.c:9755 msgid "Paste" msgstr "Enganxa" @@ -2318,7 +2316,7 @@ msgstr "_Nom:" #. Open item is always present #: gtk/gtkfilechoosernative.c:541 gtk/gtkfilechoosernative.c:626 #: gtk/gtkplacessidebar.c:3594 gtk/gtkplacessidebar.c:3662 -#: gtk/gtkplacesview.c:1629 +#: gtk/gtkplacesview.c:1633 msgid "_Open" msgstr "_Obre" @@ -2629,19 +2627,73 @@ msgstr "Accedit" msgid "File System" msgstr "Sistema de fitxers" -#: gtk/gtkfontbutton.c:368 gtk/gtkfontbutton.c:498 +#: gtk/gtkfontbutton.c:381 gtk/gtkfontbutton.c:511 msgid "Sans 12" msgstr "Sans 12" -#: gtk/gtkfontbutton.c:481 gtk/gtkfontbutton.c:615 +#: gtk/gtkfontbutton.c:494 gtk/gtkfontbutton.c:628 msgid "Pick a Font" msgstr "Trieu un tipus de lletra" -#: gtk/gtkfontbutton.c:1355 +#: gtk/gtkfontbutton.c:1390 msgctxt "font" msgid "None" msgstr "Cap" +#: gtk/gtkfontchooserwidget.c:1515 +msgid "Width" +msgstr "Amplada" + +#: gtk/gtkfontchooserwidget.c:1516 +msgid "Weight" +msgstr "Pes" + +#: gtk/gtkfontchooserwidget.c:1517 +msgid "Italic" +msgstr "Cursiva" + +#: gtk/gtkfontchooserwidget.c:1518 +msgid "Slant" +msgstr "Inclina" + +#: gtk/gtkfontchooserwidget.c:1519 +msgid "Optical Size" +msgstr "Mida òptica" + +#: gtk/gtkfontchooserwidget.c:1658 +msgctxt "Language" +msgid "Default" +msgstr "Per defecte" + +#: gtk/gtkfontchooserwidget.c:1949 gtk/inspector/prop-editor.c:1676 +msgid "Default" +msgstr "Per defecte" + +#: gtk/gtkfontchooserwidget.c:1979 +msgid "Ligatures" +msgstr "Lligadures" + +#: gtk/gtkfontchooserwidget.c:1980 +msgid "Letter Case" +msgstr "Ignora les diferències entre majúscules i minúscules" + +#: gtk/gtkfontchooserwidget.c:1981 +#, fuzzy +msgid "Number Case" +msgstr "" + +#: gtk/gtkfontchooserwidget.c:1982 +msgid "Number Spacing" +msgstr "Espaiat dels nombres" + +#: gtk/gtkfontchooserwidget.c:1983 +msgid "Number Formatting" +msgstr "Formatació dels nombres" + +#: gtk/gtkfontchooserwidget.c:1984 +msgid "Character Variants" +msgstr "Variants del caràcter" + #: gtk/gtkglarea.c:313 msgid "OpenGL context creation failed" msgstr "S'ha produït un error en la creació del context OpenGL" @@ -3165,12 +3217,12 @@ msgid "Unable to poll “%s” for media changes" msgstr "No es pot comprovar «%s» per si hi ha canvis de suports" #: gtk/gtkplacessidebar.c:3599 gtk/gtkplacessidebar.c:3665 -#: gtk/gtkplacesview.c:1639 +#: gtk/gtkplacesview.c:1643 msgid "Open in New _Tab" msgstr "Obre en una _pestanya nova" #: gtk/gtkplacessidebar.c:3605 gtk/gtkplacessidebar.c:3668 -#: gtk/gtkplacesview.c:1650 +#: gtk/gtkplacesview.c:1654 msgid "Open in New _Window" msgstr "Obre en una _finestra nova" @@ -3186,11 +3238,11 @@ msgstr "_Elimina" msgid "Rename…" msgstr "Canvia el nom…" -#: gtk/gtkplacessidebar.c:3678 gtk/gtkplacesview.c:1684 +#: gtk/gtkplacessidebar.c:3678 gtk/gtkplacesview.c:1688 msgid "_Mount" msgstr "_Munta" -#: gtk/gtkplacessidebar.c:3679 gtk/gtkplacesview.c:1674 +#: gtk/gtkplacessidebar.c:3679 gtk/gtkplacesview.c:1678 msgid "_Unmount" msgstr "_Desmunta" @@ -3202,55 +3254,55 @@ msgstr "_Expulsa" msgid "_Detect Media" msgstr "_Detecta el suport" -#: gtk/gtkplacessidebar.c:4127 gtk/gtkplacesview.c:1118 +#: gtk/gtkplacessidebar.c:4127 gtk/gtkplacesview.c:1121 msgid "Computer" msgstr "Ordinador" -#: gtk/gtkplacesview.c:894 +#: gtk/gtkplacesview.c:897 msgid "Searching for network locations" msgstr "S'estan cercant ubicacions de xarxa" -#: gtk/gtkplacesview.c:901 +#: gtk/gtkplacesview.c:904 msgid "No network locations found" msgstr "No s'ha trobat cap ubicació de xarxa" #. if it wasn't cancelled show a dialog -#: gtk/gtkplacesview.c:1228 gtk/gtkplacesview.c:1303 +#: gtk/gtkplacesview.c:1231 gtk/gtkplacesview.c:1306 msgid "Unable to access location" msgstr "No s'ha pogut accedir a la ubicació" #. Restore from Cancel to Connect -#: gtk/gtkplacesview.c:1246 gtk/ui/gtkplacesview.ui:449 +#: gtk/gtkplacesview.c:1249 gtk/ui/gtkplacesview.ui:449 msgid "Con_nect" msgstr "C_onnecta" #. if it wasn't cancelled show a dialog -#: gtk/gtkplacesview.c:1366 +#: gtk/gtkplacesview.c:1369 msgid "Unable to unmount volume" msgstr "No es pot desmuntar el volum" #. Allow to cancel the operation -#: gtk/gtkplacesview.c:1466 +#: gtk/gtkplacesview.c:1470 msgid "Cance_l" msgstr "_Cancel·la" -#: gtk/gtkplacesview.c:1674 +#: gtk/gtkplacesview.c:1678 msgid "_Disconnect" msgstr "_Desconnecta" -#: gtk/gtkplacesview.c:1684 +#: gtk/gtkplacesview.c:1688 msgid "_Connect" msgstr "C_onnecta" -#: gtk/gtkplacesview.c:1825 +#: gtk/gtkplacesview.c:1829 msgid "Unable to get remote server location" msgstr "No s'ha pogut obtenir la ubicació del servidor remot" -#: gtk/gtkplacesview.c:2013 gtk/gtkplacesview.c:2022 +#: gtk/gtkplacesview.c:2017 gtk/gtkplacesview.c:2026 msgid "Networks" msgstr "Xarxes" -#: gtk/gtkplacesview.c:2013 gtk/gtkplacesview.c:2022 +#: gtk/gtkplacesview.c:2017 gtk/gtkplacesview.c:2026 msgid "On This Computer" msgstr "En aquest ordinador" @@ -3274,11 +3326,11 @@ msgstr "Desconnecta" msgid "Unmount" msgstr "Desmunta" -#: gtk/gtkprintbackend.c:762 +#: gtk/gtkprintbackend.c:780 msgid "Authentication" msgstr "Autenticació" -#: gtk/gtkprintbackend.c:833 +#: gtk/gtkprintbackend.c:851 msgid "_Remember password" msgstr "_Recorda la contrasenya" @@ -3387,7 +3439,7 @@ msgstr "No hi ha paper" #. Translators: this is a printer status. #: gtk/gtkprintoperation-win32.c:621 -#: modules/printbackends/cups/gtkprintbackendcups.c:2596 +#: modules/printbackends/cups/gtkprintbackendcups.c:2603 msgid "Paused" msgstr "En pausa" @@ -3455,42 +3507,42 @@ msgstr "S'està obtenint informació de la impressora…" #. * multiple pages on a sheet when printing #. #: gtk/gtkprintunixdialog.c:3119 -#: modules/printbackends/cups/gtkprintbackendcups.c:5434 +#: modules/printbackends/cups/gtkprintbackendcups.c:5441 msgid "Left to right, top to bottom" msgstr "D'esquerra a dreta, de dalt a baix" #: gtk/gtkprintunixdialog.c:3119 -#: modules/printbackends/cups/gtkprintbackendcups.c:5434 +#: modules/printbackends/cups/gtkprintbackendcups.c:5441 msgid "Left to right, bottom to top" msgstr "D'esquerra a dreta, de baix a dalt" #: gtk/gtkprintunixdialog.c:3120 -#: modules/printbackends/cups/gtkprintbackendcups.c:5435 +#: modules/printbackends/cups/gtkprintbackendcups.c:5442 msgid "Right to left, top to bottom" msgstr "De dreta a esquerra, de dalt a baix" #: gtk/gtkprintunixdialog.c:3120 -#: modules/printbackends/cups/gtkprintbackendcups.c:5435 +#: modules/printbackends/cups/gtkprintbackendcups.c:5442 msgid "Right to left, bottom to top" msgstr "De dreta a esquerra, de baix a dalt" #: gtk/gtkprintunixdialog.c:3121 -#: modules/printbackends/cups/gtkprintbackendcups.c:5436 +#: modules/printbackends/cups/gtkprintbackendcups.c:5443 msgid "Top to bottom, left to right" msgstr "De dalt a baix, d'esquerra a dreta" #: gtk/gtkprintunixdialog.c:3121 -#: modules/printbackends/cups/gtkprintbackendcups.c:5436 +#: modules/printbackends/cups/gtkprintbackendcups.c:5443 msgid "Top to bottom, right to left" msgstr "De dalt a baix, de dreta a esquerra" #: gtk/gtkprintunixdialog.c:3122 -#: modules/printbackends/cups/gtkprintbackendcups.c:5437 +#: modules/printbackends/cups/gtkprintbackendcups.c:5444 msgid "Bottom to top, left to right" msgstr "De baix a dalt, d'esquerra a dreta" #: gtk/gtkprintunixdialog.c:3122 -#: modules/printbackends/cups/gtkprintbackendcups.c:5437 +#: modules/printbackends/cups/gtkprintbackendcups.c:5444 msgid "Bottom to top, right to left" msgstr "De baix a dalt, de dreta a esquerra" @@ -4246,12 +4298,6 @@ msgstr "Font:" msgid "Reset" msgstr "Reinicia" -# Premi a qui va ficar "Per defecte:LTR. M'ha costat -# trobar en quin mòdul estava l'error. jm -#: gtk/inspector/prop-editor.c:1676 -msgid "Default" -msgstr "Per defecte" - #: gtk/inspector/prop-editor.c:1679 msgid "Theme" msgstr "Tema" @@ -4285,6 +4331,7 @@ msgid "Count" msgstr "Compte" #: gtk/inspector/resource-list.ui:130 gtk/ui/gtkfilechooserwidget.ui:223 +#: gtk/ui/gtkfontchooserwidget.ui:255 msgid "Size" msgstr "Mida" @@ -4617,6 +4664,803 @@ msgstr "Visualització" msgid "General" msgstr "General" +#: gtk/open-type-layout.h:13 +#, fuzzy +#| msgid "Accessible name" +msgctxt "OpenType layout" +msgid "Access All Alternates" +msgstr "Pot veure els anuncis de tots els grups" + +#: gtk/open-type-layout.h:14 +#, fuzzy +msgctxt "OpenType layout" +msgid "Above-base Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:15 +#, fuzzy +msgctxt "OpenType layout" +msgid "Above-base Mark Positioning" +msgstr "Qualificació base {$a}" + +#: gtk/open-type-layout.h:16 +#, fuzzy +msgctxt "OpenType layout" +msgid "Above-base Substitutions" +msgstr "Substitucions" + +#: gtk/open-type-layout.h:17 +msgctxt "OpenType layout" +msgid "Alternative Fractions" +msgstr "Fraccions alternatives" + +#: gtk/open-type-layout.h:18 +msgctxt "OpenType layout" +msgid "Akhands" +msgstr "Akhands" + +#: gtk/open-type-layout.h:19 +#, fuzzy +msgctxt "OpenType layout" +msgid "Below-base Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:20 +#, fuzzy +msgctxt "OpenType layout" +msgid "Below-base Mark Positioning" +msgstr "Qualificació base {$a}" + +#: gtk/open-type-layout.h:21 +#, fuzzy +msgctxt "OpenType layout" +msgid "Below-base Substitutions" +msgstr "Substitucions" + +#: gtk/open-type-layout.h:22 +# +msgctxt "OpenType layout" +msgid "Contextual Alternates" +msgstr "Alternatives contextuals" + +#: gtk/open-type-layout.h:23 +msgctxt "OpenType layout" +msgid "Case-Sensitive Forms" +msgstr "Distingeix entre majúscules i minúscules a les formes" + +#: gtk/open-type-layout.h:24 +msgctxt "OpenType layout" +msgid "Glyph Composition / Decomposition" +msgstr "Composició / Descomposició de gilfs" + +#: gtk/open-type-layout.h:25 +msgctxt "OpenType layout" +msgid "Conjunct Form After Ro" +msgstr "" + +#: gtk/open-type-layout.h:26 +#, fuzzy +msgctxt "OpenType layout" +msgid "Conjunct Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:27 +msgctxt "OpenType layout" +msgid "Contextual Ligatures" +msgstr "Lligadures contextuals" + +#: gtk/open-type-layout.h:28 +#, fuzzy +msgctxt "OpenType layout" +msgid "Centered CJK Punctuation" +msgstr "Puntuació i símbols CJK" + +#: gtk/open-type-layout.h:29 +#, fuzzy +msgctxt "OpenType layout" +msgid "Capital Spacing" +msgstr "Capital:" + +#: gtk/open-type-layout.h:30 +#, fuzzy +msgctxt "OpenType layout" +msgid "Contextual Swash" +msgstr "Contextuals" + +#: gtk/open-type-layout.h:31 +msgctxt "OpenType layout" +msgid "Cursive Positioning" +msgstr "Posicionament de la cursiva" + +#: gtk/open-type-layout.h:32 +#, fuzzy +msgctxt "OpenType layout" +msgid "Petite Capitals From Capitals" +msgstr "Versaletes" + +#: gtk/open-type-layout.h:33 +#, fuzzy +msgctxt "OpenType layout" +msgid "Small Capitals From Capitals" +msgstr "Versaletes" + +#: gtk/open-type-layout.h:34 +msgctxt "OpenType layout" +msgid "Distances" +msgstr "Distàncies" + +#: gtk/open-type-layout.h:35 +#, fuzzy +msgctxt "OpenType layout" +msgid "Discretionary Ligatures" +msgstr "" +"Lligadures discrecionals. Desactivat per defecte. Taula d'OpenType: «hlig»" + +#: gtk/open-type-layout.h:36 +#, fuzzy +msgctxt "OpenType layout" +msgid "Denominators" +msgstr "" +"alineant nombres i denominadors, per exemple, <emph>{alignl a}over{b+c}</" +"emph>" + +#: gtk/open-type-layout.h:37 +msgctxt "OpenType layout" +msgid "Dotless Forms" +msgstr "Formes sense punts" + +#: gtk/open-type-layout.h:38 +msgctxt "OpenType layout" +msgid "Expert Forms" +msgstr "Formes expertes" + +#: gtk/open-type-layout.h:39 +msgctxt "OpenType layout" +msgid "Final Glyph on Line Alternates" +msgstr "" + +#: gtk/open-type-layout.h:40 +msgctxt "OpenType layout" +msgid "Terminal Forms #2" +msgstr "Formes de terminal núm. 2" + +#: gtk/open-type-layout.h:41 +msgctxt "OpenType layout" +msgid "Terminal Forms #3" +msgstr "Formes de terminal núm. 3" + +#: gtk/open-type-layout.h:42 +msgctxt "OpenType layout" +msgid "Terminal Forms" +msgstr "Formes de terminal" + +#: gtk/open-type-layout.h:43 +#, fuzzy +msgctxt "OpenType layout" +msgid "Flattened accent forms" +msgstr "sobreescriu l'aplanat" + +#: gtk/open-type-layout.h:44 +msgctxt "OpenType layout" +msgid "Fractions" +msgstr "Fraccions" + +#: gtk/open-type-layout.h:45 +msgctxt "OpenType layout" +msgid "Full Widths" +msgstr "Amplada completa" + +#: gtk/open-type-layout.h:46 +msgctxt "OpenType layout" +msgid "Half Forms" +msgstr "Formes mitjanes" + +#: gtk/open-type-layout.h:47 +#, fuzzy +msgctxt "OpenType layout" +msgid "Halant Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:48 +msgctxt "OpenType layout" +msgid "Alternate Half Widths" +msgstr "Formes mitjanes alternatives" + +#: gtk/open-type-layout.h:49 +msgctxt "OpenType layout" +msgid "Historical Forms" +msgstr "Formes històriques" + +#: gtk/open-type-layout.h:50 +msgctxt "OpenType layout" +msgid "Horizontal Kana Alternates" +msgstr "Alternativa Kana horitzontal" + +#: gtk/open-type-layout.h:51 +msgctxt "OpenType layout" +msgid "Historical Ligatures" +msgstr "Lligadures històriques" + +#: gtk/open-type-layout.h:52 +msgctxt "OpenType layout" +msgid "Hangul" +msgstr "Hangul" + +#: gtk/open-type-layout.h:53 +msgctxt "OpenType layout" +msgid "Hojo Kanji Forms" +msgstr "Formes Hojo Kanji" + +#: gtk/open-type-layout.h:54 +msgctxt "OpenType layout" +msgid "Half Widths" +msgstr "Amplada mitja" + +#: gtk/open-type-layout.h:55 +msgctxt "OpenType layout" +msgid "Initial Forms" +msgstr "Formes inicials" + +#: gtk/open-type-layout.h:56 +msgctxt "OpenType layout" +msgid "Isolated Forms" +msgstr "Formes aïllades" + +#: gtk/open-type-layout.h:57 +msgctxt "OpenType layout" +msgid "Italics" +msgstr "Cursives" + +#: gtk/open-type-layout.h:58 +msgctxt "OpenType layout" +msgid "Justification Alternates" +msgstr "Alternatives de justificació" + +#: gtk/open-type-layout.h:59 +msgctxt "OpenType layout" +msgid "JIS78 Forms" +msgstr "Formes JIS78" + +#: gtk/open-type-layout.h:60 +msgctxt "OpenType layout" +msgid "JIS83 Forms" +msgstr "Formes JIS83" + +#: gtk/open-type-layout.h:61 +msgctxt "OpenType layout" +msgid "JIS90 Forms" +msgstr "Formes JIS90" + +#: gtk/open-type-layout.h:62 +msgctxt "OpenType layout" +msgid "JIS2004 Forms" +msgstr "Formes JIS2004" + +#: gtk/open-type-layout.h:63 +msgctxt "OpenType layout" +msgid "Kerning" +msgstr "Interlletratge" + +#: gtk/open-type-layout.h:64 +#| msgid "Left Bin" +msgctxt "OpenType layout" +msgid "Left Bounds" +msgstr "Límit esquerre" + +#: gtk/open-type-layout.h:65 +msgctxt "OpenType layout" +msgid "Standard Ligatures" +msgstr "Lligadures estàndards" + +#: gtk/open-type-layout.h:66 +#, fuzzy +msgctxt "OpenType layout" +msgid "Leading Jamo Forms" +msgstr "Hangul Jamo" + +#: gtk/open-type-layout.h:67 +msgctxt "OpenType layout" +msgid "Lining Figures" +msgstr "Figures lineals" + +#: gtk/open-type-layout.h:68 +msgctxt "OpenType layout" +msgid "Localized Forms" +msgstr "Formes localitzades" + +#: gtk/open-type-layout.h:69 +msgctxt "OpenType layout" +msgid "Left-to-right alternates" +msgstr "Alternatives esquerra-dreta" + +#: gtk/open-type-layout.h:70 +#, fuzzy +#| msgid "LRM _Left-to-right mark" +msgctxt "OpenType layout" +msgid "Left-to-right mirrored forms" +msgstr "() esquerre-dret - \\esquerre(..\\dret)" + +#: gtk/open-type-layout.h:71 +msgctxt "OpenType layout" +msgid "Mark Positioning" +msgstr "Posicionament de la marca" + +#: gtk/open-type-layout.h:72 +msgctxt "OpenType layout" +msgid "Medial Forms #2" +msgstr "Formes mitjanes núm. 2" + +#: gtk/open-type-layout.h:73 +msgctxt "OpenType layout" +msgid "Medial Forms" +msgstr "Formes mitjanes" + +#: gtk/open-type-layout.h:74 +msgctxt "OpenType layout" +msgid "Mathematical Greek" +msgstr "Grecs matemàtics" + +#: gtk/open-type-layout.h:75 +msgctxt "OpenType layout" +msgid "Mark to Mark Positioning" +msgstr "Posicionament marca a marca" + +#: gtk/open-type-layout.h:76 +msgctxt "OpenType layout" +msgid "Mark Positioning via Substitution" +msgstr "Posicionament de marca per substitució" + +#: gtk/open-type-layout.h:77 +msgctxt "OpenType layout" +msgid "Alternate Annotation Forms" +msgstr "Formes anotades alternatives" + +#: gtk/open-type-layout.h:78 +#, fuzzy +msgctxt "OpenType layout" +msgid "NLC Kanji Forms" +msgstr "Kanji" + +#: gtk/open-type-layout.h:79 +msgctxt "OpenType layout" +msgid "Nukta Forms" +msgstr "Formes Nukta" + +#: gtk/open-type-layout.h:80 +msgctxt "OpenType layout" +msgid "Numerators" +msgstr "Numeradors" + +#: gtk/open-type-layout.h:81 +msgctxt "OpenType layout" +msgid "Oldstyle Figures" +msgstr "Figures amb estil antic" + +#: gtk/open-type-layout.h:82 +#, fuzzy +msgctxt "OpenType layout" +msgid "Optical Bounds" +msgstr "Òptics" + +#: gtk/open-type-layout.h:83 +msgctxt "OpenType layout" +msgid "Ordinals" +msgstr "Ordinals" + +#: gtk/open-type-layout.h:84 +msgctxt "OpenType layout" +msgid "Ornaments" +msgstr "Ornaments" + +#: gtk/open-type-layout.h:85 +msgctxt "OpenType layout" +msgid "Proportional Alternate Widths" +msgstr "Amplades proporcionals alternatives" + +#: gtk/open-type-layout.h:86 +#, fuzzy +msgctxt "OpenType layout" +msgid "Petite Capitals" +msgstr "Majúscules" + +#: gtk/open-type-layout.h:87 +msgctxt "OpenType layout" +msgid "Proportional Kana" +msgstr "Kana proporcional" + +#: gtk/open-type-layout.h:88 +msgctxt "OpenType layout" +msgid "Proportional Figures" +msgstr "Figures proporcionals" + +#: gtk/open-type-layout.h:89 +msgctxt "OpenType layout" +msgid "Pre-Base Forms" +msgstr "Formes pre-base" + +#: gtk/open-type-layout.h:90 +msgctxt "OpenType layout" +msgid "Pre-base Substitutions" +msgstr "Substitucions pre-base" + +#: gtk/open-type-layout.h:91 +#, fuzzy +msgctxt "OpenType layout" +msgid "Post-base Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:92 +#, fuzzy +msgctxt "OpenType layout" +msgid "Post-base Substitutions" +msgstr "Substitucions" + +#: gtk/open-type-layout.h:93 +msgctxt "OpenType layout" +msgid "Proportional Widths" +msgstr "Amplades proporcionals" + +#: gtk/open-type-layout.h:94 +#, fuzzy +msgctxt "OpenType layout" +msgid "Quarter Widths" +msgstr "Trimestre" + +#: gtk/open-type-layout.h:95 +msgctxt "OpenType layout" +msgid "Randomize" +msgstr "Aleatoritza" + +#: gtk/open-type-layout.h:96 +#, fuzzy +msgctxt "OpenType layout" +msgid "Required Contextual Alternates" +msgstr "Contextuals" + +#: gtk/open-type-layout.h:97 +#, fuzzy +msgctxt "OpenType layout" +msgid "Rakar Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:98 +#, fuzzy +msgctxt "OpenType layout" +msgid "Required Ligatures" +msgstr "Lligadures" + +#: gtk/open-type-layout.h:99 +#, fuzzy +msgctxt "OpenType layout" +msgid "Reph Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:100 +#, fuzzy +#| msgctxt "output-bin" +#| msgid "Right Bin" +msgctxt "OpenType layout" +msgid "Right Bounds" +msgstr ": límits" + +#: gtk/open-type-layout.h:101 +#, fuzzy +#| msgid "RLM _Right-to-left mark" +msgctxt "OpenType layout" +msgid "Right-to-left alternates" +msgstr "() esquerre-dret - \\esquerre(..\\dret)" + +#: gtk/open-type-layout.h:102 +#, fuzzy +#| msgid "RLM _Right-to-left mark" +msgctxt "OpenType layout" +msgid "Right-to-left mirrored forms" +msgstr "() esquerre-dret - \\esquerre(..\\dret)" + +#: gtk/open-type-layout.h:103 +#, fuzzy +msgctxt "OpenType layout" +msgid "Ruby Notation Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:104 +#, fuzzy +msgctxt "OpenType layout" +msgid "Required Variation Alternates" +msgstr "_Variació:" + +#: gtk/open-type-layout.h:105 +msgctxt "OpenType layout" +msgid "Stylistic Alternates" +msgstr "" + +#: gtk/open-type-layout.h:106 +#, fuzzy +msgctxt "OpenType layout" +msgid "Scientific Inferiors" +msgstr "Científic" + +#: gtk/open-type-layout.h:107 +#, fuzzy +msgctxt "OpenType layout" +msgid "Optical size" +msgstr "Òptics" + +#: gtk/open-type-layout.h:108 +#, fuzzy +msgctxt "OpenType layout" +msgid "Small Capitals" +msgstr "Versaletes" + +#: gtk/open-type-layout.h:109 +#, fuzzy +msgctxt "OpenType layout" +msgid "Simplified Forms" +msgstr "Simplificat" + +#: gtk/open-type-layout.h:110 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 1" +msgstr "No s'ha pogut establir el criteri «%1»" + +#: gtk/open-type-layout.h:111 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 2" +msgstr "Defineix el preferit 2 de la llista de reproducció" + +#: gtk/open-type-layout.h:112 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 3" +msgstr "Defineix l'amplada del camí en 3:" + +#: gtk/open-type-layout.h:113 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 4" +msgstr "Defineix el preferit 4 de la llista de reproducció" + +#: gtk/open-type-layout.h:114 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 5" +msgstr "Defineix l'amplada del camí en 5:" + +#: gtk/open-type-layout.h:115 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 6" +msgstr "Defineix el preferit 6 de la llista de reproducció" + +#: gtk/open-type-layout.h:116 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 7" +msgstr "Defineix l'amplada del camí en 7:" + +#: gtk/open-type-layout.h:117 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 8" +msgstr "Defineix el preferit 8 de la llista de reproducció" + +#: gtk/open-type-layout.h:118 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 9" +msgstr "Defineix l'amplada del camí en 9:" + +#: gtk/open-type-layout.h:119 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 10" +msgstr "Defineix el preferit 10 de la llista de reproducció" + +#: gtk/open-type-layout.h:120 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 11" +msgstr "Espai de treball 11" + +#: gtk/open-type-layout.h:121 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 12" +msgstr "12" + +#: gtk/open-type-layout.h:122 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 13" +msgstr "openSUSE 13" + +#: gtk/open-type-layout.h:123 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 14" +msgstr "14 ->" + +#: gtk/open-type-layout.h:124 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 15" +msgstr "INT(15) és igual a 15" + +#: gtk/open-type-layout.h:125 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 16" +msgstr "16 ms" + +#: gtk/open-type-layout.h:126 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 17" +msgstr "Edat de 17" + +#: gtk/open-type-layout.h:127 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 18" +msgstr "Auxiliar 18" + +#: gtk/open-type-layout.h:128 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stylistic Set 19" +msgstr "Edat de 19" + +#: gtk/open-type-layout.h:129 +#, fuzzy +#| msgid "Artistic License 2.0" +msgctxt "OpenType layout" +msgid "Stylistic Set 20" +msgstr "20" + +#: gtk/open-type-layout.h:130 +msgctxt "OpenType layout" +msgid "Math script style alternates" +msgstr "" + +#: gtk/open-type-layout.h:131 +#, fuzzy +msgctxt "OpenType layout" +msgid "Stretching Glyph Decomposition" +msgstr "Estirament" + +#: gtk/open-type-layout.h:132 +#, fuzzy +#| msgid "Postscript" +msgctxt "OpenType layout" +msgid "Subscript" +msgstr "Subíndex" + +#: gtk/open-type-layout.h:133 +#, fuzzy +#| msgctxt "keyboard label" +#| msgid "Super" +msgctxt "OpenType layout" +msgid "Superscript" +msgstr "Superíndex" + +#: gtk/open-type-layout.h:134 +msgctxt "OpenType layout" +msgid "Swash" +msgstr "" + +#: gtk/open-type-layout.h:135 +#, fuzzy +msgctxt "OpenType layout" +msgid "Titling" +msgstr "Titulació" + +#: gtk/open-type-layout.h:136 +#, fuzzy +msgctxt "OpenType layout" +msgid "Trailing Jamo Forms" +msgstr "Hangul Jamo" + +#: gtk/open-type-layout.h:137 +#, fuzzy +msgctxt "OpenType layout" +msgid "Traditional Name Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:138 +#, fuzzy +msgctxt "OpenType layout" +msgid "Tabular Figures" +msgstr "Taula*" + +#: gtk/open-type-layout.h:139 +#, fuzzy +msgctxt "OpenType layout" +msgid "Traditional Forms" +msgstr "Formularis" + +#: gtk/open-type-layout.h:140 +#, fuzzy +msgctxt "OpenType layout" +msgid "Third Widths" +msgstr "Amplades" + +#: gtk/open-type-layout.h:141 +#, fuzzy +msgctxt "OpenType layout" +msgid "Unicase" +msgstr "Caixa única" + +#: gtk/open-type-layout.h:142 +#, fuzzy +msgctxt "OpenType layout" +msgid "Alternate Vertical Metrics" +msgstr "Mètrica" + +#: gtk/open-type-layout.h:143 +#, fuzzy +#| msgid "Dark Variant" +msgctxt "OpenType layout" +msgid "Vattu Variants" +msgstr "_Variants:" + +#: gtk/open-type-layout.h:144 +#, fuzzy +#| msgctxt "sizegroup mode" +#| msgid "Vertical" +msgctxt "OpenType layout" +msgid "Vertical Writing" +msgstr "Vertical cap endins" + +#: gtk/open-type-layout.h:145 +msgctxt "OpenType layout" +msgid "Alternate Vertical Half Metrics" +msgstr "" + +#: gtk/open-type-layout.h:146 +#, fuzzy +msgctxt "OpenType layout" +msgid "Vowel Jamo Forms" +msgstr "És una vocal?" + +#: gtk/open-type-layout.h:147 +#, fuzzy +msgctxt "OpenType layout" +msgid "Vertical Kana Alternates" +msgstr "Kana (suplement)" + +#: gtk/open-type-layout.h:148 +#, fuzzy +#| msgctxt "sizegroup mode" +#| msgid "Vertical" +msgctxt "OpenType layout" +msgid "Vertical Kerning" +msgstr "_Interlletratge" + +#: gtk/open-type-layout.h:149 +msgctxt "OpenType layout" +msgid "Proportional Alternate Vertical Metrics" +msgstr "" + +#: gtk/open-type-layout.h:150 +#, fuzzy +msgctxt "OpenType layout" +msgid "Vertical Alternates and Rotation" +msgstr "Gir" + +#: gtk/open-type-layout.h:151 +#, fuzzy +msgctxt "OpenType layout" +msgid "Vertical Alternates for Rotation" +msgstr "Gir" + +#: gtk/open-type-layout.h:152 +#, fuzzy +msgctxt "OpenType layout" +msgid "Slashed Zero" +msgstr "Zero barrat" + #: gtk/paper_names_offsets.c:4 msgctxt "paper size" msgid "asme_f" @@ -5528,6 +6372,707 @@ msgctxt "paper size" msgid "ROC 8k" msgstr "ROC 8k" +#: gtk/script-names.c:16 +msgctxt "Script" +msgid "Arabic" +msgstr "Àrab" + +#: gtk/script-names.c:17 +msgctxt "Script" +msgid "Armenian" +msgstr "Armeni" + +#: gtk/script-names.c:18 +msgctxt "Script" +msgid "Bengali" +msgstr "Bengalí" + +#: gtk/script-names.c:19 +msgctxt "Script" +msgid "Bopomofo" +msgstr "Bopomofo" + +#: gtk/script-names.c:20 +msgctxt "Script" +msgid "Cherokee" +msgstr "Cherokee" + +#: gtk/script-names.c:21 +msgctxt "Script" +msgid "Coptic" +msgstr "Copte" + +#: gtk/script-names.c:22 +msgctxt "Script" +msgid "Cyrillic" +msgstr "Ciríl·lic" + +#: gtk/script-names.c:23 +msgctxt "Script" +msgid "Deseret" +msgstr "Deseret" + +#: gtk/script-names.c:24 +msgctxt "Script" +msgid "Devanagari" +msgstr "Devanagari" + +#: gtk/script-names.c:25 +msgctxt "Script" +msgid "Ethiopic" +msgstr "Etiòpic" + +#: gtk/script-names.c:26 +msgctxt "Script" +msgid "Georgian" +msgstr "Georgià" + +#: gtk/script-names.c:27 +msgctxt "Script" +msgid "Gothic" +msgstr "Gòtic" + +#: gtk/script-names.c:28 +msgctxt "Script" +msgid "Greek" +msgstr "Grec" + +#: gtk/script-names.c:29 +msgctxt "Script" +msgid "Gujarati" +msgstr "Gujarati" + +#: gtk/script-names.c:30 +msgctxt "Script" +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: gtk/script-names.c:31 +msgctxt "Script" +msgid "Han" +msgstr "Han" + +#: gtk/script-names.c:32 +msgctxt "Script" +msgid "Hangul" +msgstr "Hangul" + +#: gtk/script-names.c:33 +msgctxt "Script" +msgid "Hebrew" +msgstr "Hebreu" + +#: gtk/script-names.c:34 +msgctxt "Script" +msgid "Hiragana" +msgstr "Hiragana" + +#: gtk/script-names.c:35 +msgctxt "Script" +msgid "Kannada" +msgstr "Kanarès" + +#: gtk/script-names.c:36 +msgctxt "Script" +msgid "Katakana" +msgstr "Katakana" + +#: gtk/script-names.c:37 +msgctxt "Script" +msgid "Khmer" +msgstr "Khmer" + +#: gtk/script-names.c:38 +msgctxt "Script" +msgid "Lao" +msgstr "Laosià" + +#: gtk/script-names.c:39 +msgctxt "Script" +msgid "Latin" +msgstr "Llatí" + +#: gtk/script-names.c:40 +msgctxt "Script" +msgid "Malayalam" +msgstr "Malaiàlam" + +#: gtk/script-names.c:41 +msgctxt "Script" +msgid "Mongolian" +msgstr "Mongol" + +#: gtk/script-names.c:42 +msgctxt "Script" +msgid "Myanmar" +msgstr "Myanmar" + +#: gtk/script-names.c:43 +msgctxt "Script" +msgid "Ogham" +msgstr "Ogham" + +#: gtk/script-names.c:44 +msgctxt "Script" +msgid "Old Italic" +msgstr "Cursiva antiga" + +#: gtk/script-names.c:45 +msgctxt "Script" +msgid "Oriya" +msgstr "Oriya" + +#: gtk/script-names.c:46 +msgctxt "Script" +msgid "Runic" +msgstr "Rúnic" + +#: gtk/script-names.c:47 +msgctxt "Script" +msgid "Sinhala" +msgstr "Singalès" + +#: gtk/script-names.c:48 +msgctxt "Script" +msgid "Syriac" +msgstr "Siríac" + +#: gtk/script-names.c:49 +msgctxt "Script" +msgid "Tamil" +msgstr "Tàmil" + +#: gtk/script-names.c:50 +msgctxt "Script" +msgid "Telugu" +msgstr "Telugu" + +#: gtk/script-names.c:51 +msgctxt "Script" +msgid "Thaana" +msgstr "Thaana" + +#: gtk/script-names.c:52 +msgctxt "Script" +msgid "Thai" +msgstr "Tailandès" + +#: gtk/script-names.c:53 +msgctxt "Script" +msgid "Tibetan" +msgstr "Tibetà" + +#: gtk/script-names.c:54 +msgctxt "Script" +msgid "Canadian Aboriginal" +msgstr "Aborigen canadenc" + +#: gtk/script-names.c:55 +msgctxt "Script" +msgid "Yi" +msgstr "Yi" + +#: gtk/script-names.c:56 +msgctxt "Script" +msgid "Tagalog" +msgstr "Tagàlog" + +#: gtk/script-names.c:57 +msgctxt "Script" +msgid "Hanunoo" +msgstr "Hanunoo" + +#: gtk/script-names.c:58 +msgctxt "Script" +msgid "Buhid" +msgstr "Bugui" + +#: gtk/script-names.c:59 +msgctxt "Script" +msgid "Tagbanwa" +msgstr "Tagbanwa" + +#: gtk/script-names.c:60 +msgctxt "Script" +msgid "Braille" +msgstr "Braille" + +#: gtk/script-names.c:61 +msgctxt "Script" +msgid "Cypriot" +msgstr "Xipriota" + +#: gtk/script-names.c:62 +msgctxt "Script" +msgid "Limbu" +msgstr "Limbu" + +#: gtk/script-names.c:63 +msgctxt "Script" +msgid "Osmanya" +msgstr "Osmanli" + +#: gtk/script-names.c:64 +msgctxt "Script" +msgid "Shavian" +msgstr "Alfabet Shawn" + +#: gtk/script-names.c:65 +msgctxt "Script" +msgid "Linear B" +msgstr "Lineal B" + +#: gtk/script-names.c:66 +msgctxt "Script" +msgid "Tai Le" +msgstr "Tai Le" + +#: gtk/script-names.c:67 +msgctxt "Script" +msgid "Ugaritic" +msgstr "Ugarític" + +#: gtk/script-names.c:68 +msgctxt "Script" +msgid "New Tai Lue" +msgstr "Tai Lue nou" + +#: gtk/script-names.c:69 +msgctxt "Script" +msgid "Buginese" +msgstr "Bugui" + +#: gtk/script-names.c:70 +msgctxt "Script" +msgid "Glagolitic" +msgstr "Glagolític" + +#: gtk/script-names.c:71 +msgctxt "Script" +msgid "Tifinagh" +msgstr "Tifinagh" + +#: gtk/script-names.c:72 +msgctxt "Script" +msgid "Syloti Nagri" +msgstr "Syloti Nagri" + +#: gtk/script-names.c:73 +msgctxt "Script" +msgid "Old Persian" +msgstr "Persa antic" + +#: gtk/script-names.c:74 +msgctxt "Script" +msgid "Kharoshthi" +msgstr "Kharosthi" + +#: gtk/script-names.c:75 +msgctxt "Script" +msgid "Unknown" +msgstr "Desconegut" + +#: gtk/script-names.c:76 +msgctxt "Script" +msgid "Balinese" +msgstr "Balinès" + +#: gtk/script-names.c:77 +msgctxt "Script" +msgid "Cuneiform" +msgstr "Cuneïforme" + +#: gtk/script-names.c:78 +msgctxt "Script" +msgid "Phoenician" +msgstr "Fenici" + +#: gtk/script-names.c:79 +msgctxt "Script" +msgid "Phags-pa" +msgstr "Phags-pa" + +#: gtk/script-names.c:80 +msgctxt "Script" +msgid "N'Ko" +msgstr "Nko" + +#: gtk/script-names.c:81 +msgctxt "Script" +msgid "Kayah Li" +msgstr "Kayah Li" + +#: gtk/script-names.c:82 +msgctxt "Script" +msgid "Lepcha" +msgstr "Lepcha" + +#: gtk/script-names.c:83 +msgctxt "Script" +msgid "Rejang" +msgstr "Rejang" + +#: gtk/script-names.c:84 +msgctxt "Script" +msgid "Sundanese" +msgstr "Sundanès" + +#: gtk/script-names.c:85 +msgctxt "Script" +msgid "Saurashtra" +msgstr "Saurashtra" + +#: gtk/script-names.c:86 +msgctxt "Script" +msgid "Cham" +msgstr "Cham" + +#: gtk/script-names.c:87 +msgctxt "Script" +msgid "Ol Chiki" +msgstr "Ol Chiki" + +#: gtk/script-names.c:88 +msgctxt "Script" +msgid "Vai" +msgstr "Vai" + +#: gtk/script-names.c:89 +msgctxt "Script" +msgid "Carian" +msgstr "Caria" + +#: gtk/script-names.c:90 +msgctxt "Script" +msgid "Lycian" +msgstr "Lici" + +#: gtk/script-names.c:91 +msgctxt "Script" +msgid "Lydian" +msgstr "Lidi" + +#: gtk/script-names.c:92 +msgctxt "Script" +msgid "Avestan" +msgstr "avèstic" + +#: gtk/script-names.c:93 +msgctxt "Script" +msgid "Bamum" +msgstr "Bamum" + +#: gtk/script-names.c:94 +msgctxt "Script" +msgid "Egyptian Hieroglpyhs" +msgstr "Jeroglífics egipcis" + +#: gtk/script-names.c:95 +msgctxt "Script" +msgid "Imperial Aramaic" +msgstr "Arameu imperial" + +#: gtk/script-names.c:96 +msgctxt "Script" +msgid "Inscriptional Pahlavi" +msgstr "Pahlavi d'inscripció" + +#: gtk/script-names.c:97 +msgctxt "Script" +msgid "Inscriptional Parthian" +msgstr "Part d'inscripció" + +#: gtk/script-names.c:98 +msgctxt "Script" +msgid "Javanese" +msgstr "Javanès" + +#: gtk/script-names.c:99 +msgctxt "Script" +msgid "Kaithi" +msgstr "kaithi" + +#: gtk/script-names.c:100 +msgctxt "Script" +msgid "Lisu" +msgstr "Lisu" + +#: gtk/script-names.c:101 +msgctxt "Script" +msgid "Meetei Mayek" +msgstr "Meetei mayek" + +#: gtk/script-names.c:102 +msgctxt "Script" +msgid "Old South Arabian" +msgstr "Àrab del sud antic" + +#: gtk/script-names.c:103 +msgctxt "Script" +msgid "Old Turkic" +msgstr "Turc antic" + +#: gtk/script-names.c:104 +msgctxt "Script" +msgid "Samaritan" +msgstr "Samarità" + +#: gtk/script-names.c:105 +msgctxt "Script" +msgid "Tai Tham" +msgstr "Tai Tham" + +#: gtk/script-names.c:106 +msgctxt "Script" +msgid "Tai Viet" +msgstr "Tai Viet" + +#: gtk/script-names.c:107 +msgctxt "Script" +msgid "Batak" +msgstr "Batak" + +#: gtk/script-names.c:108 +msgctxt "Script" +msgid "Brahmi" +msgstr "Brahmi" + +#: gtk/script-names.c:109 +msgctxt "Script" +msgid "Mandaic" +msgstr "Mandaic" + +#: gtk/script-names.c:110 +msgctxt "Script" +msgid "Chakma" +msgstr "Chakma" + +#: gtk/script-names.c:111 +msgctxt "Script" +msgid "Meroitic Cursive" +msgstr "Meroític cursiva" + +#: gtk/script-names.c:112 +msgctxt "Script" +msgid "Meroitic Hieroglyphs" +msgstr "Jeroglífics meroítics" + +#: gtk/script-names.c:113 +msgctxt "Script" +msgid "Miao" +msgstr "Miao" + +#: gtk/script-names.c:114 +msgctxt "Script" +msgid "Sharada" +msgstr "Sharada" + +#: gtk/script-names.c:115 +msgctxt "Script" +msgid "Sora Sompeng" +msgstr "Sora Sompeng" + +#: gtk/script-names.c:116 +msgctxt "Script" +msgid "Takri" +msgstr "Takri" + +#: gtk/script-names.c:117 +msgctxt "Script" +msgid "Bassa" +msgstr "Bassa" + +#: gtk/script-names.c:118 +msgctxt "Script" +msgid "Caucasian Albanian" +msgstr "Albanès caucàsic" + +#: gtk/script-names.c:119 +msgctxt "Script" +msgid "Duployan" +msgstr "Duployan" + +#: gtk/script-names.c:120 +msgctxt "Script" +msgid "Elbasan" +msgstr "Elbasan" + +#: gtk/script-names.c:121 +msgctxt "Script" +msgid "Grantha" +msgstr "Grantha" + +#: gtk/script-names.c:122 +msgctxt "Script" +msgid "Khojki" +msgstr "Khojki" + +#: gtk/script-names.c:123 +msgctxt "Script" +msgid "Khudawadi, Sindhi" +msgstr "Khudawadi, Sindhi" + +#: gtk/script-names.c:124 +msgctxt "Script" +msgid "Linear A" +msgstr "Lineal A" + +#: gtk/script-names.c:125 +msgctxt "Script" +msgid "Mahajani" +msgstr "Mahajani" + +#: gtk/script-names.c:126 +#, fuzzy +msgctxt "Script" +msgid "Manichaean" +msgstr "Maniquees" + +#: gtk/script-names.c:127 +msgctxt "Script" +msgid "Mende Kikakui" +msgstr "Mende Kikakui" + +#: gtk/script-names.c:128 +msgctxt "Script" +msgid "Modi" +msgstr "Modi" + +#: gtk/script-names.c:129 +msgctxt "Script" +msgid "Mro" +msgstr "Mro" + +#: gtk/script-names.c:130 +msgctxt "Script" +msgid "Nabataean" +msgstr "Nabateu" + +#: gtk/script-names.c:131 +msgctxt "Script" +msgid "Old North Arabian" +msgstr "Àrab del nord antic" + +#: gtk/script-names.c:132 +msgctxt "Script" +msgid "Old Permic" +msgstr "Pèrmic antic" + +#: gtk/script-names.c:133 +msgctxt "Script" +msgid "Pahawh Hmong" +msgstr "Pahawh Hmong" + +#: gtk/script-names.c:134 +msgctxt "Script" +msgid "Palmyrene" +msgstr "Palmyrene" + +#: gtk/script-names.c:135 +msgctxt "Script" +msgid "Pau Cin Hau" +msgstr "Pau Cin Hau" + +#: gtk/script-names.c:136 +msgctxt "Script" +msgid "Psalter Pahlavi" +msgstr "Inscripcions Pahlavi" + +#: gtk/script-names.c:137 +msgctxt "Script" +msgid "Siddham" +msgstr "Siddham" + +#: gtk/script-names.c:138 +msgctxt "Script" +msgid "Tirhuta" +msgstr "Tirhuta" + +#: gtk/script-names.c:139 +msgctxt "Script" +msgid "Warang Citi" +msgstr "Warang Citi" + +#: gtk/script-names.c:140 +msgctxt "Script" +msgid "Ahom" +msgstr "" + +#: gtk/script-names.c:141 +msgctxt "Script" +msgid "Anatolian Hieroglyphs" +msgstr "Jeroglífics antòlics" + +#: gtk/script-names.c:142 +msgctxt "Script" +msgid "Hatran" +msgstr "Hatran" + +#: gtk/script-names.c:143 +msgctxt "Script" +msgid "Multani" +msgstr "Multani" + +#: gtk/script-names.c:144 +msgctxt "Script" +msgid "Old Hungarian" +msgstr "Hongarès antic" + +#: gtk/script-names.c:145 +msgctxt "Script" +msgid "Signwriting" +msgstr "Lengua de signes" + +#: gtk/script-names.c:146 +msgctxt "Script" +msgid "Adlam" +msgstr "" + +#: gtk/script-names.c:147 +msgctxt "Script" +msgid "Bhaiksuki" +msgstr "Bhaiksuki" + +#: gtk/script-names.c:148 +msgctxt "Script" +msgid "Marchen" +msgstr "Marchen" + +#: gtk/script-names.c:149 +msgctxt "Script" +msgid "Newa" +msgstr "Newa" + +#: gtk/script-names.c:150 +msgctxt "Script" +msgid "Osage" +msgstr "Osage" + +#: gtk/script-names.c:151 +msgctxt "Script" +msgid "Tangut" +msgstr "Tangut" + +#: gtk/script-names.c:152 +msgctxt "Script" +msgid "Masaram Gondi" +msgstr "Masaram Gondi" + +#: gtk/script-names.c:153 +msgctxt "Script" +msgid "Nushu" +msgstr "Nushu" + +#: gtk/script-names.c:154 +msgctxt "Script" +msgid "Soyombo" +msgstr "Soyombo" + +#: gtk/script-names.c:155 +msgctxt "Script" +msgid "Zanabazar Square" +msgstr "Quadrat de Zanabazar" + #: gtk/ui/gtkaboutdialog.ui:133 msgid "About" msgstr "Quant a" @@ -5693,19 +7238,19 @@ msgstr "_Crea" msgid "Select Font" msgstr "Seleccioneu el tipus de lletra" -#: gtk/ui/gtkfontchooserwidget.ui:50 +#: gtk/ui/gtkfontchooserwidget.ui:53 msgid "Search font name" msgstr "Cerca el nom de la lletra" -#: gtk/ui/gtkfontchooserwidget.ui:98 +#: gtk/ui/gtkfontchooserwidget.ui:101 msgid "Font Family" msgstr "_Família del tipus de lletra" -#: gtk/ui/gtkfontchooserwidget.ui:120 +#: gtk/ui/gtkfontchooserwidget.ui:123 gtk/ui/gtkfontchooserwidget.ui:242 msgid "Preview text" msgstr "Text previsualitzat" -#: gtk/ui/gtkfontchooserwidget.ui:187 +#: gtk/ui/gtkfontchooserwidget.ui:192 msgid "No Fonts Found" msgstr "No s'ha trobat cap tipus de lletra" @@ -6231,7 +7776,7 @@ msgstr "Tailandès-Lao" #: modules/input/imti-er.c:451 msgctxt "input method menu" msgid "Tigrigna-Eritrean (EZ+)" -msgstr "Tigrinya-Eritreà (EZ+)" +msgstr "Tigrinya-Eritrea (EZ+)" #. ID #: modules/input/imti-et.c:451 @@ -6246,10 +7791,10 @@ msgid "Vietnamese (VIQR)" msgstr "Vietnamita (VIQR)" #. ID -#: modules/input/imwayland.c:81 +#: modules/input/imwayland.c:82 msgctxt "input method menu" msgid "Wayland" -msgstr "" +msgstr "Wayland" #. ID #: modules/input/imxim.c:26 @@ -6282,107 +7827,107 @@ msgstr "Latent" msgid "Pages per _sheet:" msgstr "Pàgines per _full:" -#: modules/printbackends/cups/gtkprintbackendcups.c:1106 -#: modules/printbackends/cups/gtkprintbackendcups.c:1415 +#: modules/printbackends/cups/gtkprintbackendcups.c:1113 +#: modules/printbackends/cups/gtkprintbackendcups.c:1422 msgid "Username:" msgstr "Nom d'usuari:" -#: modules/printbackends/cups/gtkprintbackendcups.c:1107 -#: modules/printbackends/cups/gtkprintbackendcups.c:1424 +#: modules/printbackends/cups/gtkprintbackendcups.c:1114 +#: modules/printbackends/cups/gtkprintbackendcups.c:1431 msgid "Password:" msgstr "Contrasenya:" -#: modules/printbackends/cups/gtkprintbackendcups.c:1146 -#: modules/printbackends/cups/gtkprintbackendcups.c:1437 +#: modules/printbackends/cups/gtkprintbackendcups.c:1153 +#: modules/printbackends/cups/gtkprintbackendcups.c:1444 #, c-format msgid "Authentication is required to print document “%s” on printer %s" msgstr "Cal autenticació per imprimir el document «%s» a la impressora %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1148 +#: modules/printbackends/cups/gtkprintbackendcups.c:1155 #, c-format msgid "Authentication is required to print a document on %s" msgstr "Cal autenticació per imprimir un document a %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1152 +#: modules/printbackends/cups/gtkprintbackendcups.c:1159 #, c-format msgid "Authentication is required to get attributes of job “%s”" msgstr "Cal autenticació per obtenir els atributs de la tasca «%s»" -#: modules/printbackends/cups/gtkprintbackendcups.c:1154 +#: modules/printbackends/cups/gtkprintbackendcups.c:1161 msgid "Authentication is required to get attributes of a job" msgstr "Cal autenticació per obtenir els atributs d'una tasca" -#: modules/printbackends/cups/gtkprintbackendcups.c:1158 +#: modules/printbackends/cups/gtkprintbackendcups.c:1165 #, c-format msgid "Authentication is required to get attributes of printer %s" msgstr "Cal autenticació per obtenir els atributs de la impressora %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1160 +#: modules/printbackends/cups/gtkprintbackendcups.c:1167 msgid "Authentication is required to get attributes of a printer" msgstr "Cal autenticació per obtenir els atributs d'una impressora" -#: modules/printbackends/cups/gtkprintbackendcups.c:1163 +#: modules/printbackends/cups/gtkprintbackendcups.c:1170 #, c-format msgid "Authentication is required to get default printer of %s" msgstr "Cal autenticació per obtenir la impressora per defecte de %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1166 +#: modules/printbackends/cups/gtkprintbackendcups.c:1173 #, c-format msgid "Authentication is required to get printers from %s" msgstr "Cal autenticació per obtenir les impressores de %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1171 +#: modules/printbackends/cups/gtkprintbackendcups.c:1178 #, c-format msgid "Authentication is required to get a file from %s" msgstr "Cal autenticació per obtenir un fitxer de %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1173 +#: modules/printbackends/cups/gtkprintbackendcups.c:1180 #, c-format msgid "Authentication is required on %s" msgstr "Cal autenticació a %s" -#: modules/printbackends/cups/gtkprintbackendcups.c:1409 +#: modules/printbackends/cups/gtkprintbackendcups.c:1416 msgid "Domain:" msgstr "Domini:" -#: modules/printbackends/cups/gtkprintbackendcups.c:1439 +#: modules/printbackends/cups/gtkprintbackendcups.c:1446 #, c-format msgid "Authentication is required to print document “%s”" msgstr "Cal autenticar-se per imprimir un document a «%s»" -#: modules/printbackends/cups/gtkprintbackendcups.c:1444 +#: modules/printbackends/cups/gtkprintbackendcups.c:1451 #, c-format msgid "Authentication is required to print this document on printer %s" msgstr "Cal autenticar-se per imprimir aquest document a la impressora «%s»" -#: modules/printbackends/cups/gtkprintbackendcups.c:1446 +#: modules/printbackends/cups/gtkprintbackendcups.c:1453 msgid "Authentication is required to print this document" msgstr "Cal autenticar-se per imprimir aquest document" -#: modules/printbackends/cups/gtkprintbackendcups.c:2525 +#: modules/printbackends/cups/gtkprintbackendcups.c:2532 #, c-format msgid "Printer “%s” is low on toner." msgstr "El nivell del tòner de la impressora «%s» és baix." -#: modules/printbackends/cups/gtkprintbackendcups.c:2529 +#: modules/printbackends/cups/gtkprintbackendcups.c:2536 #, c-format msgid "Printer “%s” has no toner left." msgstr "La impressora «%s» s'ha quedat sense tòner." #. Translators: "Developer" like on photo development context -#: modules/printbackends/cups/gtkprintbackendcups.c:2534 +#: modules/printbackends/cups/gtkprintbackendcups.c:2541 #, c-format msgid "Printer “%s” is low on developer." msgstr "El nivell del revelador de la impressora «%s» és baix." #. Translators: "Developer" like on photo development context -#: modules/printbackends/cups/gtkprintbackendcups.c:2539 +#: modules/printbackends/cups/gtkprintbackendcups.c:2546 #, c-format msgid "Printer “%s” is out of developer." msgstr "La impressora «%s» s'ha quedat sense revelador." #. Translators: "marker" is one color bin of the printer -#: modules/printbackends/cups/gtkprintbackendcups.c:2544 +#: modules/printbackends/cups/gtkprintbackendcups.c:2551 #, c-format msgid "Printer “%s” is low on at least one marker supply." msgstr "" @@ -6390,334 +7935,334 @@ msgstr "" "baix." #. Translators: "marker" is one color bin of the printer -#: modules/printbackends/cups/gtkprintbackendcups.c:2549 +#: modules/printbackends/cups/gtkprintbackendcups.c:2556 #, c-format msgid "Printer “%s” is out of at least one marker supply." msgstr "" "La impressora «%s» s'ha quedat sense tinta en almenys un dels contenidors de " "color." -#: modules/printbackends/cups/gtkprintbackendcups.c:2553 +#: modules/printbackends/cups/gtkprintbackendcups.c:2560 #, c-format msgid "The cover is open on printer “%s”." msgstr "La tapa de la impressora «%s» és oberta." -#: modules/printbackends/cups/gtkprintbackendcups.c:2557 +#: modules/printbackends/cups/gtkprintbackendcups.c:2564 #, c-format msgid "The door is open on printer “%s”." msgstr "La porta de la impressora «%s» és oberta." -#: modules/printbackends/cups/gtkprintbackendcups.c:2561 +#: modules/printbackends/cups/gtkprintbackendcups.c:2568 #, c-format msgid "Printer “%s” is low on paper." msgstr "El nivell del paper de la impressora «%s» és baix." -#: modules/printbackends/cups/gtkprintbackendcups.c:2565 +#: modules/printbackends/cups/gtkprintbackendcups.c:2572 #, c-format msgid "Printer “%s” is out of paper." msgstr "La impressora «%s» s'ha quedat sense paper." -#: modules/printbackends/cups/gtkprintbackendcups.c:2569 +#: modules/printbackends/cups/gtkprintbackendcups.c:2576 #, c-format msgid "Printer “%s” is currently offline." msgstr "La impressora «%s» no està en línia." -#: modules/printbackends/cups/gtkprintbackendcups.c:2573 +#: modules/printbackends/cups/gtkprintbackendcups.c:2580 #, c-format msgid "There is a problem on printer “%s”." msgstr "Hi ha un problema a la impressora «%s»." #. Translators: this is a printer status. -#: modules/printbackends/cups/gtkprintbackendcups.c:2593 +#: modules/printbackends/cups/gtkprintbackendcups.c:2600 msgid "Paused; Rejecting Jobs" msgstr "En pausa; es refusen les tasques" #. Translators: this is a printer status. -#: modules/printbackends/cups/gtkprintbackendcups.c:2599 +#: modules/printbackends/cups/gtkprintbackendcups.c:2606 msgid "Rejecting Jobs" msgstr "Es refusen les tasques" #. Translators: this string connects multiple printer states together. -#: modules/printbackends/cups/gtkprintbackendcups.c:2640 +#: modules/printbackends/cups/gtkprintbackendcups.c:2647 msgid "; " msgstr ", " -#: modules/printbackends/cups/gtkprintbackendcups.c:4380 -#: modules/printbackends/cups/gtkprintbackendcups.c:4447 +#: modules/printbackends/cups/gtkprintbackendcups.c:4387 +#: modules/printbackends/cups/gtkprintbackendcups.c:4454 msgctxt "printing option" msgid "Two Sided" msgstr "Doble cara" -#: modules/printbackends/cups/gtkprintbackendcups.c:4381 +#: modules/printbackends/cups/gtkprintbackendcups.c:4388 msgctxt "printing option" msgid "Paper Type" msgstr "Tipus de paper" -#: modules/printbackends/cups/gtkprintbackendcups.c:4382 +#: modules/printbackends/cups/gtkprintbackendcups.c:4389 msgctxt "printing option" msgid "Paper Source" msgstr "Font del paper" -#: modules/printbackends/cups/gtkprintbackendcups.c:4383 -#: modules/printbackends/cups/gtkprintbackendcups.c:4448 +#: modules/printbackends/cups/gtkprintbackendcups.c:4390 +#: modules/printbackends/cups/gtkprintbackendcups.c:4455 msgctxt "printing option" msgid "Output Tray" msgstr "Safata de sortida" -#: modules/printbackends/cups/gtkprintbackendcups.c:4384 +#: modules/printbackends/cups/gtkprintbackendcups.c:4391 msgctxt "printing option" msgid "Resolution" msgstr "Resolució" -#: modules/printbackends/cups/gtkprintbackendcups.c:4385 +#: modules/printbackends/cups/gtkprintbackendcups.c:4392 msgctxt "printing option" msgid "GhostScript pre-filtering" msgstr "Filtrat previ del GhostScript" -#: modules/printbackends/cups/gtkprintbackendcups.c:4394 +#: modules/printbackends/cups/gtkprintbackendcups.c:4401 msgctxt "printing option value" msgid "One Sided" msgstr "Una cara" #. Translators: this is an option of "Two Sided" -#: modules/printbackends/cups/gtkprintbackendcups.c:4396 +#: modules/printbackends/cups/gtkprintbackendcups.c:4403 msgctxt "printing option value" msgid "Long Edge (Standard)" msgstr "Cantó llarg (estàndard)" #. Translators: this is an option of "Two Sided" -#: modules/printbackends/cups/gtkprintbackendcups.c:4398 +#: modules/printbackends/cups/gtkprintbackendcups.c:4405 msgctxt "printing option value" msgid "Short Edge (Flip)" msgstr "Cantó curt (capgirat)" #. Translators: this is an option of "Paper Source" -#: modules/printbackends/cups/gtkprintbackendcups.c:4400 -#: modules/printbackends/cups/gtkprintbackendcups.c:4402 -#: modules/printbackends/cups/gtkprintbackendcups.c:4410 +#: modules/printbackends/cups/gtkprintbackendcups.c:4407 +#: modules/printbackends/cups/gtkprintbackendcups.c:4409 +#: modules/printbackends/cups/gtkprintbackendcups.c:4417 msgctxt "printing option value" msgid "Auto Select" msgstr "Selecció automàtica" #. Translators: this is an option of "Paper Source" #. Translators: this is an option of "Resolution" -#: modules/printbackends/cups/gtkprintbackendcups.c:4404 -#: modules/printbackends/cups/gtkprintbackendcups.c:4406 -#: modules/printbackends/cups/gtkprintbackendcups.c:4408 -#: modules/printbackends/cups/gtkprintbackendcups.c:4412 +#: modules/printbackends/cups/gtkprintbackendcups.c:4411 +#: modules/printbackends/cups/gtkprintbackendcups.c:4413 +#: modules/printbackends/cups/gtkprintbackendcups.c:4415 +#: modules/printbackends/cups/gtkprintbackendcups.c:4419 msgctxt "printing option value" msgid "Printer Default" msgstr "Per defecte de la impressora" #. Translators: this is an option of "GhostScript" -#: modules/printbackends/cups/gtkprintbackendcups.c:4414 +#: modules/printbackends/cups/gtkprintbackendcups.c:4421 msgctxt "printing option value" msgid "Embed GhostScript fonts only" msgstr "Incrusta només els tipus de lletra GhostScript" #. Translators: this is an option of "GhostScript" -#: modules/printbackends/cups/gtkprintbackendcups.c:4416 +#: modules/printbackends/cups/gtkprintbackendcups.c:4423 msgctxt "printing option value" msgid "Convert to PS level 1" msgstr "Converteix a PS nivell 1" #. Translators: this is an option of "GhostScript" -#: modules/printbackends/cups/gtkprintbackendcups.c:4418 +#: modules/printbackends/cups/gtkprintbackendcups.c:4425 msgctxt "printing option value" msgid "Convert to PS level 2" msgstr "Converteix a PS nivell 2" #. Translators: this is an option of "GhostScript" -#: modules/printbackends/cups/gtkprintbackendcups.c:4420 +#: modules/printbackends/cups/gtkprintbackendcups.c:4427 msgctxt "printing option value" msgid "No pre-filtering" msgstr "Sense filtratge previ" #. Translators: "Miscellaneous" is the label for a button, that opens #. up an extra panel of settings in a print dialog. -#: modules/printbackends/cups/gtkprintbackendcups.c:4429 +#: modules/printbackends/cups/gtkprintbackendcups.c:4436 msgctxt "printing option group" msgid "Miscellaneous" msgstr "Miscel·lània" -#: modules/printbackends/cups/gtkprintbackendcups.c:4456 +#: modules/printbackends/cups/gtkprintbackendcups.c:4463 msgctxt "sides" msgid "One Sided" msgstr "Una cara" #. Translators: this is an option of "Two Sided" -#: modules/printbackends/cups/gtkprintbackendcups.c:4458 +#: modules/printbackends/cups/gtkprintbackendcups.c:4465 msgctxt "sides" msgid "Long Edge (Standard)" msgstr "Cantó llarg (estàndard)" #. Translators: this is an option of "Two Sided" -#: modules/printbackends/cups/gtkprintbackendcups.c:4460 +#: modules/printbackends/cups/gtkprintbackendcups.c:4467 msgctxt "sides" msgid "Short Edge (Flip)" msgstr "Cantó curt (capgirat)" #. Translators: Top output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4463 +#: modules/printbackends/cups/gtkprintbackendcups.c:4470 msgctxt "output-bin" msgid "Top Bin" msgstr "Safata superior" #. Translators: Middle output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4465 +#: modules/printbackends/cups/gtkprintbackendcups.c:4472 msgctxt "output-bin" msgid "Middle Bin" msgstr "Safata del mig" #. Translators: Bottom output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4467 +#: modules/printbackends/cups/gtkprintbackendcups.c:4474 msgctxt "output-bin" msgid "Bottom Bin" msgstr "Safata inferior" #. Translators: Side output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4469 +#: modules/printbackends/cups/gtkprintbackendcups.c:4476 msgctxt "output-bin" msgid "Side Bin" msgstr "Safata lateral" #. Translators: Left output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4471 +#: modules/printbackends/cups/gtkprintbackendcups.c:4478 msgctxt "output-bin" msgid "Left Bin" msgstr "Safata esquerra" #. Translators: Right output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4473 +#: modules/printbackends/cups/gtkprintbackendcups.c:4480 msgctxt "output-bin" msgid "Right Bin" msgstr "Safata dreta" #. Translators: Center output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4475 +#: modules/printbackends/cups/gtkprintbackendcups.c:4482 msgctxt "output-bin" msgid "Center Bin" msgstr "Safata central" #. Translators: Rear output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4477 +#: modules/printbackends/cups/gtkprintbackendcups.c:4484 msgctxt "output-bin" msgid "Rear Bin" msgstr "Safata posterior" #. Translators: Output bin where one sided output is oriented in the face-up position -#: modules/printbackends/cups/gtkprintbackendcups.c:4479 +#: modules/printbackends/cups/gtkprintbackendcups.c:4486 msgctxt "output-bin" msgid "Face Up Bin" msgstr "Safata cara amunt" #. Translators: Output bin where one sided output is oriented in the face-down position -#: modules/printbackends/cups/gtkprintbackendcups.c:4481 +#: modules/printbackends/cups/gtkprintbackendcups.c:4488 msgctxt "output-bin" msgid "Face Down Bin" msgstr "Safata cara avall" #. Translators: Large capacity output bin -#: modules/printbackends/cups/gtkprintbackendcups.c:4483 +#: modules/printbackends/cups/gtkprintbackendcups.c:4490 msgctxt "output-bin" msgid "Large Capacity Bin" msgstr "Safata de gran capacitat" #. Translators: Output stacker number %d -#: modules/printbackends/cups/gtkprintbackendcups.c:4505 +#: modules/printbackends/cups/gtkprintbackendcups.c:4512 #, c-format msgctxt "output-bin" msgid "Stacker %d" msgstr "Apilador %d" #. Translators: Output mailbox number %d -#: modules/printbackends/cups/gtkprintbackendcups.c:4509 +#: modules/printbackends/cups/gtkprintbackendcups.c:4516 #, c-format msgctxt "output-bin" msgid "Mailbox %d" msgstr "Bústia %d" #. Translators: Private mailbox -#: modules/printbackends/cups/gtkprintbackendcups.c:4513 +#: modules/printbackends/cups/gtkprintbackendcups.c:4520 msgctxt "output-bin" msgid "My Mailbox" msgstr "La meva bústia" #. Translators: Output tray number %d -#: modules/printbackends/cups/gtkprintbackendcups.c:4517 +#: modules/printbackends/cups/gtkprintbackendcups.c:4524 #, c-format msgctxt "output-bin" msgid "Tray %d" msgstr "Safata %d" -#: modules/printbackends/cups/gtkprintbackendcups.c:4988 +#: modules/printbackends/cups/gtkprintbackendcups.c:4995 msgid "Printer Default" msgstr "Per defecte de la impressora" #. Translators: These strings name the possible values of the #. * job priority option in the print dialog #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5429 +#: modules/printbackends/cups/gtkprintbackendcups.c:5436 msgid "Urgent" msgstr "Urgent" -#: modules/printbackends/cups/gtkprintbackendcups.c:5429 +#: modules/printbackends/cups/gtkprintbackendcups.c:5436 msgid "High" msgstr "Alta" -#: modules/printbackends/cups/gtkprintbackendcups.c:5429 +#: modules/printbackends/cups/gtkprintbackendcups.c:5436 msgid "Medium" msgstr "Mitjana" -#: modules/printbackends/cups/gtkprintbackendcups.c:5429 +#: modules/printbackends/cups/gtkprintbackendcups.c:5436 msgid "Low" msgstr "Baixa" #. Translators, this string is used to label the job priority option #. * in the print dialog #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5459 +#: modules/printbackends/cups/gtkprintbackendcups.c:5466 msgid "Job Priority" msgstr "Prioritat de la tasca" #. Translators, this string is used to label the billing info entry #. * in the print dialog #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5470 +#: modules/printbackends/cups/gtkprintbackendcups.c:5477 msgid "Billing Info" msgstr "Informació de facturació" -#: modules/printbackends/cups/gtkprintbackendcups.c:5494 +#: modules/printbackends/cups/gtkprintbackendcups.c:5501 msgctxt "cover page" msgid "None" msgstr "Cap" -#: modules/printbackends/cups/gtkprintbackendcups.c:5495 +#: modules/printbackends/cups/gtkprintbackendcups.c:5502 msgctxt "cover page" msgid "Classified" msgstr "Classificat" -#: modules/printbackends/cups/gtkprintbackendcups.c:5496 +#: modules/printbackends/cups/gtkprintbackendcups.c:5503 msgctxt "cover page" msgid "Confidential" msgstr "Confidencial" -#: modules/printbackends/cups/gtkprintbackendcups.c:5497 +#: modules/printbackends/cups/gtkprintbackendcups.c:5504 msgctxt "cover page" msgid "Secret" msgstr "Secret" -#: modules/printbackends/cups/gtkprintbackendcups.c:5498 +#: modules/printbackends/cups/gtkprintbackendcups.c:5505 msgctxt "cover page" msgid "Standard" msgstr "Estàndard" -#: modules/printbackends/cups/gtkprintbackendcups.c:5499 +#: modules/printbackends/cups/gtkprintbackendcups.c:5506 msgctxt "cover page" msgid "Top Secret" msgstr "Alt secret" -#: modules/printbackends/cups/gtkprintbackendcups.c:5500 +#: modules/printbackends/cups/gtkprintbackendcups.c:5507 msgctxt "cover page" msgid "Unclassified" msgstr "No classificat" @@ -6725,7 +8270,7 @@ msgstr "No classificat" #. Translators, this string is used to label the pages-per-sheet option #. * in the print dialog #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5512 +#: modules/printbackends/cups/gtkprintbackendcups.c:5519 msgctxt "printer option" msgid "Pages per Sheet" msgstr "Pàgines per full" @@ -6733,7 +8278,7 @@ msgstr "Pàgines per full" #. Translators, this string is used to label the option in the print #. * dialog that controls in what order multiple pages are arranged #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5529 +#: modules/printbackends/cups/gtkprintbackendcups.c:5536 msgctxt "printer option" msgid "Page Ordering" msgstr "Ordenació de les pàgines" @@ -6742,7 +8287,7 @@ msgstr "Ordenació de les pàgines" #. Translators, this is the label used for the option in the print #. * dialog that controls the front cover page. #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5571 +#: modules/printbackends/cups/gtkprintbackendcups.c:5578 msgctxt "printer option" msgid "Before" msgstr "Abans" @@ -6751,7 +8296,7 @@ msgstr "Abans" #. Translators, this is the label used for the option in the print #. * dialog that controls the back cover page. #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5586 +#: modules/printbackends/cups/gtkprintbackendcups.c:5593 msgctxt "printer option" msgid "After" msgstr "Després" @@ -6760,7 +8305,7 @@ msgstr "Després" #. * a print job is printed. Possible values are 'now', a specified time, #. * or 'on hold' #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5606 +#: modules/printbackends/cups/gtkprintbackendcups.c:5613 msgctxt "printer option" msgid "Print at" msgstr "Imprimeix a" @@ -6769,7 +8314,7 @@ msgstr "Imprimeix a" #. Translators: this is the name of the option that allows the user #. * to specify a time when a print job will be printed. #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5617 +#: modules/printbackends/cups/gtkprintbackendcups.c:5624 msgctxt "printer option" msgid "Print at time" msgstr "Imprimeix a una hora determinada" @@ -6779,19 +8324,19 @@ msgstr "Imprimeix a una hora determinada" #. * the width and height in points. E.g: "Custom #. * 230.4x142.9" #. -#: modules/printbackends/cups/gtkprintbackendcups.c:5659 +#: modules/printbackends/cups/gtkprintbackendcups.c:5666 #, c-format msgid "Custom %s×%s" msgstr "Personalitzat %sx%s" # Connectada? (josep) -#: modules/printbackends/cups/gtkprintbackendcups.c:5768 +#: modules/printbackends/cups/gtkprintbackendcups.c:5775 msgctxt "printer option" msgid "Printer Profile" msgstr "Perfil de la impressora" #. TRANSLATORS: this is when color profile information is unavailable -#: modules/printbackends/cups/gtkprintbackendcups.c:5775 +#: modules/printbackends/cups/gtkprintbackendcups.c:5782 msgctxt "printer option value" msgid "Unavailable" msgstr "No està disponible" |