Compare commits

..

4 Commits

Author SHA1 Message Date
11bf65e2b4 status/keyboard: Disregard the backwards flag for the popup switcher
This seems to cause more harm than good. It puzzles users looking at
the shortcuts list in g-c-c and it prevents otherwise valid shortcuts
like Shift+Hangul from working.

https://bugzilla.gnome.org/show_bug.cgi?id=695823
2013-04-05 18:12:48 +02:00
a8b7e559aa status/keyboard: Allow switching input source in the message tray
We still can't show a popup switcher in the message tray but we can at
least degrade gracefully and advance to the next input source.

https://bugzilla.gnome.org/show_bug.cgi?id=697009
2013-04-05 18:12:48 +02:00
b733e30a4a status/keyboard: Switch input source on special modifiers accelerator
This simply mimics the X server's layout switching behavior by
advancing to the next input source and wrapping around.

https://bugzilla.gnome.org/show_bug.cgi?id=697008
2013-04-05 18:12:48 +02:00
b607958134 status/keyboard: Synchronize input source switching with key events
Currently we simply set the gsettings key when activating an input
source. This obviously introduces a time window, between the event that
activates the switch and when the switch is complete, under which key
events are being delivered to applications and interpreted according
to the previous input source.

The patches in bug 696996 introduce a DBus API in g-s-d that allows us
to know when an input source if effectively active. Using that and
freezing keyboard events in the X server until we hear back from g-s-d
we can ensure that events won't be misinterpreted after an input
source switch.

https://bugzilla.gnome.org/show_bug.cgi?id=697007
2013-04-05 18:12:47 +02:00
61 changed files with 3230 additions and 6181 deletions

55
NEWS
View File

@ -1,58 +1,3 @@
3.9.1
=====
* Add additional toggle-overview keybinding [Matthias; #698251]
* Disable <super> shortcut when sticky keys are enabled [Matthias; #685974]
* Disable tray context menu while a notification displays [Jasper; #695800]
* Watch GApplication busy state [Cosimo; #697207]
* Disable style transitions if animations are disabled [Jasper; #698391]
* Filter out hidden applications from "Frequent" view [Giovanni; #696949]
* Fix window previews swapping place randomly [Jasper; #694469, #698776]
* Add support for serialized GIcons in remote search providers [Cosimo; #698761]
* Fix hotcorner regression in RTL locales [Jasper; #698884]
* Allow some keybindings to work while a top bar menu is open [Florian; #698938]
* Make open-app-menu keybinding a toggle action [Florian; #686756]
* Only recognize common URL schemes in notification messages [Monica; #661225]
* Misc fixes and cleanups [Tim, Jasper, Florian, Giovanni, Owen; #698531,
#698622, #698427, #698483, #698513, #697203, #698959, #698918, #699029,
#699075, #696720, #649748]
Contributors:
Giovanni Campagna, Cosimo Cecchi, Monica Chelliah, Matthias Clasen, Tim Lunn,
Florian Müllner, Jasper St. Pierre, Michael Wood, Owen W. Taylor
Translations:
Fran Diéguez [gl], Muhammet Kara [tr], Daniel Mustieles [es],
Gil Forcada [ia], Anish A [ml], Dimitris Spingos [el], Marek Černocký [cs],
Žygimantas Beručka [lt]
3.8.1
=====
* Clip window group during startup animation [Jasper; #696323]
* Check for logind rather than systemd [Martin; #696252]
* Don't special-case last remote search provider position [Giovanni; #694974]
* Fix memory leaks [Ray, Jasper; ##697119, #697295, #697300, #697395]
* AppSwitcherPopup: Activate only the selected window if any [Rui; #697480]
* Enable screen recorder keybinding in all modes [Florian; #696200]
* Remove box-shadow from screen shield for performance reasons [Adel; #697274]
* Add support for -st-natural-width/height CSS properties [Giovanni; #664411]
* Remove excessive padding from notification buttons [Allan; #664411]
* Fix thumbnail dragging in overview [Jasper; #697504]
* theme-node: Add get_url()/lookup_url() methods [Florian; #693688]
* Misc bug fixes and cleanups [Jasper, Rui, Colin, David, Ray, Matthias:
#695859, #696259, #696585, #696436, #697432, #697435, #697560, #697722,
#697709]
Contributors:
Giovanni Campagna, Matthias Clasen, Allan Day, Adel Gadllah, David Gumberg,
Rui Matos, Florian Müllner, Martin Pitt, Jasper St. Pierre, Ray Strode,
Colin Walters
Translations:
Daniel Martinez [an], Bruce Cowan [en_GB], Khaled Hosny [ar],
Ihar Hrachyshka [be], Aron Xu [zh_CN], Wojciech Szczęsny [pl],
Inaki Larranaga Murgoitio [eu], Kjartan Maraas [nb],
Милош Поповић [sr, sr@latin], Trần Ngọc Quân [vi]
3.8.0.1
=======
* Background bug fixes [Ray; #696712]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.9.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.8.0.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -63,9 +63,9 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.9.1
MUTTER_MIN_VERSION=3.8.0
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0
GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3
TELEPATHY_GLIB_MIN_VERSION=0.17.5
@ -74,7 +74,7 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
GNOME_MENUS_REQUIRED_VERSION=3.5.3
NETWORKMANAGER_MIN_VERSION=0.9.8
NETWORKMANAGER_MIN_VERSION=0.9.6
PULSE_MIN_VERS=2.0
# Collect more than 20 libraries for a prize!

View File

@ -11,9 +11,6 @@
<KeyListEntry name="focus-active-notification"
_description="Focus the active notification"/>
<KeyListEntry name="toggle-overview"
_description="Show the overview"/>
<KeyListEntry name="toggle-application-view"
_description="Show all applications"/>

View File

@ -46,7 +46,7 @@
<!--
GetResultMetas:
@identifiers: An array of result identifiers as returned by GetInitialResultSet() or GetSubsearchResultSet()
@metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, 'icon' (a serialized GIcon as obtained by g_icon_serialize) can be specified if the result can be better served with a thumbnail of the content (such as with images). 'gicon' (a serialized GIcon as obtained by g_icon_to_string) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) are deprecated values that can also be used for that purpose. A 'description' field (string) may also be specified if more context would help the user find the desired result.
@metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, either 'gicon' (a serialized GIcon) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) can be specified if the result can be better served with a thumbnail of the content (such as with images). A 'description' field (string) may also be specified if more context would help the user find the desired result.
Return an array of meta data used to display each given result
-->

View File

@ -117,13 +117,6 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
Overview.
</_description>
</key>
<key name="toggle-overview" type="as">
<default>["&lt;Super&gt;s"]</default>
<_summary>Keybinding to open the overview</_summary>
<_description>
Keybinding to open the Activities Overview.
</_description>
</key>
<key name="toggle-message-tray" type="as">
<default>["&lt;Super&gt;m"]</default>
<_summary>Keybinding to toggle the visibility of the message tray</_summary>

View File

@ -125,10 +125,6 @@ StScrollBar StButton#vhandle:active {
/* PopupMenu */
.popup-menu-ornament {
text-align: center;
}
.popup-menu-boxpointer,
.candidate-popup-boxpointer {
-arrow-border-radius: 8px;
@ -516,7 +512,6 @@ StScrollBar StButton#vhandle:active {
}
#appMenu {
spinner-image: url("process-working.svg");
spacing: 4px;
}
@ -1458,13 +1453,11 @@ StScrollBar StButton#vhandle:active {
}
.notification-button {
-st-natural-width: 140px;
padding: 4px 4px 5px;
padding: 4px 42px 5px;
}
.notification-button:focus {
-st-natural-width: 138px;
padding: 3px 4px 4px;
padding: 3px 41px 4px;
}
.notification-icon-button {
@ -2452,6 +2445,7 @@ StScrollBar StButton#vhandle:active {
.screen-shield-background {
background: black;
box-shadow: 0px 4px 8px rgba(0,0,0,0.9);
}
#lockDialogGroup {

View File

@ -774,8 +774,7 @@ const LoginDialog = new Lang.Class({
},
_prepareDialog: function(forSecret, hold) {
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();

View File

@ -18,7 +18,7 @@ const _urlRegexp = new RegExp(
'(^|' + _leadingJunk + ')' +
'(' +
'(?:' +
'(?:http|https|ftp)://' + // scheme://
'[a-z][\\w-]+://' + // scheme://
'|' +
'www\\d{0,3}[.]' + // www.
'|' +

View File

@ -233,10 +233,8 @@ const AppSwitcherPopup = new Lang.Class({
_finish : function(timestamp) {
let appIcon = this._items[this._selectedIndex];
if (this._currentWindow < 0)
appIcon.app.activate_full(-1, timestamp);
else
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);
let window = this._currentWindow > 0 ? this._currentWindow : 0;
appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
this.parent();
},

View File

@ -316,8 +316,6 @@ const FrequentView = new Lang.Class({
loadApps: function() {
let mostUsed = this._usage.get_most_used ("");
for (let i = 0; i < mostUsed.length; i++) {
if (!mostUsed[i].get_app_info().should_show())
continue;
let appIcon = new AppIcon(mostUsed[i]);
this._grid.addItem(appIcon.actor, -1);
}

View File

@ -126,11 +126,6 @@ const BackgroundCache = new Lang.Class({
},
removeImageContent: function(content) {
let filename = content.get_filename();
if (filename && this._fileMonitors[filename])
delete this._fileMonitors[filename];
this._removeContent(this._images, content);
},
@ -431,7 +426,7 @@ const Background = new Lang.Class({
content.brightness = this._brightness;
content.vignette_sharpness = this._vignetteSharpness;
this._cache.removeImageContent(this._images[index].content);
this._cache.removeImageContent(content);
this._images[index].content = content;
this._watchCacheFile(filename);
},
@ -747,15 +742,11 @@ const BackgroundManager = new Lang.Class({
time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
if (this._newBackground == newBackground) {
if (this.background == background) {
this.background = newBackground;
this._newBackground = null;
} else {
newBackground.actor.destroy();
background.actor.destroy();
}
background.actor.destroy();
this.emit('changed');
})
});

View File

@ -46,10 +46,8 @@ function addBackgroundMenu(actor) {
clickAction.connect('long-press', function(action, actor, state) {
if (state == Clutter.LongPressState.QUERY)
return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
if (state == Clutter.LongPressState.ACTIVATE) {
if (state == Clutter.LongPressState.ACTIVATE)
openMenu();
actor._backgroundManager.ignoreRelease();
}
return true;
});
clickAction.connect('clicked', function(action) {
@ -62,7 +60,5 @@ function addBackgroundMenu(actor) {
actor._backgroundMenu.destroy();
actor._backgroundMenu = null;
actor._backgroundManager = null;
cursor.destroy();
});
}

View File

@ -20,7 +20,8 @@ const Recorder = new Lang.Class({
Main.wm.addKeybinding('toggle-recording',
this._bindingSettings,
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleRecorder));
},

View File

@ -221,8 +221,8 @@ const DateMenuButton = new Lang.Class({
this.menu.close();
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
if (app.get_id() == 'evolution.desktop')
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
if (app.get_id() == 'evolution')
app = Gio.DesktopAppInfo.new('evolution-calendar');
app.launch([], global.create_app_launch_context());
},

View File

@ -291,19 +291,19 @@ const _Draggable = new Lang.Class({
this._dragOrigY = this._dragActor.y;
this._dragOrigScale = this._dragActor.scale_x;
// Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
this._dragActor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
this._dragActor.reparent(Main.uiGroup);
this._dragActor.raise_top();
Shell.util_set_hidden_from_pick(this._dragActor, true);
let [actorStageX, actorStageY] = this.actor.get_transformed_position();
this._dragOffsetX = actorStageX - this._dragStartX;
this._dragOffsetY = actorStageY - this._dragStartY;
this._dragActor.reparent(Main.uiGroup);
this._dragActor.raise_top();
Shell.util_set_hidden_from_pick(this._dragActor, true);
// Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
this.actor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
}
this._dragOrigOpacity = this._dragActor.opacity;

View File

@ -118,22 +118,6 @@ const MonitorConstraint = new Lang.Class({
}
});
const Monitor = new Lang.Class({
Name: 'Monitor',
_init: function(index, geometry) {
this.index = index;
this.x = geometry.x;
this.y = geometry.y;
this.width = geometry.width;
this.height = geometry.height;
},
get inFullscreen() {
return global.screen.get_monitor_in_fullscreen(this.index);
}
})
const defaultParams = {
trackFullscreen: false,
affectsStruts: false,
@ -277,7 +261,7 @@ const LayoutManager = new Lang.Class({
this.monitors = [];
let nMonitors = screen.get_n_monitors();
for (let i = 0; i < nMonitors; i++)
this.monitors.push(new Monitor(i, screen.get_monitor_geometry(i)));
this.monitors.push(screen.get_monitor_geometry(i));
if (nMonitors == 1) {
this.primaryIndex = this.bottomIndex = 0;
@ -299,10 +283,8 @@ const LayoutManager = new Lang.Class({
_updateHotCorners: function() {
// destroy old hot corners
this.hotCorners.forEach(function(corner) {
if (corner)
corner.destroy();
});
for (let i = 0; i < this.hotCorners.length; i++)
this.hotCorners[i].destroy();
this.hotCorners = [];
let size = this.panelBox.height;
@ -313,9 +295,9 @@ const LayoutManager = new Lang.Class({
let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x;
let cornerY = monitor.y;
let haveTopLeftCorner = true;
if (i != this.primaryIndex) {
let haveTopLeftCorner = true;
// Check if we have a top left (right for RTL) corner.
// I.e. if there is no monitor directly above or to the left(right)
let besideX = this._rtl ? monitor.x + 1 : cornerX - 1;
@ -342,15 +324,14 @@ const LayoutManager = new Lang.Class({
break;
}
}
if (!haveTopLeftCorner)
continue;
}
if (haveTopLeftCorner) {
let corner = new HotCorner(this, monitor, cornerX, cornerY);
corner.setBarrierSize(size);
this.hotCorners.push(corner);
} else {
this.hotCorners.push(null);
}
let corner = new HotCorner(this, monitor, cornerX, cornerY);
corner.setBarrierSize(size);
this.hotCorners.push(corner);
}
this.emit('hot-corners-changed');
@ -427,8 +408,7 @@ const LayoutManager = new Lang.Class({
let size = this.panelBox.height;
this.hotCorners.forEach(function(corner) {
if (corner)
corner.setBarrierSize(size);
corner.setBarrierSize(size);
});
},
@ -920,8 +900,13 @@ const LayoutManager = new Lang.Class({
},
_updateFullscreen: function() {
for (let i = 0; i < this.monitors.length; i++)
this.monitors[i].inFullscreen = global.screen.get_monitor_in_fullscreen (i);
this._updateVisibility();
this._queueUpdateRegions();
this.emit('fullscreen-changed');
},
_windowsRestacked: function() {
@ -1107,21 +1092,12 @@ const HotCorner = new Lang.Class({
}
if (size > 0) {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
this._verticalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
directions: Meta.BarrierDirection.NEGATIVE_X });
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x - size, x2: this._x, y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y });
} else {
this._verticalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
directions: Meta.BarrierDirection.POSITIVE_X });
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x + size, y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y });
}
this._verticalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
directions: Meta.BarrierDirection.POSITIVE_X });
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x + size, y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y });
this._pressureBarrier.addBarrier(this._verticalBarrier);
this._pressureBarrier.addBarrier(this._horizontalBarrier);

View File

@ -41,9 +41,6 @@ const Util = imports.misc.util;
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
let componentManager = null;
let panel = null;
let overview = null;
@ -72,7 +69,6 @@ let _startDate;
let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _overridesSettings = null;
let _a11ySettings = null;
function _sessionUpdated() {
_loadDefaultStylesheet();
@ -161,14 +157,9 @@ function _initializeUI() {
layoutManager.init();
overview.init();
_a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1);
global.display.connect('overlay-key', Lang.bind(overview, function () {
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
overview.toggle();
}));
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
// Provide the bus object for gnome-session to
// initiate logouts.

View File

@ -1557,22 +1557,23 @@ const MessageTray = new Lang.Class({
this.actor = new St.Widget({ name: 'message-tray',
reactive: true,
track_hover: true,
layout_manager: new Clutter.BinLayout(),
x_expand: true,
y_expand: true,
y_align: Clutter.ActorAlign.START,
});
this.actor.connect('notify::hover', Lang.bind(this, this._onTrayHoverChanged));
this._notificationWidget = new St.Widget({ name: 'notification-container',
reactive: true,
track_hover: true,
y_align: Clutter.ActorAlign.START,
x_align: Clutter.ActorAlign.CENTER,
y_expand: true,
x_expand: true,
layout_manager: new Clutter.BinLayout() });
this._notificationWidget.connect('key-release-event', Lang.bind(this, this._onNotificationKeyRelease));
this._notificationWidget.connect('notify::hover', Lang.bind(this, this._onNotificationHoverChanged));
this.actor.add_actor(this._notificationWidget);
this._notificationBin = new St.Bin({ y_expand: true });
this._notificationBin.set_y_align(Clutter.ActorAlign.START);
@ -1627,25 +1628,24 @@ const MessageTray = new Lang.Class({
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
this._grabHelper.addActor(this._summaryBoxPointer.actor);
this._grabHelper.addActor(this.actor);
this._grabHelper.addActor(this._notificationWidget);
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
this._trayState = State.HIDDEN;
this._traySummoned = false;
this._useLongerNotificationLeftTimeout = false;
this._useLongerTrayLeftTimeout = false;
this._trayLeftTimeoutId = 0;
// pointerInNotification is sort of a misnomer -- it tracks whether
// pointerInTray is sort of a misnomer -- it tracks whether
// a message tray notification should expand. The value is
// partially driven by the hover state of the notification, but has
// partially driven by the hover state of the tray, but has
// a lot of complex state related to timeouts and the current
// state of the pointer when a notification pops up.
this._pointerInNotification = false;
this._pointerInTray = false;
// This tracks this._notificationWidget.hover and is used to fizzle
// out non-changing hover notifications in onNotificationHoverChanged.
this._notificationHovered = false;
// This tracks this.actor.hover and is used to fizzle
// out non-changing hover notifications in onTrayHoverChanged.
this._trayHovered = false;
this._keyboardVisible = false;
this._notificationClosed = false;
@ -1657,6 +1657,7 @@ const MessageTray = new Lang.Class({
this._desktopCloneState = State.HIDDEN;
this._notificationRemoved = false;
this._reNotifyAfterHideNotification = null;
this._inFullscreen = false;
this._desktopClone = null;
this._inCtrlAltTab = false;
@ -1668,12 +1669,11 @@ const MessageTray = new Lang.Class({
});
Main.layoutManager.trayBox.add_actor(this.actor);
Main.layoutManager.trayBox.add_actor(this._notificationWidget);
Main.layoutManager.trackChrome(this.actor);
Main.layoutManager.trackChrome(this._notificationWidget);
Main.layoutManager.trackChrome(this._closeButton);
global.screen.connect('in-fullscreen-changed', Lang.bind(this, this._updateState));
Main.layoutManager.connect('fullscreen-changed', Lang.bind(this, this._updateState));
Main.layoutManager.connect('hot-corners-changed', Lang.bind(this, this._hotCornersChanged));
// If the overview shows or hides while we're in
@ -1747,7 +1747,7 @@ const MessageTray = new Lang.Class({
let [x, y, mask] = global.get_pointer();
this._contextMenu.setPosition(Math.round(x), Math.round(y));
this._grabHelper.grab({ actor: this._contextMenu.actor,
modal: true,
grabFocus: true,
onUngrab: Lang.bind(this, function () {
this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
})
@ -1793,12 +1793,12 @@ const MessageTray = new Lang.Class({
y == monitor.y + monitor.height - 1);
if (shouldDwell) {
// We only set up dwell timeout when the user is not hovering over the tray
// (!this._notificationHovered). This avoids bringing up the message tray after the
// (!this.actor.hover). This avoids bringing up the message tray after the
// user clicks on a notification with the pointer on the bottom pixel
// of the monitor. The _trayDwelling variable is used so that we only try to
// fire off one tray dwell - if it fails (because, say, the user has the mouse down),
// we don't try again until the user moves the mouse up and down again.
if (!this._trayDwelling && !this._notificationHovered && this._trayDwellTimeoutId == 0) {
if (!this._trayDwelling && !this.actor.hover && this._trayDwellTimeoutId == 0) {
// Save the interaction timestamp so we can detect user input
let focusWindow = global.display.focus_window;
this._trayDwellUserTime = focusWindow ? focusWindow.user_time : 0;
@ -2021,6 +2021,7 @@ const MessageTray = new Lang.Class({
hide: function() {
this._traySummoned = false;
this.actor.set_hover(false);
this._updateState();
},
@ -2087,21 +2088,25 @@ const MessageTray = new Lang.Class({
this._grabHelper.addActor(corner.actor);
},
_onNotificationHoverChanged: function() {
if (this._notificationWidget.hover == this._notificationHovered)
_onTrayHoverChanged: function() {
if (this.actor.hover == this._trayHovered)
return;
this._notificationHovered = this._notificationWidget.hover;
if (this._notificationHovered) {
this._trayHovered = this.actor.hover;
if (this._trayHovered) {
// No dwell inside notifications at the bottom of the screen
this._cancelTrayDwell();
this._useLongerNotificationLeftTimeout = false;
if (this._notificationLeftTimeoutId) {
Mainloop.source_remove(this._notificationLeftTimeoutId);
this._notificationLeftTimeoutId = 0;
this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1;
// Don't do anything if the one pixel area at the bottom is hovered over while the tray is hidden.
if (this._trayState == State.HIDDEN && this._notificationState == State.HIDDEN)
return;
this._useLongerTrayLeftTimeout = false;
if (this._trayLeftTimeoutId) {
Mainloop.source_remove(this._trayLeftTimeoutId);
this._trayLeftTimeoutId = 0;
this._trayLeftMouseX = -1;
this._trayLeftMouseY = -1;
return;
}
@ -2110,32 +2115,32 @@ const MessageTray = new Lang.Class({
global.stage.get_actor_at_pos(Clutter.PickMode.ALL, this._showNotificationMouseX, this._showNotificationMouseY);
this._showNotificationMouseX = -1;
this._showNotificationMouseY = -1;
// Don't set this._pointerInNotification to true if the pointer was initially in the area where the notification
// Don't set this._pointerInTray to true if the pointer was initially in the area where the notification
// popped up. That way we will not be expanding notifications that happen to pop up over the pointer
// automatically. Instead, the user is able to expand the notification by mousing away from it and then
// mousing back in. Because this is an expected action, we set the boolean flag that indicates that a longer
// timeout should be used before popping down the notification.
if (this.actor.contains(actorAtShowNotificationPosition)) {
this._useLongerNotificationLeftTimeout = true;
this._useLongerTrayLeftTimeout = true;
return;
}
}
this._pointerInNotification = true;
this._pointerInTray = true;
this._updateState();
} else {
// We record the position of the mouse the moment it leaves the tray. These coordinates are used in
// this._onNotificationLeftTimeout() to determine if the mouse has moved far enough during the initial timeout for us
// this._onTrayLeftTimeout() to determine if the mouse has moved far enough during the initial timeout for us
// to consider that the user intended to leave the tray and therefore hide the tray. If the mouse is still
// close to its previous position, we extend the timeout once.
let [x, y, mods] = global.get_pointer();
this._notificationLeftMouseX = x;
this._notificationLeftMouseY = y;
this._trayLeftMouseX = x;
this._trayLeftMouseY = y;
// We wait just a little before hiding the message tray in case the user quickly moves the mouse back into it.
// We wait for a longer period if the notification popped up where the mouse pointer was already positioned.
// That gives the user more time to mouse away from the notification and mouse back in in order to expand it.
let timeout = this._useLongerNotificationLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onNotificationLeftTimeout));
let timeout = this._useLongerTrayLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
this._trayLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onTrayLeftTimeout));
}
},
@ -2159,22 +2164,22 @@ const MessageTray = new Lang.Class({
this._updateState();
},
_onNotificationLeftTimeout: function() {
_onTrayLeftTimeout: function() {
let [x, y, mods] = global.get_pointer();
// We extend the timeout once if the mouse moved no further than MOUSE_LEFT_ACTOR_THRESHOLD to either side or up.
// We don't check how far down the mouse moved because any point above the tray, but below the exit coordinate,
// is close to the tray.
if (this._notificationLeftMouseX > -1 &&
y > this._notificationLeftMouseY - MOUSE_LEFT_ACTOR_THRESHOLD &&
x < this._notificationLeftMouseX + MOUSE_LEFT_ACTOR_THRESHOLD &&
x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) {
this._notificationLeftMouseX = -1;
this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
Lang.bind(this, this._onNotificationLeftTimeout));
if (this._trayLeftMouseX > -1 &&
y > this._trayLeftMouseY - MOUSE_LEFT_ACTOR_THRESHOLD &&
x < this._trayLeftMouseX + MOUSE_LEFT_ACTOR_THRESHOLD &&
x > this._trayLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) {
this._trayLeftMouseX = -1;
this._trayLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
Lang.bind(this, this._onTrayLeftTimeout));
} else {
this._notificationLeftTimeoutId = 0;
this._useLongerNotificationLeftTimeout = false;
this._pointerInNotification = false;
this._trayLeftTimeoutId = 0;
this._useLongerTrayLeftTimeout = false;
this._pointerInTray = false;
this._updateNotificationTimeout(0);
this._updateState();
}
@ -2182,7 +2187,7 @@ const MessageTray = new Lang.Class({
},
_escapeTray: function() {
this._pointerInNotification = false;
this._pointerInTray = false;
this._traySummoned = false;
this._setClickedSummaryItem(null);
this._updateNotificationTimeout(0);
@ -2191,7 +2196,7 @@ const MessageTray = new Lang.Class({
// All of the logic for what happens when occurs here; the various
// event handlers merely update variables such as
// 'this._pointerInNotification', 'this._traySummoned', etc, and
// 'this._pointerInTray', 'this._traySummoned', etc, and
// _updateState() figures out what (if anything) needs to be done
// at the present time.
_updateState: function() {
@ -2202,12 +2207,12 @@ const MessageTray = new Lang.Class({
let notificationsLimited = this._busy || Main.layoutManager.bottomMonitor.inFullscreen;
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent || notificationForFeedback) && Main.sessionMode.hasNotifications;
let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null;
let notificationPinned = this._pointerInNotification && !this._notificationRemoved;
let notificationPinned = this._pointerInTray && !this._notificationRemoved;
let notificationExpanded = this._notification && this._notification.expanded;
let notificationExpired = this._notificationTimeoutId == 0 &&
!(this._notification && this._notification.urgency == Urgency.CRITICAL) &&
!(this._notification && this._notification.focused) &&
!this._pointerInNotification;
!this._pointerInTray;
let notificationLockedOut = !Main.sessionMode.hasNotifications && this._notification;
let notificationMustClose = this._notificationRemoved || notificationLockedOut || (notificationExpired && this._userActiveWhileNotificationShown) || this._notificationClosed;
let canShowNotification = notificationsPending && this._trayState == State.HIDDEN;
@ -2420,7 +2425,7 @@ const MessageTray = new Lang.Class({
let [x, y, mods] = global.get_pointer();
// We save the position of the mouse at the time when we started showing the notification
// in order to determine if the notification popped up under it. We make that check if
// the user starts moving the mouse and _onNotificationHoverChanged() gets called. We don't
// the user starts moving the mouse and _onTrayHoverChanged() gets called. We don't
// expand the notification if it just happened to pop up under the mouse unless the user
// explicitly mouses away from it and then mouses back in.
this._showNotificationMouseX = x;
@ -2482,13 +2487,13 @@ const MessageTray = new Lang.Class({
_notificationTimeout: function() {
let [x, y, mods] = global.get_pointer();
if (y > this._lastSeenMouseY + 10 && !this._notificationHovered) {
if (y > this._lastSeenMouseY + 10 && !this.actor.hover) {
// The mouse is moving towards the notification, so don't
// hide it yet. (We just create a new timeout (and destroy
// the old one) each time because the bookkeeping is
// simpler.)
this._updateNotificationTimeout(1000);
} else if (this._useLongerNotificationLeftTimeout && !this._notificationLeftTimeoutId &&
} else if (this._useLongerTrayLeftTimeout && !this._trayLeftTimeoutId &&
(x != this._lastSeenMouseX || y != this._lastSeenMouseY)) {
// Refresh the timeout if the notification originally
// popped up under the pointer, and the pointer is hovering
@ -2532,12 +2537,12 @@ const MessageTray = new Lang.Class({
this._notificationUnfocusedId = 0;
}
this._useLongerNotificationLeftTimeout = false;
if (this._notificationLeftTimeoutId) {
Mainloop.source_remove(this._notificationLeftTimeoutId);
this._notificationLeftTimeoutId = 0;
this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1;
this._useLongerTrayLeftTimeout = false;
if (this._trayLeftTimeoutId) {
Mainloop.source_remove(this._trayLeftTimeoutId);
this._trayLeftTimeoutId = 0;
this._trayLeftMouseX = -1;
this._trayLeftMouseY = -1;
}
if (this._notificationRemoved) {
@ -2567,9 +2572,14 @@ const MessageTray = new Lang.Class({
if (notification.isTransient)
notification.destroy(NotificationDestroyedReason.EXPIRED);
this._closeButton.hide();
this._pointerInNotification = false;
this._notificationRemoved = false;
this._closeButton.hide();
this._pointerInTray = false;
// Clutter will send a leave-event the next time the mouse
// moves, but we need to set this here now to update the
// state machine.
this.actor.hover = false;
this._notificationBin.child = null;
this._notificationWidget.hide();
},
@ -2660,7 +2670,7 @@ const MessageTray = new Lang.Class({
}
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
modal: true,
grabFocus: true,
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
this._summaryBoxPointer.actor.opacity = 0;

View File

@ -11,6 +11,7 @@ const Shell = imports.gi.Shell;
const Gdk = imports.gi.Gdk;
const Background = imports.ui.background;
const Dash = imports.ui.dash;
const DND = imports.ui.dnd;
const LayoutManager = imports.ui.layout;
const Main = imports.ui.main;
@ -19,6 +20,7 @@ const OverviewControls = imports.ui.overviewControls;
const Panel = imports.ui.panel;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
// Time for initial animation going into Overview mode
@ -131,6 +133,14 @@ const Overview = new Lang.Class({
y_expand: true });
this._overview._delegate = this;
this._groupStack = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true,
clip_to_allocation: true });
this._group = new St.BoxLayout({ name: 'overview-group',
reactive: true,
x_expand: true, y_expand: true });
this._groupStack.add_actor(this._group);
this._backgroundGroup = new Meta.BackgroundGroup();
global.overlay_group.add_child(this._backgroundGroup);
this._backgroundGroup.hide();
@ -167,6 +177,7 @@ const Overview = new Lang.Class({
Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd));
global.screen.connect('restacked', Lang.bind(this, this._onRestacked));
this._group.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0;
@ -265,13 +276,28 @@ const Overview = new Lang.Class({
this._overview.add_actor(this._searchEntryBin);
// Create controls
this._controls = new OverviewControls.ControlsManager(this._searchEntry);
this._dash = this._controls.dash;
this._viewSelector = this._controls.viewSelector;
this._dash = new Dash.Dash();
this._viewSelector = new ViewSelector.ViewSelector(this._searchEntry,
this._dash.showAppsButton);
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
this._controls = new OverviewControls.ControlsManager(this._dash,
this._thumbnailsBox,
this._viewSelector);
this._controls.dashActor.x_align = Clutter.ActorAlign.START;
this._controls.dashActor.y_expand = true;
// Put the dash in a separate layer to allow content to be centered
this._groupStack.add_actor(this._controls.dashActor);
// Pack all the actors into the group
this._group.add_actor(this._controls.dashSpacer);
this._group.add(this._viewSelector.actor, { x_fill: true,
expand: true });
this._group.add_actor(this._controls.thumbnailsActor);
// Add our same-line elements after the search entry
this._overview.add(this._controls.actor, { y_fill: true, expand: true });
this._controls.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this._overview.add(this._groupStack, { y_fill: true, expand: true });
this._stack.add_actor(this._controls.indicatorActor);

View File

@ -6,12 +6,10 @@ const Meta = imports.gi.Meta;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Dash = imports.ui.dash;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
const SIDE_CONTROLS_ANIMATION_TIME = 0.16;
@ -271,11 +269,6 @@ const ThumbnailsSlider = new Lang.Class({
return alwaysZoomOut;
},
getNonExpandedWidth: function() {
let child = this.actor.get_first_child();
return child.get_theme_node().get_length('visible-width');
},
getSlide: function() {
if (!this.visible)
return 0;
@ -287,16 +280,18 @@ const ThumbnailsSlider = new Lang.Class({
let child = this.actor.get_first_child();
let preferredHeight = child.get_preferred_height(-1)[1];
let expandedWidth = child.get_preferred_width(preferredHeight)[1];
let visibleWidth = child.get_theme_node().get_length('visible-width');
return this.getNonExpandedWidth() / expandedWidth;
return visibleWidth / expandedWidth;
},
getVisibleWidth: function() {
let alwaysZoomOut = this._getAlwaysZoomOut();
if (alwaysZoomOut)
return this.parent();
else
return this.getNonExpandedWidth();
let child = this.actor.get_first_child();
return child.get_theme_node().get_length('visible-width');
}
});
@ -314,10 +309,6 @@ const DashSlider = new Lang.Class({
// available allocation
this._dash.actor.x_expand = true;
this._dash.actor.y_expand = true;
this.actor.x_align = Clutter.ActorAlign.START;
this.actor.y_expand = true;
this.actor.add_actor(this._dash.actor);
this._dash.connect('icon-size-changed', Lang.bind(this, this.updateSlide));
@ -488,77 +479,39 @@ const MessagesIndicator = new Lang.Class({
const ControlsManager = new Lang.Class({
Name: 'ControlsManager',
_init: function(searchEntry) {
this.dash = new Dash.Dash();
this._dashSlider = new DashSlider(this.dash);
this._dashSpacer = new DashSpacer();
this._dashSpacer.setDashActor(this._dashSlider.actor);
_init: function(dash, thumbnails, viewSelector) {
this._dashSlider = new DashSlider(dash);
this.dashActor = this._dashSlider.actor;
this.dashSpacer = new DashSpacer();
this.dashSpacer.setDashActor(this.dashActor);
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox);
this._thumbnailsSlider = new ThumbnailsSlider(thumbnails);
this.thumbnailsActor = this._thumbnailsSlider.actor;
this.viewSelector = new ViewSelector.ViewSelector(searchEntry,
this.dash.showAppsButton);
this.viewSelector.connect('page-changed', Lang.bind(this, this._setVisibility));
this.viewSelector.connect('page-empty', Lang.bind(this, this._onPageEmpty));
this._indicator = new MessagesIndicator(this.viewSelector);
this._indicator = new MessagesIndicator(viewSelector);
this.indicatorActor = this._indicator.actor;
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true,
clip_to_allocation: true });
this._group = new St.BoxLayout({ name: 'overview-group',
reactive: true,
x_expand: true, y_expand: true });
this.actor.add_actor(this._group);
this.actor.add_actor(this._dashSlider.actor);
this._group.add_actor(this._dashSpacer);
this._group.add(this.viewSelector.actor, { x_fill: true,
expand: true });
this._group.add_actor(this._thumbnailsSlider.actor);
this._group.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry));
this._viewSelector = viewSelector;
this._viewSelector.connect('page-changed', Lang.bind(this, this._setVisibility));
this._viewSelector.connect('page-empty', Lang.bind(this, this._onPageEmpty));
Main.overview.connect('showing', Lang.bind(this, this._updateSpacerVisibility));
Main.overview.connect('item-drag-begin', Lang.bind(this,
function() {
let activePage = this.viewSelector.getActivePage();
let activePage = this._viewSelector.getActivePage();
if (activePage != ViewSelector.ViewPage.WINDOWS)
this.viewSelector.fadeHalf();
this._viewSelector.fadeHalf();
}));
Main.overview.connect('item-drag-end', Lang.bind(this,
function() {
this.viewSelector.fadeIn();
this._viewSelector.fadeIn();
}));
Main.overview.connect('item-drag-cancelled', Lang.bind(this,
function() {
this.viewSelector.fadeIn();
this._viewSelector.fadeIn();
}));
},
_updateWorkspacesGeometry: function() {
let [x, y] = this.actor.get_transformed_position();
let [width, height] = this.actor.get_transformed_size();
let geometry = { x: x, y: y, width: width, height: height };
let spacing = this.actor.get_theme_node().get_length('spacing');
let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
geometry.width -= dashWidth;
geometry.width -= thumbnailsWidth;
if (this.actor.get_text_direction() == Clutter.TextDirection.LTR)
geometry.x += dashWidth;
else
geometry.x += thumbnailsWidth;
this.viewSelector.setWorkspacesFullGeometry(geometry);
},
_setVisibility: function() {
// Ignore the case when we're leaving the overview, since
// actors will be made visible again when entering the overview
@ -568,7 +521,7 @@ const ControlsManager = new Lang.Class({
(Main.overview.animationInProgress && !Main.overview.visibleTarget))
return;
let activePage = this.viewSelector.getActivePage();
let activePage = this._viewSelector.getActivePage();
let dashVisible = (activePage == ViewSelector.ViewPage.WINDOWS ||
activePage == ViewSelector.ViewPage.APPS);
let thumbnailsVisible = (activePage == ViewSelector.ViewPage.WINDOWS);
@ -588,8 +541,8 @@ const ControlsManager = new Lang.Class({
if (Main.overview.animationInProgress && !Main.overview.visibleTarget)
return;
let activePage = this.viewSelector.getActivePage();
this._dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS);
let activePage = this._viewSelector.getActivePage();
this.dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS);
},
_onPageEmpty: function() {

View File

@ -144,8 +144,8 @@ const AnimatedIcon = new Lang.Class({
Name: 'AnimatedIcon',
Extends: Animation,
_init: function(filename, size) {
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
_init: function(name, size) {
this.parent(global.datadir + '/theme/' + name, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
}
});
@ -258,7 +258,6 @@ const AppMenuButton = new Lang.Class({
this._actionGroupNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this.actor.add_actor(bin);
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
@ -289,25 +288,27 @@ const AppMenuButton = new Lang.Class({
this._visible = !Main.overview.visible;
if (!this._visible)
this.actor.hide();
this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () {
Main.overview.connect('hiding', Lang.bind(this, function () {
this.show();
}));
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () {
Main.overview.connect('showing', Lang.bind(this, function () {
this.hide();
}));
this._stop = true;
this._spinner = null;
this._spinner = new AnimatedIcon('process-working.svg',
PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide();
this._spinner.actor.lower_bottom();
let tracker = Shell.WindowTracker.get_default();
let appSys = Shell.AppSystem.get_default();
this._focusAppNotifyId =
tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
this._appStateChangedSignalId =
appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
this._sync();
},
@ -353,18 +354,6 @@ const AppMenuButton = new Lang.Class({
onCompleteScope: this });
},
_onStyleChanged: function(actor) {
let node = actor.get_theme_node();
let [success, icon] = node.lookup_url('spinner-image', false);
if (!success || this._spinnerIcon == icon)
return;
this._spinnerIcon = icon;
this._spinner = new AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide();
this._spinner.actor.lower_bottom();
},
_onIconBoxStyleChanged: function() {
let node = this._iconBox.get_theme_node();
this._iconBottomClip = node.get_length('app-icon-bottom-clip');
@ -396,10 +385,6 @@ const AppMenuButton = new Lang.Class({
this._stop = true;
this.actor.reactive = true;
if (this._spinner == null)
return;
Tweener.addTween(this._spinner.actor,
{ opacity: 0,
time: SPINNER_ANIMATION_TIME,
@ -416,10 +401,6 @@ const AppMenuButton = new Lang.Class({
startAnimation: function() {
this._stop = false;
this.actor.reactive = false;
if (this._spinner == null)
return;
this._spinner.play();
this._spinner.actor.show();
},
@ -482,9 +463,6 @@ const AppMenuButton = new Lang.Class({
}
this._label.actor.allocate(childBox, flags);
if (this._spinner == null)
return;
if (direction == Clutter.TextDirection.LTR) {
childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width;
childBox.x2 = childBox.x1 + this._spinner.actor.width;
@ -568,20 +546,14 @@ const AppMenuButton = new Lang.Class({
}
if (targetApp == this._targetApp) {
if (targetApp &&
targetApp.get_state() != Shell.AppState.STARTING &&
targetApp.get_state() != Shell.AppState.BUSY) {
if (targetApp && targetApp.get_state() != Shell.AppState.STARTING) {
this.stopAnimation();
this._maybeSetMenu();
} else if (targetApp &&
targetApp.get_state() == Shell.AppState.BUSY) {
this.startAnimation();
}
return;
}
if (this._spinner)
this._spinner.actor.hide();
this._spinner.actor.hide();
if (this._iconBox.child != null)
this._iconBox.child.destroy();
this._iconBox.hide();
@ -608,8 +580,7 @@ const AppMenuButton = new Lang.Class({
this._iconBox.set_child(icon);
this._iconBox.show();
if (targetApp.get_state() == Shell.AppState.STARTING ||
targetApp.get_state() == Shell.AppState.BUSY)
if (targetApp.get_state() == Shell.AppState.STARTING)
this.startAnimation();
else
this._maybeSetMenu();
@ -645,33 +616,6 @@ const AppMenuButton = new Lang.Class({
this.setMenu(menu);
this._menuManager.addMenu(menu);
},
destroy: function() {
if (this._appStateChangedSignalId > 0) {
let appSys = Shell.AppSystem.get_default();
appSys.disconnect(this._appStateChangedSignalId);
this._appStateChangedSignalId = 0;
}
if (this._focusAppNotifyId > 0) {
let tracker = Shell.WindowTracker.get_default();
tracker.disconnect(this._focusAppNotifyId);
this._focusAppNotifyId = 0;
}
if (this._overviewHidingId > 0) {
Main.overview.disconnect(this._overviewHidingId);
this._overviewHidingId = 0;
}
if (this._overviewShowingId > 0) {
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
}
if (this._switchWorkspaceNotifyId > 0) {
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
this._switchWorkspaceNotifyId = 0;
}
this.parent();
}
});
@ -958,7 +902,7 @@ const Panel = new Lang.Class({
this.statusArea = {};
this.menuManager = new PopupMenu.PopupMenuManager(this, { keybindingMode: Shell.KeyBindingMode.TOPBAR_POPUP });
this.menuManager = new PopupMenu.PopupMenuManager(this);
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
this.actor.add_actor(this._leftBox);
@ -1112,18 +1056,17 @@ const Panel = new Lang.Class({
return true;
},
toggleAppMenu: function() {
openAppMenu: function() {
let indicator = this.statusArea.appMenu;
if (!indicator) // appMenu not supported by current session mode
return;
let menu = indicator.menu;
if (!indicator.actor.reactive)
if (!indicator.actor.reactive || menu.isOpen)
return;
menu.toggle();
if (menu.isOpen)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
menu.open();
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
set boxOpacity(value) {

View File

@ -19,12 +19,6 @@ const Tweener = imports.ui.tweener;
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
const Ornament = {
NONE: 0,
DOT: 1,
CHECK: 2,
};
function _ensureStyle(actor) {
if (actor.get_children) {
let children = actor.get_children();
@ -59,9 +53,7 @@ const PopupBaseMenuItem = new Lang.Class({
this.actor._delegate = this;
this._children = [];
this._ornament = Ornament.NONE;
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
this.actor.add_actor(this._ornamentLabel);
this._dot = null;
this._columnWidths = null;
this._spacing = 0;
this.active = false;
@ -184,24 +176,40 @@ const PopupBaseMenuItem = new Lang.Class({
this._removeChild(child);
},
setOrnament: function(ornament) {
if (ornament == this._ornament)
return;
setShowDot: function(show) {
if (show) {
if (this._dot)
return;
this._ornament = ornament;
this._dot = new St.DrawingArea({ style_class: 'popup-menu-item-dot' });
this._dot.connect('repaint', Lang.bind(this, this._onRepaintDot));
this.actor.add_actor(this._dot);
this.actor.add_accessible_state (Atk.StateType.CHECKED);
} else {
if (!this._dot)
return;
if (ornament == Ornament.DOT) {
this._ornamentLabel.text = '\u2022';
this.actor.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.CHECK) {
this._ornamentLabel.text = '\u2713';
this.actor.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.NONE) {
this._ornamentLabel.text = '';
this.actor.remove_accessible_state(Atk.StateType.CHECKED);
this._dot.destroy();
this._dot = null;
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
}
},
_onRepaintDot: function(area) {
let cr = area.get_context();
let [width, height] = area.get_surface_size();
let color = area.get_theme_node().get_foreground_color();
cr.setSourceRGBA (
color.red / 255,
color.green / 255,
color.blue / 255,
color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
// This returns column widths in logical order (i.e. from the dot
// to the image), not in visual order (left to right)
getColumnWidths: function() {
@ -272,25 +280,26 @@ const PopupBaseMenuItem = new Lang.Class({
let height = box.y2 - box.y1;
let direction = this.actor.get_text_direction();
// The ornament is placed outside box
// one quarter of padding from the border of the container
// (so 3/4 from the inner border)
// (padding is box.x1)
let ornamentBox = new Clutter.ActorBox();
let ornamentWidth = box.x1;
if (this._dot) {
// The dot is placed outside box
// one quarter of padding from the border of the container
// (so 3/4 from the inner border)
// (padding is box.x1)
let dotBox = new Clutter.ActorBox();
let dotWidth = Math.round(box.x1 / 2);
ornamentBox.x1 = 0;
ornamentBox.x2 = ornamentWidth;
ornamentBox.y1 = box.y1;
ornamentBox.y2 = box.y2;
if (direction == Clutter.TextDirection.RTL) {
ornamentBox.x1 += box.x2;
ornamentBox.x2 += box.x2;
if (direction == Clutter.TextDirection.LTR) {
dotBox.x1 = Math.round(box.x1 / 4);
dotBox.x2 = dotBox.x1 + dotWidth;
} else {
dotBox.x2 = box.x2 + 3 * Math.round(box.x1 / 4);
dotBox.x1 = dotBox.x2 - dotWidth;
}
dotBox.y1 = Math.round(box.y1 + (height - dotWidth) / 2);
dotBox.y2 = dotBox.y1 + dotWidth;
this._dot.allocate(dotBox, flags);
}
this._ornamentLabel.allocate(ornamentBox, flags);
let x;
if (direction == Clutter.TextDirection.LTR)
x = box.x1;
@ -1148,7 +1157,6 @@ const PopupMenuBase = new Lang.Class({
},
destroy: function() {
this.close();
this.removeAll();
this.actor.destroy();
@ -1466,12 +1474,23 @@ const PopupMenuSection = new Lang.Class({
this.actor = this.box;
this.actor._delegate = this;
this.isOpen = true;
// an array of externally managed separators
this.separators = [];
},
// deliberately ignore any attempt to open() or close(), but emit the
// corresponding signal so children can still pick it up
open: function() { this.emit('open-state-changed', true); },
close: function() { this.emit('open-state-changed', false); },
destroy: function() {
for (let i = 0; i < this.separators.length; i++)
this.separators[i].destroy();
this.separators = [];
this.parent();
}
});
const PopupSubMenuMenuItem = new Lang.Class({
@ -1788,8 +1807,8 @@ const RemoteMenu = new Lang.Class({
this.model = model;
this.actionGroup = actionGroup;
this._actions = {};
this._trackMenu(model, this);
this._actions = { };
this._modelChanged(this.model, 0, 0, this.model.get_n_items(), this);
this._actionStateChangeId = this.actionGroup.connect('action-state-changed', Lang.bind(this, this._actionStateChanged));
this._actionEnableChangeId = this.actionGroup.connect('action-enabled-changed', Lang.bind(this, this._actionEnabledChanged));
@ -1809,8 +1828,39 @@ const RemoteMenu = new Lang.Class({
this.parent();
},
_actionAdded: function(model, item, index) {
let action_id = item.action_id;
_createMenuItem: function(model, index) {
let labelValue = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_LABEL, null);
let label = labelValue ? labelValue.deep_unpack() : '';
// remove all underscores that are not followed by another underscore
label = label.replace(/_([^_])/, '$1');
let section_link = model.get_item_link(index, Gio.MENU_LINK_SECTION);
if (section_link) {
let item = new PopupMenuSection();
if (label) {
let title = new PopupMenuItem(label, { reactive: false,
style_class: 'popup-subtitle-menu-item' });
item._titleMenuItem = title;
title._ignored = true;
item.addMenuItem(title);
}
this._modelChanged(section_link, 0, 0, section_link.get_n_items(), item);
return [item, true, ''];
}
let submenu_link = model.get_item_link(index, Gio.MENU_LINK_SUBMENU);
if (submenu_link) {
let item = new PopupSubMenuMenuItem(label);
this._modelChanged(submenu_link, 0, 0, submenu_link.get_n_items(), item.menu);
return [item, false, ''];
}
let action_id = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_ACTION, null).deep_unpack();
if (!this.actionGroup.has_action(action_id)) {
// the action may not be there yet, wait for action-added
return [null, false, 'action-added'];
}
if (!this._actions[action_id])
this._actions[action_id] = { enabled: this.actionGroup.get_action_enabled(action_id),
@ -1818,7 +1868,7 @@ const RemoteMenu = new Lang.Class({
items: [ ],
};
let action = this._actions[action_id];
let target, destroyId, specificSignalId;
let item, target, destroyId, specificSignalId;
if (action.state) {
// Docs have get_state_hint(), except that the DBus protocol
@ -1829,28 +1879,28 @@ const RemoteMenu = new Lang.Class({
switch (String.fromCharCode(action.state.classify())) {
case 'b':
item = new PopupSwitchMenuItem(label, action.state.get_boolean());
action.items.push(item);
item.setOrnament(action.state.get_boolean() ?
Ornament.CHECK : Ornament.NONE);
specificSignalId = item.connect('activate', Lang.bind(this, function(item) {
specificSignalId = item.connect('toggled', Lang.bind(this, function(item) {
this.actionGroup.activate_action(action_id, null);
}));
break;
case 's':
action.items.push(item);
item = new PopupMenuItem(label);
item._remoteTarget = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_TARGET, null).deep_unpack();
item.setOrnament(action.state.deep_unpack() == item._remoteTarget ?
Ornament.DOT : Ornament.NONE);
action.items.push(item);
item.setShowDot(action.state.deep_unpack() == item._remoteTarget);
specificSignalId = item.connect('activate', Lang.bind(this, function(item) {
this.actionGroup.activate_action(action_id, GLib.Variant.new_string(item._remoteTarget));
}));
break;
default:
log('Action "%s" has state of type %s, which is not supported'.format(action_id, action.state.get_type_string()));
return;
return [null, false, 'action-state-changed'];
}
} else {
target = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_TARGET, null);
item = new PopupMenuItem(label);
action.items.push(item);
specificSignalId = item.connect('activate', Lang.bind(this, function() {
this.actionGroup.activate_action(action_id, target);
@ -1867,52 +1917,94 @@ const RemoteMenu = new Lang.Class({
if (pos != -1)
action.items.splice(pos, 1);
}));
},
_trackMenu: function(model, item) {
item._tracker = Shell.MenuTracker.new(model,
null, /* action namespace */
Lang.bind(this, this._insertItem, item),
Lang.bind(this, this._removeItem, item));
return [item, false, ''];
},
item.connect('destroy', function() {
item._tracker.destroy();
item._tracker = null;
});
},
_modelChanged: function(model, position, removed, added, target) {
let j, k;
let j0, k0;
_createMenuItem: function(model, index) {
let labelValue = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_LABEL, null);
let label = labelValue ? labelValue.deep_unpack() : '';
// remove all underscores that are not followed by another underscore
label = label.replace(/_([^_])/, '$1');
let currentItems = target._getMenuItems();
let submenuModel = model.get_item_link(index, Gio.MENU_LINK_SUBMENU);
if (submenuModel) {
let item = new PopupSubMenuMenuItem(label);
this._trackMenu(submenuModel, item.menu);
return item;
k0 = 0;
// skip ignored items at the beginning
while (k0 < currentItems.length && currentItems[k0]._ignored)
k0++;
// find the right menu item matching the model item
for (j0 = 0; k0 < currentItems.length && j0 < position; j0++, k0++) {
if (currentItems[k0]._ignored)
k0++;
}
let item = new PopupMenuItem(label);
let action_id = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_ACTION, null).deep_unpack();
item.actor.can_focus = item.actor.reactive = false;
if (removed == -1) {
// special flag to indicate we should destroy everything
for (k = k0; k < currentItems.length; k++)
currentItems[k].destroy();
} else {
for (j = j0, k = k0; k < currentItems.length && j < j0 + removed; j++, k++) {
currentItems[k].destroy();
item.action_id = action_id;
if (this.actionGroup.has_action(action_id)) {
this._actionAdded(model, item, index);
return item;
if (currentItems[k]._ignored)
j--;
}
}
let signalId = this.actionGroup.connect('action-added', Lang.bind(this, function(actionGroup, actionName) {
actionGroup.disconnect(signalId);
if (this._actions[actionName]) return;
for (j = j0, k = k0; j < j0 + added; j++, k++) {
let [item, addSeparator, changeSignal] = this._createMenuItem(model, j);
this._actionAdded(model, item, index);
}));
if (item) {
// separators must be added in the parent to make autohiding work
if (addSeparator) {
let separator = new PopupSeparatorMenuItem();
item.separators.push(separator);
separator._ignored = true;
target.addMenuItem(separator, k+1);
k++;
}
return item;
target.addMenuItem(item, k);
if (addSeparator) {
let separator = new PopupSeparatorMenuItem();
item.separators.push(separator);
separator._ignored = true;
target.addMenuItem(separator, k+1);
k++;
}
} else if (changeSignal) {
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
actionGroup.disconnect(signalId);
if (this._actions[actionName]) return;
// force a full update
this._modelChanged(model, 0, -1, model.get_n_items(), target);
}));
}
}
if (!model._changedId) {
model._changedId = model.connect('items-changed', Lang.bind(this, this._modelChanged, target));
model._destroyId = target.connect('destroy', function() {
if (model._changedId)
model.disconnect(model._changedId);
if (model._destroyId)
target.disconnect(model._destroyId);
model._changedId = 0;
model._destroyId = 0;
});
}
if (target instanceof PopupMenuSection) {
if (target._titleMenuItem)
target.actor.visible = target.numMenuItems != 1;
else
target.actor.visible = target.numMenuItems != 0;
} else {
let sourceItem = target.sourceActor._delegate;
if (sourceItem instanceof PopupSubMenuMenuItem)
sourceItem.actor.visible = target.numMenuItems != 0;
}
},
_actionStateChanged: function(actionGroup, action_id) {
@ -1925,8 +2017,7 @@ const RemoteMenu = new Lang.Class({
switch (String.fromCharCode(action.state.classify())) {
case 'b':
for (let i = 0; i < action.items.length; i++)
action.items[i].setOrnament(action.state.get_boolean() ?
Ornament.CHECK : Ornament.NONE);
action.items[i].setToggleState(action.state.get_boolean());
break;
case 'd':
for (let i = 0; i < action.items.length; i++)
@ -1934,8 +2025,7 @@ const RemoteMenu = new Lang.Class({
break;
case 's':
for (let i = 0; i < action.items.length; i++)
action.items[i].setOrnament(action.items[i]._remoteTarget == action.state.deep_unpack() ?
Ornament.DOT : Ornament.NONE);
action.items[i].setShowDot(action.items[i]._remoteTarget == action.state.deep_unpack());
}
}
},
@ -1952,23 +2042,7 @@ const RemoteMenu = new Lang.Class({
item.actor.reactive = item.actor.can_focus = action.enabled;
}
}
},
_insertItem: function(position, model, item_index, action_namespace, is_separator, target) {
let item;
if (is_separator)
item = new PopupSeparatorMenuItem();
else
item = this._createMenuItem(model, item_index);
target.addMenuItem(item, position);
},
_removeItem: function(position, target) {
let items = target._getMenuItems();
items[position].destroy();
},
}
});
/* Basic implementation of a menu manager.
@ -1977,9 +2051,9 @@ const RemoteMenu = new Lang.Class({
const PopupMenuManager = new Lang.Class({
Name: 'PopupMenuManager',
_init: function(owner, grabParams) {
_init: function(owner) {
this._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
this._grabHelper = new GrabHelper.GrabHelper(owner.actor);
this._menus = [];
},
@ -2049,8 +2123,6 @@ const PopupMenuManager = new Lang.Class({
_onMenuOpenState: function(menu, open) {
if (open) {
if (this.activeMenu)
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
onUngrab: Lang.bind(this, this._closeMenu, menu) });
} else {
@ -2067,8 +2139,13 @@ const PopupMenuManager = new Lang.Class({
},
_changeMenu: function(newMenu) {
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
: BoxPointer.PopupAnimation.FULL);
let oldMenu = this.activeMenu;
if (oldMenu) {
oldMenu.close(BoxPointer.PopupAnimation.FADE);
newMenu.open(BoxPointer.PopupAnimation.FADE);
} else {
newMenu.open(BoxPointer.PopupAnimation.FULL);
}
},
_onMenuSourceEnter: function(menu) {

View File

@ -187,9 +187,7 @@ const RemoteSearchProvider = new Lang.Class({
createIcon: function(size, meta) {
let gicon;
if (meta['icon']) {
gicon = Gio.icon_deserialize(meta['icon']);
} else if (meta['gicon']) {
if (meta['gicon']) {
gicon = Gio.icon_new_for_string(meta['gicon']);
} else if (meta['icon-data']) {
let [width, height, rowStride, hasAlpha,
@ -242,12 +240,8 @@ const RemoteSearchProvider = new Lang.Class({
let metas = results[0];
let resultMetas = [];
for (let i = 0; i < metas.length; i++) {
for (let prop in metas[i]) {
// we can use the serialized icon variant directly
if (prop != 'icon')
metas[i][prop] = metas[i][prop].deep_unpack();
}
for (let prop in metas[i])
metas[i][prop] = metas[i][prop].deep_unpack();
resultMetas.push({ id: metas[i]['id'],
name: metas[i]['name'],
description: metas[i]['description'],

View File

@ -35,8 +35,7 @@ const RunDialog = new Lang.Class({
Extends: ModalDialog.ModalDialog,
_init : function() {
this.parent({ styleClass: 'run-dialog',
destroyOnClose: false });
this.parent({ styleClass: 'run-dialog' });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });

View File

@ -562,7 +562,6 @@ const ScreenShield = new Lang.Class({
this._bgManagers[i].destroy();
this._bgManagers = [];
this._backgroundGroup.destroy_all_children();
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i);

View File

@ -81,10 +81,10 @@ const _modes = {
'initial-setup': {
hasWindows: true,
isPrimary: true,
components: ['networkAgent', 'keyring'],
components: ['keyring'],
panel: {
left: [],
center: [],
center: ['dateMenu'],
right: ['a11yGreeter', 'keyboard', 'volume', 'battery']
}
},

View File

@ -97,7 +97,7 @@ const GnomeShell = new Lang.Class({
*/
Eval: function(code) {
if (!global.settings.get_boolean('development-tools'))
return [false, ''];
return [false, null];
let returnValue;
let success;

View File

@ -82,6 +82,11 @@ const EntryMenu = new Lang.Class({
this.actor.grab_key_focus();
},
close: function(animate) {
this._entry.grab_key_focus();
this.parent(animate);
},
_updateCopyItem: function() {
let selection = this._entry.clutter_text.get_selection();
this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&

View File

@ -33,6 +33,36 @@ const KEY_INPUT_SOURCES = 'sources';
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
// This is longest we'll keep the keyboard frozen until an input
// source is active.
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 2000; // ms
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
const KeyboardManagerInterface =
<interface name="org.gnome.SettingsDaemon.Keyboard">
<method name="SetInputSource">
<arg type="u" direction="in" />
</method>
</interface>;
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
if (Main.modalCount > 0)
global.display.freeze_keyboard(global.get_current_time());
else
global.display.grab_keyboard(global.get_current_time());
}
const IBusManager = new Lang.Class({
Name: 'IBusManager',
@ -230,6 +260,7 @@ const InputSource = new Lang.Class({
},
activate: function() {
holdKeyboard();
this.emit('activate');
},
});
@ -262,11 +293,11 @@ const InputSourcePopup = new Lang.Class({
this._select(this._selectedIndex);
},
_keyPressHandler: function(keysym, backwards, action) {
_keyPressHandler: function(keysym, _ignored, action) {
if (action == this._action)
this._select(backwards ? this._previous() : this._next());
this._select(this._next());
else if (action == this._actionBackward)
this._select(backwards ? this._next() : this._previous());
this._select(this._previous());
else if (keysym == Clutter.Left)
this._select(this._previous());
else if (keysym == Clutter.Right)
@ -336,15 +367,14 @@ const InputSourceIndicator = new Lang.Class({
this._keybindingAction =
Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY,
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES |
Meta.KeyBindingFlags.REVERSED,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY,
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
@ -364,6 +394,13 @@ const InputSourceIndicator = new Lang.Class({
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
this._inputSourcesChanged();
this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
function(proxy, error) {
if (error)
log(error.message);
});
global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
@ -397,13 +434,44 @@ const InputSourceIndicator = new Lang.Class({
this._inputSourcesChanged();
},
_modifiersSwitcher: function() {
let sourceIndexes = Object.keys(this._inputSources);
if (sourceIndexes.length == 0) {
releaseKeyboard();
return;
}
let is = this._currentSource;
if (!is)
is = this._inputSources[sourceIndexes[0]];
let nextIndex = is.index + 1;
if (nextIndex > sourceIndexes[sourceIndexes.length - 1])
nextIndex = 0;
while (!(is = this._inputSources[nextIndex]))
nextIndex += 1;
is.activate();
},
_switchInputSource: function(display, screen, window, binding) {
if (this._mruSources.length < 2)
return;
// HACK: Fall back on simple input source switching since we
// can't show a popup switcher while the message tray is up
// without considerable work to consolidate the usage of
// pushModal/popModal and grabHelper. See
// https://bugzilla.gnome.org/show_bug.cgi?id=695143 .
if (Main.keybindingMode == Shell.KeyBindingMode.MESSAGE_TRAY) {
this._modifiersSwitcher();
return;
}
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
let backwards = false; // Not using this
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
popup.destroy();
},
@ -417,7 +485,7 @@ const InputSourceIndicator = new Lang.Class({
[oldSource, this._currentSource] = [this._currentSource, newSource];
if (oldSource) {
oldSource.menuItem.setOrnament(PopupMenu.Ornament.NONE);
oldSource.menuItem.setShowDot(false);
oldSource.indicatorLabel.hide();
}
@ -435,7 +503,7 @@ const InputSourceIndicator = new Lang.Class({
this.actor.show();
newSource.menuItem.setOrnament(PopupMenu.Ornament.DOT);
newSource.menuItem.setShowDot(true);
newSource.indicatorLabel.show();
this._buildPropSection(newSource.properties);
@ -459,7 +527,6 @@ const InputSourceIndicator = new Lang.Class({
this._inputSources = {};
this._ibusSources = {};
this._currentSource = null;
let inputSourcesByShortName = {};
@ -488,10 +555,10 @@ const InputSourceIndicator = new Lang.Class({
let is = new InputSource(type, id, displayName, shortName, i);
is.connect('activate', Lang.bind(this, function() {
if (this._currentSource && this._currentSource.index == is.index)
return;
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
GLib.Variant.new_uint32(is.index));
let inVariant = new GLib.Variant('(u)', [is.index]);
this._keyboardManager.call('SetInputSource', inVariant, 0,
MAX_INPUT_SOURCE_ACTIVATION_TIME,
null, releaseKeyboard);
}));
if (!(is.shortName in inputSourcesByShortName))
@ -661,8 +728,7 @@ const InputSourceIndicator = new Lang.Class({
item.prop = prop;
radioGroup.push(item);
item.radioGroup = radioGroup;
item.setOrnament(prop.get_state() == IBus.PropState.CHECKED ?
PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE);
item.setShowDot(prop.get_state() == IBus.PropState.CHECKED);
item.connect('activate', Lang.bind(this, function() {
if (item.prop.get_state() == IBus.PropState.CHECKED)
return;
@ -670,12 +736,12 @@ const InputSourceIndicator = new Lang.Class({
let group = item.radioGroup;
for (let i = 0; i < group.length; ++i) {
if (group[i] == item) {
item.setOrnament(PopupMenu.Ornament.DOT);
item.setShowDot(true);
item.prop.set_state(IBus.PropState.CHECKED);
this._ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.CHECKED);
} else {
group[i].setOrnament(PopupMenu.Ornament.NONE);
group[i].setShowDot(false);
group[i].prop.set_state(IBus.PropState.UNCHECKED);
this._ibusManager.activateProperty(group[i].prop.get_key(),
IBus.PropState.UNCHECKED);

View File

@ -5,10 +5,17 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang;
const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient;
const NMGtk = imports.gi.NMGtk;
const Signals = imports.signals;
const St = imports.gi.St;
// Some of the new code depends on as-yet-unreleased NM
var NMGtk;
try {
NMGtk = imports.gi.NMGtk;
} catch(e) {
NMGtk = null;
}
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@ -27,6 +34,7 @@ const NMConnectionCategory = {
};
const NMAccessPointSecurity = {
UNKNOWN: 0,
NONE: 1,
WEP: 2,
WPA_PSK: 3,
@ -44,6 +52,20 @@ const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
// (the remaining are placed into More…)
const NUM_VISIBLE_NETWORKS = 5;
function macToArray(string) {
return string.split(':').map(function(el) {
return parseInt(el, 16);
});
}
function macCompare(one, two) {
for (let i = 0; i < 6; i++) {
if (one[i] != two[i])
return false;
}
return true;
}
function ssidCompare(one, two) {
if (!one || !two)
return false;
@ -108,7 +130,8 @@ const NMNetworkMenuItem = new Lang.Class({
this._icons.add_actor(this._signalIcon);
this._secureIcon = new St.Icon({ style_class: 'popup-menu-icon' });
if (this.bestAP._secType != NMAccessPointSecurity.NONE)
if (this.bestAP._secType != NMAccessPointSecurity.UNKNOWN &&
this.bestAP._secType != NMAccessPointSecurity.NONE)
this._secureIcon.icon_name = 'network-wireless-encrypted-symbolic';
this._icons.add_actor(this._secureIcon);
},
@ -130,12 +153,18 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
Name: 'NMWirelessSectionTitleMenuItem',
Extends: PopupMenu.PopupSwitchMenuItem,
_init: function(client) {
this.parent(_("Wi-Fi"), false, { style_class: 'popup-subtitle-menu-item' });
_init: function(client, property, title, params) {
params = params || { };
params.style_class = 'popup-subtitle-menu-item';
this.parent(title, false, params);
this._client = client;
this._client.connect('notify::wireless-enabled', Lang.bind(this, this._propertyChanged));
this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._propertyChanged));
this._property = property + '_enabled';
this._propertyHardware = property + '_hardware_enabled';
this._setEnabledFunc = property + '_set_enabled';
this._client.connect('notify::' + property + '-enabled', Lang.bind(this, this._propertyChanged));
this._client.connect('notify::' + property + '-hardware-enabled', Lang.bind(this, this._propertyChanged));
this._propertyChanged();
},
@ -157,12 +186,12 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
activate: function(event) {
this.parent(event);
this._client.wireless_set_enabled(this._switch.state);
this._client[this._setEnabledFunc](this._switch.state);
},
_propertyChanged: function() {
this._softwareEnabled = this._client.wireless_enabled;
this._hardwareEnabled = this._client.wireless_hardware_enabled;
this._softwareEnabled = this._client[this._property];
this._hardwareEnabled = this._client[this._propertyHardware];
let enabled = this._softwareEnabled && this._hardwareEnabled;
this.setToggleState(enabled);
@ -286,6 +315,7 @@ const NMDevice = new Lang.Class({
this._activeConnection = null;
this._activeConnectionItem = null;
this._autoConnectionItem = null;
this._overflowItem = null;
this.statusItem = new PopupMenu.PopupSwitchMenuItem('', this.connected, { style_class: 'popup-subtitle-menu-item' });
@ -372,9 +402,13 @@ const NMDevice = new Lang.Class({
},
_activateAutomaticConnection: function() {
let connection = new NetworkManager.Connection();
this._client.add_and_activate_connection(connection, this.device, null, null);
return true;
let connection = this._createAutomaticConnection();
if (connection) {
this._client.add_and_activate_connection(connection, this.device, null, null);
return true;
}
return false;
},
get connected() {
@ -468,6 +502,11 @@ const NMDevice = new Lang.Class({
this.statusItem.label.text = this.device._description;
},
// protected
_createAutomaticConnection: function() {
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
},
_queueCreateSection: function() {
if (this._deferredWorkId) {
this._clearSection();
@ -478,6 +517,7 @@ const NMDevice = new Lang.Class({
_clearSection: function() {
// Clear everything
this.section.removeAll();
this._autoConnectionItem = null;
this._activeConnectionItem = null;
this._overflowItem = null;
for (let i = 0; i < this._connections.length; i++) {
@ -516,6 +556,14 @@ const NMDevice = new Lang.Class({
} else
this.section.addMenuItem(obj.item);
}
} else if (this._autoConnectionName) {
this._autoConnectionItem = new PopupMenu.PopupMenuItem(this._autoConnectionName);
this._autoConnectionItem.connect('activate', Lang.bind(this, function() {
let connection = this._createAutomaticConnection();
if (connection)
this._client.add_and_activate_connection(connection, this.device, null, null);
}));
this.section.addMenuItem(this._autoConnectionItem);
}
},
@ -540,7 +588,7 @@ const NMDevice = new Lang.Class({
title = _("Connected (private)");
}
this._activeConnectionItem = new PopupMenu.PopupMenuItem(title, { reactive: false });
this._activeConnectionItem.setOrnament(PopupMenu.Ornament.DOT);
this._activeConnectionItem.setShowDot(true);
},
_deviceStateChanged: function(device, newstate, oldstate, reason) {
@ -617,10 +665,24 @@ const NMDeviceWired = new Lang.Class({
_init: function(client, device, connections) {
device._description = _("Wired");
this._autoConnectionName = _("Auto Ethernet");
this.category = NMConnectionCategory.WIRED;
this.parent(client, device, connections);
},
_createAutomaticConnection: function() {
let connection = new NetworkManager.Connection();
let uuid = NetworkManager.utils_uuid_generate();
connection.add_setting(new NetworkManager.SettingWired());
connection.add_setting(new NetworkManager.SettingConnection({
uuid: uuid,
id: this._autoConnectionName,
type: NetworkManager.SETTING_WIRED_SETTING_NAME,
autoconnect: true
}));
return connection;
}
});
const NMDeviceModem = new Lang.Class({
@ -661,10 +723,13 @@ const NMDeviceModem = new Lang.Class({
this._connectionType = NetworkManager.SETTING_GSM_SETTING_NAME;
}
if (is_wwan)
if (is_wwan) {
this.category = NMConnectionCategory.WWAN;
else
this._autoConnectionName = _("Auto broadband");
} else {
this.category = NMConnectionCategory.WIRED;
this._autoConnectionName = _("Auto dial-up");
}
if (this.mobileDevice) {
this._operatorNameId = this.mobileDevice.connect('notify::operator-name', Lang.bind(this, function() {
@ -759,20 +824,50 @@ const NMDeviceBluetooth = new Lang.Class({
_init: function(client, device, connections) {
device._description = _("Bluetooth");
this._autoConnectionName = this._makeConnectionName(device);
device.connect('notify::name', Lang.bind(this, this._updateAutoConnectionName));
this.category = NMConnectionCategory.WWAN;
this.parent(client, device, connections);
},
_createAutomaticConnection: function() {
let connection = new NetworkManager.Connection;
let uuid = NetworkManager.utils_uuid_generate();
connection.add_setting(new NetworkManager.SettingBluetooth);
connection.add_setting(new NetworkManager.SettingConnection({
uuid: uuid,
id: this._autoConnectionName,
type: NetworkManager.SETTING_BLUETOOTH_SETTING_NAME,
autoconnect: false
}));
return connection;
},
_activateAutomaticConnection: function() {
// FIXME: DUN devices are configured like modems, so
// We need to spawn the mobile wizard
// we need to spawn the mobile wizard
// but the network panel doesn't support bluetooth at the moment
// so we just create an empty connection and hope
// that this phone supports PAN
return this.parent();
},
_makeConnectionName: function(device) {
let name = device.name;
if (name)
return _("Auto %s").format(name);
else
return _("Auto bluetooth");
},
_updateAutoConnectionName: function() {
this._autoConnectionName = this._makeConnectionName(this.device);
this._queueCreateSection();
this._updateStatusItem();
}
});
@ -808,20 +903,20 @@ const NMDeviceWireless = new Lang.Class({
}
let pos = this._findNetwork(ap);
let network;
let obj;
if (pos != -1) {
network = this._networks[pos];
network.accessPoints.push(ap);
obj = this._networks[pos];
obj.accessPoints.push(ap);
} else {
network = { ssid: ap.get_ssid(),
mode: ap.mode,
security: this._getApSecurityType(ap),
connections: [ ],
item: null,
accessPoints: [ ap ]
obj = { ssid: ap.get_ssid(),
mode: ap.mode,
security: this._getApSecurityType(ap),
connections: [ ],
item: null,
accessPoints: [ ap ]
};
network.ssidText = ssidToLabel(network.ssid);
this._networks.push(network);
obj.ssidText = ssidToLabel(obj.ssid);
this._networks.push(obj);
}
ap._updateId = ap.connect('notify::strength', Lang.bind(this, this._onApStrengthChanged));
@ -829,8 +924,8 @@ const NMDeviceWireless = new Lang.Class({
for (let j = 0; j < validConnections.length; j++) {
let connection = validConnections[j];
if (ap.connection_valid(connection) &&
network.connections.indexOf(connection) == -1) {
network.connections.push(connection);
obj.connections.indexOf(connection) == -1) {
obj.connections.push(connection);
}
}
}
@ -839,7 +934,16 @@ const NMDeviceWireless = new Lang.Class({
for (let i = 0; i < this._networks.length; i++)
sortAccessPoints(this._networks[i].accessPoints);
this._activeApChanged();
if (this.device.active_access_point) {
let networkPos = this._findNetwork(this.device.active_access_point);
if (networkPos == -1) // the connected access point is invisible
this._activeNetwork = null;
else
this._activeNetwork = this._networks[networkPos];
} else {
this._activeNetwork = null;
}
this._networks.sort(this._networkSortFunction);
this._apChangedId = device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
@ -986,9 +1090,9 @@ const NMDeviceWireless = new Lang.Class({
_findExistingNetwork: function(accessPoint) {
for (let i = 0; i < this._networks.length; i++) {
let network = this._networks[i];
for (let j = 0; j < network.accessPoints.length; j++) {
if (network.accessPoints[j] == accessPoint)
let apObj = this._networks[i];
for (let j = 0; j < apObj.accessPoints.length; j++) {
if (apObj.accessPoints[j] == accessPoint)
return { network: i, ap: j };
}
}
@ -1036,30 +1140,30 @@ const NMDeviceWireless = new Lang.Class({
}
let pos = this._findNetwork(accessPoint);
let network;
let apObj;
let needsupdate = false;
if (pos != -1) {
network = this._networks[pos];
if (network.accessPoints.indexOf(accessPoint) != -1) {
apObj = this._networks[pos];
if (apObj.accessPoints.indexOf(accessPoint) != -1) {
log('Access point was already seen, not adding again');
return;
}
Util.insertSorted(network.accessPoints, accessPoint, function(one, two) {
Util.insertSorted(apObj.accessPoints, accessPoint, function(one, two) {
return two.strength - one.strength;
});
if (network.item)
network.item.updateBestAP(network.accessPoints[0]);
if (apObj.item)
apObj.item.updateBestAP(apObj.accessPoints[0]);
} else {
network = { ssid: accessPoint.get_ssid(),
mode: accessPoint.mode,
security: this._getApSecurityType(accessPoint),
connections: [ ],
item: null,
accessPoints: [ accessPoint ]
};
network.ssidText = ssidToLabel(network.ssid);
apObj = { ssid: accessPoint.get_ssid(),
mode: accessPoint.mode,
security: this._getApSecurityType(accessPoint),
connections: [ ],
item: null,
accessPoints: [ accessPoint ]
};
apObj.ssidText = ssidToLabel(apObj.ssid);
}
accessPoint._updateId = accessPoint.connect('notify::strength', Lang.bind(this, this._onApStrengthChanged));
@ -1067,14 +1171,14 @@ const NMDeviceWireless = new Lang.Class({
for (let i = 0; i < this._connections.length; i++) {
let connection = this._connections[i].connection;
if (accessPoint.connection_valid(connection) &&
network.connections.indexOf(connection) == -1) {
network.connections.push(connection);
apObj.connections.indexOf(connection) == -1) {
apObj.connections.push(connection);
}
}
if (pos != -1)
this._networks.splice(pos, 1);
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
let newPos = Util.insertSorted(this._networks, apObj, this._networkSortFunction);
// Queue an update of the UI if we changed the order
if (newPos != pos)
@ -1094,28 +1198,28 @@ const NMDeviceWireless = new Lang.Class({
return;
}
let network = this._networks[res.network];
network.accessPoints.splice(res.ap, 1);
let apObj = this._networks[res.network];
apObj.accessPoints.splice(res.ap, 1);
if (network.accessPoints.length == 0) {
if (this._activeNetwork == network)
if (apObj.accessPoints.length == 0) {
if (this._activeNetwork == apObj)
this._activeNetwork = null;
if (network.item)
network.item.destroy();
if (apObj.item)
apObj.item.destroy();
if (this._overflowItem) {
if (!network.isMore) {
if (!apObj.isMore) {
// we removed an item in the main menu, and we have a more submenu
// we need to extract the first item in more and move it to the submenu
let item = this._overflowItem.menu.firstMenuItem;
if (item && item._network) {
if (item && item._apObj) {
item.destroy();
// clear the cycle, and allow the construction of the new item
item._network.item = null;
item._apObj.item = null;
this._createNetworkItem(item._network, NUM_VISIBLE_NETWORKS-1);
this._createNetworkItem(item._apObj, NUM_VISIBLE_NETWORKS-1);
} else {
log('The more... menu was existing and empty! This should not happen');
}
@ -1134,14 +1238,14 @@ const NMDeviceWireless = new Lang.Class({
let okPrev = true, okNext = true;
if (res.network > 0)
okPrev = this._networkSortFunction(this._networks[res.network - 1], network) >= 0;
okPrev = this._networkSortFunction(this._networks[res.network - 1], apObj) >= 0;
if (res.network < this._networks.length-1)
okNext = this._networkSortFunction(this._networks[res.network + 1], network) <= 0;
okNext = this._networkSortFunction(this._networks[res.network + 1], apObj) <= 0;
if (!okPrev || !okNext)
this._queueCreateSection();
else if (network.item)
network.item.updateBestAP(network.accessPoints[0]);
else if (apObj.item)
apObj.item.updateBestAP(apObj.accessPoints[0]);
}
},
@ -1180,20 +1284,20 @@ const NMDeviceWireless = new Lang.Class({
let forceupdate = false;
for (let i = 0; i < this._networks.length; i++) {
let network = this._networks[i];
let connections = network.connections;
let apObj = this._networks[i];
let connections = apObj.connections;
for (let k = 0; k < connections.length; k++) {
if (connections[k].get_uuid() == connection.get_uuid()) {
// remove the connection from the access point group
connections.splice(k, 1);
connections.splice(k);
forceupdate = forceupdate || connections.length == 0;
if (forceupdate)
break;
if (network.item) {
if (network.item instanceof PopupMenu.PopupSubMenuMenuItem) {
let items = network.item.menu._getMenuItems();
if (apObj.item) {
if (apObj.item instanceof PopupMenu.PopupSubMenuMenuItem) {
let items = apObj.item.menu._getMenuItems();
if (items.length == 2) {
// we need to update the connection list to convert this to a normal item
forceupdate = true;
@ -1206,8 +1310,8 @@ const NMDeviceWireless = new Lang.Class({
}
}
} else {
network.item.destroy();
network.item = null;
apObj.item.destroy();
apObj.item = null;
}
}
break;
@ -1233,13 +1337,13 @@ const NMDeviceWireless = new Lang.Class({
// find an appropriate access point
let forceupdate = false;
for (let i = 0; i < this._networks.length; i++) {
let network = this._networks[i];
let apObj = this._networks[i];
// Check if connection is valid for any of these access points
for (let k = 0; k < network.accessPoints.length; k++) {
let ap = network.accessPoints[k];
for (let k = 0; k < apObj.accessPoints.length; k++) {
let ap = apObj.accessPoints[k];
if (ap.connection_valid(connection)) {
network.connections.push(connection);
apObj.connections.push(connection);
// this potentially changes the sorting order
forceupdate = true;
break;
@ -1260,30 +1364,55 @@ const NMDeviceWireless = new Lang.Class({
else
title = _("Connected (private)");
this._activeConnectionItem = new NMNetworkMenuItem(this.device.active_access_point, undefined,
{ reactive: false });
this._activeConnectionItem.setOrnament(PopupMenu.Ornament.DOT);
if (this._activeNetwork)
this._activeConnectionItem = new NMNetworkMenuItem(this.device.active_access_point, undefined,
{ reactive: false });
else
this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(title,
'network-wireless-connected-symbolic',
{ reactive: false });
this._activeConnectionItem.setShowDot(true);
},
_createNetworkItem: function(network, position) {
if(!network.accessPoints || network.accessPoints.length == 0) {
_createAutomaticConnection: function(apObj) {
let name;
let ssid = NetworkManager.utils_ssid_to_utf8(apObj.ssid);
if (ssid) {
/* TRANSLATORS: this the automatic wireless connection name (including the network name) */
name = _("Auto %s").format(ssid);
} else
name = _("Auto wireless");
let connection = new NetworkManager.Connection();
connection.add_setting(new NetworkManager.SettingWireless());
connection.add_setting(new NetworkManager.SettingConnection({
id: name,
autoconnect: true, // NetworkManager will know to ignore this if appropriate
uuid: NetworkManager.utils_uuid_generate(),
type: NetworkManager.SETTING_WIRELESS_SETTING_NAME
}));
return connection;
},
_createNetworkItem: function(apObj, position) {
if(!apObj.accessPoints || apObj.accessPoints.length == 0) {
// this should not happen, but I have no idea why it happens
return;
}
if(network.connections.length > 0) {
if (network.connections.length == 1) {
network.item = this._createAPItem(network.connections[0], network, false);
if(apObj.connections.length > 0) {
if (apObj.connections.length == 1) {
apObj.item = this._createAPItem(apObj.connections[0], apObj, false);
} else {
let title = network.ssidText;
network.item = new PopupMenu.PopupSubMenuMenuItem(title);
for (let i = 0; i < network.connections.length; i++)
network.item.menu.addMenuItem(this._createAPItem(network.connections[i], network, true));
let title = apObj.ssidText;
apObj.item = new PopupMenu.PopupSubMenuMenuItem(title);
for (let i = 0; i < apObj.connections.length; i++)
apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true));
}
} else {
network.item = new NMNetworkMenuItem(network.accessPoints[0]);
network.item.connect('activate', Lang.bind(this, function() {
let accessPoints = network.accessPoints;
apObj.item = new NMNetworkMenuItem(apObj.accessPoints[0]);
apObj.item.connect('activate', Lang.bind(this, function() {
let accessPoints = apObj.accessPoints;
if ( (accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT)
|| (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) {
// 802.1x-enabled APs require further configuration, so they're
@ -1291,23 +1420,23 @@ const NMDeviceWireless = new Lang.Class({
Util.spawn(['gnome-control-center', 'network', 'connect-8021x-wifi',
this.device.get_path(), accessPoints[0].dbus_path]);
} else {
let connection = new NetworkManager.Connection();
let connection = this._createAutomaticConnection(apObj);
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null)
}
}));
}
network.item._network = network;
apObj.item._apObj = apObj;
if (position < NUM_VISIBLE_NETWORKS) {
network.isMore = false;
this.section.addMenuItem(network.item, position);
apObj.isMore = false;
this.section.addMenuItem(apObj.item, position);
} else {
if (!this._overflowItem) {
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More…"));
this.section.addMenuItem(this._overflowItem);
}
this._overflowItem.menu.addMenuItem(network.item, position - NUM_VISIBLE_NETWORKS);
network.isMore = true;
this._overflowItem.menu.addMenuItem(apObj.item, position - NUM_VISIBLE_NETWORKS);
apObj.isMore = true;
}
},
@ -1323,13 +1452,13 @@ const NMDeviceWireless = new Lang.Class({
let activeOffset = this._activeConnectionItem ? 1 : 0;
for(let j = 0; j < this._networks.length; j++) {
let network = this._networks[j];
if (network == this._activeNetwork) {
let apObj = this._networks[j];
if (apObj == this._activeNetwork) {
activeOffset--;
continue;
}
this._createNetworkItem(network, j + activeOffset);
this._createNetworkItem(apObj, j + activeOffset);
}
},
});
@ -1551,9 +1680,11 @@ const NMApplet = new Lang.Class({
// Virtual device types
this._vtypes = { };
this._vtypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMDeviceVirtual;
if (NMGtk) {
this._vtypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMDeviceVirtual;
}
// Connection types
this._ctypes = { };
@ -1565,9 +1696,11 @@ const NMApplet = new Lang.Class({
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_INFINIBAND_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
if (NMGtk) {
this._ctypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
}
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
NMClient.Client.new_async(null, Lang.bind(this, this._clientGot));
@ -1635,7 +1768,7 @@ const NMApplet = new Lang.Class({
this._devices.wireless = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
item: this._makeWirelessToggle()
item: this._makeToggleItem('wireless', _("Wi-Fi"))
};
this._devices.wireless.section.addMenuItem(this._devices.wireless.item);
this._devices.wireless.section.actor.hide();
@ -1682,14 +1815,14 @@ const NMApplet = new Lang.Class({
}
},
_makeWirelessToggle: function() {
let item = new NMWirelessSectionTitleMenuItem(this._client);
_makeToggleItem: function(type, title) {
let item = new NMWirelessSectionTitleMenuItem(this._client, type, title);
item.connect('enabled-changed', Lang.bind(this, function(item, enabled) {
let devices = this._devices.wireless.devices;
let devices = this._devices[type].devices;
devices.forEach(function(dev) {
dev.setEnabled(enabled);
});
this._syncSectionTitle('wireless');
this._syncSectionTitle(type);
}));
return item;
},
@ -1767,12 +1900,19 @@ const NMApplet = new Lang.Class({
},
_syncDeviceNames: function() {
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._description = names[i];
if (device._delegate)
if (NMGtk) {
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._description = names[i];
if (device._delegate)
device._delegate.syncDescription();
}
} else {
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._delegate.syncDescription();
}
}
},
@ -1808,6 +1948,11 @@ const NMApplet = new Lang.Class({
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.disconnect(wrapper._destroyId);
});
let section = this._devices[wrapper.category].section;
section.addMenuItem(wrapper.statusItem);
@ -1839,8 +1984,6 @@ const NMApplet = new Lang.Class({
},
_removeDeviceWrapper: function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.destroy();
let devices = this._devices[wrapper.category].devices;
@ -1991,7 +2134,25 @@ const NMApplet = new Lang.Class({
return false;
},
_addConnection: function(connection) {
_readConnections: function() {
let connections = this._settings.list_connections();
for (let i = 0; i < connections.length; i++) {
let connection = connections[i];
if (this._ignoreConnection(connection))
continue;
if (connection._updatedId) {
// connection was already seen (for example because NetworkManager was restarted)
continue;
}
connection._removedId = connection.connect('removed', Lang.bind(this, this._connectionRemoved));
connection._updatedId = connection.connect('updated', Lang.bind(this, this._updateConnection));
this._updateConnection(connection);
this._connections.push(connection);
}
},
_newConnection: function(settings, connection) {
if (this._ignoreConnection(connection))
return;
if (connection._updatedId) {
@ -2004,22 +2165,14 @@ const NMApplet = new Lang.Class({
this._updateConnection(connection);
this._connections.push(connection);
},
_readConnections: function() {
let connections = this._settings.list_connections();
connections.forEach(Lang.bind(this, this._addConnection));
},
_newConnection: function(settings, connection) {
this._addConnection(connection);
this._updateIcon();
},
_connectionRemoved: function(connection) {
let pos = this._connections.indexOf(connection);
if (pos != -1)
this._connections.splice(connection, 1);
this._connections.splice(connection);
let section = connection._section;

View File

@ -91,8 +91,7 @@ const UnlockDialog = new Lang.Class({
this._promptLoginHint.hide();
this.contentLayout.add_actor(this._promptLoginHint);
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, LoginDialog.WORK_SPINNER_ICON_SIZE);
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', LoginDialog.WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this.allowCancel = false;

View File

@ -150,14 +150,6 @@ const ViewSelector = new Lang.Class({
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleAppsPage));
Main.wm.addKeybinding('toggle-overview',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(Main.overview, Main.overview.toggle));
},
_toggleAppsPage: function() {
@ -186,10 +178,6 @@ const ViewSelector = new Lang.Class({
Main.overview.fadeInDesktop();
},
setWorkspacesFullGeometry: function(geom) {
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
},
hide: function() {
this._workspacesDisplay.hide();
},

View File

@ -172,9 +172,8 @@ const WindowManager = new Lang.Class({
this.addKeybinding('open-application-menu',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.TOPBAR_POPUP,
Lang.bind(this, this._toggleAppMenu));
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._openAppMenu));
Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
@ -680,8 +679,8 @@ const WindowManager = new Lang.Class({
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
},
_toggleAppMenu : function(display, screen, window, event, binding) {
Main.panel.toggleAppMenu();
_openAppMenu : function(display, screen, window, event, binding) {
Main.panel.openAppMenu();
},
_showWorkspaceSwitcher : function(display, screen, window, binding) {

View File

@ -753,6 +753,13 @@ const LayoutStrategy = new Lang.Class({
layout.space = space;
},
_getDistance: function (row, actor) {
let dist_x = actor.x - row.x;
let dist_y = actor.y - row.y;
return Math.sqrt(Math.pow(dist_x, 2) + Math.pow(dist_y, 2));
},
computeWindowSlots: function(layout, area) {
this._computeRowSizes(layout);
@ -760,36 +767,28 @@ const LayoutStrategy = new Lang.Class({
let slots = [];
// Do this in three parts.
let height = 0;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
height += row.height + this._rowSpacing;
}
height -= this._rowSpacing;
let y = 0;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
// If this window layout row doesn't fit in the actual
// geometry, then apply an additional scale to it.
row.additionalScale = Math.min(1, area.width / row.width, area.height / height);
row.x = area.x + (Math.max(area.width - row.width, 0) / 2) * row.additionalScale;
row.y = area.y + (y + Math.max(area.height - height, 0) / 2) * row.additionalScale;
row.x = area.x + (area.width - row.width) / 2;
row.y = area.y + y;
y += row.height + this._rowSpacing;
row.windows.sort(Lang.bind(this, function(a, b) {
return this._getDistance(row, a.realWindow) - this._getDistance(row, b.realWindow);
}));
}
let height = y - this._rowSpacing;
let baseY = (area.height - height) / 2;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
row.y += baseY;
let x = row.x;
for (let j = 0; j < row.windows.length; j++) {
let window = row.windows[j];
let s = scale * this._computeWindowScale(window) * row.additionalScale;
let s = scale * this._computeWindowScale(window);
let cellWidth = window.actor.width * s;
let cellHeight = window.actor.height * s;
@ -833,13 +832,6 @@ const UnalignedLayoutStrategy = new Lang.Class({
return false;
},
_sortRow: function(row) {
// Sort windows horizontally to minimize travel distance
row.windows.sort(function(a, b) {
return a.realWindow.x - b.realWindow.x;
});
},
computeLayout: function(windows, layout) {
let numRows = layout.numRows;
@ -870,7 +862,6 @@ const UnalignedLayoutStrategy = new Lang.Class({
row.windows.push(window);
row.fullWidth += width;
} else {
this._sortRow(row);
break;
}
}
@ -892,14 +883,6 @@ const UnalignedLayoutStrategy = new Lang.Class({
}
});
function padArea(area, padding) {
return {
x: area.x + padding.left,
y: area.y + padding.top,
width: area.width - padding.left - padding.right,
height: area.height - padding.top - padding.bottom,
};
}
/**
* @metaWorkspace: a #Meta.Workspace, or null
@ -911,19 +894,10 @@ const Workspace = new Lang.Class({
// When dragging a window, we use this slot for reserve space.
this._reservedSlot = null;
this.metaWorkspace = metaWorkspace;
// The full geometry is the geometry we should try and position
// windows for. The actual geometry we allocate may be less than
// this, like if the workspace switcher is slid out.
this._fullGeometry = null;
// The actual geometry is the geometry we need to arrange windows
// in. If this is a smaller area than the full geometry, we'll
// do some simple aspect ratio like math to fit the layout calculated
// for the full geometry into this area.
this._actualGeometry = null;
this._currentLayout = null;
this._x = 0;
this._y = 0;
this._width = 0;
this._height = 0;
this.monitorIndex = monitorIndex;
this._monitor = Main.layoutManager.monitors[this.monitorIndex];
@ -973,22 +947,23 @@ const Workspace = new Lang.Class({
this._positionWindowsFlags = 0;
this._positionWindowsId = 0;
this._currentLayout = null;
},
setFullGeometry: function(geom) {
this._fullGeometry = geom;
this._recalculateWindowPositions(WindowPositionFlags.NONE);
},
setActualGeometry: function(geom) {
this._actualGeometry = geom;
setGeometry: function(x, y, width, height) {
this._x = x;
this._y = y;
this._width = width;
this._height = height;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._dropRect.set_position(geom.x, geom.y);
this._dropRect.set_size(geom.width, geom.height);
this._updateWindowPositions(WindowPositionFlags.NONE);
this._dropRect.set_position(x, y);
this._dropRect.set_size(width, height);
return false;
}));
this.positionWindows(WindowPositionFlags.NONE);
},
_lookupIndex: function (metaWindow) {
@ -1016,32 +991,37 @@ const Workspace = new Lang.Class({
clone = null;
this._reservedSlot = clone;
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
this._currentLayout = null;
this.positionWindows(WindowPositionFlags.ANIMATE);
},
_recalculateWindowPositions: function(flags) {
/**
* positionWindows:
* @flags:
* INITIAL - this is the initial positioning of the windows.
* ANIMATE - Indicates that we need animate changing position.
*/
positionWindows: function(flags) {
this._positionWindowsFlags |= flags;
if (this._positionWindowsId > 0)
return;
this._positionWindowsId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._realRecalculateWindowPositions(this._positionWindowsFlags);
this._realPositionWindows(this._positionWindowsFlags);
this._positionWindowsFlags = 0;
this._positionWindowsId = 0;
return false;
}));
},
_realRecalculateWindowPositions: function(flags) {
_realPositionWindows : function(flags) {
if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0;
}
let clones = this._windows.slice();
if (clones.length == 0)
return;
clones.sort(function(a, b) {
return a.metaWindow.get_stable_sequence() - b.metaWindow.get_stable_sequence();
@ -1050,25 +1030,11 @@ const Workspace = new Lang.Class({
if (this._reservedSlot)
clones.push(this._reservedSlot);
this._currentLayout = this._computeLayout(clones);
this._updateWindowPositions(flags);
},
_updateWindowPositions: function(flags) {
if (this._currentLayout == null) {
this._recalculateWindowPositions(flags);
return;
}
let initialPositioning = flags & WindowPositionFlags.INITIAL;
let animate = flags & WindowPositionFlags.ANIMATE;
let layout = this._currentLayout;
let strategy = layout.strategy;
let [, , padding] = this._getSpacingAndPadding();
let area = padArea(this._actualGeometry, padding);
let slots = strategy.computeWindowSlots(layout, area);
// Start the animations
let slots = this._computeAllWindowSlots(clones);
let currentWorkspace = global.screen.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
@ -1182,8 +1148,8 @@ const Workspace = new Lang.Class({
let [x, y, mask] = global.get_pointer();
let pointerHasMoved = (this._cursorX != x && this._cursorY != y);
let inWorkspace = (this._fullGeometry.x < x && x < this._fullGeometry.x + this._fullGeometry.width &&
this._fullGeometry.y < y && y < this._fullGeometry.y + this._fullGeometry.height);
let inWorkspace = (this._x < x && x < this._x + this._width &&
this._y < y && y < this._y + this._height);
if (pointerHasMoved && inWorkspace) {
// store current cursor position
@ -1198,7 +1164,7 @@ const Workspace = new Lang.Class({
return true;
}
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
this.positionWindows(WindowPositionFlags.ANIMATE);
return false;
},
@ -1303,7 +1269,7 @@ const Workspace = new Lang.Class({
}
this._currentLayout = null;
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
this.positionWindows(WindowPositionFlags.ANIMATE);
},
_windowAdded : function(metaWorkspace, metaWin) {
@ -1340,8 +1306,13 @@ const Workspace = new Lang.Class({
// Animate the full-screen to Overview transition.
zoomToOverview : function() {
this._currentLayout = null;
// Position and scale the windows.
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
if (Main.overview.animationInProgress)
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
else
this.positionWindows(WindowPositionFlags.INITIAL);
},
// Animates the return from Overview mode
@ -1465,7 +1436,7 @@ const Workspace = new Lang.Class({
}));
clone.connect('size-changed',
Lang.bind(this, function() {
this._recalculateWindowPositions(WindowPositionFlags.NONE);
this.positionWindows(0);
}));
this.actor.add_actor(clone.actor);
@ -1514,14 +1485,12 @@ const Workspace = new Lang.Class({
}
},
_getBestLayout: function(windows, area, rowSpacing, columnSpacing) {
_computeLayout: function(windows, area, rowSpacing, columnSpacing) {
// We look for the largest scale that allows us to fit the
// largest row/tallest column on the workspace.
let lastLayout = {};
let strategy = new UnalignedLayoutStrategy(this._monitor, rowSpacing, columnSpacing);
for (let numRows = 1; ; numRows++) {
let numColumns = Math.ceil(windows.length / numRows);
@ -1531,6 +1500,8 @@ const Workspace = new Lang.Class({
if (numColumns == lastLayout.numColumns)
break;
let strategy = new UnalignedLayoutStrategy(this._monitor, rowSpacing, columnSpacing);
let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns };
strategy.computeLayout(windows, layout);
strategy.computeScaleAndSpace(layout);
@ -1544,7 +1515,18 @@ const Workspace = new Lang.Class({
return lastLayout;
},
_getSpacingAndPadding: function() {
_rectEqual: function(one, two) {
if (one == two)
return true;
return (one.x == two.x &&
one.y == two.y &&
one.width == two.width &&
one.height == two.height);
},
_computeAllWindowSlots: function(windows) {
let totalWindows = windows.length;
let node = this.actor.get_theme_node();
// Window grid spacing
@ -1557,14 +1539,21 @@ const Workspace = new Lang.Class({
right: node.get_padding(St.Side.RIGHT),
};
if (!totalWindows)
return [];
let closeButtonHeight, captionHeight;
let leftBorder, rightBorder;
// All of the overlays have the same chrome sizes,
// so just pick the first one.
let overlay = this._windowOverlays[0];
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
[leftBorder, rightBorder] = overlay.chromeWidths();
if (this._windowOverlays.length) {
// All of the overlays have the same chrome sizes,
// so just pick the first one.
let overlay = this._windowOverlays[0];
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
[leftBorder, rightBorder] = overlay.chromeWidths();
} else {
[closeButtonHeight, captionHeight] = [0, 0];
[leftBorder, rightBorder] = [0, 0];
}
rowSpacing += captionHeight;
columnSpacing += (rightBorder + leftBorder) / 2;
@ -1573,13 +1562,25 @@ const Workspace = new Lang.Class({
padding.left += leftBorder;
padding.right += rightBorder;
return [rowSpacing, columnSpacing, padding];
},
let area = {
x: this._x + padding.left,
y: this._y + padding.top,
width: this._width - padding.left - padding.right,
height: this._height - padding.top - padding.bottom,
};
_computeLayout: function(windows) {
let [rowSpacing, columnSpacing, padding] = this._getSpacingAndPadding();
let area = padArea(this._fullGeometry, padding);
return this._getBestLayout(windows, area, rowSpacing, columnSpacing);
if (!this._currentLayout)
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing);
let layout = this._currentLayout;
let strategy = layout.strategy;
if (!this._rectEqual(area, layout.area)) {
layout.area = area;
strategy.computeScaleAndSpace(layout);
}
return strategy.computeWindowSlots(layout, area);
},
_onCloneSelected : function (clone, time) {

View File

@ -23,18 +23,6 @@ const MAX_WORKSPACES = 16;
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
function rectEqual(one, two) {
if (one == two)
return true;
if (!one || !two)
return false;
return (one.x == two.x &&
one.y == two.y &&
one.width == two.width &&
one.height == two.height);
}
const WorkspacesView = new Lang.Class({
Name: 'WorkspacesView',
@ -55,9 +43,10 @@ const WorkspacesView = new Lang.Class({
this._updateWorkspaceActors(false);
}));
this._fullGeometry = null;
this._actualGeometry = null;
this._width = 0;
this._height = 0;
this._x = 0;
this._y = 0;
this._spacing = 0;
this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling
@ -96,8 +85,8 @@ const WorkspacesView = new Lang.Class({
this._overviewShownId =
Main.overview.connect('shown',
Lang.bind(this, function() {
this.actor.set_clip(this._fullGeometry.x, this._fullGeometry.y,
this._fullGeometry.width, this._fullGeometry.height);
this.actor.set_clip(this._x, this._y,
this._width, this._height);
}));
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@ -135,8 +124,10 @@ const WorkspacesView = new Lang.Class({
continue;
let ws = new Workspace.Workspace(null, i);
ws.setFullGeometry(monitors[i]);
ws.setActualGeometry(monitors[i]);
ws.setGeometry(monitors[i].x,
monitors[i].y,
monitors[i].width,
monitors[i].height);
global.overlay_group.add_actor(ws.actor);
this._extraWorkspaces.push(ws);
}
@ -148,24 +139,18 @@ const WorkspacesView = new Lang.Class({
this._extraWorkspaces = [];
},
setFullGeometry: function(geom) {
if (rectEqual(this._fullGeometry, geom))
return;
setGeometry: function(x, y, width, height) {
if (this._x == x && this._y == y &&
this._width == width && this._height == height)
return;
this._fullGeometry = geom;
this._width = width;
this._height = height;
this._x = x;
this._y = y;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setFullGeometry(geom);
},
setActualGeometry: function(geom) {
if (rectEqual(this._actualGeometry, geom))
return;
this._actualGeometry = geom;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setActualGeometry(geom);
this._workspaces[i].setGeometry(x, y, width, height);
},
_lookupWorkspaceForMetaWindow: function (metaWindow) {
@ -225,7 +210,7 @@ const WorkspacesView = new Lang.Class({
Tweener.removeTweens(workspace.actor);
let y = (w - active) * (this._fullGeometry.height + this._spacing);
let y = (w - active) * (this._height + this._spacing);
if (showAnimation) {
let params = { y: y,
@ -296,9 +281,8 @@ const WorkspacesView = new Lang.Class({
if (newNumWorkspaces > oldNumWorkspaces) {
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
this._workspaces[w].setFullGeometry(this._fullGeometry);
if (this._actualGeometry)
this._workspaces[w].setActualGeometry(this._actualGeometry);
this._workspaces[w].setGeometry(this._x, this._y,
this._width, this._height);
this.actor.add_actor(this._workspaces[w].actor);
}
@ -446,7 +430,7 @@ const WorkspacesDisplay = new Lang.Class({
_init: function() {
this.actor = new St.Widget({ clip_to_allocation: true });
this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesActualGeometry));
this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry));
this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
let clickAction = new Clutter.ClickAction()
@ -500,8 +484,6 @@ const WorkspacesDisplay = new Lang.Class({
this._notifyOpacityId = 0;
this._scrollEventId = 0;
this._fullGeometry = null;
},
_onPan: function(action) {
@ -590,8 +572,7 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews.push(view);
}
this._updateWorkspacesFullGeometry();
this._updateWorkspacesActualGeometry();
this._updateWorkspacesGeometry();
for (let i = 0; i < this._workspacesViews.length; i++)
global.overlay_group.add_actor(this._workspacesViews[i].actor);
@ -651,48 +632,31 @@ const WorkspacesDisplay = new Lang.Class({
}));
},
// This geometry should always be the fullest geometry
// the workspaces switcher can ever be allocated, as if
// the sliding controls were never slid in at all.
setWorkspacesFullGeometry: function(geom) {
this._fullGeometry = geom;
this._updateWorkspacesFullGeometry();
},
_updateWorkspacesFullGeometry: function() {
_updateWorkspacesGeometry: function() {
if (!this._workspacesViews.length)
return;
let monitors = Main.layoutManager.monitors;
let m = 0;
for (let i = 0; i < monitors.length; i++) {
if (i == this._primaryIndex) {
this._workspacesViews[m].setFullGeometry(this._fullGeometry);
m++;
} else if (!this._workspacesOnlyOnPrimary) {
this._workspacesViews[m].setFullGeometry(monitors[i]);
m++;
}
}
},
let fullWidth = this.actor.allocation.x2 - this.actor.allocation.x1;
let fullHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
_updateWorkspacesActualGeometry: function() {
if (!this._workspacesViews.length)
return;
let width = fullWidth;
let height = fullHeight;
let [x, y] = this.actor.get_transformed_position();
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
let geometry = { x: x, y: y, width: width, height: height };
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);
let monitors = Main.layoutManager.monitors;
let m = 0;
for (let i = 0; i < monitors.length; i++) {
if (i == this._primaryIndex) {
this._workspacesViews[m].setActualGeometry(geometry);
this._workspacesViews[m].setGeometry(x, y, width, height);
m++;
} else if (!this._workspacesOnlyOnPrimary) {
this._workspacesViews[m].setActualGeometry(monitors[i]);
this._workspacesViews[m].setGeometry(monitors[i].x,
monitors[i].y,
monitors[i].width,
monitors[i].height);
m++;
}
}

View File

@ -28,7 +28,6 @@ gu
he
hi
hu
ia
id
it
ja

View File

@ -55,7 +55,6 @@ js/ui/viewSelector.js
js/ui/wanda.js
js/ui/windowAttentionHandler.js
src/calendar-server/evolution-calendar.desktop.in.in
# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it.
src/gvc/gvc-mixer-control.c
src/main.c
src/shell-app.c

312
po/cs.po
View File

@ -5,23 +5,23 @@
# Andre Klapper <ak-47@gmx.net>, 2009.
# Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011, 2012.
# Adam Matoušek <adydas95@gmail.com>, 2012, 2013.
# Marek Černocký <marek@manet.cz>, 2012, 2013.
# Marek Černocký <marek@manet.cz>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-04-26 16:24+0000\n"
"PO-Revision-Date: 2013-04-26 19:18+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-08 19:47+0100\n"
"Last-Translator: Adam Matoušek <adamatousek@gmail.com>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.6\n"
"X-Generator: Poedit 1.5.4\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
@ -45,14 +45,10 @@ msgid "Focus the active notification"
msgstr "Zaměřovat aktivní upozornění"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "Zobrazit přehled"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications"
msgstr "Zobrazit všechny aplikace"
#: ../data/50-gnome-shell-system.xml.in.h:6
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Open the application menu"
msgstr "Otevřít nabídku aplikací"
@ -138,8 +134,8 @@ msgid ""
"Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view."
msgstr ""
"Každá kategorie v tomto seznamu bude zobrazena jako složka, místo toho aby "
"byla zobrazena v hlavním pohledu."
"Každá kategorie v tomto seznamu bude zobrazena jako složka, místo toho "
"aby byla zobrazena v hlavním pohledu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
@ -223,50 +219,42 @@ msgid ""
msgstr "Klávesová zkratka k otevření nabídky aplikací v Přehledu aktivit"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to open the overview"
msgstr "Klávesová zkratka k otevření přehledu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to open the Activities Overview."
msgstr "Klávesová zkratka k otevření přehledu činností"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to focus the active notification"
msgstr "Klávesová zkratka k zaměření aktivního upozornění"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification."
msgstr "Klávesová zkratka k zaměření aktivního upozornění."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder"
msgstr "Klávesová zkratka k záznamu obrazovky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Klávesová zkratka k započnutí nebo ukončení záznamu dění na obrazovce."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Která klávesnice se má používat"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "Typ klávesnice, který se má používat."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts."
msgstr "Frekvence snímků při nahrávání dění na obrazovce."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -274,11 +262,11 @@ msgstr ""
"Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla "
"nahrána záznamovým programem GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -303,11 +291,11 @@ msgstr ""
"nahráváním do WEBM s kodekem VP8. %T je použito jako zástupný symbol odhadu "
"nejvhodnějšího počtu vláken na systému."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast"
msgstr "Přípona souboru s nahrávkou dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -317,11 +305,11 @@ msgstr ""
"názvu vycházejícího z aktuálního data a bude používat tuto příponu. Při "
"nahrávání do jiného formátu kontejneru by měla být provedena úprava pravidel."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "The application icon mode."
msgstr "Režim ikon aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@ -331,20 +319,20 @@ msgstr ""
"only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) "
"a „both“ (zobrazí náhled i ikonu)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "Připojovat modální dialogová okna k rodičovským oknům"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Tento kíč přepisuje klíč v org.gnome.mutter, když běží GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "Uspořádání tlačítek v záhlaví"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
@ -352,15 +340,15 @@ msgstr ""
"Tento kíč přepisuje klíč v org.gnome.desktop.wm.preferences, když běží GNOME "
"Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Nechat okna upuštěná při okraji obrazovky vytvářet dlaždice"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:49
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "Pracovní plochy jsou spravovány dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:50
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "Pracovní plochy pouze na hlavním monitoru"
@ -386,36 +374,36 @@ msgstr "Sezení…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Nejste na seznamu?"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:934
msgid "Cancel"
msgstr "Zrušit"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Přihlásit se"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Následující"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Uživatelské jméno: "
#: ../js/gdm/loginDialog.js:1174
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Přihlašovací okno"
@ -424,8 +412,8 @@ msgstr "Přihlašovací okno"
msgid "Power"
msgstr "Vypnout"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:815
msgid "Suspend"
msgstr "Uspat do paměti"
@ -433,58 +421,58 @@ msgstr "Uspat do paměti"
msgid "Restart"
msgstr "Restartovat"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
msgid "Power Off"
msgstr "Vypnout"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Chyba ověření"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(nebo otiskněte prst)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Příkaz nenalezen"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Nelze analyzovat příkaz:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Vykonání „%s“ selhalo:"
#: ../js/ui/appDisplay.js:351
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Časté"
#: ../js/ui/appDisplay.js:358
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Všechny"
#: ../js/ui/appDisplay.js:916
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Nové okno"
#: ../js/ui/appDisplay.js:919 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených"
#: ../js/ui/appDisplay.js:920
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené"
@ -498,7 +486,7 @@ msgstr "%s byl přidán mezi oblíbené."
msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
msgid "Settings"
msgstr "Nastavení"
@ -519,15 +507,15 @@ msgstr "Celý den"
#: ../js/ui/calendar.js:68
msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H:%M"
msgstr "%H.%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
msgctxt "event list time"
msgid "%l\\u2236%M\\u2009%p"
msgstr "%l:%M\\u2009%p"
msgstr "%l.%M\\u2009%p"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
@ -623,35 +611,35 @@ msgid "S"
msgstr "So"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Nic nenaplánováno"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Dnes"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Zítra"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Tento týden"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "Následující týden"
@ -667,12 +655,12 @@ msgstr "Externí svazek odpojen"
msgid "Removable Devices"
msgstr "Výměnná zařízení"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Otevřít s %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Vysunout"
@ -781,7 +769,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47
#: ../js/ui/components/recorder.js:48
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Záznam obrazovky z %d %t"
@ -1055,7 +1043,7 @@ msgstr "Nastavení data a času"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A, %e. %B, %Y"
@ -1230,24 +1218,24 @@ msgstr "Vymazat zprávy"
msgid "Notification Settings"
msgstr "Nastavení upozornění"
#: ../js/ui/messageTray.js:1710
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Žádné zprávy"
#: ../js/ui/messageTray.js:1783
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Lišta zpráv"
#: ../js/ui/messageTray.js:2801
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Informace o systému"
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:378
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:374
msgctxt "program"
msgid "Unknown"
msgstr "Neznámé"
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1259,7 +1247,7 @@ msgstr[2] "%d nových zpráv"
msgid "Undo"
msgstr "Zpět"
#: ../js/ui/overview.js:127
#: ../js/ui/overview.js:129
msgid "Overview"
msgstr "Přehled"
@ -1267,21 +1255,21 @@ msgstr "Přehled"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:260
#: ../js/ui/overview.js:284
msgid "Type to search…"
msgstr "Vyhledávejte psaním…"
#: ../js/ui/panel.js:641
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:692
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Činnosti"
#: ../js/ui/panel.js:989
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Horní lišta"
@ -1290,25 +1278,25 @@ msgstr "Horní lišta"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:718
#: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:74
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Zadejte příkaz:"
#: ../js/ui/runDialog.js:110
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Zavřít"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1316,11 +1304,11 @@ msgstr[0] "%d nové upozornění"
msgstr[1] "%d nová upozornění"
msgstr[2] "%d nových upozornění"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
msgid "Lock"
msgstr "Uzamknout"
#: ../js/ui/screenShield.js:641
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "GNOME potřebuje uzamknout obrazovku"
@ -1331,19 +1319,19 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
msgid "Searching…"
msgstr "Hledá se…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Žádné výsledky."
@ -1355,11 +1343,11 @@ msgstr "Kopírovat"
msgid "Paste"
msgstr "Vložit"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Zobrazit text"
#: ../js/ui/shellEntry.js:103
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Skrýt text"
@ -1371,7 +1359,7 @@ msgstr "Heslo"
msgid "Remember Password"
msgstr "Pamatovat si heslo"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Odemknout"
@ -1426,7 +1414,7 @@ msgstr "Styl velkého textu"
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
#: ../js/ui/status/network.js:761
#: ../js/ui/status/network.js:826
msgid "Bluetooth"
msgstr "Bluetooth"
@ -1447,7 +1435,7 @@ msgid "Bluetooth Settings"
msgstr "Nastavit Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:149
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:178
msgid "hardware disabled"
msgstr "zařízení zakázáno"
@ -1455,12 +1443,12 @@ msgstr "zařízení zakázáno"
msgid "Connection"
msgstr "Připojení"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:426
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:460
msgid "disconnecting..."
msgstr "odpojování…"
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:432
#: ../js/ui/status/network.js:1417
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:466
#: ../js/ui/status/network.js:1546
msgid "connecting..."
msgstr "připojování…"
@ -1552,91 +1540,117 @@ msgstr "Místní a jazyková nastavení"
msgid "Volume, network, battery"
msgstr "Hlasitost, síť, baterie"
#: ../js/ui/status/network.js:82
#: ../js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<neznámé>"
#: ../js/ui/status/network.js:134
msgid "Wi-Fi"
msgstr "Wi-Fi"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:171
#: ../js/ui/status/network.js:200
msgid "disabled"
msgstr "zakázáno"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:424
#: ../js/ui/status/network.js:458
msgid "unmanaged"
msgstr "nespravováno"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:435 ../js/ui/status/network.js:1420
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549
msgid "authentication required"
msgstr "je vyžadováno ověření"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:445
#: ../js/ui/status/network.js:479
msgid "firmware missing"
msgstr "nedostupný firmware"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:452
#: ../js/ui/status/network.js:486
msgid "cable unplugged"
msgstr "kabel byl odpojen"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:457
#: ../js/ui/status/network.js:491
msgid "unavailable"
msgstr "nedostupné"
#: ../js/ui/status/network.js:459 ../js/ui/status/network.js:1422
#: ../js/ui/status/network.js:493 ../js/ui/status/network.js:1551
msgid "connection failed"
msgstr "připojení selhalo"
#: ../js/ui/status/network.js:512 ../js/ui/status/network.js:1306
#: ../js/ui/status/network.js:1498
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1435
#: ../js/ui/status/network.js:1627
msgid "More…"
msgstr "Další…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:540 ../js/ui/status/network.js:1261
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1365
msgid "Connected (private)"
msgstr "Připojení (soukromé)"
#: ../js/ui/status/network.js:619
#: ../js/ui/status/network.js:667
msgid "Wired"
msgstr "Drátová"
#: ../js/ui/status/network.js:633
#: ../js/ui/status/network.js:668
msgid "Auto Ethernet"
msgstr "Automatické Ethernet"
#: ../js/ui/status/network.js:695
msgid "Mobile broadband"
msgstr "Mobilní širokopásmová"
#: ../js/ui/status/network.js:1596
#: ../js/ui/status/network.js:728
msgid "Auto broadband"
msgstr "Automatické širokopásmové"
#: ../js/ui/status/network.js:731
msgid "Auto dial-up"
msgstr "Automatické vytáčené"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:861 ../js/ui/status/network.js:1382
#, c-format
msgid "Auto %s"
msgstr "Automatické %s"
#: ../js/ui/status/network.js:863
msgid "Auto bluetooth"
msgstr "Automatické Bluetooth"
#: ../js/ui/status/network.js:1384
msgid "Auto wireless"
msgstr "Automatické bezdrátové"
#: ../js/ui/status/network.js:1729
msgid "Enable networking"
msgstr "Povolit síť"
#: ../js/ui/status/network.js:1657
#: ../js/ui/status/network.js:1771
msgid "Wi-Fi"
msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1790
msgid "Network Settings"
msgstr "Nastavení sítě"
#: ../js/ui/status/network.js:1674
#: ../js/ui/status/network.js:1807
msgid "Network Manager"
msgstr "Network Manager"
#: ../js/ui/status/network.js:1764
#: ../js/ui/status/network.js:1897
msgid "Connection failed"
msgstr "Připojení selhalo"
#: ../js/ui/status/network.js:1765
#: ../js/ui/status/network.js:1898
msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala"
#: ../js/ui/status/network.js:2123
#: ../js/ui/status/network.js:2276
msgid "Networking is disabled"
msgstr "Síť je zakázána"
@ -1754,11 +1768,11 @@ msgstr "Hlasitost"
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:125
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Přihlásit se jako jiný uživatel"
#: ../js/ui/unlockDialog.js:146
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Odemykací okno"
@ -1786,27 +1800,27 @@ msgstr "Nečinný"
msgid "Offline"
msgstr "Odpojen"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:780
msgid "Notifications"
msgstr "Upozornění"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:796
msgid "Switch User"
msgstr "Přepnout uživatele"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:801
msgid "Log Out"
msgstr "Odhlásit se"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:821
msgid "Install Updates & Restart"
msgstr "Nainstalovat aktualizace a restartovat"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:839
msgid "Your chat status will be set to busy"
msgstr "Váš stav v konverzacích byl nastaven na „Zaneprázdněn“"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:840
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1814,22 +1828,20 @@ msgstr ""
"Upozornění jsou nyní vypnuta, včetně zpráv v konverzacích. Váš stav on-line "
"byl změněn tak, aby ostatní věděli, že si jejich zprávy nemusíte přečíst."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:886
msgid "Other users are logged in."
msgstr "Jsou přihlášeni jiní uživatelé."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:891
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Vypnutí by mohlo způsobit ztrátu jejich neuložené práce."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (remote)"
msgstr "%s (vzdálený)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:920
#, c-format
msgid "%s (console)"
msgstr "%s (konzole)"
@ -1842,7 +1854,7 @@ msgstr "Aplikace"
msgid "Search"
msgstr "Hledat"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1851,7 +1863,7 @@ msgstr ""
"Promiňte, dnes žádné moudro:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "%s říká Prorok"
@ -1905,7 +1917,7 @@ msgstr "Použít pro přihlašovací obrazovku určitý mód, např. „gdm“."
msgid "List possible modes"
msgstr "Vypsat možné režimy"
#: ../src/shell-app.c:626
#: ../src/shell-app.c:622
#, c-format
msgid "Failed to launch '%s'"
msgstr "Nelze spustit „%s“"

239
po/el.po
View File

@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.po.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-04-19 02:48+0000\n"
"PO-Revision-Date: 2013-04-25 08:11+0300\n"
"POT-Creation-Date: 2013-03-02 23:02+0000\n"
"PO-Revision-Date: 2013-03-03 13:22+0300\n"
"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
"Language-Team: team@gnome.gr\n"
"Language: el\n"
@ -40,14 +40,10 @@ msgid "Focus the active notification"
msgstr "Εστίαση στην ενεργή ειδοποίηση"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "Εμφάνιση της επισκόπησης"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications"
msgstr "Προβολή όλων των εφαρμογών"
#: ../data/50-gnome-shell-system.xml.in.h:6
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Open the application menu"
msgstr "Άνοιγμα του μενού εφαρμογών"
@ -227,55 +223,45 @@ msgstr ""
"επισκόπησης ενεργειών."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "Συνδυασμός πλήκτρων για το άνοιγμα της επισκόπησης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "Συνδυασμός πλήκτρων για το άνοιγμα της προβολής ενέργειες."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Συνδυασμός πλήκτρων για την ορατότητα της περιοχής ειδοποιήσεων"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Συνδυασμός πλήκτρων για την ορατότητα της περιοχής ειδοποιήσεων."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to focus the active notification"
msgstr "Ο συνδυασμός πλήκτρων για εστίαση της ενεργής ειδοποίησης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification."
msgstr "Ο συνδυασμός πλήκτρων για εστίαση της ενεργής ειδοποίησης."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder"
msgstr "Συνδυασμός πλήκτρων για την εναλλαγή της μαγνητοσκόπησης οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr ""
"Συνδυασμός πλήκτρων για το άνοιγμα/κλείσιμο της ενσωματωμένης "
"μαγνητοσκόπησης οθόνης."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Ποιο πληκτρολόγιο θα χρησιμοποιηθεί"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "Ο τύπος του πληκτρολογίου που θα χρησιμοποιηθεί."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts."
msgstr ""
"Ο ρυθμός καρέ που θα χρησιμοποιηθεί για την καταγραφή του βίντεο οθόνης."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -283,13 +269,13 @@ msgstr ""
"Ο ρυθμός καρέ του στιγμιότυπου που παράγεται από τον εγγραφέα βίντεο οθόνης "
"του GNOME Shell σε καρέ ανά δευτερόλεπτο."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
"Ο δίαυλος του gstreamer που χρησιμοποιήθηκε για την κωδικοποίηση του βίντεο "
"οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -317,12 +303,12 @@ msgstr ""
"χρησιμοποιείται ως παράδειγμα για το πιθανό βέλτιστο αριθμό πυρήνων του "
"συστήματος."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast"
msgstr ""
"Επέκταση αρχείου που θα χρησιμοποιηθεί για την αποθήκευση του βίντεο οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -332,11 +318,11 @@ msgstr ""
"βασισμένο στην τρέχουσα ημερομηνία και θα χρησιμοποιεί αυτή την επέκταση. Θα "
"πρέπει να αλλάζει όταν γίνεται εγγραφή σε διαφορετικό πρότυπο περιέκτη."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "The application icon mode."
msgstr "Η κατάσταση εικονιδίου εφαρμογής."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@ -347,22 +333,22 @@ msgstr ""
"παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή "
"'both' - και τα δύο."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "Προσάρτηση αναγκαστικού διαλόγου στο γονικό παράθυρο"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.mutter όταν εκτελείται "
"το κέλυφος GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "Διάταξη των κουμπιών στη γραμμή τίτλου"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
@ -370,17 +356,17 @@ msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.desktop.wm.preferences "
"όταν εκτελείται το κέλυφος GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Ενεργοποίηση της παράθεσης άκρων όταν αποθέτετε παράθυρα στις άκρες της "
"οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:49
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "Οι χώροι εργασίας διαχειρίζονται δυναμικά"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:50
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "Χώροι εργασίας μόνο στην κύρια οθόνη"
@ -402,42 +388,43 @@ msgstr ""
"πολλαπλών επιλογών."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "Συνεδρία…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Δεν είστε στη λίστα;"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:932
msgid "Cancel"
msgstr "Ακύρωση"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Σύνδεση"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Επόμενο"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Όνομα χρήστη: "
#: ../js/gdm/loginDialog.js:1174
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Παράθυρο σύνδεσης"
@ -446,8 +433,8 @@ msgstr "Παράθυρο σύνδεσης"
msgid "Power"
msgstr "Ενέργεια"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:814
msgid "Suspend"
msgstr "Αναστολή"
@ -455,58 +442,58 @@ msgstr "Αναστολή"
msgid "Restart"
msgstr "Επανεκκίνηση"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
msgid "Power Off"
msgstr "Απενεργοποίηση"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Σφάλμα πιστοποίησης"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(ή περάστε το δάκτυλο σας)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(π.χ χρήστης ή %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Δε βρέθηκε η εντολή"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Δεν ήταν δυνατό να επεξεργαστεί η εντολή:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Η εκτέλεση του '%s' απέτυχε:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Συχνό"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Όλα"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Νέο παράθυρο"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Αφαίρεση από τα αγαπημένα"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Προσθήκη στα αγαπημένα"
@ -520,7 +507,7 @@ msgstr "Tο %s προστέθηκε στα αγαπημένα σας."
msgid "%s has been removed from your favorites."
msgstr "Tο %s αφαιρέθηκε από τα αγαπημένα σας."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
msgid "Settings"
msgstr "Ρυθμίσεις"
@ -543,7 +530,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%Ω\\u2236%Λ"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -645,35 +632,35 @@ msgid "S"
msgstr "Σ"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Τίποτα προγραμματισμένο"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Σήμερα"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Αύριο"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Αυτή η εβδομάδα"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "Επόμενη εβδομάδα"
@ -689,12 +676,12 @@ msgstr "Αποσυνδέθηκε εξωτερικός δίσκος"
msgid "Removable Devices"
msgstr "Αφαιρούμενες συσκευές"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Άνοιγμα με %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Εξαγωγή"
@ -803,7 +790,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "Συγνώμη, αυτό δεν λειτούργησε. Παρακαλώ προσπαθήστε ξανά."
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47
#: ../js/ui/components/recorder.js:48
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Βίντεο οθόνης από %d %t"
@ -1050,7 +1037,7 @@ msgstr "Προβολή λογαριασμού"
msgid "Unknown reason"
msgstr "Άγνωστος λόγος"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
msgid "Windows"
msgstr "Παράθυρα"
@ -1079,7 +1066,7 @@ msgstr "Ρυθμίσεις ημερομηνίας & ώρας"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
@ -1248,6 +1235,7 @@ msgid "Remove"
msgstr "Αφαίρεση"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "Καθαρισμός μηνυμάτων"
@ -1255,15 +1243,15 @@ msgstr "Καθαρισμός μηνυμάτων"
msgid "Notification Settings"
msgstr "Ρυθμίσεις ειδοποιήσεων"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Κανένα μήνυμα"
#: ../js/ui/messageTray.js:1785
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Περιοχή ειδοποιήσεων"
#: ../js/ui/messageTray.js:2813
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Πληροφορίες συστήματος"
@ -1272,14 +1260,14 @@ msgctxt "program"
msgid "Unknown"
msgstr "Άγνωστο"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d νέο μήνυμα"
msgstr[1] "%d νέα μηνύματα"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Αναίρεση"
@ -1291,21 +1279,22 @@ msgstr "Επισκόπηση"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "Πληκτρολογήστε για αναζήτηση…"
#: ../js/ui/panel.js:633
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Έξοδος"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:657
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Δραστηριότητες"
#: ../js/ui/panel.js:954
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Πάνω μπάρα"
@ -1318,32 +1307,32 @@ msgstr "Πάνω μπάρα"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:74
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Εισαγωγή εντολής"
#: ../js/ui/runDialog.js:110
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Κλείσιμο"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d νέα ειδοποίηση"
msgstr[1] "%d νέες ειδοποιήσεις"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
msgid "Lock"
msgstr "Κλείδωμα"
#: ../js/ui/screenShield.js:641
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "Το GNOME χρειάζεται να κλειδώσει την οθόνη"
@ -1354,19 +1343,21 @@ msgstr "Το GNOME χρειάζεται να κλειδώσει την οθόν
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "Αδυναμία κλειδώματος"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application"
msgstr "Το κλείδωμα εμποδίστηκε από μια εφαρμογή"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…"
msgstr "Αναζήτηση…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Δε βρέθηκαν αποτελέσματα."
@ -1378,11 +1369,11 @@ msgstr "Αντιγραφή"
msgid "Paste"
msgstr "Επικόλληση"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Εμφάνιση κειμένου"
#: ../js/ui/shellEntry.js:103
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Απόκρυψη κειμένου"
@ -1394,7 +1385,7 @@ msgstr "Κωδικός"
msgid "Remember Password"
msgstr "Απομνημόνευση κωδικού"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Ξεκλείδωμα"
@ -1458,10 +1449,12 @@ msgid "Visibility"
msgstr "Ορατότητα"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "Αποστολή αρχείων σε συσκευή…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "Ρύθμιση νέας συσκευής…"
@ -1488,6 +1481,7 @@ msgid "connecting..."
msgstr "σύνδεση..."
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "Αποστολή αρχείων…"
@ -1700,6 +1694,7 @@ msgstr "Ρυθμίσεις τροφοδοσίας"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "Υπολογισμός…"
@ -1799,59 +1794,59 @@ msgstr "Ένταση ήχου"
msgid "Microphone"
msgstr "Μικρόφωνο"
#: ../js/ui/unlockDialog.js:125
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Είσοδος ως άλλος χρήστης"
#: ../js/ui/unlockDialog.js:146
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Ξεκλείδωμα παραθύρου"
#: ../js/ui/userMenu.js:193
#: ../js/ui/userMenu.js:192
msgid "Available"
msgstr "Διαθέσιμος-η"
#: ../js/ui/userMenu.js:196
#: ../js/ui/userMenu.js:195
msgid "Busy"
msgstr "Απασχολημένος-η"
#: ../js/ui/userMenu.js:199
#: ../js/ui/userMenu.js:198
msgid "Invisible"
msgstr "Αόρατος-η"
#: ../js/ui/userMenu.js:202
#: ../js/ui/userMenu.js:201
msgid "Away"
msgstr "Απουσιάζει"
#: ../js/ui/userMenu.js:205
#: ../js/ui/userMenu.js:204
msgid "Idle"
msgstr "Αδρανής"
#: ../js/ui/userMenu.js:208
#: ../js/ui/userMenu.js:207
msgid "Offline"
msgstr "Εκτός σύνδεσης"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:779
msgid "Notifications"
msgstr "Ειδοποιήσεις"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:795
msgid "Switch User"
msgstr "Αλλαγή χρήστη"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:800
msgid "Log Out"
msgstr "Αποσύνδεση"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:820
msgid "Install Updates & Restart"
msgstr "Εγκατάσταση ενημερώσεων & επανεκκίνηση"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:838
msgid "Your chat status will be set to busy"
msgstr "Η κατάσταση συνομιλίας σας θα ορισθεί σε απασχολημένος"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:839
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1860,36 +1855,34 @@ msgstr ""
"κατάσταση σας έχει ορισθεί έτσι ώστε να γίνεται γνωστό ότι πιθανόν να μην "
"δείτε τα μηνύματα τους."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:885
msgid "Other users are logged in."
msgstr "Και άλλοι χρήστες είναι συνδεμένοι."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:890
msgid "Shutting down might cause them to lose unsaved work."
msgstr ""
"Κλείνοντας μπορεί να τους προκαλέσετε την απώλεια αναποθήκευτης εργασίας."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:916
#, c-format
msgid "%s (remote)"
msgstr "%s (απομακρυσμένο)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (console)"
msgstr "%s (κονσόλα)"
#: ../js/ui/viewSelector.js:100
#: ../js/ui/viewSelector.js:101
msgid "Applications"
msgstr "Εφαρμογές"
#: ../js/ui/viewSelector.js:104
#: ../js/ui/viewSelector.js:105
msgid "Search"
msgstr "Αναζήτηση"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1898,7 +1891,7 @@ msgstr ""
"Συγγνώμη, κανένα απόφθεγμα για εσάς σήμερα:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "%s ο Προφήτης λέει"

240
po/es.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-04-19 02:48+0000\n"
"PO-Revision-Date: 2013-04-22 17:40+0200\n"
"POT-Creation-Date: 2013-03-02 23:02+0000\n"
"PO-Revision-Date: 2013-03-04 13:44+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n"
@ -42,14 +42,10 @@ msgid "Focus the active notification"
msgstr "Dar el foco a la notificación activa"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "Mostrar la vista general"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications"
msgstr "Mostrar todas las aplicaciones"
#: ../data/50-gnome-shell-system.xml.in.h:6
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Open the application menu"
msgstr "Abrir el menú de la aplicación"
@ -227,52 +223,42 @@ msgstr ""
"de actividades."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "Asociación de teclas para la vista general"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "Asociación de teclas para abrir la Vista de actividades"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to focus the active notification"
msgstr "Asociación de teclas para dar el foco a la notificación activa"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification."
msgstr "Asociación de teclas para dar el foco a la notificación activa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder"
msgstr "Asociación de teclas cambiar el grabador de pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Qué teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "El tipo de teclado que usar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts."
msgstr "Tasa de fotogramas usada para grabar «screencast»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -280,11 +266,11 @@ msgstr ""
"La tasa de fotogramas de la grabación resultante grabada por el grabador de "
"«screencast» de GNOME Shell, en fotogramas por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La tubería de gstreamer usada para codificar el «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -310,11 +296,11 @@ msgstr ""
"threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
"como marcador de posición para el número de hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast"
msgstr "Extensión de archivo que usar para almacenar los «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -324,11 +310,11 @@ msgstr ""
"basado en la fecha actual y usará esta extensión. Se debería cambiar al "
"grabar en otro formato contenedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "The application icon mode."
msgstr "El modo de icono de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@ -338,21 +324,21 @@ msgstr ""
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
"only» (sólo muestra el icono de la aplicación) «both»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "Acoplar un diálogo modal a la ventana padre"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Esta clave sobreescribe la clave en org.gnome.mutter al ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "Orden de los botones en la barra de título"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
@ -360,17 +346,17 @@ msgstr ""
"Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al "
"ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
"ventana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:49
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "Las áreas de trabajo se gestionan dinámicamente"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:50
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "Áreas de trabajo solo en la pantalla principal"
@ -389,42 +375,43 @@ msgstr ""
"Seleccione una extensión que configurar usando la caja combinada de arriba."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "Sesión…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:932
msgid "Cancel"
msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Siguiente"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Nombre de usuario:"
#: ../js/gdm/loginDialog.js:1174
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Ventana de inicio de sesión"
@ -433,8 +420,8 @@ msgstr "Ventana de inicio de sesión"
msgid "Power"
msgstr "Energía"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:814
msgid "Suspend"
msgstr "Suspender"
@ -442,58 +429,58 @@ msgstr "Suspender"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
msgid "Power Off"
msgstr "Apagar"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Error de autenticación"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(o pase el dedo)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(ej., usuario o %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Comando no encontrado"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Frecuentes"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -507,7 +494,7 @@ msgstr "Se ha añadido %s a sus favoritos."
msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
msgid "Settings"
msgstr "Configuración"
@ -530,7 +517,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -632,35 +619,35 @@ msgid "S"
msgstr "S"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Hoy"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Mañana"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "La semana que viene"
@ -676,12 +663,12 @@ msgstr "Dispositivo externo desconectado"
msgid "Removable Devices"
msgstr "Dispositivos extraíbles"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Abrir con %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Expulsar"
@ -790,7 +777,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "Inténtelo de nuevo,"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47
#: ../js/ui/components/recorder.js:48
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast desde %d %t"
@ -1037,7 +1024,7 @@ msgstr "Ver cuenta"
msgid "Unknown reason"
msgstr "Razón desconocida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
msgid "Windows"
msgstr "Ventanas"
@ -1066,7 +1053,7 @@ msgstr "Configuración de hora y fecha"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
@ -1232,6 +1219,7 @@ msgid "Remove"
msgstr "Quitar"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "Limpiar mensajes"
@ -1239,15 +1227,15 @@ msgstr "Limpiar mensajes"
msgid "Notification Settings"
msgstr "Configuración de las notificaciones"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "No hay mensajes"
#: ../js/ui/messageTray.js:1785
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Bandeja de mensajes"
#: ../js/ui/messageTray.js:2813
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Información del sistema"
@ -1256,14 +1244,14 @@ msgctxt "program"
msgid "Unknown"
msgstr "Desconocido"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d mensaje nuevo"
msgstr[1] "%d mensajes nuevos"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Deshacer"
@ -1275,21 +1263,22 @@ msgstr "Vista general"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "Escribir para buscar…"
#: ../js/ui/panel.js:633
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Salir"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:657
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:954
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Barra superior"
@ -1302,32 +1291,32 @@ msgstr "Barra superior"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:74
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Introducir un comando"
#: ../js/ui/runDialog.js:110
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Cerrar"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/screenShield.js:641
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "GNOME necesita bloquear la pantalla"
@ -1338,19 +1327,22 @@ msgstr "GNOME necesita bloquear la pantalla"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "No se pudo bloquear"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
#| msgid "No such application"
msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…"
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "No se encontraron resultados."
@ -1362,11 +1354,11 @@ msgstr "Copiar"
msgid "Paste"
msgstr "Pegar"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Mostrar texto"
#: ../js/ui/shellEntry.js:103
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Ocultar texto"
@ -1378,7 +1370,7 @@ msgstr "Contraseña"
msgid "Remember Password"
msgstr "Recordar contraseña"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Desbloquear"
@ -1442,10 +1434,12 @@ msgid "Visibility"
msgstr "Visibilidad"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "Enviar archivos al dispositivo…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "Configurar un dispositivo nuevo…"
@ -1472,6 +1466,7 @@ msgid "connecting..."
msgstr "conectando…"
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "Enviar archivos…"
@ -1684,6 +1679,7 @@ msgstr "Configuración de energía"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "Estimando…"
@ -1783,59 +1779,59 @@ msgstr "Volumen"
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:125
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario"
#: ../js/ui/unlockDialog.js:146
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Desbloquear ventana"
#: ../js/ui/userMenu.js:193
#: ../js/ui/userMenu.js:192
msgid "Available"
msgstr "Disponible"
#: ../js/ui/userMenu.js:196
#: ../js/ui/userMenu.js:195
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/userMenu.js:199
#: ../js/ui/userMenu.js:198
msgid "Invisible"
msgstr "Invisible"
#: ../js/ui/userMenu.js:202
#: ../js/ui/userMenu.js:201
msgid "Away"
msgstr "Ausente"
#: ../js/ui/userMenu.js:205
#: ../js/ui/userMenu.js:204
msgid "Idle"
msgstr "Inactivo"
#: ../js/ui/userMenu.js:208
#: ../js/ui/userMenu.js:207
msgid "Offline"
msgstr "Desconectado"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:779
msgid "Notifications"
msgstr "Notificaciones"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:795
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:800
msgid "Log Out"
msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:820
msgid "Install Updates & Restart"
msgstr "Instalar actualizaciones y reiniciar"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:838
msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:839
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1844,35 +1840,33 @@ msgstr ""
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
"leer sus mensajes."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:885
msgid "Other users are logged in."
msgstr "Hay otros usuarios con la sesión iniciada"
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:890
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Apagar puede hacer que pierdan el trabajo que no hayan guardado."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:916
#, c-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (console)"
msgstr "%s (consola)"
#: ../js/ui/viewSelector.js:100
#: ../js/ui/viewSelector.js:101
msgid "Applications"
msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:104
#: ../js/ui/viewSelector.js:105
msgid "Search"
msgstr "Buscar"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1881,7 +1875,7 @@ msgstr ""
"Hoy no tiene ningún mensaje:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "%s el oráculo dice"

219
po/gl.po
View File

@ -10,9 +10,10 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-18 01:27+0200\n"
"PO-Revision-Date: 2013-04-18 01:42+0200\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-02 23:02+0000\n"
"PO-Revision-Date: 2013-03-04 12:40+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n"
@ -29,7 +30,7 @@ msgstr "Capturas de pantalla"
#: ../data/50-gnome-shell-screenshot.xml.in.h:2
msgid "Record a screencast"
msgstr "Facer unha gravación da pantalla"
msgstr "Gravar unha gravación de pantalla"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -62,16 +63,16 @@ msgstr "Xestor de xanelas e inicio de aplicativos"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences"
msgstr "Preferencias das extensións de GNOME Shell"
msgstr "Preferencias de extensións de GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions"
msgstr "Configure as extensións de GNOME Shell"
msgstr "Configurar as extensións de GNOME Shell"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Activar as ferramentas internas útiles para os desenvolvedores e probadores "
"Activar as ferramentas internas útiles para os desenvolvedores e probadores, "
"usando Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
@ -84,7 +85,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "Uuids of extensions to enable"
msgstr "UUIDs das extensións a activar"
msgstr "Uuid das extensións que activar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
msgid ""
@ -374,42 +375,43 @@ msgstr ""
"Seleccione unha extensión que configurar usando a caixa combinada de arriba."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "Sesión…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Non está na lista?"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:932
msgid "Cancel"
msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Seguinte"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Nome de usuario: "
#: ../js/gdm/loginDialog.js:1174
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Xanela de inicio de sesión"
@ -418,8 +420,8 @@ msgstr "Xanela de inicio de sesión"
msgid "Power"
msgstr "Apagar"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:814
msgid "Suspend"
msgstr "Suspender"
@ -427,58 +429,58 @@ msgstr "Suspender"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
msgid "Power Off"
msgstr "Apagar"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Erro de autenticación"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(ou pase o dedo)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(p.ex., usuario ou %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Orde non atopada"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Non foi posíbel analizar a orde:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Produciuse un fallo na execución de «%s»:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Frecuentes"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Todos"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Retirar dos marcadores"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
@ -492,7 +494,7 @@ msgstr "%s foi engadido aos seus favoritos."
msgid "%s has been removed from your favorites."
msgstr "%s retirouse dos seus marcadores."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
msgid "Settings"
msgstr "Preferencias"
@ -515,7 +517,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -617,35 +619,35 @@ msgid "S"
msgstr "S"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Hoxe"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Mañá"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "A vindeira semana"
@ -661,12 +663,12 @@ msgstr "Unidade externa desconectada"
msgid "Removable Devices"
msgstr "Dispositivos extraíbeis"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Abrir con %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Expulsar"
@ -775,7 +777,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "Desculpe, iso non funcionou. Ténteo de novo."
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47
#: ../js/ui/components/recorder.js:48
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast desde %d %t"
@ -1022,7 +1024,7 @@ msgstr "Ver conta"
msgid "Unknown reason"
msgstr "Razón descoñecida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
msgid "Windows"
msgstr "Xanelas"
@ -1038,7 +1040,7 @@ msgstr "Taboleiro"
#: ../js/ui/dateMenu.js:91
msgid "Open Calendar"
msgstr "Abrir Calendario"
msgstr "Abrir o calendario"
#: ../js/ui/dateMenu.js:96
msgid "Open Clocks"
@ -1051,7 +1053,7 @@ msgstr "Preferencias de data e hora"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%a, %e de %B, %Y"
@ -1069,7 +1071,7 @@ msgstr "Saír da sesión"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
"Prema en «Saír da sesión» para pechar estes aplicativos e saír da sesión do "
"Prema sobre «Saír da sesión» para saír deses aplicativos e saír da sesión do "
"sistema."
#: ../js/ui/endSessionDialog.js:67
@ -1088,7 +1090,7 @@ msgstr[1] "A súa sesión pecharase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:76
msgid "Logging out of the system."
msgstr "Saíndo da sesión do sistema."
msgstr "Saíndo da sesión."
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
@ -1102,7 +1104,7 @@ msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:84
msgid "Click Power Off to quit these applications and power off the system."
msgstr "Prema sobre «Apagar» para pechar estes aplicativos e apagar o sistema."
msgstr "Prema sobre «Apagar» para saír deses aplicativos e apagar o sistema."
#: ../js/ui/endSessionDialog.js:86
#, c-format
@ -1132,7 +1134,7 @@ msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:101
msgid "Click Restart to quit these applications and restart the system."
msgstr "Prema «Reiniciar» para pechar estes aplicativos e reiniciar o sistema."
msgstr "Prema «Reiniciar» para saír deses aplicativos e reiniciar o sistema."
#: ../js/ui/endSessionDialog.js:103
#, c-format
@ -1167,7 +1169,7 @@ msgstr "Non hai ningunha extensión instalada"
#: ../js/ui/lookingGlass.js:747
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s non emitiu ningún erro."
msgstr "%s non xerou ningún erro."
#: ../js/ui/lookingGlass.js:753
msgid "Hide Errors"
@ -1193,7 +1195,7 @@ msgstr "Erro"
#: ../js/ui/lookingGlass.js:773
msgid "Out of date"
msgstr "Obsoleto"
msgstr "Caducado"
#: ../js/ui/lookingGlass.js:775
msgid "Downloading"
@ -1216,6 +1218,7 @@ msgid "Remove"
msgstr "Retirar"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "Limpar mensaxes"
@ -1223,15 +1226,15 @@ msgstr "Limpar mensaxes"
msgid "Notification Settings"
msgstr "Preferencias das notificacións"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Non hai mensaxes"
#: ../js/ui/messageTray.js:1785
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Bandexa de mensaxes"
#: ../js/ui/messageTray.js:2813
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Información do sistema"
@ -1240,14 +1243,14 @@ msgctxt "program"
msgid "Unknown"
msgstr "Descoñecido"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d mensaxe nova"
msgstr[1] "%d mensaxes novas"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Desfacer"
@ -1259,21 +1262,22 @@ msgstr "Vista xeral"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "Escriba para buscar…"
#: ../js/ui/panel.js:633
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Saír"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:657
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:954
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Barra superior"
@ -1286,34 +1290,34 @@ msgstr "Barra superior"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:74
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Escriba unha orde"
#: ../js/ui/runDialog.js:110
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Pechar"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d notificación nova"
msgstr[1] "%d notificacións novas"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/screenShield.js:641
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "GNOME precisa bloquear a pantalla"
msgstr "GNOME debe bloquear a pantalla"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
@ -1322,19 +1326,22 @@ msgstr "GNOME precisa bloquear a pantalla"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "Non foi posíbel bloquear"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
#| msgid "No such application"
msgid "Lock was blocked by an application"
msgstr "Un aplicativo impediu o bloqueo"
msgstr "O bloqueo foi impedido por un aplicativo"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…"
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Sen resultados."
@ -1346,11 +1353,11 @@ msgstr "Copiar"
msgid "Paste"
msgstr "Pegar"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Mostrar texto"
#: ../js/ui/shellEntry.js:103
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Ocultar texto"
@ -1360,9 +1367,9 @@ msgstr "Contrasinal"
#: ../js/ui/shellMountOperation.js:391
msgid "Remember Password"
msgstr "Lembrar contrasinal"
msgstr "Lembrar o contrasinal"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Desbloquear"
@ -1426,10 +1433,12 @@ msgid "Visibility"
msgstr "Visibilidade"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "Enviar ficheiros ao dispositivo…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "Configurar un dispositivo novo…"
@ -1456,6 +1465,7 @@ msgid "connecting..."
msgstr "conectando…"
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "Enviar ficheiros…"
@ -1537,7 +1547,7 @@ msgstr "Mostrar a distribución do teclado"
#: ../js/ui/status/keyboard.js:373
msgid "Region & Language Settings"
msgstr "Preferencias de rexión e idioma"
msgstr "Configuración rexional e de idioma"
#: ../js/ui/status/lockScreenMenu.js:43
msgid "Volume, network, battery"
@ -1582,7 +1592,7 @@ msgstr "non dispoñíbel"
#: ../js/ui/status/network.js:493 ../js/ui/status/network.js:1551
msgid "connection failed"
msgstr "conexión fallada"
msgstr "conexión fallida"
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1435
#: ../js/ui/status/network.js:1627
@ -1668,6 +1678,7 @@ msgstr "Preferencias de enerxía"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "Estimando…"
@ -1767,59 +1778,59 @@ msgstr "Volume"
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:125
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Iniciar sesión como outro usuario"
#: ../js/ui/unlockDialog.js:146
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Desbloquear xanela"
#: ../js/ui/userMenu.js:193
#: ../js/ui/userMenu.js:192
msgid "Available"
msgstr "Dispoñíbel"
#: ../js/ui/userMenu.js:196
#: ../js/ui/userMenu.js:195
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/userMenu.js:199
#: ../js/ui/userMenu.js:198
msgid "Invisible"
msgstr "Invisíbel"
#: ../js/ui/userMenu.js:202
#: ../js/ui/userMenu.js:201
msgid "Away"
msgstr "Ausente"
#: ../js/ui/userMenu.js:205
#: ../js/ui/userMenu.js:204
msgid "Idle"
msgstr "Inactivo"
#: ../js/ui/userMenu.js:208
#: ../js/ui/userMenu.js:207
msgid "Offline"
msgstr "Desconectado"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:779
msgid "Notifications"
msgstr "Notificacións"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:795
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:800
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:820
msgid "Install Updates & Restart"
msgstr "Instalar actualizacións e reiniciar"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:838
msgid "Your chat status will be set to busy"
msgstr "O seu estado de conversa estabelecerase a «ocupado»"
msgstr "O seu estado de conversa definirase como «ocupado»"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:839
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1828,35 +1839,33 @@ msgstr ""
"conversa. O seu estado de conexión axustouse para que outros saiban que non "
"quere ver as súas mensaxes."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:885
msgid "Other users are logged in."
msgstr "Hai outros usuarios conectados."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:890
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Se apaga o computador pode perder o traballo que non gardou."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:916
#, c-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (console)"
msgstr "%s (consola)"
#: ../js/ui/viewSelector.js:100
#: ../js/ui/viewSelector.js:101
msgid "Applications"
msgstr "Aplicativos"
#: ../js/ui/viewSelector.js:104
#: ../js/ui/viewSelector.js:105
msgid "Search"
msgstr "Buscar"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1865,7 +1874,7 @@ msgstr ""
"Hoxe non ten ningunha mensaxe:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "%s o oráculo dí"

1950
po/ia.po

File diff suppressed because it is too large Load Diff

View File

@ -461,7 +461,7 @@ msgstr "Nepavyko įvykdyti „%s“:"
#: ../js/ui/appDisplay.js:349
msgid "Frequent"
msgstr "Dažnai naudojamos"
msgstr "Dažniausios"
#: ../js/ui/appDisplay.js:356
msgid "All"
@ -1262,7 +1262,7 @@ msgstr "Apžvalga"
#. characters.
#: ../js/ui/overview.js:271
msgid "Type to search…"
msgstr "Rašykite, ko ieškote…"
msgstr "Rašykite ko ieškote…"
#: ../js/ui/panel.js:612
msgid "Quit"
@ -1299,7 +1299,7 @@ msgstr "Užverti"
#. long format
#: ../js/ui/screenShield.js:86
msgid "%A, %B %d"
msgstr "%A, %B %d d."
msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:151
#, c-format

320
po/ml.po
View File

@ -10,9 +10,9 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-04-24 18:23+0000\n"
"PO-Revision-Date: 2013-04-25 00:32+0530\n"
"Last-Translator: Balasankar C <c.balasankar@gmail.com>\n"
"POT-Creation-Date: 2013-03-23 11:49+0000\n"
"PO-Revision-Date: 2013-03-25 14:57+0530\n"
"Last-Translator: Ani Peter <peter.ani@gmail.com>\n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"Language: ml\n"
"MIME-Version: 1.0\n"
@ -44,14 +44,10 @@ msgid "Focus the active notification"
msgstr "സജീവമായ അറിയിപ്പിനെ കേന്ദ്രീകരിക്കുക"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "പൊതുവായ അവലോകനം കാണിക്കുക"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications"
msgstr "എല്ലാ പ്രയോഗങ്ങളും കാണിയ്ക്കുക"
#: ../data/50-gnome-shell-system.xml.in.h:6
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Open the application menu"
msgstr "പ്രയോഗത്തിന്റെ മെനു തുറക്കുക"
@ -75,7 +71,8 @@ msgstr "ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷ
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Alt-F2-ല്‍ ഡവലപ്പര്‍മാര്‍ക്കും ടെസ്റ്റേര്‍സിനും പ്രയോജനകരമായ ആന്തരിക പ്രയോഗങ്ങള്‍ പ്രവര്‍ത്തന "
"Alt-F2-ല്‍ ഡവലപ്പര്‍മാര്‍ക്കും ടെസ്റ്റേര്‍സിനും പ്രയോജനകരമായ ആന്തരിക "
"പ്രയോഗങ്ങള്‍ പ്രവര്‍ത്തന "
"സജ്ജമാക്കുന്നു"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
@ -83,7 +80,8 @@ msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും പ്രവേശനം "
"Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും "
"പ്രവേശനം "
"അനുവദിയ്ക്കുക."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
@ -97,14 +95,19 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell."
msgstr ""
"ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട എക്സ്റ്റെന്‍ഷനുകള്‍ ഈ കീ പട്ടിക "
"ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്‍ഷനും ഈ പട്ടികയിലുണ്ടാവണം. org.gnome.Shell-ല്‍ "
"നിങ്ങള്‍ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ പട്ടിക "
"ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട "
"എക്സ്റ്റെന്‍ഷനുകള്‍ ഈ കീ പട്ടിക "
"ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്‍ഷനും ഈ പട്ടികയിലുണ്ടാവണം. "
"org.gnome.Shell-ല്‍ "
"നിങ്ങള്‍ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ "
"പട്ടിക "
"കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള്‍ ശേഖരിയ്ക്കണമോ എന്നു്"
msgstr ""
"പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള്‍ ശേഖരിയ്ക്കണമോ "
"എന്നു്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
@ -113,9 +116,12 @@ msgid ""
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"ഏറ്റവും കൂടുതല്‍ തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള്‍ ലഭ്യമാക്കുന്നതിനായി ഷെല്‍ സാധാരണയായി സജീവമായ "
"പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്‍സ്). ഈ ഡേറ്റാ സ്വകാര്യമായി "
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല്‍ ഇതു് പ്രവര്‍ത്തന രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് "
"ഏറ്റവും കൂടുതല്‍ തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള്‍ ലഭ്യമാക്കുന്നതിനായി ഷെല്‍ "
"സാധാരണയായി സജീവമായ "
"പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്‍സ്). ഈ ഡേറ്റാ "
"സ്വകാര്യമായി "
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല്‍ ഇതു് പ്രവര്‍ത്തന "
"രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് "
"നിങ്ങള്‍ സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
@ -126,7 +132,8 @@ msgstr "ഇഷ്ടമുള്ള പ്രയോഗങ്ങള്‍ക്
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "ഈ ഐഡന്റിഫയറുകള്‍ക്കുള്ള പ്രയോഗങ്ങള്‍ ഉചിതമായ സ്ഥലങ്ങളില്‍ കാണിയ്ക്കുന്നു."
msgstr ""
"ഈ ഐഡന്റിഫയറുകള്‍ക്കുള്ള പ്രയോഗങ്ങള്‍ ഉചിതമായ സ്ഥലങ്ങളില്‍ കാണിയ്ക്കുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "List of categories that should be displayed as folders"
@ -137,8 +144,8 @@ msgid ""
"Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view."
msgstr ""
"ഈ പട്ടികയിലുള്ള ഓരോ വിഭാഗത്തിന്റെ പേരും, പ്രധാന കാഴ്ചയില്‍ ഓരോ വരിയായി കാണിയ്ക്കുന്നതിനു് "
"പകരം പ്രയോഗങ്ങളുടെ കാഴ്ചയില്‍ ഫോള്‍ഡറായി കാണിയ്ക്കുന്നു. "
"ഈ പട്ടികയിലുള്ള ഓരോ വിഭാഗത്തിന്റെ പേരും, പ്രധാന കാഴ്ചയില്‍ ഓരോ വരിയായി "
"കാണിയ്ക്കുന്നതിനു് പകരം പ്രയോഗങ്ങളുടെ കാഴ്ചയില്‍ ഫോള്‍ഡറായി കാണിയ്ക്കുന്നു. "
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
@ -153,7 +160,8 @@ msgid ""
"Internally used to store the last IM presence explicitly set by the user. "
"The value here is from the TpConnectionPresenceType enumeration."
msgstr ""
"ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"TpConnectionPresenceType തരത്തിലുള്ളതാകുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
@ -161,7 +169,8 @@ msgid ""
"Internally used to store the last session presence status for the user. The "
"value here is from the GsmPresenceStatus enumeration."
msgstr ""
"ഉപയോക്താവിനുള്ള അവസാന സെഷന്‍ അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"ഉപയോക്താവിനുള്ള അവസാന സെഷന്‍ അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
@ -173,13 +182,15 @@ msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"സിംഗിള്‍ യൂസര്‍, സിംഗിള്‍ സെഷനില്‍ 'ലോഗൌട്ട്' മെനുവസ്തു അദൃശ്യമാക്കുന്നതിനായി ഈ കീ ഉപയോഗിയ്ക്കുന്നു"
"സിംഗിള്‍ യൂസര്‍, സിംഗിള്‍ സെഷനില്‍ 'ലോഗൌട്ട്' മെനുവസ്തു അദൃശ്യമാക്കുന്നതിനായി "
"ഈ കീ ഉപയോഗിയ്ക്കുന്നു"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"എന്‍ക്രിപ്റ്റ് ചെയ്തതോ വിദൂരമോ ആയ ഫയല്‍സിസ്റ്റങ്ങള്‍ മൌണ്ട് ചെയ്യുമ്പോഴുള്ള രഹസ്യവാക്ക് ഓര്‍മ്മിക്കണോ എന്ന്"
"എന്‍ക്രിപ്റ്റ് ചെയ്തതോ വിദൂരമോ ആയ ഫയല്‍സിസ്റ്റങ്ങള്‍ മൌണ്ട് ചെയ്യുമ്പോഴുള്ള "
"രഹസ്യവാക്ക് ഓര്‍മ്മിക്കണോ എന്ന്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
@ -188,9 +199,10 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"ഒരു എന്‍ക്രിപ്റ്റ് ചെയ്ത ഡിവൈസ് അല്ലെങ്കില്‍ വിദൂര ഫയല്‍സിസ്റ്റം മൌണ്ട് ചെയ്യുമ്പോള്‍ ഷെല്‍ ഒരു രഹസ്യവാക്ക് "
"ആവശ്യപ്പെടുന്നു. രഹസ്യവാക്ക് സൂക്ഷിയ്ക്കുവാന്‍ സാധ്യമെങ്കില്‍, 'രഹസ്യവാക്ക് ഓര്‍ത്തു്വയ്ക്കുക' ചെക്ക്ബോക്സ് "
"കാണാം. ഈ കീ ചെക്ക്ബോക്സിന്റെ സ്വതവേയുള്ള അവസ്ഥ സജ്ജമാക്കുന്നു."
"ഒരു എന്‍ക്രിപ്റ്റ് ചെയ്ത ഡിവൈസ് അല്ലെങ്കില്‍ വിദൂര ഫയല്‍സിസ്റ്റം മൌണ്ട് "
"ചെയ്യുമ്പോള്‍ ഷെല്‍ ഒരു രഹസ്യവാക്ക് ആവശ്യപ്പെടുന്നു. രഹസ്യവാക്ക് "
"സൂക്ഷിയ്ക്കുവാന്‍ സാധ്യമെങ്കില്‍, 'രഹസ്യവാക്ക് ഓര്‍ത്തു്വയ്ക്കുക' "
"ചെക്ക്ബോക്സ് കാണാം. ഈ കീ ചെക്ക്ബോക്സിന്റെ സ്വതവേയുള്ള അവസ്ഥ സജ്ജമാക്കുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar"
@ -216,65 +228,61 @@ msgstr "\"പ്രയോഗങ്ങള്‍ കാണിയ്ക്കുക
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"പ്രവര്‍ത്തികളുടെ അവലോകനത്തിന്റെ \"പ്രയോഗങ്ങള്‍ കാണിയ്ക്കുക\" എന്ന കാഴ്ച തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്"
"പ്രവര്‍ത്തികളുടെ അവലോകനത്തിന്റെ \"പ്രയോഗങ്ങള്‍ കാണിയ്ക്കുക\" എന്ന കാഴ്ച "
"തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to open the overview"
msgstr "പൊതുവായ അവലോകനം തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to open the Activities Overview."
msgstr "പ്രയോഗങ്ങളുടെ പൊതുവായ അവലോകനം എന്ന കാഴ്ച തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "സന്ദേശ ട്രേയുടെ ദൃശ്യത ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "സന്ദേശ ട്രേയുടെ ദൃശ്യത ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to focus the active notification"
msgstr "സജീവമായ അറിയിപ്പിനുള്ള കീബൈന്‍ഡിങ്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification."
msgstr "സജീവമായ അറിയിപ്പിനുള്ള കീബൈന്‍ഡിങ്."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder"
msgstr "സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "ബിള്‍ട്ടിന്‍ സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ തുടങ്ങുവാന്‍/നിര്‍ത്തുന്നതിനുള്ള കീക്കൂട്ടം."
msgstr ""
"ബിള്‍ട്ടിന്‍ സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ തുടങ്ങുവാന്‍/നിര്‍ത്തുന്നതിനുള്ള "
"കീക്കൂട്ടം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "ഏതു് കീബോര്‍ഡ് ഉപയോഗിയ്ക്കണം"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "ഏതു് തരം കീബോര്‍ഡ് ഉപയോഗിയ്ക്കണം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts."
msgstr "സ്ക്രീന്‍കാസ്റ്റുകള്‍ റിക്കോര്‍ഡ് ചെയ്യുന്നതിനുള്ള ഫ്രെയിം റേറ്റ്."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡര്‍ റീക്കോര്‍ഡ് ചെയ്തിട്ടുള്ള സ്ക്രീന്‍കാസ്റ്റിന്റെ "
"ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡര്‍ റീക്കോര്‍ഡ് ചെയ്തിട്ടുള്ള "
"സ്ക്രീന്‍കാസ്റ്റിന്റെ "
"ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്‍ഡില്‍ ഒരു ഫ്രെയിം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "സ്ക്രീന്‍കാസ്റ്റ് എന്‍കോഡ് ചെയ്യുന്നതിനുള്ള gstreamer പൈപ്പ്‌ലൈന്‍"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -288,68 +296,78 @@ msgid ""
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
"used as a placeholder for a guess at the optimal thread count on the system."
msgstr ""
"റിക്കോര്‍ഡിങുകള്‍ എന്‍കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന്‍ ഉപയോഗിയ്ക്കുന്നു. gst-launch-"
"നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള്‍ കാലിയാകുന്നു.ഇതു് നിലവില്‍ 'vp8enc "
"റിക്കോര്‍ഡിങുകള്‍ എന്‍കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന്‍ "
"ഉപയോഗിയ്ക്കുന്നു. gst-launch-"
"നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള്‍ "
"കാലിയാകുന്നു.ഇതു് നിലവില്‍ 'vp8enc "
"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! "
"queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്‍ഡ് ചെയ്യുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast"
msgstr "സ്ക്രീന്‍കാസ്റ്റ് സൂക്ഷിയ്ക്കുന്നതിനുള്ള ഫയല്‍ എക്സ്റ്റെന്‍ഷന്‍"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"റിക്കോര്‍ഡ് ചെയ്ത സ്ക്രീന്‍കാസ്റ്റുകള്‍ക്കുള്ള ഫയല്‍നാമം നിലവിലുള്ള തീയതി, എക്സ്റ്റെന്‍ഷന്‍ എന്നിവ "
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്‍ഡ് ചെയ്യുമ്പോള്‍ ഇതു് മാറ്റണം."
"റിക്കോര്‍ഡ് ചെയ്ത സ്ക്രീന്‍കാസ്റ്റുകള്‍ക്കുള്ള ഫയല്‍നാമം നിലവിലുള്ള തീയതി, "
"എക്സ്റ്റെന്‍ഷന്‍ എന്നിവ "
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്‍ഡ് ചെയ്യുമ്പോള്‍ ഇതു് "
"മാറ്റണം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "The application icon mode."
msgstr "പ്രയോഗത്തിന്റെ ഐക്കണ്‍ മോഡ്."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"സ്വിച്ചറില്‍ ജാലകങ്ങള്‍ എങ്ങനെ കാണിയ്ക്കുന്നു എന്നു് ക്രമീകരിയ്ക്കുന്നു. ശരിയായ സാധ്യതകള്‍: "
"'thumbnail-only' (ജാലകത്തിന്റെ പ്രതിരൂപം കാണിയ്ക്കുന്നു), 'app-icon-"
"സ്വിച്ചറില്‍ ജാലകങ്ങള്‍ എങ്ങനെ കാണിയ്ക്കുന്നു എന്നു് ക്രമീകരിയ്ക്കുന്നു. "
"ശരിയായ "
"സാധ്യതകള്‍: 'thumbnail-only' (ജാലകത്തിന്റെ പ്രതിരൂപം കാണിയ്ക്കുന്നു), "
"'app-icon-"
"only' (പ്രയോഗത്തിന്റെ പ്രതിരൂപം കാണിയ്ക്കുന്നു) അല്ലെങ്കില്‍ 'both'."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "പേരന്റ് ജാലകത്തിലേക്കു് ഡയലോഗ് ചേര്‍ക്കുക"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.mutter-ലുള്ള കീ ഈ കീ തിരുത്തിയെഴുതുന്നു."
msgstr ""
"ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.mutter-ലുള്ള കീ ഈ കീ "
"തിരുത്തിയെഴുതുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "തലക്കെട്ടിനുള്ള ബാറില്‍ ബട്ടണുകളുടെ ക്രമീകരണം"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.desktop.wm.preferences-ലുള്ള കീ ഈ കീ "
"തിരുത്തിയെഴുതുന്നു."
"ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.desktop.wm.preferences-ലുള്ള "
"കീ ഈ കീ തിരുത്തിയെഴുതുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "സ്ക്രീന്‍ കോണുകളില്‍ ജാലകങ്ങള്‍ എത്തിയ്ക്കുമ്പോള്‍ കോണ്‍ ചരിയ്ക്കുന്നതിനായി പ്രവര്‍ത്തന സജ്ജമാക്കുക"
msgstr ""
"സ്ക്രീന്‍ കോണുകളില്‍ ജാലകങ്ങള്‍ എത്തിയ്ക്കുമ്പോള്‍ കോണ്‍ ചരിയ്ക്കുന്നതിനായി "
"പ്രവര്‍ത്തന സജ്ജമാക്കുക"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:49
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "പണിയിടങ്ങള്‍ ഡയനാമിക്കായി കൈകാര്യം ചെയ്തിരിക്കുന്നു"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:50
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "പ്രധാന മോണിറ്ററില്‍ മാത്രം പണിയിടങ്ങള്‍"
@ -364,9 +382,12 @@ msgstr "എക്സ്റ്റെന്‍ഷന്‍"
#: ../js/extensionPrefs/main.js:189
msgid "Select an extension to configure using the combobox above."
msgstr "മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു എക്സ്റ്റെന്‍ഷന്‍ തെര‍ഞ്ഞെടുക്കുക."
msgstr ""
"മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു "
"എക്സ്റ്റെന്‍ഷന്‍ തെര‍ഞ്ഞെടുക്കുക."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "പ്രവര്‍ത്തനവേള..."
@ -377,32 +398,32 @@ msgstr "പ്രവര്‍ത്തനവേള..."
msgid "Not listed?"
msgstr "ലഭ്യമല്ലേ?"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/userMenu.js:938
msgid "Cancel"
msgstr "വേണ്ട"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:802
msgctxt "button"
msgid "Sign In"
msgstr "അകത്തുകയറുക"
#: ../js/gdm/loginDialog.js:803
#: ../js/gdm/loginDialog.js:802
msgid "Next"
msgstr "അടുത്തത്"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "ഉപയോക്തൃ നാമം: "
#: ../js/gdm/loginDialog.js:1174
#: ../js/gdm/loginDialog.js:1173
msgid "Login Window"
msgstr "പ്രവേശന ജാലകം"
@ -455,23 +476,23 @@ msgstr "ആജ്ഞ പ്രാവര്‍ത്തികമാക്കാ
msgid "Execution of '%s' failed:"
msgstr "'%s' നടപ്പിലാക്കുന്നതില്‍ പരാജയപ്പെട്ടു:"
#: ../js/ui/appDisplay.js:351
#: ../js/ui/appDisplay.js:349
msgid "Frequent"
msgstr "ഇടയ്ക്കിടെ"
#: ../js/ui/appDisplay.js:358
#: ../js/ui/appDisplay.js:356
msgid "All"
msgstr "എല്ലാം"
#: ../js/ui/appDisplay.js:916
#: ../js/ui/appDisplay.js:914
msgid "New Window"
msgstr "പുതിയ വിന്‍ഡോ"
#: ../js/ui/appDisplay.js:919 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "ഇഷ്ടപ്പെട്ടവയില്‍ നിന്നും നീക്കം ചെയ്യുക"
#: ../js/ui/appDisplay.js:920
#: ../js/ui/appDisplay.js:918
msgid "Add to Favorites"
msgstr "ഇഷ്ടപ്പെട്ടവയിലേക്ക് ചേര്‍ക്കുക"
@ -508,7 +529,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -711,7 +732,8 @@ msgid ""
"Passwords or encryption keys are required to access the wireless network "
"'%s'."
msgstr ""
"വയര്‍ലെസ് നെറ്റ്‌വര്‍ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള്‍ അല്ലെങ്കില്‍ എന്‍ക്രിപ്ഷന്‍ കീകള്‍ "
"വയര്‍ലെസ് നെറ്റ്‌വര്‍ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള്‍ "
"അല്ലെങ്കില്‍ എന്‍ക്രിപ്ഷന്‍ കീകള്‍ "
"ആവശ്യമുണ്ടു്."
#: ../js/ui/components/networkAgent.js:314
@ -768,7 +790,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "ക്ഷമിക്കണം, അതു ശരിയല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക."
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47
#: ../js/ui/components/recorder.js:48
#, no-c-format
msgid "Screencast from %d %t"
msgstr "%d-ല്‍ നിന്നുള്ള സ്ക്രീന്‍കാസ്റ്റ്, %t-ല്‍"
@ -891,7 +913,8 @@ msgstr "%s നിങ്ങള്‍ക്കു് %s അയച്ചിരി
#: ../js/ui/components/telepathyClient.js:1206
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "നിങ്ങള്‍ ഓണ്‍ലൈന്‍ ആകുമ്പോള്‍ കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്"
msgstr ""
"നിങ്ങള്‍ ഓണ്‍ലൈന്‍ ആകുമ്പോള്‍ കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്"
#: ../js/ui/components/telepathyClient.js:1298
msgid "Network error"
@ -964,7 +987,9 @@ msgstr "ഈ അക്കൌണ്ട് നിലവില്‍ സര്‍വ
#: ../js/ui/components/telepathyClient.js:1332
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന്‍ ഉപയോഗിച്ചു് ഈ കണക്ഷന്‍ മാറ്റിസ്ഥാപിയ്ക്കുന്നു"
msgstr ""
"അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന്‍ ഉപയോഗിച്ചു് ഈ കണക്ഷന്‍ "
"മാറ്റിസ്ഥാപിയ്ക്കുന്നു"
#: ../js/ui/components/telepathyClient.js:1334
msgid "The account already exists on the server"
@ -981,14 +1006,17 @@ msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ
#: ../js/ui/components/telepathyClient.js:1340
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര്‍ ആല്‍ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു അല്ലെങ്കില്‍ ഉചിതമല്ല"
msgstr ""
"സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര്‍ ആല്‍ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു "
"അല്ലെങ്കില്‍ ഉചിതമല്ല"
#: ../js/ui/components/telepathyClient.js:1342
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
msgstr ""
"സര്‍വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില്‍ സര്‍വര്‍ സമ്മതപത്ര ചെയിന്റെ വ്യാപ്തി, എന്നിവ "
"സര്‍വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില്‍ സര്‍വര്‍ സമ്മതപത്ര "
"ചെയിന്റെ വ്യാപ്തി, എന്നിവ "
"പരിധിയില്‍ കൂടുന്നു"
#: ../js/ui/components/telepathyClient.js:1344
@ -1057,7 +1085,8 @@ msgstr "പുറത്ത് കടക്കുക"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് ചെയ്തു് സിസ്റ്റത്തില്‍ നിന്നും "
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് "
"ചെയ്തു് സിസ്റ്റത്തില്‍ നിന്നും "
"പുറത്തു് കടക്കുക."
#: ../js/ui/endSessionDialog.js:67
@ -1091,7 +1120,8 @@ msgstr "നിര്‍ത്തുക"
#: ../js/ui/endSessionDialog.js:84
msgid "Click Power Off to quit these applications and power off the system."
msgstr ""
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര്‍ ഓഫ് ചെയ്യുക ക്ലിക്ക് ചെയ്തു സിസ്റ്റിന്റെ പവര്‍ "
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര്‍ ഓഫ് ചെയ്യുക ക്ലിക്ക് "
"ചെയ്തു സിസ്റ്റിന്റെ പവര്‍ "
"ഓഫ് ചെയ്യുക."
#: ../js/ui/endSessionDialog.js:86
@ -1122,7 +1152,8 @@ msgstr "പുനരാരംഭിക്കുക"
#: ../js/ui/endSessionDialog.js:101
msgid "Click Restart to quit these applications and restart the system."
msgstr "ഈ പ്രയോഗങ്ങള്‍ നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന്‍ പുനരാരംഭിക്കൂ അമര്‍ത്തുക"
msgstr ""
"ഈ പ്രയോഗങ്ങള്‍ നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന്‍ പുനരാരംഭിക്കൂ അമര്‍ത്തുക"
#: ../js/ui/endSessionDialog.js:103
#, c-format
@ -1142,7 +1173,9 @@ msgstr "ഇന്‍സ്റ്റോള്‍"
#: ../js/ui/extensionDownloader.js:204
#, c-format
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "extensions.gnome.org ഇല്‍ നിന്നും '%s' ഡൗണ്‍ലോട് ചെയ്ത് ഇന്‍സ്റ്റോള്‍ ചെയ്യേണമോ?"
msgstr ""
"extensions.gnome.org ഇല്‍ നിന്നും '%s' ഡൗണ്‍ലോട് ചെയ്ത് ഇന്‍സ്റ്റോള്‍ "
"ചെയ്യേണമോ?"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/status/power.js:211
@ -1171,9 +1204,7 @@ msgstr "പിശകുകള്‍ കാണിക്കുക"
msgid "Enabled"
msgstr "പ്രവര്‍ത്തനക്ഷമമാക്കി"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:769
msgid "Disabled"
msgstr "പ്രവര്‍ത്തനരഹിതമാക്കി"
@ -1206,6 +1237,7 @@ msgid "Remove"
msgstr "നീക്കം ചെയ്യുക"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "സന്ദേശങ്ങള്‍ വെടിപ്പാക്കുക"
@ -1213,35 +1245,35 @@ msgstr "സന്ദേശങ്ങള്‍ വെടിപ്പാക്ക
msgid "Notification Settings"
msgstr "അറിയിപ്പു് ക്രമീകരണങ്ങള്‍"
#: ../js/ui/messageTray.js:1710
#: ../js/ui/messageTray.js:1709
msgid "No Messages"
msgstr "സന്ദേശങ്ങളില്ല"
#: ../js/ui/messageTray.js:1783
#: ../js/ui/messageTray.js:1782
msgid "Message Tray"
msgstr "സന്ദേശത്തിന്റെ ട്രേ"
#: ../js/ui/messageTray.js:2801
#: ../js/ui/messageTray.js:2810
msgid "System Information"
msgstr "സിസ്റ്റത്തെക്കുറിച്ചുള്ള വിവരം"
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:378
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:374
msgctxt "program"
msgid "Unknown"
msgstr "അജ്ഞാതം"
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d പുതിയ സന്ദേശം"
msgstr[1] "%d പുതിയ സന്ദേശങ്ങള്‍"
#: ../js/ui/overview.js:82
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "വേണ്ട"
#: ../js/ui/overview.js:127
#: ../js/ui/overview.js:129
msgid "Overview"
msgstr "അവലോകനം"
@ -1249,21 +1281,22 @@ msgstr "അവലോകനം"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:260
#: ../js/ui/overview.js:271
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "തെരയുന്നതിനായി ടൈപ്പ് ചെയ്യുക..."
#: ../js/ui/panel.js:641
#: ../js/ui/panel.js:612
msgid "Quit"
msgstr "നിര്‍ത്തുക"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:692
#: ../js/ui/panel.js:636
msgid "Activities"
msgstr "പ്രവര്‍ത്തനങ്ങള്‍"
#: ../js/ui/panel.js:989
#: ../js/ui/panel.js:933
msgid "Top Bar"
msgstr "മുകളിലുള്ള ബാര്‍"
@ -1272,15 +1305,15 @@ msgstr "മുകളിലുള്ള ബാര്‍"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:718
#: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:74
#: ../js/ui/runDialog.js:73
msgid "Enter a Command"
msgstr "ഒരു കമാന്‍ഡ് നല്‍കുക"
#: ../js/ui/runDialog.js:110
#: ../js/ui/runDialog.js:109
msgid "Close"
msgstr "അടക്കുക"
@ -1301,7 +1334,7 @@ msgstr[1] "%d പുതിയ അറിയിപ്പുകള്‍"
msgid "Lock"
msgstr "പൂട്ടുക"
#: ../js/ui/screenShield.js:641
#: ../js/ui/screenShield.js:637
msgid "GNOME needs to lock the screen"
msgstr "ഗ്നോമിന് സ്ക്രീന്‍ പൂട്ടണം"
@ -1312,15 +1345,17 @@ msgstr "ഗ്നോമിന് സ്ക്രീന്‍ പൂട്ടണ
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1194
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "പൂട്ടുവാന്‍ സാധ്യമല്ല"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1195
msgid "Lock was blocked by an application"
msgstr "പൂട്ടുന്ന സംവിധാനം ഒരു പ്രയോഗം തടസ്സപ്പെടുത്തിയിരിയ്ക്കുന്നു"
#: ../js/ui/searchDisplay.js:453
#| msgid "Searching..."
msgid "Searching…"
msgstr "തെരയുന്നു..."
@ -1336,11 +1371,11 @@ msgstr "പകര്‍ത്തുക"
msgid "Paste"
msgstr "ഒട്ടിയ്ക്കുക"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:106
msgid "Show Text"
msgstr "പദാവലി കാണിക്കുക"
#: ../js/ui/shellEntry.js:103
#: ../js/ui/shellEntry.js:108
msgid "Hide Text"
msgstr "പദാവലി മറക്കുക"
@ -1352,7 +1387,7 @@ msgstr "രഹസ്യവാക്ക്"
msgid "Remember Password"
msgstr "രഹസ്യവാക്ക് ഓര്‍ത്തു് വയ്ക്കുക"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
msgid "Unlock"
msgstr "പൂട്ട് തുറക്കുക"
@ -1416,10 +1451,12 @@ msgid "Visibility"
msgstr "കാഴ്ച"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "ഡിവൈസിലേക്കു് ഫയലുകള്‍ അയയ്ക്കുക..."
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "പുതിയൊരു ഡിവൈസ് സജ്ജമാക്കുക..."
@ -1446,6 +1483,7 @@ msgid "connecting..."
msgstr "ബന്ധിപ്പിയ്ക്കുന്നു...."
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "ഫയലുകള്‍ അയയ്ക്കുക..."
@ -1658,6 +1696,7 @@ msgstr "ഊര്‍ജ്ജ ക്രമീകരണങ്ങള്‍"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "കണക്കുകൂട്ടുന്നു..."
@ -1757,11 +1796,11 @@ msgstr "ഒച്ച"
msgid "Microphone"
msgstr "മൈക്രോഫോണ്‍"
#: ../js/ui/unlockDialog.js:125
#: ../js/ui/unlockDialog.js:124
msgid "Log in as another user"
msgstr "മറ്റൊരു ഉപയോക്താവായി പ്രവേശിയ്ക്കുക"
#: ../js/ui/unlockDialog.js:146
#: ../js/ui/unlockDialog.js:145
msgid "Unlock Window"
msgstr "ജാലകത്തിന്റെ പൂട്ടു തുറക്കുക"
@ -1814,8 +1853,10 @@ msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
msgstr ""
"ചാറ്റ് സന്ദേശങ്ങള്‍ എന്ന പോലെ അറിയിപ്പുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു. മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള്‍ "
"നിങ്ങള്‍ക്കു് കാണുവാന്‍ സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്‍ലൈന്‍ അവസ്ഥയില്‍ വ്യക്തമാക്കുന്നു."
"ചാറ്റ് സന്ദേശങ്ങള്‍ എന്ന പോലെ അറിയിപ്പുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു. "
"മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള്‍ "
"നിങ്ങള്‍ക്കു് കാണുവാന്‍ സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്‍ലൈന്‍ അവസ്ഥയില്‍ "
"വ്യക്തമാക്കുന്നു."
#: ../js/ui/userMenu.js:888
msgid "Other users are logged in."
@ -1868,28 +1909,6 @@ msgstr "'%s' തയ്യാറാണ്"
msgid "Evolution Calendar"
msgstr "ഇവല്യൂഷന്‍ കലണ്ടര്‍"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u ഔട്ട്പുട്ട്"
msgstr[1] "%u ഔട്ട്പുട്ടുകള്‍"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u ഇന്‍പുട്ട്"
msgstr[1] "%u ഇന്‍പുട്ടുകള്‍"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "സിസ്റ്റം ശബ്ദങ്ങള്‍"
#: ../src/main.c:347
msgid "Print version"
msgstr "പ്രിന്റ് ചെയ്യുവാന്‍ സാധിയ്ക്കുന്ന പതിപ്പു്"
@ -1906,7 +1925,7 @@ msgstr "ഒരു പ്രത്യേക മോഡ് ഉപയോഗിയ്
msgid "List possible modes"
msgstr "സാധ്യമായ മോഡുകള്‍ ലഭ്യമാക്കുക"
#: ../src/shell-app.c:626
#: ../src/shell-app.c:622
#, c-format
msgid "Failed to launch '%s'"
msgstr "'%s' ലഭ്യമാക്കുന്നതില്‍ പരാജയം"
@ -1936,6 +1955,19 @@ msgstr "ഉപയോക്താവു് ആധികാരികത ഉറപ
#~ msgid "More..."
#~ msgstr "കൂടുതല്‍..."
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u ഔട്ട്പുട്ട്"
#~ msgstr[1] "%u ഔട്ട്പുട്ടുകള്‍"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u ഇന്‍പുട്ട്"
#~ msgstr[1] "%u ഇന്‍പുട്ടുകള്‍"
#~ msgid "System Sounds"
#~ msgstr "സിസ്റ്റം ശബ്ദങ്ങള്‍"
#~ msgctxt "event list time"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"

163
po/sr.po
View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-31 01:48+0000\n"
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-08 20:26+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n"
@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
@ -365,52 +365,53 @@ msgid "Select an extension to configure using the combobox above."
msgstr "Изаберите проширење за подешавање користећи прозорче за избор."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "Сесија…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Није на списку?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:934
msgid "Cancel"
msgstr "Откажи"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Пријави ме"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Даље"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Корисничко име: "
#: ../js/gdm/loginDialog.js:1173
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Прозор за пријављивање"
#. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36
msgid "Power"
msgstr "Напајање"
msgstr "Угаси"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:815
msgid "Suspend"
msgstr "Обустави"
@ -418,58 +419,58 @@ msgstr "Обустави"
msgid "Restart"
msgstr "Поново покрени"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
msgid "Power Off"
msgstr "Искључи"
msgstr "Угаси"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Грешка потврђивања идентитета"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(или лупите прст)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(нпр., корисник или %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Наредба није нађена"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Не могу да обрадим наредбу:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Није успело покретање „%s“:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Често"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Све"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Нови прозор"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Уклони из омиљених"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Додај у омиљене"
@ -483,7 +484,7 @@ msgstr "„%s“ је додат међу омиљене."
msgid "%s has been removed from your favorites."
msgstr "„%s“ је уклоњен из омиљених."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
msgid "Settings"
msgstr "Подешавања"
@ -506,7 +507,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -608,35 +609,35 @@ msgid "S"
msgstr "Суб"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Ништа планирано"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Данас"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Сутра"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Ове недеље"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "Следеће недеље"
@ -652,12 +653,12 @@ msgstr "Спољни уређај је искључен"
msgid "Removable Devices"
msgstr "Уклоњиви уређаји"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Отвори програмом %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Избаци"
@ -1037,7 +1038,7 @@ msgstr "Подешавања датума и времена"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A, %e. %b., %R"
@ -1212,6 +1213,7 @@ msgid "Remove"
msgstr "Уклони"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "Очисти поруке"
@ -1219,15 +1221,15 @@ msgstr "Очисти поруке"
msgid "Notification Settings"
msgstr "Поставке обавештења"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Нема порука"
#: ../js/ui/messageTray.js:1782
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Фиока порука"
#: ../js/ui/messageTray.js:2810
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Подаци о систему"
@ -1236,7 +1238,7 @@ msgctxt "program"
msgid "Unknown"
msgstr "Непознат"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1245,7 +1247,7 @@ msgstr[1] "%d нове поруке"
msgstr[2] "%d нових порука"
msgstr[3] "Једна нова порука"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Опозови"
@ -1257,21 +1259,22 @@ msgstr "Преглед"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "Упишите текст за претрагу…"
#: ../js/ui/panel.js:612
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Изађи"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Активности"
#: ../js/ui/panel.js:933
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Горња трака"
@ -1284,21 +1287,21 @@ msgstr "Горња трака"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Унесите наредбу"
#: ../js/ui/runDialog.js:109
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Затвори"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1307,11 +1310,11 @@ msgstr[1] "%d нова обавештења"
msgstr[2] "%d нових обавештења"
msgstr[3] "Једно ново обавештење"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
msgid "Lock"
msgstr "Закључај"
#: ../js/ui/screenShield.js:640
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "Гном мора да закључа екран"
@ -1322,19 +1325,21 @@ msgstr "Гном мора да закључа екран"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "Не могу да закључам"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application"
msgstr "Неки програм је блокирао закључавање"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…"
msgstr "Тражим…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Нема одговарајућих резултата."
@ -1346,11 +1351,11 @@ msgstr "Умножи"
msgid "Paste"
msgstr "Убаци"
#: ../js/ui/shellEntry.js:106
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Прикажи текст"
#: ../js/ui/shellEntry.js:108
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Сакриј текст"
@ -1362,7 +1367,7 @@ msgstr "Лозинка"
msgid "Remember Password"
msgstr "Запамти лозинку"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Откључај"
@ -1426,10 +1431,12 @@ msgid "Visibility"
msgstr "Видљивост"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "Пошаљи датотеке на уређај…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "Подеси нови уређај…"
@ -1456,6 +1463,7 @@ msgid "connecting..."
msgstr "повезујем се..."
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "Пошаљи датотеке…"
@ -1668,6 +1676,7 @@ msgstr "Подешавања напајања"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "Приближно…"
@ -1775,11 +1784,11 @@ msgstr "Јачина звука"
msgid "Microphone"
msgstr "Микрофон"
#: ../js/ui/unlockDialog.js:124
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Пријавите се као други корсник"
#: ../js/ui/unlockDialog.js:145
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Откључај прозор"
@ -1807,27 +1816,27 @@ msgstr "Мирује"
msgid "Offline"
msgstr "Ван мреже"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:780
msgid "Notifications"
msgstr "Обавештења"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:796
msgid "Switch User"
msgstr "Промени корисника"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:801
msgid "Log Out"
msgstr "Одјави ме"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:821
msgid "Install Updates & Restart"
msgstr "Инсталирај ажурирања и поново покрени"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:839
msgid "Your chat status will be set to busy"
msgstr "Ваше стање ћаскања ће бити постављено на заузето"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:840
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1836,22 +1845,20 @@ msgstr ""
"мрежи је подешено тако да ће остали знати да ви не можете видети њихове "
"поруке."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:886
msgid "Other users are logged in."
msgstr "Други корисници су пријављени."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:891
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Искључивање може да доведе до тога да изгубе несачувани рад."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (remote)"
msgstr "%s (удаљено)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:920
#, c-format
msgid "%s (console)"
msgstr "%s (љуска)"
@ -1864,7 +1871,7 @@ msgstr "Програми"
msgid "Search"
msgstr "Тражи"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1873,7 +1880,7 @@ msgstr ""
"Извините, данас за вас нема мудрости:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "Пророк је рекао %s"

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-31 01:48+0000\n"
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-08 20:26+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n"
@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
@ -365,52 +365,53 @@ msgid "Select an extension to configure using the combobox above."
msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor."
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…"
msgstr "Sesija…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Nije na spisku?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:934
msgid "Cancel"
msgstr "Otkaži"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Prijavi me"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Dalje"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Korisničko ime: "
#: ../js/gdm/loginDialog.js:1173
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Prozor za prijavljivanje"
#. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36
msgid "Power"
msgstr "Napajanje"
msgstr "Ugasi"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:815
msgid "Suspend"
msgstr "Obustavi"
@ -418,58 +419,58 @@ msgstr "Obustavi"
msgid "Restart"
msgstr "Ponovo pokreni"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
msgid "Power Off"
msgstr "Isključi"
msgstr "Ugasi"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Greška potvrđivanja identiteta"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(ili lupite prst)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(npr., korisnik ili %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Naredba nije nađena"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Ne mogu da obradim naredbu:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Nije uspelo pokretanje „%s“:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Često"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Sve"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Novi prozor"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Ukloni iz omiljenih"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Dodaj u omiljene"
@ -483,7 +484,7 @@ msgstr "„%s“ je dodat među omiljene."
msgid "%s has been removed from your favorites."
msgstr "„%s“ je uklonjen iz omiljenih."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
msgid "Settings"
msgstr "Podešavanja"
@ -506,7 +507,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format,
#. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#: ../js/ui/calendar.js:77
@ -608,35 +609,35 @@ msgid "S"
msgstr "Sub"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Ništa planirano"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Danas"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Sutra"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Ove nedelje"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "Sledeće nedelje"
@ -652,12 +653,12 @@ msgstr "Spoljni uređaj je isključen"
msgid "Removable Devices"
msgstr "Uklonjivi uređaji"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Otvori programom %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Izbaci"
@ -1037,7 +1038,7 @@ msgstr "Podešavanja datuma i vremena"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A, %e. %b., %R"
@ -1212,6 +1213,7 @@ msgid "Remove"
msgstr "Ukloni"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "Očisti poruke"
@ -1219,15 +1221,15 @@ msgstr "Očisti poruke"
msgid "Notification Settings"
msgstr "Postavke obaveštenja"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Nema poruka"
#: ../js/ui/messageTray.js:1782
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Fioka poruka"
#: ../js/ui/messageTray.js:2810
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Podaci o sistemu"
@ -1236,7 +1238,7 @@ msgctxt "program"
msgid "Unknown"
msgstr "Nepoznat"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1245,7 +1247,7 @@ msgstr[1] "%d nove poruke"
msgstr[2] "%d novih poruka"
msgstr[3] "Jedna nova poruka"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Opozovi"
@ -1257,21 +1259,22 @@ msgstr "Pregled"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…"
msgstr "Upišite tekst za pretragu…"
#: ../js/ui/panel.js:612
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Izađi"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Aktivnosti"
#: ../js/ui/panel.js:933
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Gornja traka"
@ -1284,21 +1287,21 @@ msgstr "Gornja traka"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Unesite naredbu"
#: ../js/ui/runDialog.js:109
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Zatvori"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1307,11 +1310,11 @@ msgstr[1] "%d nova obaveštenja"
msgstr[2] "%d novih obaveštenja"
msgstr[3] "Jedno novo obaveštenje"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
msgid "Lock"
msgstr "Zaključaj"
#: ../js/ui/screenShield.js:640
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "Gnom mora da zaključa ekran"
@ -1322,19 +1325,21 @@ msgstr "Gnom mora da zaključa ekran"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock"
msgstr "Ne mogu da zaključam"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application"
msgstr "Neki program je blokirao zaključavanje"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…"
msgstr "Tražim…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Nema odgovarajućih rezultata."
@ -1346,11 +1351,11 @@ msgstr "Umnoži"
msgid "Paste"
msgstr "Ubaci"
#: ../js/ui/shellEntry.js:106
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Prikaži tekst"
#: ../js/ui/shellEntry.js:108
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Sakrij tekst"
@ -1362,7 +1367,7 @@ msgstr "Lozinka"
msgid "Remember Password"
msgstr "Zapamti lozinku"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Otključaj"
@ -1426,10 +1431,12 @@ msgid "Visibility"
msgstr "Vidljivost"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "Pošalji datoteke na uređaj…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "Podesi novi uređaj…"
@ -1456,6 +1463,7 @@ msgid "connecting..."
msgstr "povezujem se..."
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "Pošalji datoteke…"
@ -1668,6 +1676,7 @@ msgstr "Podešavanja napajanja"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "Približno…"
@ -1775,11 +1784,11 @@ msgstr "Jačina zvuka"
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:124
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Prijavite se kao drugi korsnik"
#: ../js/ui/unlockDialog.js:145
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Otključaj prozor"
@ -1807,27 +1816,27 @@ msgstr "Miruje"
msgid "Offline"
msgstr "Van mreže"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:780
msgid "Notifications"
msgstr "Obaveštenja"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:796
msgid "Switch User"
msgstr "Promeni korisnika"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:801
msgid "Log Out"
msgstr "Odjavi me"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:821
msgid "Install Updates & Restart"
msgstr "Instaliraj ažuriranja i ponovo pokreni"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:839
msgid "Your chat status will be set to busy"
msgstr "Vaše stanje ćaskanja će biti postavljeno na zauzeto"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:840
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1836,22 +1845,20 @@ msgstr ""
"mreži je podešeno tako da će ostali znati da vi ne možete videti njihove "
"poruke."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:886
msgid "Other users are logged in."
msgstr "Drugi korisnici su prijavljeni."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:891
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Isključivanje može da dovede do toga da izgube nesačuvani rad."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (remote)"
msgstr "%s (udaljeno)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:920
#, c-format
msgid "%s (console)"
msgstr "%s (ljuska)"
@ -1864,7 +1871,7 @@ msgstr "Programi"
msgid "Search"
msgstr "Traži"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1873,7 +1880,7 @@ msgstr ""
"Izvinite, danas za vas nema mudrosti:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "Prorok je rekao %s"

2590
po/tr.po

File diff suppressed because it is too large Load Diff

442
po/vi.po
View File

@ -1,19 +1,18 @@
# Vietnamese translation for gnome-shell.
# Copyright (C) 2013 GNOME i18n Project for Vietnamese.
# Copyright (C) 2010 GNOME i18n Project for Vietnamese.
# This file is distributed under the same license as the gnome-shell package.
# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2010-2013.
# Ngô Chin <ndtrung4419@gmail.com>, 2011.
# Trần Ngọc Quân <vnwildman@gmail.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-23 11:49+0000\n"
"PO-Revision-Date: 2013-04-13 17:51+1000\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
"POT-Creation-Date: 2013-03-02 23:02+0000\n"
"PO-Revision-Date: 2013-03-03 11:13+0700\n"
"Last-Translator: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n"
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -50,7 +49,7 @@ msgstr "Mở trình đơn ứng dụng"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "Hệ vỏ GNOME"
msgstr "GNOME Shell"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
@ -59,11 +58,11 @@ msgstr "Quản lý cửa sổ và chạy ứng dụng"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences"
msgstr "Cá nhân hóa phần mở rộng hệ vỏ GNOME"
msgstr "Tuỳ thích phần mở rộng GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions"
msgstr "Cấu hình phần mở rộng Hệ vỏ GNOME"
msgstr "Cấu hình phần mở rộng GNOME Shell"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
@ -88,7 +87,7 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell."
msgstr ""
"Phần mở rộng Hệ vỏ GNOME có thuộc tính uuid; khóa này liệt kê danh sách phần "
"Phần mở rộng GNOME Shell có thuộc tính uuid. Khoá này liệt kê danh sách phần "
"mở rộng nên nạp. Bất kỳ phần mở rộng nào muốn nạp phải nằm trong danh sách "
"này. Bạn có thể thao tác trên danh sách này với phương thức DBus "
"EnableExtension và DisableExtension trên org.gnome.Shell."
@ -121,15 +120,13 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "List of categories that should be displayed as folders"
msgstr "Liệt kê các các-ta-lốc mà nó có thể hiển thị như một thư mục"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid ""
"Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view."
msgstr ""
"Mỗi tên các-ta-lốc trong danh sách này sẽ được xuất hiện như là một thư mục "
"trong trình bày ứng dụng, thay vì hiển thị cùng dòng trong trình bày chính. "
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
@ -157,22 +154,18 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Luôn hiện mục Đăng xuất trên trình đơn người dùng."
msgstr "Luôn hiện mục \"Đăng xuất\" trên trình đơn người dùng."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Khóa này sẽ đè lên việc tự động ẩn trình đơn 'Đăng xuất' ở chế độ đơn-người-"
"dùng, đơn-phiên-làm-việc. "
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Hoặc là ghi nhớ mật khẩu dành cho việc gắn hệ thống tập tin đã mã hóa hoặc "
"hệ thống tập tin trên máy chủ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
@ -181,10 +174,6 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"Hệ vỏ sẽ yêu cầu mật khẩu khi có thư mục được mã hóa hay hệ thống tập tin "
"máy mạng được gắn. Nếu mật khẩu có thể ghi lại để dùng trong lần sau, hộp "
"dấu kiểm “Nhớ mật khẩu” sẽ xuất hiện. Khóa này đặt trạng thái mặc định cho "
"hộp dấu kiểm."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar"
@ -237,27 +226,27 @@ msgstr "Phím chạy hoặc ngừng trình thu màn hình."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Bàn phím cần dùng"
msgstr "Loại bàn phím cần dùng"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "Kiểu bàn phím cần dùng."
msgstr "Loại bàn phím cần dùng."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts."
msgstr "Tốc độ khung hình sẽ dùng khi ghi screencast."
msgstr "Tốc độ khung dùng lưu screencast."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"Tốc độ khung hình của screencast được ghi bởi bộ thu Hệ vỏ GNOME tính theo "
"số khung mỗi giây."
"Tốc độ khung của screencast lưu bởi bộ thu GNOME Shell theo số khung mỗi "
"giây."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Ống dẫn gstreamer dùng để thu screencast"
msgstr "Ống dẫn gstreamer để thu screencast"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format
@ -278,9 +267,9 @@ msgstr ""
"source pad không kết nối; đầu ra từ pad sẽ được ghi vào tập tin kết quả. Tuy "
"nhiên ống dẫn có thể tự lưu đầu ra riêng - có thể hữu dụng để gửi kết quả "
"đến máy chủ icecast thông qua shout2send hoặc tương tự. Nếu bỏ chọn hoặc đặt "
"giá trị rỗng, ống dẫn mặc định sẽ được dùng, hiện thời là vp8enc "
"giá trị rỗng, ống dẫn mặc định sẽ được dùng, hiện thời là 'vp8enc "
"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! "
"queue ! webmmux và lưu ở dạng WEBM dùng VP8 codec. %T được dùng để thế chỗ "
"queue ! webmmux' và lưu ở dạng WEBM dùng VP8 codec. %T được dùng để thế chỗ "
"cho số thread dự đoán tối ưu cho hệ thống."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
@ -307,31 +296,25 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Cấu hình về cách hiển thị các cửa sổ ở bảng chuyển đổi. Các kiểu có thể là "
"'thumbnail-only' (hiển thị ảnh thu nhỏ của cửa sổ), 'app-icon-only' (chỉ "
"hiển thị biểu tượng của ứng dụng) hoặc 'both' (cả hai)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "Gắn hộp thoại dạng modal vào cửa sổ mẹ"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Khóa này sẽ đè lên khóa có trong org.gnome.mutter khi chạy hệ vỏ GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "Sắp đặt các nút trên thanh tiêu đề"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"Khóa này đè lên khóa có trong org.gnome.desktop.wm.preferences khi chạy hệ "
"vỏ GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
@ -365,46 +348,46 @@ msgstr "Phiên làm việc…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:629
msgid "Not listed?"
msgstr "Không có trong danh sách?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/userMenu.js:938
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:932
msgid "Cancel"
msgstr "Thôi"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgctxt "button"
msgid "Sign In"
msgstr "Đăng nhập"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:799
msgid "Next"
msgstr "Kế tiếp"
msgstr "Tới"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Tài khoản: "
msgstr "Tên người dùng: "
#: ../js/gdm/loginDialog.js:1173
#: ../js/gdm/loginDialog.js:1157
msgid "Login Window"
msgstr "Cửa sổ đăng nhập"
msgstr "Cửa sổ đặt nhập"
#. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36
msgid "Power"
msgstr "Nguồn"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:814
msgid "Suspend"
msgstr "Ngưng"
@ -412,58 +395,58 @@ msgstr "Ngưng"
msgid "Restart"
msgstr "Khởi động lại"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
msgid "Power Off"
msgstr "Tắt máy"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:182
msgid "Authentication error"
msgstr "Lỗi xác thực"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:299
msgid "(or swipe finger)"
msgstr "(hoặc quẹt ngón tay)"
#: ../js/gdm/util.js:391
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(ví dụ: tài khoản hoặc %s)"
msgstr "(ví dụ người dùng hoặc %s)"
#: ../js/misc/util.js:97
#: ../js/misc/util.js:94
msgid "Command not found"
msgstr "Không tìm thấy lệnh"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:130
#: ../js/misc/util.js:127
msgid "Could not parse command:"
msgstr "Không thể phân tích lệnh:"
#: ../js/misc/util.js:138
#: ../js/misc/util.js:135
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Lỗi thực hiện %s:"
msgstr "Lỗi thực hiện '%s':"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:348
msgid "Frequent"
msgstr "Thường dùng"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:355
msgid "All"
msgstr "Tất cả"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:913
msgid "New Window"
msgstr "Cửa sổ mới"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Bỏ đánh dấu ưa thích"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:917
msgid "Add to Favorites"
msgstr "Đánh dấu ưa thích"
@ -477,13 +460,13 @@ msgstr "Đã được đánh dấu ưa thích cho %s."
msgid "%s has been removed from your favorites."
msgstr "Đã bỏ đánh dấu ưa thích cho %s"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
msgid "Settings"
msgstr "Cài đặt"
msgstr "Thiết lập"
#: ../js/ui/backgroundMenu.js:21
msgid "Change Background…"
msgstr "Đổi ảnh nền…"
msgstr "Thay đổi nền…"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
@ -602,35 +585,35 @@ msgid "S"
msgstr "T7"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720
#: ../js/ui/calendar.js:692
msgid "Nothing Scheduled"
msgstr "Không có lịch hẹn"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:708
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739
#: ../js/ui/calendar.js:711
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y"
#: ../js/ui/calendar.js:749
#: ../js/ui/calendar.js:721
msgid "Today"
msgstr "Hôm nay"
#: ../js/ui/calendar.js:753
#: ../js/ui/calendar.js:725
msgid "Tomorrow"
msgstr "Ngày mai"
#: ../js/ui/calendar.js:764
#: ../js/ui/calendar.js:736
msgid "This week"
msgstr "Tuần này"
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:744
msgid "Next week"
msgstr "Tuần tới"
@ -646,12 +629,12 @@ msgstr "Ổ ngoài đã ngắt kết nối"
msgid "Removable Devices"
msgstr "Thiết bị di động"
#: ../js/ui/components/autorunManager.js:594
#: ../js/ui/components/autorunManager.js:593
#, c-format
msgid "Open with %s"
msgstr "Mở bằng %s"
#: ../js/ui/components/autorunManager.js:620
#: ../js/ui/components/autorunManager.js:619
msgid "Eject"
msgstr "Đẩy ra"
@ -702,7 +685,7 @@ msgstr "Mạng không dây cần xác thực"
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"'%s'."
msgstr "Cần mật mã hoặc khoá mã để truy cập mạng không dây %s"
msgstr "Cần mật mã hoặc khoá mã để truy cập mạng không dây '%s'"
#: ../js/ui/components/networkAgent.js:314
msgid "Wired 802.1X authentication"
@ -735,7 +718,7 @@ msgstr "Mật khẩu mạng băng thông rộng"
#: ../js/ui/components/networkAgent.js:337
#, c-format
msgid "A password is required to connect to '%s'."
msgstr "Cần mật khẩu để kết nối đến %s."
msgstr "Cần mật khẩu để kết nối đến '%s'."
#: ../js/ui/components/polkitAgent.js:55
msgid "Authentication Required"
@ -789,7 +772,7 @@ msgstr "Ngừng im lặng"
#: ../js/ui/components/telepathyClient.js:480
msgid "Mute"
msgstr "Câm"
msgstr "Im lặng"
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
#: ../js/ui/components/telepathyClient.js:942
@ -1000,7 +983,7 @@ msgstr "Xem tài khoản"
msgid "Unknown reason"
msgstr "Lý do không biết"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
msgid "Windows"
msgstr "Cửa sổ"
@ -1029,7 +1012,7 @@ msgstr "Thiết lập ngày giờ"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y"
@ -1125,7 +1108,7 @@ msgstr "Cài đặt"
#: ../js/ui/extensionDownloader.js:204
#, c-format
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Tải và cài đặt %s từ extensions.gnome.org chứ?"
msgstr "Tải và cài đặt '%s' từ extensions.gnome.org chứ?"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/status/power.js:211
@ -1154,7 +1137,9 @@ msgstr "Hiện lỗi"
msgid "Enabled"
msgstr "Bật"
#: ../js/ui/lookingGlass.js:769
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Tắt"
@ -1194,15 +1179,15 @@ msgstr "Xoá thông báo"
msgid "Notification Settings"
msgstr "Thiết lập thông báo"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Không có thông báo"
#: ../js/ui/messageTray.js:1782
#: ../js/ui/messageTray.js:1787
msgid "Message Tray"
msgstr "Khay thông báo"
#: ../js/ui/messageTray.js:2810
#: ../js/ui/messageTray.js:2864
msgid "System Information"
msgstr "Thông tin hệ thống"
@ -1211,13 +1196,13 @@ msgctxt "program"
msgid "Unknown"
msgstr "Không biết"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d tin nhắn mới"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:82
msgid "Undo"
msgstr "Hoàn lại"
@ -1229,21 +1214,21 @@ msgstr "Tổng quan"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:271
#: ../js/ui/overview.js:284
msgid "Type to search…"
msgstr "Nhập để tìm…"
#: ../js/ui/panel.js:612
#: ../js/ui/panel.js:613
msgid "Quit"
msgstr "Thoát"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636
#: ../js/ui/panel.js:642
msgid "Activities"
msgstr "Hoạt động"
#: ../js/ui/panel.js:933
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Thanh đỉnh"
@ -1256,31 +1241,31 @@ msgstr "Thanh đỉnh"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73
#: ../js/ui/runDialog.js:205
msgid "Enter a Command"
msgstr "Nhập lệnh"
#: ../js/ui/runDialog.js:109
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Đóng"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:86
#: ../js/ui/screenShield.js:90
msgid "%A, %B %d"
msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:151
#: ../js/ui/screenShield.js:155
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d thông báo mới"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
msgid "Lock"
msgstr "Khoá"
#: ../js/ui/screenShield.js:637
#: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen"
msgstr "GNOME cần khoá màn hình"
@ -1291,19 +1276,19 @@ msgstr "GNOME cần khoá màn hình"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1194
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
msgid "Unable to lock"
msgstr "Không thể khoá"
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1195
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application"
msgstr "Một ứng dụng đã ngăn cản khoá"
#: ../js/ui/searchDisplay.js:453
#: ../js/ui/searchDisplay.js:431
msgid "Searching…"
msgstr "Đang tìm…"
#: ../js/ui/searchDisplay.js:497
#: ../js/ui/searchDisplay.js:475
msgid "No results."
msgstr "Không có kết quả."
@ -1315,11 +1300,11 @@ msgstr "Chép"
msgid "Paste"
msgstr "Dán"
#: ../js/ui/shellEntry.js:106
#: ../js/ui/shellEntry.js:105
msgid "Show Text"
msgstr "Hiện chữ"
#: ../js/ui/shellEntry.js:108
#: ../js/ui/shellEntry.js:107
msgid "Hide Text"
msgstr "Ẩn chữ"
@ -1331,7 +1316,7 @@ msgstr "Mật khẩu"
msgid "Remember Password"
msgstr "Nhớ mật khẩu"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock"
msgstr "Bỏ khoá"
@ -1448,7 +1433,7 @@ msgstr "Yêu cầu cấp quyền từ %s"
#: ../js/ui/status/bluetooth.js:328
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Thiết bị %s muốn truy cập dịch vụ %s"
msgstr "Thiết bị %s muốn truy cập dịch vụ '%s'"
#: ../js/ui/status/bluetooth.js:330
msgid "Always grant access"
@ -1476,7 +1461,7 @@ msgstr "Thiết bị %s muốn kết nối với máy tính này"
#: ../js/ui/status/bluetooth.js:366
#, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgstr "Vui lòng xác nhận PIN %06d khớp với số trên thiết bị."
msgstr "Vui lòng xác nhận PIN '%06d' khớp với số trên thiết bị."
#. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:369
@ -1732,59 +1717,59 @@ msgstr "Âm lượng"
msgid "Microphone"
msgstr "Micrô"
#: ../js/ui/unlockDialog.js:124
#: ../js/ui/unlockDialog.js:151
msgid "Log in as another user"
msgstr "Đăng nhập người dùng khác"
#: ../js/ui/unlockDialog.js:145
#: ../js/ui/unlockDialog.js:177
msgid "Unlock Window"
msgstr "Bỏ khoá cửa sổ"
#: ../js/ui/userMenu.js:193
#: ../js/ui/userMenu.js:192
msgid "Available"
msgstr "Có mặt"
#: ../js/ui/userMenu.js:196
#: ../js/ui/userMenu.js:195
msgid "Busy"
msgstr "Bận"
#: ../js/ui/userMenu.js:199
#: ../js/ui/userMenu.js:198
msgid "Invisible"
msgstr "Giấu mặt"
#: ../js/ui/userMenu.js:202
#: ../js/ui/userMenu.js:201
msgid "Away"
msgstr "Vắng mặt"
#: ../js/ui/userMenu.js:205
#: ../js/ui/userMenu.js:204
msgid "Idle"
msgstr "Nhàn rỗi"
#: ../js/ui/userMenu.js:208
#: ../js/ui/userMenu.js:207
msgid "Offline"
msgstr "Ngoại tuyến"
#: ../js/ui/userMenu.js:781
#: ../js/ui/userMenu.js:779
msgid "Notifications"
msgstr "Thông báo"
#: ../js/ui/userMenu.js:797
#: ../js/ui/userMenu.js:795
msgid "Switch User"
msgstr "Chuyển người dùng"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:800
msgid "Log Out"
msgstr "Đăng xuất"
#: ../js/ui/userMenu.js:822
#: ../js/ui/userMenu.js:820
msgid "Install Updates & Restart"
msgstr "Cài đặt bản cập nhật và khởi động lại"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:838
msgid "Your chat status will be set to busy"
msgstr "Trạng thái nhắn tin của bạn sẽ được đặt là bận"
#: ../js/ui/userMenu.js:841
#: ../js/ui/userMenu.js:839
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1792,35 +1777,33 @@ msgstr ""
"Thông báo đã bị tắt, bao gồm tin nhắn. Trạng thái trực tuyến của bạn đã được "
"điều chỉnh để mọi người biết bạn sẽ không xem tin nhắn họ gửi đến."
#: ../js/ui/userMenu.js:888
#: ../js/ui/userMenu.js:885
msgid "Other users are logged in."
msgstr "Người dùng khác đang đăng nhập."
#: ../js/ui/userMenu.js:893
#: ../js/ui/userMenu.js:890
msgid "Shutting down might cause them to lose unsaved work."
msgstr "Tắt sẽ làm mất những kết quả chưa được lưu."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#: ../js/ui/userMenu.js:916
#, c-format
msgid "%s (remote)"
msgstr "%s (ở xa)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#: ../js/ui/userMenu.js:918
#, c-format
msgid "%s (console)"
msgstr "%s (console)"
#: ../js/ui/viewSelector.js:100
#: ../js/ui/viewSelector.js:101
msgid "Applications"
msgstr "Ứng dụng"
#: ../js/ui/viewSelector.js:104
#: ../js/ui/viewSelector.js:105
msgid "Search"
msgstr "Tìm"
#: ../js/ui/wanda.js:77
#: ../js/ui/wanda.js:92
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1829,7 +1812,7 @@ msgstr ""
"Rất tiếc, không có lời thông thái nào hôm nay:\n"
"%s"
#: ../js/ui/wanda.js:81
#: ../js/ui/wanda.js:96
#, c-format
msgid "%s the Oracle says"
msgstr "Nhà tiên tri %s nói"
@ -1837,12 +1820,32 @@ msgstr "Nhà tiên tri %s nói"
#: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready"
msgstr "%s đã sẵn sàng"
msgstr "'%s' đã sẵn sàng"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
msgstr "Lịch Evolution"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u đầu ra"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u đầu vào"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Âm thanh hệ thống"
#: ../src/main.c:347
msgid "Print version"
msgstr "In phiên bản"
@ -1853,7 +1856,7 @@ msgstr "Chể độ dùng bởi GDM cho màn hình đăng nhập"
#: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Dùng chế độ đặc biệt, ví dụ gdm cho màn hình đăng nhập"
msgstr "Dùng chế độ đặc biệt, ví dụ \"gdm\" cho màn hình đăng nhập"
#: ../src/main.c:365
msgid "List possible modes"
@ -1862,7 +1865,7 @@ msgstr "Danh sách chế độ"
#: ../src/shell-app.c:622
#, c-format
msgid "Failed to launch '%s'"
msgstr "Lỗi chạy %s"
msgstr "Lỗi chạy '%s'"
#: ../src/shell-keyring-prompt.c:708
msgid "Passwords do not match."
@ -1876,17 +1879,6 @@ msgstr "Mật khẩu không thể không có"
msgid "Authentication dialog was dismissed by the user"
msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u đầu ra"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u đầu vào"
#~ msgid "System Sounds"
#~ msgstr "Âm thanh hệ thống"
#~ msgctxt "title"
#~ msgid "Sign In"
#~ msgstr "Đăng nhập"
@ -1918,7 +1910,7 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgstr "%l:%M %p"
#~ msgid "Failed to unmount '%s'"
#~ msgstr "Lỗi bỏ gắn kết %s"
#~ msgstr "Lỗi bỏ gắn kết '%s'"
#~ msgid "Retry"
#~ msgstr "Thử lại"
@ -1933,7 +1925,7 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgstr "Lỗi duyệt tập tin"
#~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr "Không thể duyệt thiết bị yêu cầu , lỗi là %s"
#~ msgstr "Không thể duyệt thiết bị yêu cầu , lỗi là '%s'"
#~ msgid "Wireless"
#~ msgstr "Mạng không dây"
@ -2078,3 +2070,155 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgid "Show password"
#~ msgstr "Hiện mật khẩu"
#~| msgid "If true, display seconds in time."
#~ msgid "If true, display onscreen keyboard."
#~ msgstr "Nếu đúng (true), hiện bàn phím màn hình."
#~| msgid "Screen Keyboard"
#~ msgid "Show the onscreen keyboard"
#~ msgstr "Hiện bàn phím màn hình"
#~ msgid "%s has finished starting"
#~ msgstr "%s đã hoàn tất khởi chạy"
#~ msgid "Uuids of extensions to disable"
#~ msgstr "UUID của phần mở rộng cần tắt"
#~ msgid "You're now connected to mobile broadband connection '%s'"
#~ msgstr "Đã nối mạng '%s' (băng thông rộng)"
#~ msgid "You're now connected to wireless network '%s'"
#~ msgstr "Đã nối mạng '%s' (không dây)"
#~ msgid "You're now connected to wired network '%s'"
#~ msgstr "Đã nối mạng '%s' (dây)"
#~ msgid "You're now connected to VPN network '%s'"
#~ msgstr "Đã nối mạng VPN '%s'"
#~ msgid "Localization Settings"
#~ msgstr "Thiết lập bản địa hoá"
#~ msgid "Less than a minute ago"
#~ msgstr "Chưa đến một phút"
#~ msgid "%d minute ago"
#~ msgid_plural "%d minutes ago"
#~ msgstr[0] "%d phút trước"
#~ msgid "%d hour ago"
#~ msgid_plural "%d hours ago"
#~ msgstr[0] "%d giờ trước"
#~ msgid "%d day ago"
#~ msgid_plural "%d days ago"
#~ msgstr[0] "%d ngày trước"
#~ msgid "%d week ago"
#~ msgid_plural "%d weeks ago"
#~ msgstr[0] "%d tuần trước"
#~ msgid "Shut Down"
#~ msgstr "Tắt máy"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "Nhấn Tắt máy để thoát những ứng dụng này và tắt hệ thống."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "Hệ thống sẽ tự động tắt sau %d giây."
#~ msgid "Shutting down the system."
#~ msgstr "Tắt hệ thống."
#~ msgid "Confirm"
#~ msgstr "Xác nhận"
#~ msgid "Clip the crosshairs at the center"
#~ msgstr "Cắt lưới chéo ở giữa"
#~ msgid "Color of the crosshairs"
#~ msgstr "Màu lưới chéo"
#~ msgid ""
#~ "Determines the length of the vertical and horizontal lines that make up "
#~ "the crosshairs."
#~ msgstr "Xác định độ dài và rộng của những dòng tạo nên lưới chéo."
#~ msgid ""
#~ "Determines the transparency of the crosshairs, from fully opaque to fully "
#~ "transparent."
#~ msgstr "Xác định độ trong suốt của lưới chéo, từ đặc đến trong suốt."
#~ msgid "Enable lens mode"
#~ msgstr "Bật chế độ gương"
#~ msgid "Show or hide crosshairs"
#~ msgstr "Hiện hoặc ẩn lưới chéo"
#~ msgid "Show or hide the magnifier"
#~ msgstr "Hiện hoặc ẩn kính lúp"
#~ msgid "Thickness of the crosshairs"
#~ msgstr "Độ dày lưới chéo"
#~ msgid ""
#~ "Width of the vertical and horizontal lines that make up the crosshairs."
#~ msgstr "Độ rộng của đường dọc/ngang hình thành dấu gạch chéo."
#~ msgid "PREFERENCES"
#~ msgstr "TUỲ THÍCH"
#~ msgid "Shut Down..."
#~ msgstr "Tắt máy..."
#~ msgid "Search your computer"
#~ msgstr "Tìm trong máy"
#~ msgid "Customize the panel clock"
#~ msgstr "Tuỳ biến đồng hồ"
#~ msgid "Clock Format"
#~ msgstr "Dạng đồng hồ"
#~| msgid "System Preferences..."
#~ msgid "Clock Preferences"
#~ msgstr "Thiết lập đồng hồ"
#~ msgid "Panel Display"
#~ msgstr "Khung hiển thị"
#~ msgid "Show seco_nds"
#~ msgstr "Hiện _giây"
#~ msgid "_12 hour format"
#~ msgstr "Dạng _12 giờ"
#~ msgid "_24 hour format"
#~ msgstr "Dạng _24 giờ"
#~| msgid "System Preferences..."
#~ msgid "Preferences"
#~ msgstr "Thiết lập"
#~ msgid ""
#~ "Can't add a new workspace because maximum workspaces limit has been "
#~ "reached."
#~ msgstr ""
#~ "Không thể thêm vùng làm việc mới vì đã đạt giới hạn số vùng làm việc tối "
#~ "đa."
#~ msgid "Can't remove the first workspace."
#~ msgstr "Không thể bỏ vùng làm việc đầu tiên."
#~ msgid "Drag here to add favorites"
#~ msgstr "Kéo vào đây để thêm vào danh mục ưa thích"
#~ msgid "Find..."
#~ msgstr "Tìm"
#~ msgid "Sidebar"
#~ msgstr "Thanh bên"
#~ msgid "Recent Documents"
#~ msgstr "Tài liệu gần đây"

View File

@ -135,10 +135,7 @@ shell_private_sources = \
gactionobservable.h \
gactionobservable.c \
gactionobserver.h \
gactionobserver.c \
gtkmenutracker.c \
gtkmenutracker.h \
$(NULL)
gactionobserver.c
libgnome_shell_la_SOURCES = \
$(shell_built_sources) \
@ -161,8 +158,6 @@ libgnome_shell_la_SOURCES = \
shell-invert-lightness-effect.c \
shell-keyring-prompt.h \
shell-keyring-prompt.c \
shell-menu-tracker.c \
shell-menu-tracker.h \
shell-mount-operation.c \
shell-network-agent.c \
shell-perf-log.c \

View File

@ -1,434 +0,0 @@
/*
* Copyright © 2013 Canonical Limited
*
* 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 licence, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Ryan Lortie <desrt@desrt.ca>
*/
#include "config.h"
#include "gtkmenutracker.h"
typedef struct _GtkMenuTrackerSection GtkMenuTrackerSection;
struct _GtkMenuTracker
{
GtkMenuTrackerInsertFunc insert_func;
GtkMenuTrackerRemoveFunc remove_func;
gpointer user_data;
GtkMenuTrackerSection *toplevel;
};
struct _GtkMenuTrackerSection
{
GMenuModel *model;
GSList *items;
gchar *action_namespace;
guint with_separators : 1;
guint has_separator : 1;
gulong handler;
};
static GtkMenuTrackerSection * gtk_menu_tracker_section_new (GtkMenuTracker *tracker,
GMenuModel *model,
gboolean with_separators,
gint offset,
const gchar *action_namespace);
static void gtk_menu_tracker_section_free (GtkMenuTrackerSection *section);
static GtkMenuTrackerSection *
gtk_menu_tracker_section_find_model (GtkMenuTrackerSection *section,
GMenuModel *model,
gint *offset)
{
GSList *item;
if (section->has_separator)
(*offset)++;
if (section->model == model)
return section;
for (item = section->items; item; item = item->next)
{
GtkMenuTrackerSection *subsection = item->data;
if (subsection)
{
GtkMenuTrackerSection *found_section;
found_section = gtk_menu_tracker_section_find_model (subsection, model, offset);
if (found_section)
return found_section;
}
else
(*offset)++;
}
return FALSE;
}
/* this is responsible for syncing the showing of a separator for a
* single subsection (and its children).
*
* we only ever show separators if we have _actual_ children (ie: we do
* not show a separator if the section contains only empty child
* sections). it's difficult to determine this on-the-fly, so we have
* this separate function to come back later and figure it out.
*
* 'section' is that section.
*
* 'tracker' is passed in so that we can emit callbacks when we decide
* to add/remove separators.
*
* 'offset' is passed in so we know which position to emit in our
* callbacks. ie: if we add a separator right at the top of this
* section then we would emit it with this offset. deeper inside, we
* adjust accordingly.
*
* could_have_separator is true in two situations:
*
* - our parent section had with_separators defined and we are not the
* first section (ie: we should add a separator if we have content in
* order to divide us from the items above)
*
* - if we had a 'label' attribute set for this section
*
* parent_model and parent_index are passed in so that we can give them
* to the insertion callback so that it can see the label (and anything
* else that happens to be defined on the section).
*
* we iterate each item in ourselves. for subsections, we recursively
* run ourselves to sync separators. after we are done, we notice if we
* have any items in us or if we are completely empty and sync if our
* separator is shown or not.
*/
static gint
gtk_menu_tracker_section_sync_separators (GtkMenuTrackerSection *section,
GtkMenuTracker *tracker,
gint offset,
gboolean could_have_separator,
GMenuModel *parent_model,
gint parent_index)
{
gboolean should_have_separator;
gint n_items = 0;
GSList *item;
gint i = 0;
for (item = section->items; item; item = item->next)
{
GtkMenuTrackerSection *subsection = item->data;
if (subsection)
{
gboolean could_have_separator;
could_have_separator = (section->with_separators && i > 0) ||
g_menu_model_get_item_attribute (section->model, i, "label", "s", NULL);
n_items += gtk_menu_tracker_section_sync_separators (subsection, tracker, offset + n_items,
could_have_separator, section->model, i);
}
else
n_items++;
i++;
}
should_have_separator = could_have_separator && n_items != 0;
if (should_have_separator > section->has_separator)
{
/* Add a separator */
(* tracker->insert_func) (offset, parent_model, parent_index, NULL, TRUE, tracker->user_data);
section->has_separator = TRUE;
}
else if (should_have_separator < section->has_separator)
{
/* Remove a separator */
(* tracker->remove_func) (offset, tracker->user_data);
section->has_separator = FALSE;
}
n_items += section->has_separator;
return n_items;
}
static gint
gtk_menu_tracker_section_measure (GtkMenuTrackerSection *section)
{
GSList *item;
gint n_items;
if (section == NULL)
return 1;
n_items = 0;
if (section->has_separator)
n_items++;
for (item = section->items; item; item = item->next)
n_items += gtk_menu_tracker_section_measure (item->data);
return n_items;
}
static void
gtk_menu_tracker_remove_items (GtkMenuTracker *tracker,
GSList **change_point,
gint offset,
gint n_items)
{
gint i;
for (i = 0; i < n_items; i++)
{
GtkMenuTrackerSection *subsection;
gint n;
subsection = (*change_point)->data;
*change_point = g_slist_delete_link (*change_point, *change_point);
n = gtk_menu_tracker_section_measure (subsection);
gtk_menu_tracker_section_free (subsection);
while (n--)
(* tracker->remove_func) (offset, tracker->user_data);
}
}
static void
gtk_menu_tracker_add_items (GtkMenuTracker *tracker,
GtkMenuTrackerSection *section,
GSList **change_point,
gint offset,
GMenuModel *model,
gint position,
gint n_items)
{
while (n_items--)
{
GMenuModel *submenu;
submenu = g_menu_model_get_item_link (model, position + n_items, G_MENU_LINK_SECTION);
g_assert (submenu != model);
if (submenu != NULL)
{
GtkMenuTrackerSection *subsection;
gchar *action_namespace = NULL;
g_menu_model_get_item_attribute (model, position + n_items,
G_MENU_ATTRIBUTE_ACTION_NAMESPACE, "s", &action_namespace);
if (section->action_namespace)
{
gchar *namespace;
namespace = g_strjoin (".", section->action_namespace, action_namespace, NULL);
subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, namespace);
g_free (namespace);
}
else
subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, section->action_namespace);
*change_point = g_slist_prepend (*change_point, subsection);
g_free (action_namespace);
g_object_unref (submenu);
}
else
{
(* tracker->insert_func) (offset, model, position + n_items,
section->action_namespace, FALSE, tracker->user_data);
*change_point = g_slist_prepend (*change_point, NULL);
}
}
}
static void
gtk_menu_tracker_model_changed (GMenuModel *model,
gint position,
gint removed,
gint added,
gpointer user_data)
{
GtkMenuTracker *tracker = user_data;
GtkMenuTrackerSection *section;
GSList **change_point;
gint offset = 0;
gint i;
/* First find which section the changed model corresponds to, and the
* position of that section within the overall menu.
*/
section = gtk_menu_tracker_section_find_model (tracker->toplevel, model, &offset);
/* Next, seek through that section to the change point. This gives us
* the correct GSList** to make the change to and also finds the final
* offset at which we will make the changes (by measuring the number
* of items within each item of the section before the change point).
*/
change_point = &section->items;
for (i = 0; i < position; i++)
{
offset += gtk_menu_tracker_section_measure ((*change_point)->data);
change_point = &(*change_point)->next;
}
/* We remove items in order and add items in reverse order. This
* means that the offset used for all inserts and removes caused by a
* single change will be the same.
*
* This also has a performance advantage: GtkMenuShell stores the
* menu items in a linked list. In the case where we are creating a
* menu for the first time, adding the items in reverse order means
* that we only ever insert at index zero, prepending the list. This
* means that we can populate in O(n) time instead of O(n^2) that we
* would do by appending.
*/
gtk_menu_tracker_remove_items (tracker, change_point, offset, removed);
gtk_menu_tracker_add_items (tracker, section, change_point, offset, model, position, added);
/* The offsets for insertion/removal of separators will be all over
* the place, however...
*/
gtk_menu_tracker_section_sync_separators (tracker->toplevel, tracker, 0, FALSE, NULL, 0);
}
static void
gtk_menu_tracker_section_free (GtkMenuTrackerSection *section)
{
if (section == NULL)
return;
g_signal_handler_disconnect (section->model, section->handler);
g_slist_free_full (section->items, (GDestroyNotify) gtk_menu_tracker_section_free);
g_free (section->action_namespace);
g_object_unref (section->model);
g_slice_free (GtkMenuTrackerSection, section);
}
static GtkMenuTrackerSection *
gtk_menu_tracker_section_new (GtkMenuTracker *tracker,
GMenuModel *model,
gboolean with_separators,
gint offset,
const gchar *action_namespace)
{
GtkMenuTrackerSection *section;
section = g_slice_new0 (GtkMenuTrackerSection);
section->model = g_object_ref (model);
section->with_separators = with_separators;
section->action_namespace = g_strdup (action_namespace);
gtk_menu_tracker_add_items (tracker, section, &section->items, offset, model, 0, g_menu_model_get_n_items (model));
section->handler = g_signal_connect (model, "items-changed", G_CALLBACK (gtk_menu_tracker_model_changed), tracker);
return section;
}
/*< private >
* gtk_menu_tracker_new:
* @model: the model to flatten
* @with_separators: if the toplevel should have separators (ie: TRUE
* for menus, FALSE for menubars)
* @action_namespace: the passed-in action namespace
* @insert_func: insert callback
* @remove_func: remove callback
* @user_data user data for callbacks
*
* Creates a GtkMenuTracker for @model, holding a ref on @model for as
* long as the tracker is alive.
*
* This flattens out the model, merging sections and inserting
* separators where appropriate. It monitors for changes and performs
* updates on the fly. It also handles action_namespace for subsections
* (but you will need to handle it yourself for submenus).
*
* When the tracker is first created, @insert_func will be called many
* times to populate the menu with the initial contents of @model
* (unless it is empty), before gtk_menu_tracker_new() returns. For
* this reason, the menu that is using the tracker ought to be empty
* when it creates the tracker.
*
* Future changes to @model will result in more calls to @insert_func
* and @remove_func.
*
* The position argument to both functions is the linear 0-based
* position in the menu at which the item in question should be inserted
* or removed.
*
* For @insert_func, @model and @item_index are used to get the
* information about the menu item to insert. @action_namespace is the
* action namespace that actions referred to from that item should place
* themselves in. Note that if the item is a submenu and the
* "action-namespace" attribute is defined on the item, it will _not_ be
* applied to the @action_namespace argument as it is meant for the
* items inside of the submenu, not the submenu item itself.
*
* @is_separator is set to %TRUE in case the item being added is a
* separator. @model and @item_index will still be meaningfully set in
* this case -- to the section menu item corresponding to the separator.
* This is useful if the section specifies a label, for example. If
* there is an "action-namespace" attribute on this menu item then it
* should be ignored by the consumer because #GtkMenuTracker has already
* handled it.
*
* When using #GtkMenuTracker there is no need to hold onto @model or
* monitor it for changes. The model will be unreffed when
* gtk_menu_tracker_free() is called.
*/
GtkMenuTracker *
gtk_menu_tracker_new (GMenuModel *model,
gboolean with_separators,
const gchar *action_namespace,
GtkMenuTrackerInsertFunc insert_func,
GtkMenuTrackerRemoveFunc remove_func,
gpointer user_data)
{
GtkMenuTracker *tracker;
tracker = g_slice_new (GtkMenuTracker);
tracker->insert_func = insert_func;
tracker->remove_func = remove_func;
tracker->user_data = user_data;
tracker->toplevel = gtk_menu_tracker_section_new (tracker, model, with_separators, 0, action_namespace);
gtk_menu_tracker_section_sync_separators (tracker->toplevel, tracker, 0, FALSE, NULL, 0);
return tracker;
}
/*< private >
* gtk_menu_tracker_free:
* @tracker: a #GtkMenuTracker
*
* Frees the tracker, ...
*/
void
gtk_menu_tracker_free (GtkMenuTracker *tracker)
{
gtk_menu_tracker_section_free (tracker->toplevel);
g_slice_free (GtkMenuTracker, tracker);
}

View File

@ -1,51 +0,0 @@
/*
* Copyright © 2013 Canonical Limited
*
* 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 licence, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Ryan Lortie <desrt@desrt.ca>
*/
#ifndef __GTK_MENU_TRACKER_H__
#define __GTK_MENU_TRACKER_H__
#include <gio/gio.h>
typedef struct _GtkMenuTracker GtkMenuTracker;
typedef void (* GtkMenuTrackerInsertFunc) (gint position,
GMenuModel *model,
gint item_index,
const gchar *action_namespace,
gboolean is_separator,
gpointer user_data);
typedef void (* GtkMenuTrackerRemoveFunc) (gint position,
gpointer user_data);
G_GNUC_INTERNAL
GtkMenuTracker * gtk_menu_tracker_new (GMenuModel *model,
gboolean with_separators,
const gchar *action_namespace,
GtkMenuTrackerInsertFunc insert_func,
GtkMenuTrackerRemoveFunc remove_func,
gpointer user_data);
G_GNUC_INTERNAL
void gtk_menu_tracker_free (GtkMenuTracker *tracker);
#endif /* __GTK_MENU_TRACKER_H__ */

View File

@ -39,14 +39,10 @@ typedef struct {
/* Whether or not we need to resort the windows; this is done on demand */
gboolean window_sort_stale : 1;
/* DBus property notification subscription */
guint properties_changed_id : 1;
/* See GApplication documentation */
GDBusMenuModel *remote_menu;
GActionMuxer *muxer;
char *unique_bus_name;
GDBusConnection *session;
char * unique_bus_name;
} ShellAppRunningState;
/**
@ -558,7 +554,7 @@ shell_app_update_window_actions (ShellApp *app, MetaWindow *window)
actions = g_object_get_data (G_OBJECT (window), "actions");
if (actions == NULL)
{
actions = G_ACTION_GROUP (g_dbus_action_group_get (app->running_state->session,
actions = G_ACTION_GROUP (g_dbus_action_group_get (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
meta_window_get_gtk_unique_bus_name (window),
object_path));
g_object_set_data_full (G_OBJECT (window), "actions", actions, g_object_unref);
@ -962,84 +958,6 @@ shell_app_on_ws_switch (MetaScreen *screen,
g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0);
}
static void
application_properties_changed (GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
const gchar *interface_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
ShellApp *app = user_data;
GVariant *changed_properties;
GVariantIter iter;
gboolean busy = FALSE;
const gchar *key, *interface_name_for_signal;
GVariant *value;
g_variant_get (parameters,
"(&s@a{sv}as)",
&interface_name_for_signal,
&changed_properties,
NULL);
if (g_strcmp0 (interface_name_for_signal, "org.gtk.Application") != 0)
return;
g_variant_iter_init (&iter, changed_properties);
while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
{
if (g_strcmp0 (key, "Busy") != 0)
{
g_variant_unref (value);
continue;
}
busy = g_variant_get_boolean (value);
g_variant_unref (value);
break;
}
if (busy)
shell_app_state_transition (app, SHELL_APP_STATE_BUSY);
else
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
if (changed_properties != NULL)
g_variant_unref (changed_properties);
}
static void
shell_app_ensure_busy_watch (ShellApp *app)
{
ShellAppRunningState *running_state = app->running_state;
MetaWindow *window;
const gchar *object_path;
if (running_state->properties_changed_id != 0)
return;
if (running_state->unique_bus_name == NULL)
return;
window = g_slist_nth_data (running_state->windows, 0);
object_path = meta_window_get_gtk_application_object_path (window);
if (object_path == NULL)
return;
running_state->properties_changed_id =
g_dbus_connection_signal_subscribe (running_state->session,
running_state->unique_bus_name,
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
object_path,
"org.gtk.Application",
G_DBUS_SIGNAL_FLAGS_NONE,
application_properties_changed, app, NULL);
}
void
_shell_app_add_window (ShellApp *app,
MetaWindow *window)
@ -1058,7 +976,6 @@ _shell_app_add_window (ShellApp *app,
g_signal_connect (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app);
shell_app_update_app_menu (app, window);
shell_app_ensure_busy_watch (app);
if (app->state != SHELL_APP_STATE_STARTING)
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
@ -1301,8 +1218,6 @@ create_running_state (ShellApp *app)
app->running_state->workspace_switch_id =
g_signal_connect (screen, "workspace-switched", G_CALLBACK(shell_app_on_ws_switch), app);
app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
g_assert (app->running_state->session != NULL);
app->running_state->muxer = g_action_muxer_new ();
}
@ -1329,6 +1244,7 @@ shell_app_update_app_menu (ShellApp *app,
{
const gchar *application_object_path;
const gchar *app_menu_object_path;
GDBusConnection *session;
GDBusActionGroup *actions;
application_object_path = meta_window_get_gtk_application_object_path (window);
@ -1337,13 +1253,16 @@ shell_app_update_app_menu (ShellApp *app,
if (application_object_path == NULL || app_menu_object_path == NULL || unique_bus_name == NULL)
return;
session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
g_assert (session != NULL);
g_clear_pointer (&app->running_state->unique_bus_name, g_free);
app->running_state->unique_bus_name = g_strdup (unique_bus_name);
g_clear_object (&app->running_state->remote_menu);
app->running_state->remote_menu = g_dbus_menu_model_get (app->running_state->session, unique_bus_name, app_menu_object_path);
actions = g_dbus_action_group_get (app->running_state->session, unique_bus_name, application_object_path);
app->running_state->remote_menu = g_dbus_menu_model_get (session, unique_bus_name, app_menu_object_path);
actions = g_dbus_action_group_get (session, unique_bus_name, application_object_path);
g_action_muxer_insert (app->running_state->muxer, "app", G_ACTION_GROUP (actions));
g_object_unref (actions);
g_object_unref (session);
}
}
@ -1361,12 +1280,8 @@ unref_running_state (ShellAppRunningState *state)
screen = shell_global_get_screen (shell_global_get ());
g_signal_handler_disconnect (screen, state->workspace_switch_id);
if (state->properties_changed_id != 0)
g_dbus_connection_signal_unsubscribe (state->session, state->properties_changed_id);
g_clear_object (&state->remote_menu);
g_clear_object (&state->muxer);
g_clear_object (&state->session);
g_clear_pointer (&state->unique_bus_name, g_free);
g_clear_pointer (&state->remote_menu, g_free);

View File

@ -31,8 +31,7 @@ struct _ShellAppClass
typedef enum {
SHELL_APP_STATE_STOPPED,
SHELL_APP_STATE_STARTING,
SHELL_APP_STATE_RUNNING,
SHELL_APP_STATE_BUSY
SHELL_APP_STATE_RUNNING
} ShellAppState;
GType shell_app_get_type (void) G_GNUC_CONST;

View File

@ -15,8 +15,6 @@
* @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal
* dialog (e.g. authentification or session dialogs) is open
* @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass
* @SHELL_KEYBINDING_MODE_TOPBAR_POPUP: allow keybinding while a top bar menu
* is open
* @SHELL_KEYBINDING_MODE_ALL: always allow keybinding
*
* Controls in which GNOME Shell states a keybinding should be handled.
@ -31,7 +29,6 @@ typedef enum {
SHELL_KEYBINDING_MODE_MESSAGE_TRAY = 1 << 5,
SHELL_KEYBINDING_MODE_SYSTEM_MODAL = 1 << 6,
SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7,
SHELL_KEYBINDING_MODE_TOPBAR_POPUP = 1 << 8,
SHELL_KEYBINDING_MODE_ALL = ~0,
} ShellKeyBindingMode;

View File

@ -1,137 +0,0 @@
/*
* Copyright (C) 2013 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Written by:
* Jasper St. Pierre <jstpierre@mecheye.net>
*/
#include "config.h"
#include "shell-menu-tracker.h"
#include "gtkmenutracker.h"
struct _ShellMenuTracker
{
guint ref_count;
GtkMenuTracker *tracker;
ShellMenuTrackerInsertFunc insert_func;
gpointer insert_user_data;
GDestroyNotify insert_notify;
ShellMenuTrackerRemoveFunc remove_func;
gpointer remove_user_data;
GDestroyNotify remove_notify;
};
static void
shell_menu_tracker_insert_func (gint position,
GMenuModel *model,
gint item_index,
const gchar *action_namespace,
gboolean is_separator,
gpointer user_data)
{
ShellMenuTracker *tracker = (ShellMenuTracker *) user_data;
tracker->insert_func (position, model, item_index,
action_namespace, is_separator,
tracker->insert_user_data);
}
static void
shell_menu_tracker_remove_func (gint position,
gpointer user_data)
{
ShellMenuTracker *tracker = (ShellMenuTracker *) user_data;
tracker->remove_func (position, tracker->remove_user_data);
}
/**
* shell_menu_tracker_new:
* @model:
* @action_namespace: (allow-none):
* @insert_func:
* @insert_user_data:
* @insert_notify:
* @remove_func:
* @remove_user_data:
* @remove_notify:
*/
ShellMenuTracker *
shell_menu_tracker_new (GMenuModel *model,
const gchar *action_namespace,
ShellMenuTrackerInsertFunc insert_func,
gpointer insert_user_data,
GDestroyNotify insert_notify,
ShellMenuTrackerRemoveFunc remove_func,
gpointer remove_user_data,
GDestroyNotify remove_notify)
{
ShellMenuTracker *tracker = g_slice_new0 (ShellMenuTracker);
tracker->ref_count = 1;
tracker->insert_func = insert_func;
tracker->insert_user_data = insert_user_data;
tracker->insert_notify = insert_notify;
tracker->remove_func = remove_func;
tracker->remove_user_data = remove_user_data;
tracker->remove_notify = remove_notify;
tracker->tracker = gtk_menu_tracker_new (model,
TRUE, /* with separators */
action_namespace,
shell_menu_tracker_insert_func,
shell_menu_tracker_remove_func,
tracker);
return tracker;
}
ShellMenuTracker *
shell_menu_tracker_ref (ShellMenuTracker *tracker)
{
tracker->ref_count++;
return tracker;
}
void
shell_menu_tracker_unref (ShellMenuTracker *tracker)
{
if (tracker->ref_count-- <= 0)
{
shell_menu_tracker_destroy (tracker);
g_slice_free (ShellMenuTracker, tracker);
}
}
void
shell_menu_tracker_destroy (ShellMenuTracker *tracker)
{
if (tracker->tracker != NULL)
{
gtk_menu_tracker_free (tracker->tracker);
tracker->tracker = NULL;
tracker->insert_notify (tracker->insert_user_data);
tracker->remove_notify (tracker->remove_user_data);
}
}
G_DEFINE_BOXED_TYPE(ShellMenuTracker,
shell_menu_tracker,
shell_menu_tracker_ref,
shell_menu_tracker_unref)

View File

@ -1,54 +0,0 @@
/*
* Copyright (C) 2013 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Written by:
* Jasper St. Pierre <jstpierre@mecheye.net>
*/
#ifndef __SHELL_MENU_TRACKER_H__
#define __SHELL_MENU_TRACKER_H__
#include <gio/gio.h>
typedef struct _ShellMenuTracker ShellMenuTracker;
GType shell_menu_tracker_get_type (void) G_GNUC_CONST;
typedef void (* ShellMenuTrackerInsertFunc) (gint position,
GMenuModel *model,
gint item_index,
const gchar *action_namespace,
gboolean is_separator,
gpointer user_data);
typedef void (* ShellMenuTrackerRemoveFunc) (gint position,
gpointer user_data);
ShellMenuTracker * shell_menu_tracker_new (GMenuModel *model,
const gchar *action_namespace,
ShellMenuTrackerInsertFunc insert_func,
gpointer insert_user_data,
GDestroyNotify insert_notify,
ShellMenuTrackerRemoveFunc remove_func,
gpointer remove_user_data,
GDestroyNotify remove_notify);
ShellMenuTracker * shell_menu_tracker_ref (ShellMenuTracker *tracker);
void shell_menu_tracker_unref (ShellMenuTracker *tracker);
void shell_menu_tracker_destroy (ShellMenuTracker *tracker);
#endif /* __SHELL_MENU_TRACKER_H__ */

View File

@ -410,8 +410,8 @@ st_icon_finish_update (StIcon *icon)
st_icon_update_shadow_material (icon);
/* "pixbuf-change" is actually a misnomer for "texture-changed" */
g_signal_connect_object (priv->icon_texture, "pixbuf-change",
G_CALLBACK (on_pixbuf_changed), icon, 0);
g_signal_connect (priv->icon_texture, "pixbuf-change",
G_CALLBACK (on_pixbuf_changed), icon);
}
}
@ -469,7 +469,7 @@ st_icon_update (StIcon *icon)
else
{
/* Will be shown when fully loaded */
priv->opacity_handler_id = g_signal_connect_object (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon, 0);
priv->opacity_handler_id = g_signal_connect (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon);
}
}
else if (priv->icon_texture)

View File

@ -74,24 +74,27 @@ st_im_text_dispose (GObject *object)
}
static void
st_im_text_cursor_event (ClutterText *self,
const ClutterGeometry *geometry)
update_im_cursor_location (StIMText *self)
{
StIMTextPrivate *priv = ST_IM_TEXT (self)->priv;
StIMTextPrivate *priv = self->priv;
ClutterText *clutter_text = CLUTTER_TEXT (self);
gint position;
gfloat cursor_x, cursor_y, cursor_height;
gfloat actor_x, actor_y;
GdkRectangle area;
position = clutter_text_get_cursor_position (clutter_text);
clutter_text_position_to_coords (clutter_text, position,
&cursor_x, &cursor_y, &cursor_height);
clutter_actor_get_transformed_position (CLUTTER_ACTOR (self), &actor_x, &actor_y);
area.x = (int)(0.5 + geometry->x + actor_x);
area.y = (int)(0.5 + geometry->y + actor_y);
area.width = geometry->width;
area.height = geometry->height;
area.x = (int)(0.5 + cursor_x + actor_x);
area.y = (int)(0.5 + cursor_y + actor_y);
area.width = 0;
area.height = (int)(0.5 + cursor_height);
gtk_im_context_set_cursor_location (priv->im_context, &area);
if (CLUTTER_TEXT_CLASS (st_im_text_parent_class)->cursor_event)
CLUTTER_TEXT_CLASS (st_im_text_parent_class)->cursor_event (self, geometry);
}
static void
@ -187,6 +190,20 @@ reset_im_context (StIMText *self)
}
}
static void
st_im_text_paint (ClutterActor *actor)
{
StIMText *self = ST_IM_TEXT (actor);
ClutterText *clutter_text = CLUTTER_TEXT (actor);
/* This updates the cursor position as a side-effect */
if (CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint)
CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint (actor);
if (clutter_text_get_editable (clutter_text))
update_im_cursor_location (self);
}
static gboolean
st_im_text_get_paint_volume (ClutterActor *self,
ClutterPaintVolume *volume)
@ -409,12 +426,12 @@ st_im_text_class_init (StIMTextClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
ClutterTextClass *text_class = CLUTTER_TEXT_CLASS (klass);
g_type_class_add_private (klass, sizeof (StIMTextPrivate));
object_class->dispose = st_im_text_dispose;
actor_class->paint = st_im_text_paint;
actor_class->get_paint_volume = st_im_text_get_paint_volume;
actor_class->realize = st_im_text_realize;
actor_class->unrealize = st_im_text_unrealize;
@ -423,8 +440,6 @@ st_im_text_class_init (StIMTextClass *klass)
actor_class->captured_event = st_im_text_captured_event;
actor_class->key_focus_in = st_im_text_key_focus_in;
actor_class->key_focus_out = st_im_text_key_focus_out;
text_class->cursor_event = st_im_text_cursor_event;
}
static void

View File

@ -879,101 +879,6 @@ st_theme_node_get_double (StThemeNode *node,
}
}
/**
* st_theme_node_lookup_url:
* @node: a #StThemeNode
* @property_name: The name of the string property
* @inherit: if %TRUE, if a value is not found for the property on the
* node, then it will be looked up on the parent node, and then on the
* parent's parent, and so forth. Note that if the property has a
* value of 'inherit' it will be inherited even if %FALSE is passed
* in for @inherit; this only affects the default behavior for inheritance.
* @value: (out): location to store the newly allocated value that was
* determined. If the property is not found, the value in this location
* will not be changed.
*
* Looks up a property containing a single URL value.
*
* See also st_theme_node_get_url(), which provides a simpler API.
*
* Return value: %TRUE if the property was found in the properties for this
* theme node (or in the properties of parent nodes when inheriting.)
*/
gboolean
st_theme_node_lookup_url (StThemeNode *node,
const char *property_name,
gboolean inherit,
char **value)
{
gboolean result = FALSE;
int i;
ensure_properties (node);
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
CRTerm *term = decl->value;
CRStyleSheet *base_stylesheet;
GFile *file;
if (term->type != TERM_URI && term->type != TERM_STRING)
continue;
if (decl->parent_statement != NULL)
base_stylesheet = decl->parent_statement->parent_sheet;
else
base_stylesheet = NULL;
file = _st_theme_resolve_url (node->theme,
base_stylesheet,
decl->value->content.str->stryng->str);
*value = g_file_get_path (file);
g_object_unref (file);
result = TRUE;
break;
}
}
if (!result && inherit && node->parent_node)
result = st_theme_node_lookup_url (node->parent_node, property_name, inherit, value);
return result;
}
/*
* st_theme_node_get_url:
* @node: a #StThemeNode
* @property_name: The name of the string property
*
* Looks up a property containing a single URL value.
*
* See also st_theme_node_lookup_url(), which provides more options,
* and lets you handle the case where the theme does not specify the
* indicated value.
*
* Return value: the newly allocated value if found.
* If @property_name is not found, a warning will be logged and %NULL
* will be returned.
*/
char *
st_theme_node_get_url (StThemeNode *node,
const char *property_name)
{
char *value;
if (st_theme_node_lookup_url (node, property_name, FALSE, &value))
return value;
else
{
g_warning ("Did not find string property '%s'", property_name);
return NULL;
}
}
static const PangoFontDescription *
get_parent_font (StThemeNode *node)
{
@ -1649,7 +1554,6 @@ void
_st_theme_node_ensure_geometry (StThemeNode *node)
{
int i, j;
int width, height;
if (node->geometry_computed)
return;
@ -1667,8 +1571,6 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
node->outline_width = 0;
node->outline_color = TRANSPARENT_COLOR;
width = -1;
height = -1;
node->width = -1;
node->height = -1;
node->min_width = -1;
@ -1688,12 +1590,8 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
else if (g_str_has_prefix (property_name, "padding"))
do_padding_property (node, decl);
else if (strcmp (property_name, "width") == 0)
do_size_property (node, decl, &width);
else if (strcmp (property_name, "height") == 0)
do_size_property (node, decl, &height);
else if (strcmp (property_name, "-st-natural-width") == 0)
do_size_property (node, decl, &node->width);
else if (strcmp (property_name, "-st-natural-height") == 0)
else if (strcmp (property_name, "height") == 0)
do_size_property (node, decl, &node->height);
else if (strcmp (property_name, "min-width") == 0)
do_size_property (node, decl, &node->min_width);
@ -1705,43 +1603,29 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
do_size_property (node, decl, &node->max_height);
}
/*
* Setting width sets max-width, min-width and -st-natural-width,
* unless one of them is set individually.
* Setting min-width sets natural width too, so that the minimum
* width reported by get_preferred_width() is always not greater
* than the natural width.
* The natural width in node->width is actually a lower bound, the
* actor is allowed to request something greater than that, but
* not greater than max-width.
* We don't need to clamp node->width to be less than max_width,
* that's done by adjust_preferred_width.
*/
if (width != -1)
if (node->width != -1)
{
if (node->width == -1)
node->width = width;
if (node->min_width == -1)
node->min_width = width;
node->min_width = node->width;
else if (node->width < node->min_width)
node->width = node->min_width;
if (node->max_width == -1)
node->max_width = width;
node->max_width = node->width;
else if (node->width > node->max_width)
node->width = node->max_width;
}
if (node->width < node->min_width)
node->width = node->min_width;
if (height != -1)
if (node->height != -1)
{
if (node->height == -1)
node->height = height;
if (node->min_height == -1)
node->min_height = height;
node->min_height = node->height;
else if (node->height < node->min_height)
node->height = node->min_height;
if (node->max_height == -1)
node->max_height = height;
node->max_height = node->height;
else if (node->height > node->max_height)
node->height = node->max_height;
}
if (node->height < node->min_height)
node->height = node->min_height;
}
int
@ -3541,7 +3425,7 @@ st_theme_node_adjust_preferred_width (StThemeNode *node,
if (natural_width_p)
{
if (node->width != -1)
*natural_width_p = MAX (*natural_width_p, node->width);
*natural_width_p = node->width;
if (node->max_width != -1)
*natural_width_p = MIN (*natural_width_p, node->max_width);
*natural_width_p += width_inc;
@ -3607,7 +3491,7 @@ st_theme_node_adjust_preferred_height (StThemeNode *node,
if (natural_height_p)
{
if (node->height != -1)
*natural_height_p = MAX (*natural_height_p, node->height);
*natural_height_p = node->height;
if (node->max_height != -1)
*natural_height_p = MIN (*natural_height_p, node->max_height);
*natural_height_p += height_inc;

View File

@ -142,10 +142,6 @@ gboolean st_theme_node_lookup_shadow (StThemeNode *node,
const char *property_name,
gboolean inherit,
StShadow **shadow);
gboolean st_theme_node_lookup_url (StThemeNode *node,
const char *property_name,
gboolean inherit,
char **value);
/* Easier-to-use variants of the above, for application-level use */
void st_theme_node_get_color (StThemeNode *node,
@ -157,8 +153,6 @@ gdouble st_theme_node_get_length (StThemeNode *node,
const char *property_name);
StShadow *st_theme_node_get_shadow (StThemeNode *node,
const char *property_name);
char *st_theme_node_get_url (StThemeNode *node,
const char *property_name);
/* Specific getters for particular properties: cached
*/

View File

@ -1533,7 +1533,6 @@ st_widget_recompute_style (StWidget *widget,
StThemeNode *new_theme_node = st_widget_get_theme_node (widget);
int transition_duration;
gboolean paint_equal;
gboolean animations_enabled;
if (new_theme_node == old_theme_node)
{
@ -1552,11 +1551,7 @@ st_widget_recompute_style (StWidget *widget,
if (paint_equal)
st_theme_node_copy_cached_paint_state (new_theme_node, old_theme_node);
g_object_get (gtk_settings_get_default (),
"gtk-enable-animations", &animations_enabled,
NULL);
if (animations_enabled && transition_duration > 0)
if (transition_duration > 0)
{
if (widget->priv->transition_animation != NULL)
{