Merge remote branch origin/master into zeitgeist

This commit is contained in:
Federico Mena Quintero 2011-03-25 18:28:15 -04:00
commit e4e6b26e15
103 changed files with 23488 additions and 7254 deletions

3
.gitignore vendored
View File

@ -44,8 +44,9 @@ src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell
src/gnome-shell-calendar-server
src/gnome-shell-extension-tool
src/gnome-shell-real
src/gnome-shell-jhbuild
src/gnome-shell-perf-helper
src/gnome-shell-real
src/run-js-test
src/test-recorder
src/test-recorder.ogg

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[2.91.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[2.91.92],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -71,13 +71,14 @@ LIBEDATASERVER_MIN_VERSION=1.2.0
LIBEDATASERVERUI2_MIN_VERSION=1.2.0
LIBEDATASERVERUI3_MIN_VERSION=2.91.6
TELEPATHY_GLIB_MIN_VERSION=0.13.12
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
POLKIT_MIN_VERSION=0.100
# Collect more than 20 libraries for a prize!
PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
gio-unix-2.0 dbus-glib-1 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION
libmutter-wm >= $MUTTER_MIN_VERSION
libmutter >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu $recorder_modules gconf-2.0
gdk-x11-3.0
@ -87,6 +88,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -96,6 +98,14 @@ AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're li
AC_SUBST([GJS_VERSION], ["$GJS_VERSION"])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
JHBUILD_TYPELIBDIR="$INTROSPECTION_TYPELIBDIR"
# NM is the only typelib we use that we don't jhbuild
PKG_CHECK_EXISTS([libnm-glib >= 0.8.995],
[NM_TYPELIBDIR=`$PKG_CONFIG --variable=libdir libnm-glib`/girepository-1.0
if test "$INTROSPECTION_TYPELIBDIR" != "$NM_TYPELIBDIR"; then
JHBUILD_TYPELIBDIR="$JHBUILD_TYPELIBDIR:$NM_TYPELIBDIR"
fi])
AC_SUBST(JHBUILD_TYPELIBDIR)
saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS
@ -136,8 +146,8 @@ PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedatas
AC_SUBST(CALENDAR_SERVER_CFLAGS)
AC_SUBST(CALENDAR_SERVER_LIBS)
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter-wm`
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter-wm`
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
AC_SUBST(MUTTER_GIR_DIR)
AC_SUBST(MUTTER_TYPELIB_DIR)

View File

@ -24,7 +24,8 @@ dist_theme_DATA = \
theme/calendar-today.svg \
theme/close-window.svg \
theme/close.svg \
theme/corner-ripple.png \
theme/corner-ripple-ltr.png \
theme/corner-ripple-rtl.png \
theme/dash-placeholder.svg \
theme/filter-selected-ltr.svg \
theme/filter-selected-rtl.svg \
@ -49,6 +50,7 @@ dist_theme_DATA = \
theme/separator-white.png \
theme/single-view-active.svg \
theme/single-view.svg \
theme/source-button-border.svg \
theme/toggle-off-us.svg \
theme/toggle-off-intl.svg \
theme/toggle-on-us.svg \

View File

@ -13,3 +13,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=WindowManager
X-GNOME-Provides=panel;windowmanager;
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true

View File

@ -81,5 +81,20 @@
</locale>
</schema>
<schema>
<key>/schemas/desktop/gnome/shell/windows/workspaces_only_on_primary</key>
<applyto>/desktop/gnome/shell/windows/workspaces_only_on_primary</applyto>
<owner>gnome-shell</owner>
<type>bool</type>
<default>true</default>
<locale name="C">
<short>Workspaces only on primary monitor</short>
<long>
This key overrides /apps/mutter/general/workspaces_only_on_primary when
running GNOME Shell.
</long>
</locale>
</schema>
</schemalist>
</gconfschemafile>

View File

@ -1,5 +1,5 @@
<schemalist>
<schema id="org.gnome.shell" path="/apps/gnome-shell/"
<schema id="org.gnome.shell" path="/org/gnome/shell/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="development-tools" type="b">
<default>true</default>
@ -54,7 +54,7 @@
<child name="recorder" schema="org.gnome.shell.recorder"/>
</schema>
<schema id="org.gnome.shell.calendar" path="/apps/gnome-shell/calendar/"
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="show-weekdate" type="b">
<default>false</default>
@ -65,7 +65,7 @@
</key>
</schema>
<schema id="org.gnome.shell.clock" path="/apps/gnome-shell/clock/"
<schema id="org.gnome.shell.clock" path="/org/gnome/shell/clock/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="show-seconds" type="b">
<default>false</default>
@ -83,7 +83,7 @@
</key>
</schema>
<schema id="org.gnome.shell.recorder" path="/apps/gnome-shell/recorder/"
<schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="framerate" type="i">
<default>15</default>

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -34,13 +34,6 @@ stage {
color: rgba(0,0,0,0.5);
}
.label-real-shadow {
background-gradient-direction: horizontal;
background-gradient-start: rgba(0, 0, 0, 0);
background-gradient-end: rgba(0, 0, 0, 255);
width: 10px;
}
StScrollBar
{
padding: 0px;
@ -82,10 +75,10 @@ StScrollBar StButton#vhandle:hover
}
StTooltip StLabel {
border: 1px solid rgba(79,111,173,1);
border: 1px solid rgba(255,255,255,0.6);
border-radius: 5px;
padding: 4px;
background-color: rgba(79,111,173,0.9);
padding: 2px 12px;
background-color: rgba(0,0,0,0.9);
color: #ffffff;
font-size: 0.8em;
font-weight: normal;
@ -105,7 +98,7 @@ StTooltip StLabel {
.popup-menu {
color: #ffffff;
font-size: 14px;
font-size: 10.5pt;
min-width: 200px;
}
@ -160,6 +153,14 @@ StTooltip StLabel {
spacing: .5em;
}
.popup-inactive-menu-item {
color: #999;
}
.popup-subtitle-menu-item {
font-weight: bold;
}
.popup-menu-icon {
icon-size: 1.14em;
}
@ -190,6 +191,8 @@ StTooltip StLabel {
color: #ffffff;
background-color: black;
border-image: url("panel-border.svg") 1;
font-size: 10.5pt;
height: 1.86em;
}
#panelLeft, #panelCenter, #panelRight {
@ -249,12 +252,16 @@ StTooltip StLabel {
.panel-button {
padding: 0px 12px;
font-size: 14px;
font-weight: bold;
color: #ccc;
transition-duration: 100;
}
.panel-button:hover {
color: white;
text-shadow: black 0px 2px 2px;
}
.panel-button:active,
.panel-button:checked,
.panel-button:focus {
@ -317,7 +324,7 @@ StTooltip StLabel {
background-color: rgba(0,0,0,0.6);
}
.workspaces-view {
.window-caption {
color: white;
spacing: 25px;
}
@ -346,13 +353,14 @@ StTooltip StLabel {
.workspace-thumbnail-indicator {
outline: 2px solid white;
border: 1px solid #888;
}
.window-caption {
background: rgba(0,0,0,0.8);
border: 1px solid rgba(128,128,128,0.40);
border-radius: 10px;
font-size: 12px;
font-size: 9pt;
padding: 2px 8px;
-shell-caption-spacing: 4px;
}
@ -372,7 +380,7 @@ StTooltip StLabel {
#dash {
color: #5f5f5f;
font-size: 12px;
font-size: 9pt;
padding: 4px 0px;
background-color: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(128, 128, 128, 0.4);
@ -398,12 +406,12 @@ StTooltip StLabel {
}
#viewSelector {
spacing: 16px;
font-size: 16px;
spacing: 1em;
font-size: 12pt;
}
#viewSelectorTabBar {
padding: 16px;
padding: 1em;
}
#searchArea {
@ -451,8 +459,8 @@ StTooltip StLabel {
.view-tab-title {
color: #888a85;
font-weight: bold;
padding: 0px 12px;
height: 24px;
padding: 0px 0.75em;
height: 1.5em;
}
.view-tab-title:hover {
@ -462,8 +470,7 @@ StTooltip StLabel {
.view-tab-title:selected {
color: #000000;
background-color: #c2c7cd;
border-radius: 4px;
height: 24px;
border-radius: 0.25em;
}
#searchResults {
@ -526,7 +533,7 @@ StTooltip StLabel {
.dash-search-button-label {
color: #cccccc;
font-size: 16px;
font-size: 12pt;
}
/* Apps */
@ -551,9 +558,9 @@ StTooltip StLabel {
}
.app-filter {
font-size: 14px;
font-size: 10.5pt;
font-weight: bold;
height: 40px;
height: 2.85em;
color: #aaa;
width: 200px;
}
@ -596,7 +603,7 @@ StTooltip StLabel {
border-radius: 4px;
padding: 3px;
border: 1px rgba(0,0,0,0);
font-size: 10px;
font-size: 7.5pt;
color: white;
transition-duration: 100;
text-align: center;
@ -626,7 +633,7 @@ StTooltip StLabel {
}
.app-well-menu {
font-size: 12px
font-size: 9pt;
}
/* LookingGlass */
@ -782,7 +789,7 @@ StTooltip StLabel {
.calendar-month-label {
color: #666666;
font-size: 10px;
font-size: 7.5pt;
padding: 2px;
font-weight: bold;
}
@ -825,16 +832,16 @@ StTooltip StLabel {
.datemenu-date-label {
padding: .4em 1.75em;
font-size: 14px;
font-size: 10.5pt;
color: #cccccc;
font-weight: bold;
}
.calendar-day-base {
font-size: 10px;
font-size: 7.5pt;
text-align: center;
width: 24px;
height: 24px;
width: 2.4em;
height: 2.4em;
}
.calendar-day-base:hover {
@ -904,7 +911,7 @@ StTooltip StLabel {
}
.events-day-header {
font-size: 12px;
font-size: 9pt;
font-weight: bold;
color: rgba(153, 153, 153, 1.0);
padding-left: 0.3em;
@ -916,7 +923,7 @@ StTooltip StLabel {
}
.events-day-dayname {
font-size: 12px;
font-size: 9pt;
color: rgba(153, 153, 153, 1.0);
text-align: left;
}
@ -926,7 +933,7 @@ StTooltip StLabel {
}
.events-day-time {
font-size: 12px;
font-size: 9pt;
color: #fff;
text-align: right;
}
@ -936,7 +943,7 @@ StTooltip StLabel {
}
.events-day-task {
font-size: 12px;
font-size: 9pt;
color: rgba(153, 153, 153, 1.0);
}
@ -965,13 +972,13 @@ StTooltip StLabel {
#message-tray {
background-gradient-direction: vertical;
background-gradient-start: rgba(0,0,0,0.01);
background-gradient-end: rgba(0,0,0,0.95);
background-gradient-end: rgba(0,0,0,0.82);
height: 36px;
color: white;
}
#notification {
font-size: 16px;
font-size: 12pt;
border-radius: 5px 5px 0px 0px;
background: rgba(0,0,0,0.9);
padding: 8px 8px 4px 8px;
@ -1000,11 +1007,29 @@ StTooltip StLabel {
}
.summary-boxpointer #summary-right-click-menu {
font-size: 14px;
font-size: 10.5pt;
padding-top: 12px;
padding-bottom: 12px;
}
#summary-notification-stack-scrollview {
max-height: 18em;
padding-top: 6px;
padding-bottom: 6px;
}
#summary-notification-stack-scrollview > .top-shadow, #summary-notification-stack-scrollview > .bottom-shadow {
height: 1em;
}
#summary-notification-stack-scrollview:ltr {
padding-right: 8px;
}
#summary-notification-stack-scrollview:rtl {
padding-left: 8px;
}
#notification-scrollview {
max-height: 10em;
}
@ -1102,7 +1127,7 @@ StTooltip StLabel {
.chat-meta-message {
padding-left: 4px;
border-radius: 4px;
font-size: 14px;
font-size: 10.5pt;
color: #bbbbbb;
}
@ -1151,14 +1176,32 @@ StTooltip StLabel {
padding: 2px 4px 0px 0px;
}
.summary-source-button {
color: #fff;
text-shadow: black 0px 2px 2px;
}
.summary-source-button:ltr {
padding-left: 4px;
padding-right: 16px;
padding-right: 12px;
}
.summary-source-button:selected .summary-source {
background-image: url("panel-button-highlight-narrow.svg");
border-image: url("source-button-border.svg") 10 10 0 1;
}
.summary-source-button:expanded:selected .summary-source {
background-image: none;
border-image: none;
}
.summary-source-button:expanded:selected {
background-image: url("panel-button-highlight-wide.svg");
border-image: url("source-button-border.svg") 10 10 0 1;
}
.summary-source-button:rtl {
padding-right: 4px;
padding-left: 16px;
padding-left: 12px;
}
.summary-source-button:last-child:ltr {
@ -1169,8 +1212,13 @@ StTooltip StLabel {
padding-left: 12px;
}
.summary-source {
padding-right: 4px;
padding-left: 4px;
}
.source-title {
font-size: 12px;
font-size: 9pt;
font-weight: bold;
padding-left: 4px;
}
@ -1192,7 +1240,7 @@ StTooltip StLabel {
border-radius: 24px;
padding: 20px;
font-size: 12px;
font-size: 9pt;
color: white;
}
@ -1251,7 +1299,11 @@ StTooltip StLabel {
.ripple-box {
width: 52px;
height: 52px;
background-image: url("corner-ripple.png");
background-image: url("corner-ripple-ltr.png");
}
.ripple-box:rtl {
background-image: url("corner-ripple-rtl.png");
}
.switcher-arrow {
@ -1321,10 +1373,14 @@ StTooltip StLabel {
padding-top: 30px;
}
.modal-dialog-button-box {
spacing: 21px;
}
.modal-dialog-button {
border: 1px solid #8b8b8b;
border-radius: 18px;
font-size: 14px;
font-size: 10.5pt;
margin-left: 10px;
margin-right: 10px;
@ -1357,12 +1413,12 @@ StTooltip StLabel {
/* Run Dialog */
.run-dialog-label {
font-size: 12px;
font-size: 9pt;
color: white;
}
.run-dialog-error-label {
font-size: 12px;
font-size: 9pt;
color: white;
}
@ -1372,9 +1428,9 @@ StTooltip StLabel {
}
.run-dialog-entry {
font-size: 14px;
font-size: 10.5pt;
font-weight: bold;
width: 320px;
width: 23em;
color: white;
}
@ -1392,6 +1448,10 @@ StTooltip StLabel {
}
/* End Session Dialog */
.end-session-dialog {
spacing: 42px;
}
.end-session-dialog-subject {
font-size: 12pt;
font-weight: bold;
@ -1410,13 +1470,11 @@ StTooltip StLabel {
font-size: 10pt;
color: white;
padding-left: 17px;
padding-right: 40px;
width: 16em;
width: 28em;
}
.end-session-dialog-description:rtl {
padding-right: 17px;
padding-left: 40px;
}
.end-session-dialog-logout-icon {
@ -1435,16 +1493,23 @@ StTooltip StLabel {
font-size: 10pt;
max-height: 200px;
padding-top: 42px;
padding-bottom: 42px;
padding-left: 17px;
padding-left: 49px;
padding-right: 32px;
}
.end-session-dialog-app-list:rtl {
padding-right: 17px;
padding-right: 49px;
padding-left: 32px;
}
.end-session-dialog-app-list-item {
color: #ccc;
}
.end-session-dialog-app-list-item:hover {
color: white;
}
.end-session-dialog-app-list-item:ltr {
padding-right: 1em;
}

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="21"
height="10"
id="svg2"
version="1.1"
inkscape:version="0.48.0 r9654"
sodipodi:docname="source-button-border.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="44.8"
inkscape:cx="8.704132"
inkscape:cy="5.7029946"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1600"
inkscape:window-height="1145"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
guidetolerance="10000"
objecttolerance="10000">
<inkscape:grid
type="xygrid"
id="grid3792"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3796"
width="19"
height="2"
x="1"
y="8" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -8,6 +8,7 @@ nobase_dist_js_DATA = \
misc/format.js \
misc/gnomeSession.js \
misc/history.js \
misc/modemManager.js \
misc/params.js \
misc/semantic.js \
misc/util.js \
@ -51,6 +52,7 @@ nobase_dist_js_DATA = \
ui/statusMenu.js \
ui/status/accessibility.js \
ui/status/keyboard.js \
ui/status/network.js \
ui/status/power.js \
ui/status/volume.js \
ui/status/bluetooth.js \

225
js/misc/modemManager.js Normal file
View File

@ -0,0 +1,225 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const DBus = imports.dbus;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
// The following are not the complete interfaces, just the methods we need
// (or may need in the future)
const ModemGsmNetworkInterface = {
name: 'org.freedesktop.ModemManager.Modem.Gsm.Network',
methods: [
{ name: 'GetRegistrationInfo', inSignature: '', outSignature: 'uss' },
{ name: 'GetSignalQuality', inSignature: '', outSignature: 'u' }
],
properties: [
{ name: 'AccessTechnology', signature: 'u', access: 'read' }
],
signals: [
{ name: 'SignalQuality', inSignature: 'u' },
{ name: 'RegistrationInfo', inSignature: 'uss' }
]
};
const ModemGsmNetworkProxy = DBus.makeProxyClass(ModemGsmNetworkInterface);
const ModemCdmaInterface = {
name: 'org.freedesktop.ModemManager.Modem.Cdma',
methods: [
{ name: 'GetSignalQuality', inSignature: '', outSignature: 'u' },
{ name: 'GetServingSystem', inSignature: '', outSignature: 'usu' }
],
signals: [
{ name: 'SignalQuality', inSignature: 'u' }
]
};
const ModemCdmaProxy = DBus.makeProxyClass(ModemCdmaInterface);
let _providersTable;
function _getProvidersTable() {
if (_providersTable)
return _providersTable;
let [providers, countryCodes] = Shell.mobile_providers_parse();
return _providersTable = providers;
}
function ModemGsm() {
this._init.apply(this, arguments);
}
ModemGsm.prototype = {
_init: function(path) {
this._proxy = new ModemGsmNetworkProxy(DBus.system, 'org.freedesktop.ModemManager', path);
this.signal_quality = 0;
this.operator_name = null;
// Code is duplicated because the function have different signatures
this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, quality) {
this.signal_quality = quality;
this.emit('notify::signal-quality');
}));
this._proxy.connect('RegistrationInfo', Lang.bind(this, function(proxy, status, code, name) {
this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name');
}));
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function(result, err) {
if (err) {
log(err);
return;
}
let [status, code, name] = result;
this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name');
}));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
if (err) {
// it will return an error if the device is not connected
this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
}
this.emit('notify::signal-quality');
}));
},
_findOperatorName: function(name, opCode) {
if (name.length != 0 && (name.length > 6 || name.length < 5)) {
// this looks like a valid name, i.e. not an MCCMNC (that some
// devices return when not yet connected
return name;
}
if (isNaN(parseInt(name))) {
// name is definitely not a MCCMNC, so it may be a name
// after all; return that
return name;
}
let needle;
if (name.length == 0 && opCode)
needle = opCode;
else if (name.length == 6 || name.length == 5)
needle = name;
else // nothing to search
return null;
return this._findProviderForMCCMNC(needle);
},
_findProviderForMCCMNC: function(needle) {
let table = _getProvidersTable();
let needlemcc = needle.substring(0, 3);
let needlemnc = needle.substring(3, needle.length);
let name2, name3;
for (let iter in table) {
let providers = table[iter];
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
// Search through MCC/MNC list
let list = provider.get_gsm_mcc_mnc();
for (let j = 0; j < list.length; j++) {
let mccmnc = list[j];
// Match both 2-digit and 3-digit MNC; prefer a
// 3-digit match if found, otherwise a 2-digit one.
if (mccmnc.mcc != needlemcc)
continue; // MCC was wrong
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
name3 = provider.name;
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
name2 = provider.name;
if (name2 && name3)
break;
}
}
}
return name3 || name2 || null;
}
}
Signals.addSignalMethods(ModemGsm.prototype);
function ModemCdma() {
this._init.apply(this, arguments);
}
ModemCdma.prototype = {
_init: function(path) {
this._proxy = new ModemCdmaProxy(DBus.system, 'org.freedesktop.ModemManager', path);
this.signal_quality = 0;
this.operator_name = null;
this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, quality) {
this.signal_quality = quality;
this.emit('notify::signal-quality');
// receiving this signal means the device got activated
// and we can finally call GetServingSystem
if (this.operator_name == null)
this._refreshServingSystem();
}));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
if (err) {
// it will return an error if the device is not connected
this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
}
this.emit('notify::signal-quality');
}));
},
_refreshServingSystem: function() {
this._proxy.GetServingSystemRemote(Lang.bind(this, function(result, err) {
if (err) {
// it will return an error if the device is not connected
this.operator_name = null;
} else {
let [bandClass, band, id] = result;
if (name.length > 0)
this.operator_name = this._findProviderForSid(id);
else
this.operator_name = null;
}
this.emit('notify::operator-name');
}));
},
_findProviderForSid: function(sid) {
if (sid == 0)
return null;
let table = _getProvidersTable();
// Search through each country
for (let iter in table) {
let providers = table[iter];
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let cdma_sid = provider.get_cdma_sid();
// Search through CDMA SID list
for (let j = 0; j < cdma_sid.length; j++) {
if (cdma_sid[j] == sid)
return provider.name;
}
}
}
return null;
}
};
Signals.addSignalMethods(ModemCdma.prototype);

View File

@ -6,7 +6,6 @@ const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
@ -56,20 +55,6 @@ function spawnCommandLine(command_line) {
}
}
// spawnDesktop:
// @id: a desktop file ID
//
// Spawns the desktop file identified by @id using startup notification,
// etc, handling any errors that occur when trying to find or start
// the program.
function spawnDesktop(id) {
try {
trySpawnDesktop(id);
} catch (err) {
_handleSpawnError(id, err);
}
}
// trySpawn:
// @argv: an argv array
//
@ -117,41 +102,9 @@ function trySpawnCommandLine(command_line) {
trySpawn(argv);
}
// trySpawnDesktop:
// @id: a desktop file ID
//
// Spawns the desktop file identified by @id using startup notification.
// On error, throws an exception.
function trySpawnDesktop(id) {
let app;
// shell_app_system_load_from_desktop_file() will end up returning
// a stupid error message if the desktop file doesn't exist, but
// that's the only case it returns an error for, so we just
// substitute our own error in instead
try {
app = Shell.AppSystem.get_default().load_from_desktop_file(id + '.desktop');
} catch (err) {
throw new Error(_("No such application"));
}
try {
app.launch();
} catch(err) {
// see trySpawn
err.message = err.message.replace(/.*\((.+)\)/, '$1');
throw err;
}
}
function _handleSpawnError(command, err) {
let title = _("Execution of '%s' failed:").format(command);
let source = new MessageTray.SystemNotificationSource();
Main.messageTray.add(source);
let notification = new MessageTray.Notification(source, title, err.message);
notification.setTransient(true);
source.notify(notification);
Main.notifyError(title, err.message);
}
// killall:
@ -178,3 +131,83 @@ function killall(processName) {
logError(e, 'Failed to kill ' + processName);
}
}
// This was ported from network-manager-applet
// Copyright 2007 - 2011 Red Hat, Inc.
// Author: Dan Williams <dcbw@redhat.com>
const _IGNORED_WORDS = [
'Semiconductor',
'Components',
'Corporation',
'Communications',
'Company',
'Corp.',
'Corp',
'Co.',
'Inc.',
'Inc',
'Incorporated',
'Ltd.',
'Limited.',
'Intel?',
'chipset',
'adapter',
'[hex]',
'NDIS',
'Module'
];
const _IGNORED_PHRASES = [
'Multiprotocol MAC/baseband processor',
'Wireless LAN Controller',
'Wireless LAN Adapter',
'Wireless Adapter',
'Network Connection',
'Wireless Cardbus Adapter',
'Wireless CardBus Adapter',
'54 Mbps Wireless PC Card',
'Wireless PC Card',
'Wireless PC',
'PC Card with XJACK(r) Antenna',
'Wireless cardbus',
'Wireless LAN PC Card',
'Technology Group Ltd.',
'Communication S.p.A.',
'Business Mobile Networks BV',
'Mobile Broadband Minicard Composite Device',
'Mobile Communications AB',
'(PC-Suite Mode)'
];
function fixupPCIDescription(desc) {
desc.replace(/[_,]/, ' ');
/* Attempt to shorten ID by ignoring certain phrases */
for (let i = 0; i < _IGNORED_PHRASES.length; i++) {
let item = _IGNORED_PHRASES[i];
let pos = desc.indexOf(item);
if (pos != -1) {
let before = desc.substring(0, pos);
let after = desc.substring(pos + item.length, desc.length);
desc = before + after;
}
}
/* Attmept to shorten ID by ignoring certain individual words */
let words = desc.split(' ');
let out = [ ];
for (let i = 0; i < words; i++) {
let item = words[i];
// skip empty items (that come out from consecutive spaces)
if (item.length == 0)
continue;
if (_IGNORED_WORDS.indexOf(item) == -1) {
out.push(item);
}
}
return out.join(' ');
}

View File

@ -376,7 +376,15 @@ AltTabPopup.prototype = {
this.destroy();
},
_popModal: function() {
if (this._haveModal) {
Main.popModal(this.actor);
this._haveModal = false;
}
},
destroy : function() {
this._popModal();
if (this.actor.visible) {
Tweener.addTween(this.actor,
{ opacity: 0,
@ -392,8 +400,7 @@ AltTabPopup.prototype = {
},
_onDestroy : function() {
if (this._haveModal)
Main.popModal(this.actor);
this._popModal();
if (this._thumbnails)
this._destroyThumbnails();

View File

@ -86,10 +86,14 @@ AlphabeticalView.prototype = {
if (vfade)
offset = vfade.fade_offset;
if (icon.y < value + offset)
value = Math.max(0, icon.y - offset);
else if (icon.y + icon.height > value + pageSize - offset)
value = Math.min(upper, icon.y + icon.height + offset - pageSize);
// If this gets called as part of a right-click, the actor
// will be needs_allocation, and so "icon.y" would return 0
let box = icon.get_allocation_box();
if (box.y1 < value + offset)
value = Math.max(0, box.y1 - offset);
else if (box.y2 > value + pageSize - offset)
value = Math.min(upper, box.y2 + offset - pageSize);
else
return;
@ -412,6 +416,10 @@ AppWellIcon.prototype = {
this._removeMenuTimeout();
Main.overview.beginItemDrag(this);
}));
this._draggable.connect('drag-cancelled', Lang.bind(this,
function () {
Main.overview.cancelledItemDrag(this);
}));
this._draggable.connect('drag-end', Lang.bind(this,
function () {
Main.overview.endItemDrag(this);
@ -505,6 +513,8 @@ AppWellIcon.prototype = {
this._menuManager.addMenu(this._menu);
}
this.actor.set_hover(true);
this.actor.show_tooltip();
this._menu.popup();
return false;
@ -568,6 +578,9 @@ AppIconMenu.prototype = {
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, 0.5, side, 0);
// We want to keep the item hovered while the menu is up
this.blockSourceEvents = true;
this._source = source;
this.connect('activate', Lang.bind(this, this._onActivate));

View File

@ -36,8 +36,8 @@ Chrome.prototype = {
this._trackedActors = [];
global.gdk_screen.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
global.screen.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
global.screen.connect('restacked',
Lang.bind(this, this._windowsRestacked));
@ -335,6 +335,11 @@ Chrome.prototype = {
this._updateVisibility();
this._queueUpdateRegions();
}
// Figure out where the pointer is in case we lost track of
// it during a grab. (In particular, if a trayicon popup menu
// is dismissed, see if we need to close the message tray.)
global.sync_pointer();
},
_updateRegions: function() {

View File

@ -281,6 +281,7 @@ CtrlAltTabPopup.prototype = {
},
_onDestroy : function() {
this._popModal();
if (this._keyPressEventId)
this.actor.disconnect(this._keyPressEventId);
if (this._keyReleaseEventId)

View File

@ -283,20 +283,37 @@ Dash.prototype = {
Lang.bind(this, this._onDragBegin));
Main.overview.connect('item-drag-end',
Lang.bind(this, this._onDragEnd));
Main.overview.connect('item-drag-cancelled',
Lang.bind(this, this._onDragCancelled));
Main.overview.connect('window-drag-begin',
Lang.bind(this, this._onDragBegin));
Main.overview.connect('window-drag-cancelled',
Lang.bind(this, this._onDragCancelled));
Main.overview.connect('window-drag-end',
Lang.bind(this, this._onDragEnd));
},
_onDragBegin: function() {
this._dragCancelled = false;
this._dragMonitor = {
dragMotion: Lang.bind(this, this._onDragMotion)
};
DND.addDragMonitor(this._dragMonitor);
},
_onDragCancelled: function() {
this._dragCancelled = true;
this._endDrag();
},
_onDragEnd: function() {
if (this._dragCancelled)
return;
this._endDrag();
},
_endDrag: function() {
this._clearDragPlaceholder();
if (this._favRemoveTarget) {
this._favRemoveTarget.actor.hide();
@ -372,6 +389,8 @@ Dash.prototype = {
Lang.bind(this, function() {
display.actor.opacity = 255;
}));
display.actor.set_tooltip_text(app.get_name());
let item = new DashItemContainer();
item.setChild(display.actor);

View File

@ -200,13 +200,13 @@ DateMenuButton.prototype = {
_onPreferencesActivate: function() {
this.menu.close();
Util.spawnDesktop('gnome-datetime-panel');
let app = Shell.AppSystem.get_default().get_app('gnome-datetime-panel.desktop');
app.activate(-1);
},
_onOpenCalendarActivate: function() {
this.menu.close();
// TODO: pass '-c calendar' (to force the calendar at startup)
// TODO: pass the selected day
Util.spawnDesktop('evolution');
},
Util.spawn(['evolution', '-c', 'calendar']);
}
};

View File

@ -507,6 +507,9 @@ _Draggable.prototype = {
if (!this._buttonDown)
this._dragComplete();
this.emit('drag-end', eventTime, false);
if (!this._dragOrigParent)
this._dragActor.destroy();
return;
}

View File

@ -66,16 +66,20 @@ const logoutDialogContent = {
uninhibitedDescriptionWithUser: _("%s will be logged out automatically in %d seconds."),
uninhibitedDescription: _("You will be logged out automatically in %d seconds."),
endDescription: _("Logging out of the system."),
confirmButtonText: _("Log Out"),
confirmButtons: [{ signal: 'ConfirmedLogout',
label: _("Log Out") }],
iconStyleClass: 'end-session-dialog-logout-icon'
};
const shutdownDialogContent = {
subject: _("Shut Down"),
inhibitedDescription: _("Click Shut Down to quit these applications and shut down the system."),
uninhibitedDescription: _("The system will shut down automatically in %d seconds."),
endDescription: _("Shutting down the system."),
confirmButtonText: _("Shut Down"),
subject: _("Power Off"),
inhibitedDescription: _("Click Power Off to quit these applications and power off the system."),
uninhibitedDescription: _("The system will power off automatically in %d seconds."),
endDescription: _("Powering off the system."),
confirmButtons: [{ signal: 'ConfirmedReboot',
label: _("Restart") },
{ signal: 'ConfirmedShutdown',
label: _("Power Off") }],
iconName: 'system-shutdown',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
@ -85,7 +89,8 @@ const restartDialogContent = {
inhibitedDescription: _("Click Restart to quit these applications and restart the system."),
uninhibitedDescription: _("The system will restart automatically in %d seconds."),
endDescription: _("Restarting the system."),
confirmButtonText: _("Restart"),
confirmButtons: [{ signal: 'ConfirmedReboot',
label: _("Restart") }],
iconName: 'system-shutdown',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
@ -233,7 +238,7 @@ EndSessionDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init: function() {
ModalDialog.ModalDialog.prototype._init.call(this);
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'end-session-dialog' });
this._user = Gdm.UserManager.ref_default().get_user(GLib.get_user_name());
@ -288,12 +293,26 @@ EndSessionDialog.prototype = {
this.contentLayout.add(scrollView,
{ x_fill: true,
y_fill: true });
scrollView.hide();
this._applicationList = new St.BoxLayout({ vertical: true });
scrollView.add_actor(this._applicationList,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
this._applicationList.connect('actor-added',
Lang.bind(this, function() {
if (this._applicationList.get_children().length == 1)
scrollView.show();
}));
this._applicationList.connect('actor-removed',
Lang.bind(this, function() {
if (this._applicationList.get_children().length == 0)
scrollView.hide();
}));
},
_onDestroy: function() {
@ -392,18 +411,27 @@ EndSessionDialog.prototype = {
return;
let dialogContent = DialogContent[this._type];
let confirmButtonText = _("Confirm");
let buttons = [{ action: Lang.bind(this, this.cancel),
label: _("Cancel"),
key: Clutter.Escape }];
if (dialogContent.confirmButtonText)
confirmButtonText = dialogContent.confirmButtonText;
for (let i = 0; i < dialogContent.confirmButtons.length; i++) {
let signal = dialogContent.confirmButtons[i].signal;
let label = dialogContent.confirmButtons[i].label;
buttons.push({ action: Lang.bind(this, function() {
this._confirm(signal);
}),
label: label });
}
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape
},
{ label: confirmButtonText,
action: Lang.bind(this, this._confirm)
}]);
this.setButtons(buttons);
},
close: function() {
ModalDialog.ModalDialog.prototype.close.call(this);
DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
'org.gnome.SessionManager.EndSessionDialog',
'Closed', '', []);
},
cancel: function() {
@ -414,12 +442,12 @@ EndSessionDialog.prototype = {
this.close(global.get_current_time());
},
_confirm: function() {
_confirm: function(signal) {
this._fadeOutDialog();
this._stopTimer();
DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
'org.gnome.SessionManager.EndSessionDialog',
'Confirmed', '', []);
signal, '', []);
},
_onOpened: function() {
@ -434,7 +462,11 @@ EndSessionDialog.prototype = {
time: this._secondsLeft,
transition: 'linear',
onUpdate: Lang.bind(this, this._updateContent),
onComplete: Lang.bind(this, this._confirm),
onComplete: Lang.bind(this, function() {
let dialogContent = DialogContent[this._type];
let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1];
this._confirm(button.signal);
}),
});
},

View File

@ -281,8 +281,11 @@ IconGrid.prototype = {
}
},
childrenInRow: function(rowWidth) {
return this._computeLayout(rowWidth)[0];
},
_computeLayout: function (forWidth) {
let children = this._grid.get_children();
let nColumns = 0;
let usedWidth = 0;
while ((this._colLimit == null || nColumns < this._colLimit) &&

View File

@ -86,6 +86,9 @@ function start() {
global.logError = _logError;
global.log = _logDebug;
// Chain up async errors reported from C
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
Gio.DesktopAppInfo.set_desktop_env('GNOME');
shellDBusService = new ShellDBus.GnomeShell();
@ -133,6 +136,7 @@ function start() {
// Set up stage hierarchy to group all UI actors under one container.
uiGroup = new Clutter.Group();
St.set_ui_root(global.stage, uiGroup);
global.window_group.reparent(uiGroup);
global.overlay_group.reparent(uiGroup);
global.stage.add_actor(uiGroup);
@ -189,7 +193,7 @@ function start() {
// Attempt to become a PolicyKit authentication agent
PolkitAuthenticationAgent.init()
global.gdk_screen.connect('monitors-changed', _relayout);
global.screen.connect('monitors-changed', _relayout);
ExtensionSystem.init();
ExtensionSystem.loadExtensions();
@ -216,7 +220,11 @@ function start() {
}
global.screen.connect('notify::n-workspaces', _nWorkspacesChanged);
Mainloop.idle_add(_nWorkspacesChanged);
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);
global.screen.connect('window-left-monitor', _windowLeftMonitor);
_nWorkspacesChanged();
}
let _workspaces = [];
@ -303,6 +311,20 @@ function _windowRemoved(workspace, window) {
});
}
function _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
// If the window left the primary monitor, that
// might make that workspace empty
if (monitorIndex == global.get_primary_monitor_index())
_queueCheckWorkspaces();
}
function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
// If the window entered the primary monitor, that
// might make that workspace non-empty
if (monitorIndex == global.get_primary_monitor_index())
_queueCheckWorkspaces();
}
function _queueCheckWorkspaces() {
if (_checkWorkspacesId == 0)
_checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, _checkWorkspaces);
@ -395,6 +417,27 @@ function loadTheme() {
themeContext.set_theme (theme);
}
/**
* notifyError:
* @msg: An error message
* @details: Additional information
*
* See shell_global_notify_problem().
*/
function notifyError(msg, details) {
// Also print to stderr so it's logged somewhere
if (details)
log("error: " + msg + ": " + details);
else
log("error: " + msg)
let source = new MessageTray.SystemNotificationSource();
messageTray.add(source);
let notification = new MessageTray.Notification(source, msg, details);
notification.setTransient(true);
source.notify(notification);
}
/**
* _log:
* @category: string message type ('info', 'error')
@ -438,28 +481,67 @@ function _getAndClearErrorStack() {
function _relayout() {
let monitors = global.get_monitors();
if (monitors.length != hotCorners.length) {
// destroy old corners
for (let i = 0; i < hotCorners.length; i++)
hotCorners[i].destroy();
hotCorners = [];
for (let i = 0; i < monitors.length; i++)
hotCorners[i] = new Panel.HotCorner();
}
// destroy old corners
for (let i = 0; i < hotCorners.length; i++)
hotCorners[i].destroy();
hotCorners = [];
let primary = global.get_primary_monitor();
for (let i = 0; i < monitors.length; i++) {
let monitor = monitors[i];
let corner = hotCorners[i];
let isPrimary = (monitor.x == primary.x &&
monitor.y == primary.y &&
monitor.width == primary.width &&
monitor.height == primary.height);
let cornerX = monitor.x;
let cornerY = monitor.y;
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
corner.actor.set_position(monitor.x + monitor.width, monitor.y);
cornerX += monitor.width;
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;
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
besideX = monitor.x + 1;
else
corner.actor.set_position(monitor.x, monitor.y);
besideX = cornerX - 1;
let besideY = cornerY;
let aboveX = cornerX;
let aboveY = cornerY - 1;
for (let j = 0; j < monitors.length; j++) {
if (i == j)
continue;
let otherMonitor = monitors[j];
if (besideX >= otherMonitor.x &&
besideX < otherMonitor.x + otherMonitor.width &&
besideY >= otherMonitor.y &&
besideY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
if (aboveX >= otherMonitor.x &&
aboveX < otherMonitor.x + otherMonitor.width &&
aboveY >= otherMonitor.y &&
aboveY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
}
/* We only want hot corners where there is a natural top-left
* corner, and on the primary monitor */
if (!isPrimary && !haveTopLeftCorner)
continue;
let corner = new Panel.HotCorner();
hotCorners.push(corner);
corner.actor.set_position(cornerX, cornerY);
if (isPrimary)
panel.setHotCorner(corner);
}

View File

@ -406,24 +406,23 @@ Notification.prototype = {
this._bannerBodyMarkup = false;
this._titleFitsInBannerMode = true;
this._spacing = 0;
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
source.connect('destroy', Lang.bind(this,
// Avoid passing 'source' as an argument to this.destroy()
function () {
this.destroy();
function (source, reason) {
this.destroy(reason);
}));
this.actor = new St.Table({ name: 'notification',
reactive: true });
this.actor.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.connect('button-release-event', Lang.bind(this,
function (actor, event) {
if (!this._actionArea ||
!this._actionArea.contains(event.get_source()))
this._onClicked();
}));
this.actor = new St.Button();
this.actor._delegate = this;
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._table = new St.Table({ name: 'notification',
reactive: true });
this._table.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.set_child(this._table);
this._buttonFocusManager = St.FocusManager.get_for_stage(global.stage);
// The first line should have the title, followed by the
@ -435,10 +434,10 @@ Notification.prototype = {
this._bannerBox.connect('get-preferred-width', Lang.bind(this, this._bannerBoxGetPreferredWidth));
this._bannerBox.connect('get-preferred-height', Lang.bind(this, this._bannerBoxGetPreferredHeight));
this._bannerBox.connect('allocate', Lang.bind(this, this._bannerBoxAllocate));
this.actor.add(this._bannerBox, { row: 0,
col: 1,
y_expand: false,
y_fill: false });
this._table.add(this._bannerBox, { row: 0,
col: 1,
y_expand: false,
y_fill: false });
this._titleLabel = new St.Label();
this._bannerBox.add_actor(this._titleLabel);
@ -468,31 +467,39 @@ Notification.prototype = {
this._customContent = params.customContent;
let oldFocus = global.stage.key_focus;
if (this._icon)
this._icon.destroy();
// We always clear the content area if we don't have custom
// content because it might contain the @banner that didn't
// fit in the banner mode.
if (this._scrollArea && (!this._customContent || params.clear)) {
if (oldFocus && this._scrollArea.contains(oldFocus))
this.actor.grab_key_focus();
this._scrollArea.destroy();
this._scrollArea = null;
this._contentArea = null;
}
if (this._actionArea && params.clear) {
if (oldFocus && this._actionArea.contains(oldFocus))
this.actor.grab_key_focus();
this._actionArea.destroy();
this._actionArea = null;
this._buttonBox = null;
}
if (!this._scrollArea && !this._actionArea)
this.actor.remove_style_class_name('multi-line-notification');
this._table.remove_style_class_name('multi-line-notification');
this._icon = params.icon || this.source.createNotificationIcon();
this.actor.add(this._icon, { row: 0,
col: 0,
x_expand: false,
y_expand: false,
y_fill: false,
y_align: St.Align.START });
this._table.add(this._icon, { row: 0,
col: 0,
x_expand: false,
y_expand: false,
y_fill: false,
y_align: St.Align.START });
title = title ? _fixMarkup(title.replace(/\n/g, ' '), params.titleMarkup) : '';
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
@ -518,13 +525,23 @@ Notification.prototype = {
this._updated();
},
setIconVisible: function(visible) {
this._icon.visible = visible;
},
enableScrolling: function(enableScrolling) {
this._scrollPolicy = enableScrolling ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER;
if (this._scrollArea)
this._scrollArea.vscrollbar_policy = this._scrollPolicy;
},
_createScrollArea: function() {
this.actor.add_style_class_name('multi-line-notification');
this._table.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
vscrollbar_policy: this._scrollPolicy,
hscrollbar_policy: Gtk.PolicyType.NEVER,
vfade: true });
this.actor.add(this._scrollArea, { row: 1, col: 1 });
this._table.add(this._scrollArea, { row: 1, col: 1 });
this._contentArea = new St.BoxLayout({ name: 'notification-body',
vertical: true });
this._scrollArea.add_actor(this._contentArea);
@ -603,8 +620,8 @@ Notification.prototype = {
props.row = 2;
props.col = 1;
this.actor.add_style_class_name('multi-line-notification');
this.actor.add(this._actionArea, props);
this._table.add_style_class_name('multi-line-notification');
this._table.add(this._actionArea, props);
this._updated();
},
@ -665,7 +682,7 @@ Notification.prototype = {
},
_styleChanged: function() {
this._spacing = this.actor.get_theme_node().get_length('spacing-columns');
this._spacing = this._table.get_theme_node().get_length('spacing-columns');
},
_bannerBoxGetPreferredWidth: function(actor, forHeight, alloc) {
@ -710,7 +727,7 @@ Notification.prototype = {
// Make _bannerLabel visible if the entire notification
// fits on one line, or if the notification is currently
// unexpanded and only showing one line anyway.
if (!this.expanded || (bannerFits && this.actor.row_count == 1))
if (!this.expanded || (bannerFits && this._table.row_count == 1))
this._bannerLabel.opacity = 255;
}
@ -722,7 +739,7 @@ Notification.prototype = {
function() {
this._addBannerBody();
if (!this._titleFitsInBannerMode)
this.actor.add_style_class_name('multi-line-notification');
this._table.add_style_class_name('multi-line-notification');
this._updated();
return false;
}));
@ -743,7 +760,7 @@ Notification.prototype = {
this._titleLabel.clutter_text.line_wrap = true;
this._titleLabel.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
} else if (this.actor.row_count > 1 && this._bannerLabel.opacity != 0) {
} else if (this._table.row_count > 1 && this._bannerLabel.opacity != 0) {
// We always hide the banner if the notification has additional content.
//
// We don't need to wrap the banner that doesn't fit the way we wrap the
@ -808,6 +825,7 @@ Notification.prototype = {
destroy: function(reason) {
this._destroyedReason = reason;
this.actor.destroy();
this.actor._delegate = null;
}
};
Signals.addSignalMethods(Notification.prototype);
@ -822,9 +840,13 @@ Source.prototype = {
_init: function(title) {
this.title = title;
this._iconBin = new St.Bin({ width: this.ICON_SIZE,
height: this.ICON_SIZE });
height: this.ICON_SIZE,
x_fill: true,
y_fill: true });
this.isTransient = false;
this.isChat = false;
this.notifications = [];
},
setTransient: function(isTransient) {
@ -844,30 +866,40 @@ Source.prototype = {
return this._iconBin;
},
notify: function(notification) {
if (this.notification) {
this.notification.disconnect(this._notificationClickedId);
this.notification.disconnect(this._notificationDestroyedId);
pushNotification: function(notification) {
if (this.notifications.indexOf(notification) < 0) {
this.notifications.push(notification);
this.emit('notification-added', notification);
}
this.notification = notification;
this._notificationClickedId = notification.connect('clicked', Lang.bind(this, this.open));
this._notificationDestroyedId = notification.connect('destroy', Lang.bind(this,
notification.connect('clicked', Lang.bind(this, this.open));
notification.connect('destroy', Lang.bind(this,
function () {
if (this.notification == notification) {
this.notification = null;
this._notificationDestroyedId = 0;
this._notificationClickedId = 0;
this._notificationRemoved();
}
}));
let index = this.notifications.indexOf(notification);
if (index < 0)
return;
this.notifications.splice(index, 1);
if (this.notifications.length == 0)
this._lastNotificationRemoved();
}));
},
notify: function(notification) {
this.pushNotification(notification);
this.emit('notify', notification);
},
destroy: function() {
this.emit('destroy');
destroy: function(reason) {
this.emit('destroy', reason);
},
// A subclass can redefine this to "steal" clicks from the
// summaryitem; Use Clutter.get_current_event() to get the
// details, return true to prevent the default handling from
// ocurring.
handleSummaryClick: function() {
return false;
},
//// Protected methods ////
@ -883,8 +915,14 @@ Source.prototype = {
open: function(notification) {
},
destroyNonResidentNotifications: function() {
for (let i = this.notifications.length - 1; i >= 0; i--)
if (!this.notifications[i].resident)
this.notifications[i].destroy();
},
// Default implementation is to destroy this source, but subclasses can override
_notificationRemoved: function() {
_lastNotificationRemoved: function() {
this.destroy();
}
};
@ -897,8 +935,12 @@ function SummaryItem(source) {
SummaryItem.prototype = {
_init: function(source) {
this.source = source;
this.source.connect('notification-added', Lang.bind(this, this._notificationAddedToSource));
this.actor = new St.Button({ style_class: 'summary-source-button',
y_fill: true,
reactive: true,
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO | St.ButtonMask.THREE,
track_hover: true });
this._sourceBox = new St.BoxLayout({ style_class: 'summary-source' });
@ -913,9 +955,30 @@ SummaryItem.prototype = {
this._sourceTitleBin.child = this._sourceTitle;
this._sourceTitleBin.width = 0;
this._sourceBox.add_actor(this._sourceIcon);
this._sourceBox.add_actor(this._sourceTitleBin, { expand: true });
this._sourceBox.add(this._sourceIcon, { y_fill: false });
this._sourceBox.add(this._sourceTitleBin, { expand: true, y_fill: false });
this.actor.child = this._sourceBox;
this.notificationStackView = new St.ScrollView({ name: source.isChat ? '' : 'summary-notification-stack-scrollview',
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER,
vfade: true });
this.notificationStack = new St.BoxLayout({ name: 'summary-notification-stack',
vertical: true });
this.notificationStackView.add_actor(this.notificationStack);
this._notificationExpandedIds = [];
this._notificationDoneDisplayingIds = [];
this._notificationDestroyedIds = [];
this._oldMaxScrollAdjustment = 0;
this.notificationStackView.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
let currentValue = adjustment.value + adjustment.page_size;
if (currentValue == this._oldMaxScrollAdjustment)
this.scrollTo(St.Side.BOTTOM);
this._oldMaxScrollAdjustment = adjustment.upper;
}));
this.rightClickMenu = new St.BoxLayout({ name: 'summary-right-click-menu',
vertical: true });
@ -924,14 +987,14 @@ SummaryItem.prototype = {
item = new PopupMenu.PopupMenuItem(_("Open"));
item.connect('activate', Lang.bind(this, function() {
source.open();
this.emit('right-click-menu-done-displaying');
this.emit('done-displaying-content');
}));
this.rightClickMenu.add(item.actor);
item = new PopupMenu.PopupMenuItem(_("Remove"));
item.connect('activate', Lang.bind(this, function() {
source.destroy();
this.emit('right-click-menu-done-displaying');
this.emit('done-displaying-content');
}));
this.rightClickMenu.add(item.actor);
@ -961,6 +1024,87 @@ SummaryItem.prototype = {
setEllipsization: function(mode) {
this._sourceTitle.clutter_text.ellipsize = mode;
},
prepareNotificationStackForShowing: function() {
if (this.notificationStack.get_children().length > 0)
return;
for (let i = 0; i < this.source.notifications.length; i++) {
this._appendNotificationToStack(this.source.notifications[i]);
}
},
doneShowingNotificationStack: function() {
let notificationActors = this.notificationStack.get_children();
for (let i = 0; i < notificationActors.length; i++) {
notificationActors[i]._delegate.collapseCompleted();
notificationActors[i]._delegate.disconnect(this._notificationExpandedIds[i]);
notificationActors[i]._delegate.disconnect(this._notificationDoneDisplayingIds[i]);
notificationActors[i]._delegate.disconnect(this._notificationDestroyedIds[i]);
this.notificationStack.remove_actor(notificationActors[i]);
notificationActors[i]._delegate.setIconVisible(true);
notificationActors[i]._delegate.enableScrolling(true);
}
this._notificationExpandedIds = [];
this._notificationDoneDisplayingIds = [];
this._notificationDestroyedIds = [];
},
_notificationAddedToSource: function(source, notification) {
if (this.notificationStack.mapped)
this._appendNotificationToStack(notification);
},
_appendNotificationToStack: function(notification) {
let notificationExpandedId = notification.connect('expanded', Lang.bind(this, this._contentUpdated));
this._notificationExpandedIds.push(notificationExpandedId);
let notificationDoneDisplayingId = notification.connect('done-displaying', Lang.bind(this, this._notificationDoneDisplaying));
this._notificationDoneDisplayingIds.push(notificationDoneDisplayingId);
let notificationDestroyedId = notification.connect('destroy', Lang.bind(this, this._notificationDestroyed));
this._notificationDestroyedIds.push(notificationDestroyedId);
if (!this.source.isChat)
notification.enableScrolling(false);
if (this.notificationStack.get_children().length > 0)
notification.setIconVisible(false);
this.notificationStack.add(notification.actor);
notification.expand(false);
},
// scrollTo:
// @side: St.Side.TOP or St.Side.BOTTOM
//
// Scrolls the notifiction stack to the indicated edge
scrollTo: function(side) {
let adjustment = this.notificationStackView.vscroll.adjustment;
if (side == St.Side.TOP)
adjustment.value = adjustment.lower;
else if (side == St.Side.BOTTOM)
adjustment.value = adjustment.upper;
},
_contentUpdated: function() {
this.emit('content-updated');
},
_notificationDoneDisplaying: function() {
this.emit('done-displaying-content');
},
_notificationDestroyed: function(notification) {
let index = this.notificationStack.get_children().indexOf(notification.actor);
if (index >= 0) {
notification.disconnect(this._notificationExpandedIds[index]);
this._notificationExpandedIds.splice(index, 1);
notification.disconnect(this._notificationDoneDisplayingIds[index]);
this._notificationDoneDisplayingIds.splice(index, 1);
notification.disconnect(this._notificationDestroyedIds[index]);
this._notificationDestroyedIds.splice(index, 1);
this.notificationStack.remove_actor(notification.actor);
this._contentUpdated();
}
if (this.notificationStack.get_children().length > 0)
this.notificationStack.get_children()[0]._delegate.setIconVisible(true);
}
};
Signals.addSignalMethods(SummaryItem.prototype);
@ -1009,14 +1153,15 @@ MessageTray.prototype = {
this._summaryBoxPointer.actor.lower_bottom();
this._summaryBoxPointer.actor.hide();
this._summaryNotification = null;
this._summaryNotificationClickedId = 0;
this._summaryRightClickMenuClickedId = 0;
this._summaryBoxPointerItem = null;
this._summaryBoxPointerContentUpdatedId = 0;
this._summaryBoxPointerDoneDisplayingId = 0;
this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
this._clickedSummaryItemAllocationChangedId = 0;
this._expandedSummaryItem = null;
this._summaryItemTitleWidth = 0;
this._pointerBarrier = 0;
// To simplify the summary item animation code, we pretend
// that there's an invisible SummaryItem to the left of the
@ -1051,18 +1196,17 @@ MessageTray.prototype = {
this._notificationTimeoutId = 0;
this._notificationExpandedId = 0;
this._summaryBoxPointerState = State.HIDDEN;
this._summaryNotificationTimeoutId = 0;
this._summaryNotificationExpandedId = 0;
this._summaryBoxPointerTimeoutId = 0;
this._overviewVisible = Main.overview.visible;
this._notificationRemoved = false;
this._reNotifyWithSummaryNotificationAfterHide = false;
this._reNotifyAfterHideNotification = null;
Main.chrome.addActor(this.actor, { affectsStruts: false,
visibleInOverview: true });
Main.chrome.trackActor(this._notificationBin);
Main.chrome.trackActor(this._summaryBoxPointer.actor);
global.gdk_screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
global.screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
this._setSizePosition();
@ -1106,6 +1250,15 @@ MessageTray.prototype = {
this._notificationBin.width = primary.width;
this._summaryBin.x = 0;
this._summaryBin.width = primary.width;
if (this._pointerBarrier)
global.destroy_pointer_barrier(this._pointerBarrier);
this._pointerBarrier =
global.create_pointer_barrier(primary.x + primary.width, primary.y + primary.height - this.actor.height,
primary.x + primary.width, primary.y + primary.height,
4 /* BarrierNegativeX */);
},
contains: function(source) {
@ -1161,9 +1314,9 @@ MessageTray.prototype = {
this._onSummaryItemHoverChanged(summaryItem);
}));
summaryItem.actor.connect('button-press-event', Lang.bind(this,
function (actor, event) {
this._onSummaryItemClicked(summaryItem, event);
summaryItem.actor.connect('clicked', Lang.bind(this,
function (actor, button) {
this._onSummaryItemClicked(summaryItem, button);
}));
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
@ -1227,13 +1380,6 @@ MessageTray.prototype = {
if (needUpdate);
this._updateState();
// remove all notifications with this source from the queue
let newNotificationQueue = [];
for (let i = this._notificationQueue.length - 1; i >= 0; i--) {
if (this._notificationQueue[i].source == source)
this._notificationQueue[i].destroy();
}
},
_onNotificationDestroy: function(notification) {
@ -1262,14 +1408,18 @@ MessageTray.prototype = {
},
_onNotify: function(source, notification) {
if (notification == this._summaryNotification) {
if (!this._summaryNotificationExpandedId)
// We must be in the process of hiding the summary notification.
// If the summary notification is updated while it is being
// hidden, we show the update as a new notification. However,
// we must first wait till the hide is complete and the
// notification actor is not part of the stage.
this._reNotifyWithSummaryNotificationAfterHide = true;
if (this._summaryBoxPointerItem && this._summaryBoxPointerItem.source == source) {
if (this._summaryBoxPointerState == State.HIDING)
// We are in the process of hiding the summary box pointer.
// If there is an update for one of the notifications or
// a new notification to be added to the notification stack
// while it is in the process of being hidden, we show it as
// a new notification. However, we first wait till the hide
// is complete. This is especially important if one of the
// notifications in the stack was updated because we will
// need to be able to re-parent its actor to a different
// part of the stage.
this._reNotifyAfterHideNotification = notification;
return;
}
@ -1308,12 +1458,18 @@ MessageTray.prototype = {
// Turn off ellipsization for the previously expanded item that is
// collapsing and for the item that is expanding because it looks
// better that way.
if (this._expandedSummaryItem)
if (this._expandedSummaryItem) {
// Ideally, we would remove 'expanded' pseudo class when the item
// is done collapsing, but we don't track when that happens.
this._expandedSummaryItem.actor.remove_style_pseudo_class('expanded');
this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.NONE);
}
this._expandedSummaryItem = summaryItem;
if (this._expandedSummaryItem)
if (this._expandedSummaryItem) {
this._expandedSummaryItem.actor.add_style_pseudo_class('expanded');
this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.NONE);
}
// We tween on a "_expandedSummaryItemTitleWidth" pseudo-property
// that represents the current title width of the
@ -1335,6 +1491,8 @@ MessageTray.prototype = {
},
set _expandedSummaryItemTitleWidth(expansion) {
expansion = Math.round(expansion);
// Expand the expanding item to its new width
if (this._expandedSummaryItem)
this._expandedSummaryItem.setTitleWidth(expansion);
@ -1365,11 +1523,32 @@ MessageTray.prototype = {
if (this._summaryItems[i] == this._expandedSummaryItem)
continue;
let width = this._summaryItems[i].getTitleWidth();
this._summaryItems[i].setTitleWidth(width * shrinkage);
let oldWidth = this._summaryItems[i].getTitleWidth();
let newWidth = Math.floor(oldWidth * shrinkage);
excess -= newWidth;
this._summaryItems[i].setTitleWidth(newWidth);
}
if (this._expandedSummaryItem) {
let oldWidth = this._imaginarySummaryItemTitleWidth;
let newWidth = Math.floor(oldWidth * shrinkage);
excess -= newWidth;
this._imaginarySummaryItemTitleWidth = newWidth;
}
// If the tray as a whole is fully-expanded, make sure the
// left edge doesn't wobble during animation due to rounding.
if (this._imaginarySummaryItemTitleWidth == 0 && excess != 0) {
for (let i = 0; i < this._summaryItems.length; i++) {
if (this._summaryItems[i] == this._expandedSummaryItem)
continue;
let oldWidth = this._summaryItems[i].getTitleWidth();
if (oldWidth != 0) {
this._summaryItems[i].setTitleWidth (oldWidth + excess);
break;
}
}
}
if (this._expandedSummaryItem)
this._imaginarySummaryItemTitleWidth *= shrinkage;
},
_expandSummaryItemCompleted: function() {
@ -1377,13 +1556,14 @@ MessageTray.prototype = {
this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.END);
},
_onSummaryItemClicked: function(summaryItem, event) {
let clickedButton = event.get_button();
if (!this._clickedSummaryItem ||
this._clickedSummaryItem != summaryItem ||
this._clickedSummaryItemMouseButton != clickedButton) {
_onSummaryItemClicked: function(summaryItem, button) {
if (summaryItem.source.handleSummaryClick())
this._unsetClickedSummaryItem();
else if (!this._clickedSummaryItem ||
this._clickedSummaryItem != summaryItem ||
this._clickedSummaryItemMouseButton != button) {
this._clickedSummaryItem = summaryItem;
this._clickedSummaryItemMouseButton = clickedButton;
this._clickedSummaryItemMouseButton = button;
} else {
this._unsetClickedSummaryItem();
}
@ -1519,14 +1699,15 @@ MessageTray.prototype = {
// at the present time.
_updateState: function() {
// Notifications
let notificationsPending = this._notificationQueue.length > 0 &&
(!this._busy || this._notificationQueue[0].urgency == Urgency.CRITICAL);
let notificationUrgent = this._notificationQueue.length > 0 && this._notificationQueue[0].urgency == Urgency.CRITICAL;
let notificationsPending = this._notificationQueue.length > 0 && (!this._busy || notificationUrgent);
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
let notificationExpanded = this._notificationBin.y < 0;
let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && !this._locked) || this._notificationRemoved;
let canShowNotification = notificationsPending && this._summaryState == State.HIDDEN;
if (this._notificationState == State.HIDDEN) {
if (notificationsPending)
if (canShowNotification)
this._showNotification();
} else if (this._notificationState == State.SHOWN) {
if (notificationExpired)
@ -1548,7 +1729,11 @@ MessageTray.prototype = {
this._notificationState == State.SHOWN);
let notificationsDone = !notificationsVisible && !notificationsPending;
if (this._summaryState == State.HIDDEN) {
let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered;
let mustHideSummary = (notificationsPending && (notificationUrgent || summaryOptionalInOverview))
|| notificationsVisible;
if (this._summaryState == State.HIDDEN && !mustHideSummary) {
if (this._backFromAway) {
// Immediately set this to false, so that we don't schedule a timeout later
this._backFromAway = false;
@ -1560,7 +1745,7 @@ MessageTray.prototype = {
this._showSummary(0);
}
} else if (this._summaryState == State.SHOWN) {
if (!summaryPinned)
if (!summaryPinned || mustHideSummary)
this._hideSummary();
else if (summaryVisibleWithNoHover && !summaryNotificationIsForExpandedSummaryItem)
// If we are hiding the summary, we'll collapse the expanded summary item when we are done
@ -1575,18 +1760,21 @@ MessageTray.prototype = {
let summarySourceIsMainNotificationSource = (haveClickedSummaryItem && this._notification &&
this._clickedSummaryItem.source == this._notification.source);
let canShowSummaryBoxPointer = this._summaryState == State.SHOWN;
let wrongSummaryNotification = (this._clickedSummaryItemMouseButton == 1 &&
this._summaryNotification != this._clickedSummaryItem.source.notification);
// We only have sources with empty notification stacks for legacy tray icons. Currently, we never attempt
// to show notifications for legacy tray icons, but this would be necessary if we did.
let requestedNotificationStackIsEmpty = (this._clickedSummaryItemMouseButton == 1 && this._clickedSummaryItem.source.notifications.length == 0);
let wrongSummaryNotificationStack = (this._clickedSummaryItemMouseButton == 1 &&
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.notificationStackView);
let wrongSummaryRightClickMenu = (this._clickedSummaryItemMouseButton == 3 &&
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.rightClickMenu);
let wrongSummaryBoxPointer = (haveClickedSummaryItem &&
(wrongSummaryNotification || wrongSummaryRightClickMenu));
(wrongSummaryNotificationStack || wrongSummaryRightClickMenu));
if (this._summaryBoxPointerState == State.HIDDEN) {
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer)
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer && !requestedNotificationStackIsEmpty)
this._showSummaryBoxPointer();
} else if (this._summaryBoxPointerState == State.SHOWN) {
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer)
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary)
this._hideSummaryBoxPointer();
}
@ -1841,38 +2029,33 @@ MessageTray.prototype = {
},
_hideSummaryCompleted: function() {
this._expandedSummaryItem = null;
this._expandedSummaryItemTitleWidth = this._summaryItemTitleWidth;
this._setExpandedSummaryItem(null);
},
_showSummaryBoxPointer: function() {
this._summaryBoxPointerItem = this._clickedSummaryItem;
this._summaryBoxPointerContentUpdatedId = this._summaryBoxPointerItem.connect('content-updated',
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
this._summaryBoxPointerDoneDisplayingId = this._summaryBoxPointerItem.connect('done-displaying-content',
Lang.bind(this, this._escapeTray));
if (this._clickedSummaryItemMouseButton == 1) {
let clickedSummaryItemNotification = this._clickedSummaryItem.source.notification;
let index = this._notificationQueue.indexOf(clickedSummaryItemNotification);
if (index != -1)
this._notificationQueue.splice(index, 1);
this._summaryNotification = clickedSummaryItemNotification;
this._summaryNotificationClickedId = this._summaryNotification.connect('done-displaying',
Lang.bind(this, this._escapeTray));
this._summaryBoxPointer.bin.child = this._summaryNotification.actor;
if (!this._summaryNotificationExpandedId)
this._summaryNotificationExpandedId = this._summaryNotification.connect('expanded',
Lang.bind(this, this._onSummaryBoxPointerExpanded));
this._summaryNotification.expand(false);
this._notificationQueue = this._notificationQueue.filter( Lang.bind(this,
function(notification) {
return this._summaryBoxPointerItem.source != notification.source;
}));
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackView;
this._summaryBoxPointerItem.scrollTo(St.Side.BOTTOM);
} else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryRightClickMenuClickedId = this._clickedSummaryItem.connect('right-click-menu-done-displaying',
Lang.bind(this, this._escapeTray));
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
}
this._focusGrabber.grabFocus(this._summaryBoxPointer.bin.child);
this._clickedSummaryItemAllocationChangedId =
this._clickedSummaryItem.actor.connect('allocation-changed',
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
// _clickedSummaryItem.actor can change absolute postiion without changing allocation
// _clickedSummaryItem.actor can change absolute position without changing allocation
this._summaryMotionId = this._summary.connect('allocation-changed',
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
@ -1881,6 +2064,7 @@ MessageTray.prototype = {
this._adjustSummaryBoxPointerPosition();
this._summaryBoxPointerState = State.SHOWING;
this._clickedSummaryItem.actor.add_style_pseudo_class('selected');
this._summaryBoxPointer.show(true, Lang.bind(this, function() {
this._summaryBoxPointerState = State.SHOWN;
}));
@ -1902,24 +2086,13 @@ MessageTray.prototype = {
this._summaryMotionId = 0;
}
if (this._summaryRightClickMenuClickedId) {
this._clickedSummaryItem.disconnect(this._summaryRightClickMenuClickedId);
this._summaryRightClickMenuClickedId = 0;
}
if (this._clickedSummaryItem)
this._clickedSummaryItem.actor.remove_style_pseudo_class('selected');
this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
},
_onSummaryBoxPointerExpanded: function() {
this._adjustSummaryBoxPointerPosition();
},
_hideSummaryBoxPointer: function() {
if (this._summaryNotificationExpandedId) {
this._summaryNotification.disconnect(this._summaryNotificationExpandedId);
this._summaryNotificationExpandedId = 0;
}
// Unset this._clickedSummaryItem if we are no longer showing the summary
if (this._summaryState != State.SHOWN)
this._unsetClickedSummaryItem();
@ -1930,21 +2103,32 @@ MessageTray.prototype = {
},
_hideSummaryBoxPointerCompleted: function() {
let doneShowingNotificationStack = (this._summaryBoxPointer.bin.child == this._summaryBoxPointerItem.notificationStackView);
this._summaryBoxPointerState = State.HIDDEN;
this._summaryBoxPointer.bin.child = null;
if (this._summaryNotification != null) {
this._summaryNotification.collapseCompleted();
this._summaryNotification.disconnect(this._summaryNotificationClickedId);
this._summaryNotificationClickedId = 0;
let summaryNotification = this._summaryNotification;
this._summaryNotification = null;
if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide)
summaryNotification.destroy(NotificationDestroyedReason.EXPIRED);
if (this._reNotifyWithSummaryNotificationAfterHide) {
this._onNotify(summaryNotification.source, summaryNotification);
this._reNotifyWithSummaryNotificationAfterHide = false;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0;
let sourceNotificationStackDoneShowing = null;
if (doneShowingNotificationStack) {
this._summaryBoxPointerItem.doneShowingNotificationStack();
sourceNotificationStackDoneShowing = this._summaryBoxPointerItem.source;
}
this._summaryBoxPointerItem = null;
if (sourceNotificationStackDoneShowing) {
if (sourceNotificationStackDoneShowing.isTransient && !this._reNotifyAfterHideNotification)
sourceNotificationStackDoneShowing.destroy(NotificationDestroyedReason.EXPIRED);
if (this._reNotifyAfterHideNotification) {
this._onNotify(this._reNotifyAfterHideNotification.source, this._reNotifyAfterHideNotification);
this._reNotifyAfterHideNotification = null;
}
}
if (this._clickedSummaryItem)
this._updateState();
}

View File

@ -39,13 +39,20 @@ ModalDialog.prototype = {
params = Params.parse(params, { styleClass: null });
this.state = State.CLOSED;
this._hasModal = false;
this._group = new St.Group({ visible: false,
x: 0,
y: 0 });
Main.uiGroup.add_actor(this._group);
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.POSITION | Clutter.BindCoordinate.SIZE });
this._group.add_constraint(constraint);
global.focus_manager.add_group(this._group);
this._initialKeyFocus = this._group;
this._savedKeyFocus = null;
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
@ -60,12 +67,18 @@ ModalDialog.prototype = {
this._group.add_actor(this._backgroundBin);
this._lightbox.highlight(this._backgroundBin);
this._backgroundStack = new Shell.Stack();
this._backgroundBin.child = this._backgroundStack;
this._eventBlocker = new Clutter.Group({ reactive: true });
this._backgroundStack.add_actor(this._eventBlocker);
this._dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
vertical: true });
if (params.styleClass != null) {
this._dialogLayout.add_style_class_name(params.styleClass);
}
this._backgroundBin.child = this._dialogLayout;
this._backgroundStack.add_actor(this._dialogLayout);
this.contentLayout = new St.BoxLayout({ vertical: true });
this._dialogLayout.add(this.contentLayout,
@ -74,8 +87,9 @@ ModalDialog.prototype = {
x_align: St.Align.MIDDLE,
y_align: St.Align.START });
this._buttonLayout = new St.BoxLayout({ opacity: 220,
vertical: false });
this._buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
opacity: 220,
vertical: false });
this._dialogLayout.add(this._buttonLayout,
{ expand: true,
x_align: St.Align.MIDDLE,
@ -154,22 +168,23 @@ ModalDialog.prototype = {
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this._initialKeyFocus.grab_key_focus();
this.state = State.OPENED;
this.emit('opened');
}),
})
});
},
setInitialKeyFocus: function(actor) {
this._initialKeyFocus = actor;
},
open: function(timestamp) {
if (this.state == State.OPENED || this.state == State.OPENING)
return true;
if (!Main.pushModal(this._group, timestamp))
if (!this.pushModal(timestamp))
return false;
global.stage.set_key_focus(this._group);
this._fadeOpen();
return true;
},
@ -178,14 +193,8 @@ ModalDialog.prototype = {
if (this.state == State.CLOSED || this.state == State.CLOSING)
return;
let needsPopModal;
if (this.state == State.OPENED || this.state == State.OPENING)
needsPopModal = true;
else
needsPopModal = false;
this.state = State.CLOSING;
this.popModal(timestamp);
Tweener.addTween(this._group,
{ opacity: 0,
@ -195,13 +204,46 @@ ModalDialog.prototype = {
function() {
this.state = State.CLOSED;
this._group.hide();
if (needsPopModal)
Main.popModal(this._group, timestamp);
})
});
},
// Drop modal status without closing the dialog; this makes the
// dialog insensitive as well, so it needs to be followed shortly
// by either a close() or a pushModal()
popModal: function(timestamp) {
if (!this._hasModal)
return;
let focus = global.stage.key_focus;
if (focus && this._group.contains(focus))
this._savedKeyFocus = focus;
else
this._savedKeyFocus = null;
Main.popModal(this._group, timestamp);
global.gdk_screen.get_display().sync();
this._hasModal = false;
this._eventBlocker.raise_top();
},
pushModal: function (timestamp) {
if (this._hasModal)
return true;
if (!Main.pushModal(this._group, timestamp))
return false;
this._hasModal = true;
if (this._savedKeyFocus) {
this._savedKeyFocus.grab_key_focus();
this._savedKeyFocus = null;
} else
this._initialKeyFocus.grab_key_focus();
this._eventBlocker.lower_bottom();
return true;
},
// This method is like close, but fades the dialog out much slower,
// and leaves the lightbox in place. Once in the faded out state,
// the dialog can be brought back by an open call, or the lightbox
@ -220,6 +262,7 @@ ModalDialog.prototype = {
if (this.state == State.FADED_OUT)
return;
this.popModal(timestamp);
Tweener.addTween(this._dialogLayout,
{ opacity: 0,
time: FADE_OUT_DIALOG_TIME,
@ -227,7 +270,6 @@ ModalDialog.prototype = {
onComplete: Lang.bind(this,
function() {
this.state = State.FADED_OUT;
Main.popModal(this._group, timestamp);
})
});
}

View File

@ -1,5 +1,6 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
@ -345,7 +346,7 @@ NotificationDaemon.prototype = {
notification.setTransient(hints['transient'] == true);
let sourceIconActor = source.useNotificationIcon ? this._iconForNotificationData(icon, hints, source.ICON_SIZE) : null;
source.notify(notification, sourceIconActor);
source.processNotification(notification, sourceIconActor);
},
CloseNotification: function(id) {
@ -389,8 +390,7 @@ NotificationDaemon.prototype = {
for (let id in this._sources) {
let source = this._sources[id];
if (source.app == tracker.focus_app) {
if (source.notification && !source.notification.resident)
source.notification.destroy();
source.destroyNonResidentNotifications();
return;
}
}
@ -441,15 +441,43 @@ Source.prototype = {
this.title = this.app.get_name();
else
this.useNotificationIcon = true;
this._isTrayIcon = false;
this._trayIcon = null;
},
notify: function(notification, icon) {
processNotification: function(notification, icon) {
if (!this.app)
this._setApp();
if (!this.app && icon)
this._setSummaryIcon(icon);
MessageTray.Source.prototype.notify.call(this, notification);
let tracker = Shell.WindowTracker.get_default();
if (notification.resident && this.app && tracker.focus_app == this.app)
this.pushNotification(notification);
else
this.notify(notification);
},
handleSummaryClick: function() {
if (!this._trayIcon)
return false;
let event = Clutter.get_current_event();
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
return false;
if (Main.overview.visible) {
// We can't just connect to Main.overview's 'hidden' signal,
// because it's emitted *before* it calls popModal()...
let id = global.connect('notify::stage-input-mode', Lang.bind(this,
function () {
global.disconnect(id);
this._trayIcon.click(event);
}));
Main.overview.hide();
} else {
this._trayIcon.click(event);
}
return true;
},
_setApp: function() {
@ -466,7 +494,7 @@ Source.prototype = {
// Only override the icon if we were previously using
// notification-based icons (ie, not a trayicon) or if it was unset before
if (!this._isTrayIcon) {
if (!this._trayIcon) {
this.useNotificationIcon = false;
this._setSummaryIcon(this.app.create_icon_texture (this.ICON_SIZE));
}
@ -475,25 +503,29 @@ Source.prototype = {
setTrayIcon: function(icon) {
this._setSummaryIcon(icon);
this.useNotificationIcon = false;
this._isTrayIcon = true;
this._trayIcon = icon;
},
open: function(notification) {
this.destroyNonResidentNotifications();
this.openApp();
},
_notificationRemoved: function() {
if (!this._isTrayIcon)
_lastNotificationRemoved: function() {
if (!this._trayIcon)
this.destroy();
},
_appStateChanged: function() {
// Destroy notification sources when their apps exit.
// The app exiting would normally result in a tray icon being removed,
// so it should be ok to destroy the source associated with a tray icon
// here too, however we just let that happen through the code path
// associated with the tray icon being removed.
if (!this._isTrayIcon && this.app.get_state() == Shell.AppState.STOPPED)
// so the associated source would be destroyed through the code path
// that handles the tray icon being removed. We should not destroy
// the source associated with a tray icon when the application state
// is Shell.AppState.STOPPED because running applications that have
// no open windows would also have that state. This is often the case
// for applications that use tray icons.
if (!this._trayIcon && this.app.get_state() == Shell.AppState.STOPPED)
this.destroy();
},

View File

@ -23,6 +23,7 @@ const PlaceDisplay = imports.ui.placeDisplay;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const WorkspacesView = imports.ui.workspacesView;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
const ZeitgeistSearch = imports.ui.zeitgeistSearch;
// Time for initial animation going into Overview mode
@ -74,11 +75,13 @@ ShellInfo.prototype = {
Main.messageTray.add(this._source);
}
let notification = this._source.notification;
if (notification == null)
let notification = null;
if (this._source.notifications.length == 0) {
notification = new MessageTray.Notification(this._source, text, null);
else
} else {
notification = this._source.notifications[0];
notification.update(text, null, { clear: true });
}
notification.setTransient(true);
@ -247,7 +250,8 @@ Overview.prototype = {
_onDragMotion: function(dragEvent) {
let targetIsWindow = dragEvent.targetActor &&
dragEvent.targetActor._delegate &&
dragEvent.targetActor._delegate.metaWindow;
dragEvent.targetActor._delegate.metaWindow &&
!(dragEvent.targetActor._delegate instanceof WorkspaceThumbnail.WindowClone);
this._windowSwitchTimestamp = global.get_current_time();
@ -443,7 +447,7 @@ Overview.prototype = {
let primary = global.get_primary_monitor();
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
let contentY = Panel.PANEL_HEIGHT;
let contentY = Main.panel.actor.height;
let contentHeight = primary.height - contentY - Main.messageTray.actor.height;
this._group.set_position(primary.x, primary.y);
@ -478,6 +482,10 @@ Overview.prototype = {
this.emit('item-drag-begin');
},
cancelledItemDrag: function(source) {
this.emit('item-drag-cancelled');
},
endItemDrag: function(source) {
this.emit('item-drag-end');
},
@ -690,6 +698,7 @@ Overview.prototype = {
this._animateNotVisible();
this._syncInputMode();
global.sync_pointer();
},
_hideDone: function() {

View File

@ -22,8 +22,6 @@ const DateMenu = imports.ui.dateMenu;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const PANEL_HEIGHT = 26;
const PANEL_ICON_SIZE = 24;
const STARTUP_ANIMATION_TIME = 0.2;
@ -33,8 +31,7 @@ const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const SPINNER_UPDATE_TIMEOUT = 130;
const SPINNER_SPEED = 0.02;
const SPINNER_ANIMATION_TIME = 0.2;
const STANDARD_TRAY_ICON_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'bluetooth', 'network', 'battery'];
const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
@ -47,6 +44,12 @@ const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
if (Config.HAVE_BLUETOOTH)
STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
try {
STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['network'] = imports.ui.status.network.NMApplet;
} catch(e) {
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
}
// To make sure the panel corners blend nicely with the panel,
// we draw background and borders the same way, e.g. drawing
// them as filled shapes from the outside inwards instead of
@ -275,20 +278,13 @@ AppMenuButton.prototype = {
this.hide();
}));
this._updateId = 0;
this._animationStep = 0;
this._clipWidth = PANEL_ICON_SIZE;
this._direction = SPINNER_SPEED;
this._stop = true;
this._spinner = new AnimatedIcon('process-working.svg',
PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.lower_bottom();
this._shadow = new St.Bin({ style_class: 'label-real-shadow' });
this._shadow.hide();
this._container.add_actor(this._shadow);
let tracker = Shell.WindowTracker.get_default();
tracker.connect('notify::focus-app', Lang.bind(this, this._sync));
tracker.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
@ -338,62 +334,26 @@ AppMenuButton.prototype = {
this._iconBox.remove_clip();
},
_stopAnimation: function(animate) {
this._label.actor.remove_clip();
if (this._updateId) {
this._shadow.hide();
if (animate) {
Tweener.addTween(this._spinner.actor,
{ opacity: 0,
time: 0.2,
transition: "easeOutQuad",
onCompleteScope: this,
onComplete: function() {
this._spinner.actor.opacity = 255;
this._spinner.actor.hide();
}
});
}
Mainloop.source_remove(this._updateId);
this._updateId = 0;
}
if (!animate)
this._spinner.actor.hide();
},
stopAnimation: function() {
this._direction = SPINNER_SPEED * 3;
this._stop = true;
},
if (this._stop)
return;
_update: function() {
this._animationStep += this._direction;
if (this._animationStep > 1 && this._stop) {
this._animationStep = 1;
this._stopAnimation(true);
return false;
}
if (this._animationStep > 1)
this._animationStep = 1;
this._clipWidth = this._label.actor.width - (this._label.actor.width - PANEL_ICON_SIZE) * (1 - this._animationStep);
if (this.actor.get_direction() == St.TextDirection.LTR) {
this._label.actor.set_clip(0, 0, this._clipWidth + this._shadow.width, this.actor.height);
} else {
this._label.actor.set_clip(this._label.actor.width - this._clipWidth, 0, this._clipWidth, this.actor.height);
}
this._container.queue_relayout();
return true;
this._stop = true;
Tweener.addTween(this._spinner.actor,
{ opacity: 0,
time: SPINNER_ANIMATION_TIME,
transition: "easeOutQuad",
onCompleteScope: this,
onComplete: function() {
this._spinner.actor.opacity = 255;
this._spinner.actor.hide();
}
});
},
startAnimation: function() {
this._direction = SPINNER_SPEED;
this._stopAnimation(false);
this._animationStep = 0;
this._update();
this._stop = false;
this._updateId = Mainloop.timeout_add(SPINNER_UPDATE_TIMEOUT, Lang.bind(this, this._update));
this._spinner.actor.show();
this._shadow.show();
},
_getContentPreferredWidth: function(actor, forHeight, alloc) {
@ -455,18 +415,13 @@ AppMenuButton.prototype = {
this._label.actor.allocate(childBox, flags);
if (direction == St.TextDirection.LTR) {
childBox.x1 = Math.floor(iconWidth / 2) + this._clipWidth + this._shadow.width;
childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width;
childBox.x2 = childBox.x1 + this._spinner.actor.width;
childBox.y1 = box.y1;
childBox.y2 = box.y2 - 1;
this._spinner.actor.allocate(childBox, flags);
childBox.x1 = Math.floor(iconWidth / 2) + this._clipWidth + 2;
childBox.x2 = childBox.x1 + this._shadow.width;
childBox.y1 = box.y1;
childBox.y2 = box.y2 - 1;
this._shadow.allocate(childBox, flags);
} else {
childBox.x1 = this._label.actor.width - this._clipWidth - this._spinner.actor.width;
childBox.x1 = -this._spinner.actor.width;
childBox.x2 = childBox.x1 + this._spinner.actor.width;
childBox.y1 = box.y1;
childBox.y2 = box.y2 - 1;
@ -545,8 +500,8 @@ AppMenuButton.prototype = {
this.stopAnimation();
return;
}
this._stopAnimation();
this._spinner.actor.hide();
if (this._iconBox.child != null)
this._iconBox.child.destroy();
this._iconBox.hide();
@ -751,6 +706,8 @@ HotCorner.prototype = {
x: x,
y: y });
ripple._opacity = startOpacity;
if (ripple.get_direction() == St.TextDirection.RTL)
ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
Tweener.addTween(ripple, { _opacity: finalOpacity,
scale_x: finalScale,
scale_y: finalScale,
@ -834,6 +791,8 @@ Panel.prototype = {
this.actor.remove_style_class_name('in-overview');
}));
this._leftPointerBarrier = 0;
this._rightPointerBarrier = 0;
this._menus = new PopupMenu.PopupMenuManager(this);
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
@ -1017,7 +976,7 @@ Panel.prototype = {
affectsStruts: false,
affectsInputRegion: false });
Main.ctrlAltTabManager.addGroup(this.actor, _("Panel"), 'start-here',
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
{ sortGroup: CtrlAltTab.SortGroup.TOP });
},
@ -1094,7 +1053,21 @@ Panel.prototype = {
let primary = global.get_primary_monitor();
this.actor.set_position(primary.x, primary.y);
this.actor.set_size(primary.width, PANEL_HEIGHT);
this.actor.set_size(primary.width, -1);
if (this._leftPointerBarrier)
global.destroy_pointer_barrier(this._leftPointerBarrier);
if (this._rightPointerBarrier)
global.destroy_pointer_barrier(this._rightPointerBarrier);
this._leftPointerBarrier =
global.create_pointer_barrier(primary.x, primary.y,
primary.x, primary.y + this.actor.height,
1 /* BarrierPositiveX */);
this._rightPointerBarrier =
global.create_pointer_barrier(primary.x + primary.width, primary.y,
primary.x + primary.width, primary.y + this.actor.height,
4 /* BarrierNegativeX */);
this._leftCorner.relayout();
this._rightCorner.relayout();

View File

@ -71,7 +71,7 @@ AuthenticationDialog.prototype = {
{ y_align: St.Align.START });
this._subjectLabel = new St.Label({ style_class: 'polkit-dialog-headline',
text: _('Authentication Required') });
text: _("Authentication Required") });
messageBox.add(this._subjectLabel,
{ y_fill: false,
@ -105,13 +105,9 @@ AuthenticationDialog.prototype = {
let userIsRoot = false;
if (userName == 'root') {
userIsRoot = true;
userRealName = _('Administrator');
userRealName = _("Administrator");
}
// Work around Gdm.UserManager returning an empty string for the real name
if (userRealName.length == 0)
userRealName = userName;
if (userIsRoot) {
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label',
text: userRealName }));
@ -143,7 +139,7 @@ AuthenticationDialog.prototype = {
this._passwordLabel = new St.Label(({ style_class: 'polkit-dialog-password-label' }));
this._passwordBox.add(this._passwordLabel);
this._passwordEntry = new St.Entry({ style_class: 'polkit-dialog-password-entry',
text: _(''),
text: "",
can_focus: true});
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
this._passwordBox.add(this._passwordEntry,
@ -173,11 +169,11 @@ AuthenticationDialog.prototype = {
messageBox.add(this._nullMessageLabel);
this._nullMessageLabel.show();
this.setButtons([{ label: _('Cancel'),
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape
},
{ label: _('Authenticate'),
{ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed)
}]);
@ -261,7 +257,7 @@ AuthenticationDialog.prototype = {
* show "Sorry, that didn't work. Please try again."
*/
if (!this._errorMessageLabel.visible && !this._wasDismissed) {
this._errorMessageLabel.set_text(_('Sorry, that didn\'t work. Please try again.'));
this._errorMessageLabel.set_text(_("Sorry, that didn\'t work. Please try again."));
this._errorMessageLabel.show();
this._infoMessageLabel.hide();
this._nullMessageLabel.hide();
@ -273,7 +269,7 @@ AuthenticationDialog.prototype = {
_onSessionRequest: function(session, request, echo_on) {
// Cheap localization trick
if (request == 'Password:')
this._passwordLabel.set_text(_('Password:'));
this._passwordLabel.set_text(_("Password:"));
else
this._passwordLabel.set_text(request);

View File

@ -173,6 +173,8 @@ PopupBaseMenuItem.prototype = {
cr.fill();
},
// This returns column widths in logical order (i.e. from the dot
// to the image), not in visual order (left to right)
getColumnWidths: function() {
let widths = [];
for (let i = 0, col = 0; i < this._children.length; i++) {
@ -224,19 +226,36 @@ PopupBaseMenuItem.prototype = {
_allocate: function(actor, box, flags) {
let height = box.y2 - box.y1;
let direction = this.actor.get_direction();
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);
dotBox.x1 = Math.round(box.x1 / 4);
dotBox.x2 = dotBox.x1 + dotWidth;
if (direction == St.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);
}
let x = box.x1;
let x;
if (direction == St.TextDirection.LTR)
x = box.x1;
else
x = box.x2;
// if direction is ltr, x is the right edge of the last added
// actor, and it's constantly increasing, whereas if rtl, x is
// the left edge and it decreases
for (let i = 0, col = 0; i < this._children.length; i++) {
let child = this._children[i];
let childBox = new Clutter.ActorBox();
@ -244,9 +263,12 @@ PopupBaseMenuItem.prototype = {
let [minWidth, naturalWidth] = child.actor.get_preferred_width(-1);
let availWidth, extraWidth;
if (this._columnWidths) {
if (child.span == -1)
availWidth = box.x2 - x;
else {
if (child.span == -1) {
if (direction == St.TextDirection.LTR)
availWidth = box.x2 - x;
else
availWidth = x - box.x1;
} else {
availWidth = 0;
for (let j = 0; j < child.span; j++)
availWidth += this._columnWidths[col++];
@ -257,18 +279,36 @@ PopupBaseMenuItem.prototype = {
extraWidth = 0;
}
if (child.expand) {
childBox.x1 = x;
childBox.x2 = x + availWidth;
} else if (child.align === St.Align.CENTER) {
childBox.x1 = x + Math.round(extraWidth / 2);
childBox.x2 = childBox.x1 + naturalWidth;
} else if (child.align === St.Align.END) {
childBox.x2 = x + availWidth;
childBox.x1 = childBox.x2 - naturalWidth;
if (direction == St.TextDirection.LTR) {
if (child.expand) {
childBox.x1 = x;
childBox.x2 = x + availWidth;
} else if (child.align === St.Align.CENTER) {
childBox.x1 = x + Math.round(extraWidth / 2);
childBox.x2 = childBox.x1 + naturalWidth;
} else if (child.align === St.Align.END) {
childBox.x2 = x + availWidth;
childBox.x1 = childBox.x2 - naturalWidth;
} else {
childBox.x1 = x;
childBox.x2 = x + naturalWidth;
}
} else {
childBox.x1 = x;
childBox.x2 = x + naturalWidth;
if (child.expand) {
childBox.x1 = x - availWidth;
childBox.x2 = x;
} else if (child.align === St.Align.CENTER) {
childBox.x1 = x - Math.round(extraWidth / 2);
childBox.x2 = childBox.x1 + naturalWidth;
} else if (child.align === St.Align.END) {
// align to the left
childBox.x1 = x - availWidth;
childBox.x2 = childBox.x1 + naturalWidth;
} else {
// align to the right
childBox.x2 = x;
childBox.x1 = x - naturalWidth;
}
}
let [minHeight, naturalHeight] = child.actor.get_preferred_height(-1);
@ -277,7 +317,10 @@ PopupBaseMenuItem.prototype = {
child.actor.allocate(childBox, flags);
x += availWidth + this._spacing;
if (direction == St.TextDirection.LTR)
x += availWidth + this._spacing;
else
x -= availWidth + this._spacing;
}
}
};
@ -724,6 +767,11 @@ PopupMenuBase.prototype = {
}
this.isOpen = false;
// If set, we don't send events (including crossing events) to the source actor
// for the menu which causes its prelight state to freeze
this.blockSourceEvents = false;
this._activeMenuItem = null;
},
@ -1331,14 +1379,20 @@ PopupMenuManager.prototype = {
return this._activeMenuContains(event.get_source());
},
_eventIsOnAnyMenuSource: function(event) {
_shouldBlockEvent: function(event) {
let src = event.get_source();
if (this._activeMenu != null && this._activeMenu.actor.contains(src))
return false;
for (let i = 0; i < this._menus.length; i++) {
let menu = this._menus[i].menu;
if (menu.sourceActor && menu.sourceActor.contains(src))
return true;
if (menu.sourceActor && !menu.blockSourceEvents && menu.sourceActor.contains(src)) {
return false;
}
}
return false;
return true;
},
_findMenu: function(item) {
@ -1370,7 +1424,7 @@ PopupMenuManager.prototype = {
} else if (eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains) {
this._closeMenu();
return true;
} else if (activeMenuContains || this._eventIsOnAnyMenuSource(event)) {
} else if (!this._shouldBlockEvent(event)) {
return false;
}

View File

@ -22,6 +22,9 @@ const MAX_FILE_DELETED_BEFORE_INVALID = 10;
const HISTORY_KEY = 'command-history';
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const DISABLE_COMMAND_LINE_KEY = 'disable-command-line';
const DIALOG_GROW_TIME = 0.1;
function CommandCompleter() {
@ -167,6 +170,7 @@ __proto__: ModalDialog.ModalDialog.prototype,
_init : function() {
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'run-dialog' });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
this._enableInternalCommands = global.settings.get_boolean('development-tools');
}));
@ -206,10 +210,7 @@ __proto__: ModalDialog.ModalDialog.prototype,
this._entryText = entry.clutter_text;
this.contentLayout.add(entry, { y_align: St.Align.START });
this.connect('opened',
Lang.bind(this, function() {
this._entryText.grab_key_focus();
}));
this.setInitialKeyFocus(this._entryText);
this._errorBox = new St.BoxLayout({ style_class: 'run-dialog-error-box' });
@ -239,15 +240,21 @@ __proto__: ModalDialog.ModalDialog.prototype,
this._entryText.connect('key-press-event', Lang.bind(this, function(o, e) {
let symbol = e.get_key_symbol();
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
this.popModal();
if (Shell.get_event_state(e) & Clutter.ModifierType.CONTROL_MASK)
this._run(o.get_text(), true);
else
this._run(o.get_text(), false);
if (!this._commandError)
this.close(global.get_current_time());
this.close();
else {
if (!this.pushModal())
this.close();
}
return true;
}
if (symbol == Clutter.Escape) {
this.close(global.get_current_time());
this.close();
return true;
}
if (symbol == Clutter.slash) {
@ -353,6 +360,9 @@ __proto__: ModalDialog.ModalDialog.prototype,
this._entryText.set_text('');
this._commandError = false;
if (this._lockdownSettings.get_boolean(DISABLE_COMMAND_LINE_KEY))
return;
ModalDialog.ModalDialog.prototype.open.call(this);
},

View File

@ -5,6 +5,7 @@ const Lang = imports.lang;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const St = imports.gi.St;
const DND = imports.ui.dnd;
@ -49,6 +50,10 @@ SearchResult.prototype = {
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
draggable.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledItemDrag(this);
}));
draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
@ -100,8 +105,30 @@ GridSearchResults.prototype = {
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
this.actor = new St.Bin({ x_align: St.Align.START });
this.actor.set_child(this._grid.actor);
this.selectionIndex = -1;
this._width = 0;
this.actor.connect('notify::width', Lang.bind(this, function() {
this._width = this.actor.width;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._tryAddResults();
}));
}));
this._notDisplayedResult = [];
this._terms = [];
},
_tryAddResults: function() {
let canDisplay = this._grid.childrenInRow(this._width) * MAX_SEARCH_RESULTS_ROWS
- this._grid.visibleItemsCount();
for (let i = Math.min(this._notDisplayedResult.length, canDisplay); i > 0; i--) {
let result = this._notDisplayedResult.shift();
let meta = this.provider.getResultMeta(result);
let display = new SearchResult(this.provider, meta, this._terms);
this._grid.addItem(display.actor);
}
},
getVisibleResultCount: function() {
@ -109,15 +136,15 @@ GridSearchResults.prototype = {
},
renderResults: function(results, terms) {
for (let i = 0; i < results.length; i++) {
let result = results[i];
let meta = this.provider.getResultMeta(result);
let display = new SearchResult(this.provider, meta, terms);
this._grid.addItem(display.actor);
}
// copy the lists
this._notDisplayedResult = results.slice(0);
this._terms = terms.slice(0);
this._tryAddResults();
},
clear: function () {
this._terms = [];
this._notDisplayedResult = [];
this._grid.removeAll();
this.selectionIndex = -1;
},

View File

@ -66,13 +66,13 @@ ATIndicator.prototype = {
let textZoom = this._buildFontItem();
this.menu.addMenuItem(textZoom);
let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
'screen-reader-enabled');
this.menu.addMenuItem(screenReader);
// let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
// 'screen-reader-enabled');
// this.menu.addMenuItem(screenReader);
let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
'screen-keyboard-enabled');
this.menu.addMenuItem(screenKeyboard);
// let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
// 'screen-keyboard-enabled');
// this.menu.addMenuItem(screenKeyboard);
let visualBell = this._buildItemGConf(_("Visual Alerts"), client, KEY_VISUAL_BELL);
this.menu.addMenuItem(visualBell);
@ -91,7 +91,8 @@ ATIndicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Universal Access Settings"), function() {
Util.spawnDesktop('gnome-universal-access-panel');
let app = Shell.AppSystem.get_default().get_app('gnome-universal-access-panel.desktop');
app.activate(-1);
});
},

View File

@ -93,7 +93,8 @@ Indicator.prototype = {
this._updateFullMenu();
this.menu.addAction(_("Bluetooth Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center bluetooth');
let app = Shell.AppSystem.get_default().get_app('bluetooth-properties.desktop');
app.activate(-1);
});
this._applet.connect('pincode-request', Lang.bind(this, this._pinRequest));
@ -136,6 +137,7 @@ Indicator.prototype = {
_updateDevices: function() {
let devices = this._applet.get_devices();
let newlist = [ ];
for (let i = 0; i < this._deviceItems.length; i++) {
let item = this._deviceItems[i];
let destroy = true;
@ -143,26 +145,20 @@ Indicator.prototype = {
// we need to deep compare because BluetoothSimpleDevice is a boxed type
// (but we take advantage of that, because _skip will disappear the next
// time get_devices() is called)
if (this._deviceCompare(item._device, devices[i])) {
item.label.text = devices[i].alias;
devices[i]._skip = true;
if (this._deviceCompare(item._device, devices[j])) {
item.label.text = devices[j].alias;
devices[j]._skip = true;
destroy = false;
break;
}
}
if (destroy) {
if (destroy)
item.destroy();
item._destroyed = true;
}
}
let newlist = [ ];
for (let i = 0; i < this._deviceItems.length; i++) {
let item = this._deviceItems[i];
if (!item._destroyed)
else
newlist.push(item);
}
this._deviceItems = newlist;
this._deviceItems = newlist;
this._hasDevices = newlist.length > 0;
for (let i = 0; i < devices.length; i++) {
let d = devices[i];

View File

@ -74,7 +74,8 @@ XKBIndicator.prototype = {
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
}));
this.menu.addAction(_("Localization Settings"), function() {
Util.spawn(['gnome-control-center', 'region']);
let app = Shell.AppSystem.get_default().get_app('gnome-region-panel.desktop');
app.activate(-1);
});
},

2107
js/ui/status/network.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -83,7 +83,8 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Power Settings"),function() {
Util.spawnDesktop('gnome-power-panel');
let app = Shell.AppSystem.get_default().get_app('gnome-power-panel.desktop');
app.activate(-1);
});
this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged));

View File

@ -64,7 +64,8 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Sound Settings"), function() {
Util.spawnDesktop('gnome-sound-panel');
let app = Shell.AppSystem.get_default().get_app('gnome-sound-panel.desktop');
app.activate(-1);
});
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));

View File

@ -2,6 +2,7 @@
const Gdm = imports.gi.Gdm;
const DBus = imports.dbus;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
@ -20,6 +21,11 @@ const Util = imports.misc.util;
const BUS_NAME = 'org.gnome.ScreenSaver';
const OBJECT_PATH = '/org/gnome/ScreenSaver';
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const ScreenSaverInterface = {
name: BUS_NAME,
methods: [ { name: 'Lock', inSignature: '' } ]
@ -44,6 +50,8 @@ StatusMenuButton.prototype = {
let box = new St.BoxLayout({ name: 'panelStatusMenu' });
this.actor.set_child(box);
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._gdm = Gdm.UserManager.ref_default();
this._gdm.queue_load();
@ -79,6 +87,15 @@ StatusMenuButton.prototype = {
this._gdm.connect('notify::is-loaded', Lang.bind(this, this._updateSwitchUser));
this._gdm.connect('user-added', Lang.bind(this, this._updateSwitchUser));
this._gdm.connect('user-removed', Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
Lang.bind(this, this._updateLogout));
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
Lang.bind(this, this._updateLockScreen));
this._updateSwitchUser();
this._updateLogout();
this._updateLockScreen();
this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff));
},
@ -95,11 +112,41 @@ StatusMenuButton.prototype = {
this._name.set_text("");
},
_updateSessionSeparator: function() {
let showSeparator = this._loginScreenItem.actor.visible ||
this._logoutItem.actor.visible ||
this._lockScreenItem.actor.visible;
if (showSeparator)
this._sessionSeparator.actor.show();
else
this._sessionSeparator.actor.hide();
},
_updateSwitchUser: function() {
if (this._gdm.can_switch ())
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
if (allowSwitch && this._gdm.can_switch ())
this._loginScreenItem.actor.show();
else
this._loginScreenItem.actor.hide();
this._updateSessionSeparator();
},
_updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
if (allowLogout)
this._logoutItem.actor.show();
else
this._logoutItem.actor.hide();
this._updateSessionSeparator();
},
_updateLockScreen: function() {
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
if (allowLockScreen)
this._lockScreenItem.actor.show();
else
this._lockScreenItem.actor.hide();
this._updateSessionSeparator();
},
_updateSuspendOrPowerOff: function() {
@ -113,7 +160,7 @@ StatusMenuButton.prototype = {
if (!this._haveSuspend) {
this._suspendOrPowerOffItem.updateText(_("Power Off..."), null);
} else {
this._suspendOrPowerOffItem.updateText(_("Suspend"), ("Power Off..."));
this._suspendOrPowerOffItem.updateText(_("Suspend"), _("Power Off..."));
}
},
@ -161,6 +208,7 @@ StatusMenuButton.prototype = {
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
this.menu.addMenuItem(item);
this._lockScreenItem = item;
item = new PopupMenu.PopupMenuItem(_("Switch User"));
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
@ -170,9 +218,11 @@ StatusMenuButton.prototype = {
item = new PopupMenu.PopupMenuItem(_("Log Out..."));
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
this.menu.addMenuItem(item);
this._logoutItem = item;
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
this._sessionSeparator = item;
item = new PopupMenu.PopupAlternatingMenuItem(_("Suspend"),
_("Power Off..."));
@ -190,12 +240,14 @@ StatusMenuButton.prototype = {
_onMyAccountActivate: function() {
Main.overview.hide();
Util.spawnDesktop('gnome-user-accounts-panel');
let app = Shell.AppSystem.get_default().get_app('gnome-user-accounts-panel.desktop');
app.activate(-1);
},
_onPreferencesActivate: function() {
Main.overview.hide();
Util.spawnDesktop('gnome-control-center');
let app = Shell.AppSystem.get_default().get_app('gnome-control-center.desktop');
app.activate(-1);
},
_onLockScreenActivate: function() {

View File

@ -7,10 +7,12 @@ const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Tpl = imports.gi.TelepathyLogger;
const Tp = imports.gi.TelepathyGLib;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const History = imports.misc.history;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
@ -21,6 +23,9 @@ const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
const SCROLLBACK_RECENT_LENGTH = 20;
const SCROLLBACK_IDLE_LENGTH = 5;
// See Source._displayPendingMessages
const SCROLLBACK_HISTORY_LINES = 10;
const NotificationDirection = {
SENT: 'chat-sent',
RECEIVED: 'chat-received'
@ -35,6 +40,31 @@ let contactFeatures = [Tp.ContactFeature.ALIAS,
// lets us see messages even if they belong to another app (eg,
// Empathy).
function makeMessageFromTpMessage(tpMessage, direction) {
let [text, flags] = tpMessage.to_text();
return {
messageType: tpMessage.get_message_type(),
text: text,
sender: tpMessage.sender.alias,
timestamp: tpMessage.get_received_timestamp(),
direction: direction
};
}
function makeMessageFromTplEvent(event) {
let sent = event.get_sender().get_entity_type() == Tpl.EntityType.SELF;
let direction = sent ? NotificationDirection.SENT : NotificationDirection.RECEIVED;
return {
messageType: event.get_message_type(),
text: event.get_message(),
sender: event.get_sender().get_alias(),
timestamp: event.get_timestamp(),
direction: direction
};
}
function Client() {
this._init();
};
@ -67,7 +97,22 @@ Client.prototype = {
_observeChannels: function(observer, account, conn, channels,
dispatchOp, requests, context) {
let connPath = conn.get_object_path();
// If the self_contact doesn't have the ALIAS, make sure
// to fetch it before trying to grab the channels.
let self_contact = conn.get_self_contact();
if (self_contact.has_feature(Tp.ContactFeature.ALIAS)) {
this._finishObserveChannels(account, conn, channels, context);
} else {
Shell.get_self_contact_features(conn,
contactFeatures.length, contactFeatures,
Lang.bind(this, function() {
this._finishObserveChannels(account, conn, channels, context);
}));
context.delay();
}
},
_finishObserveChannels: function(account, conn, channels, context) {
let len = channels.length;
for (let i = 0; i < len; i++) {
let channel = channels[i];
@ -90,7 +135,6 @@ Client.prototype = {
}), null);
}
// Allow dbus method to return
context.accept();
},
@ -116,7 +160,7 @@ Source.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(account, conn, channel, contact) {
MessageTray.Source.prototype._init.call(this, channel.get_identifier());
MessageTray.Source.prototype._init.call(this, contact.get_alias());
this.isChat = true;
@ -127,8 +171,6 @@ Source.prototype = {
this._channel = channel;
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
this._updateAlias();
this._notification = new Notification(this);
this._notification.setUrgency(MessageTray.Urgency.HIGH);
@ -143,11 +185,18 @@ Source.prototype = {
this._notifyAvatarId = this._contact.connect('notify::avatar-file', Lang.bind(this, this._updateAvatarIcon));
this._presenceChangedId = this._contact.connect('presence-changed', Lang.bind(this, this._presenceChanged));
this._displayPendingMessages();
// Add ourselves as a source.
Main.messageTray.add(this);
this.pushNotification(this._notification);
this._getLogMessages();
},
_updateAlias: function() {
let oldAlias = this.title;
this.title = this._contact.get_alias();
this._notification.appendAliasChange(oldAlias, this.title);
this.pushNotification(this._notification);
},
createNotificationIcon: function() {
@ -183,13 +232,50 @@ Source.prototype = {
req.ensure_channel_async('', null, null);
},
_displayPendingMessages: function() {
let msgs = this._channel.get_pending_messages();
_getLogMessages: function() {
let logManager = Tpl.LogManager.dup_singleton();
let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT);
Shell.get_contact_events(logManager,
this._account, entity,
SCROLLBACK_HISTORY_LINES,
Lang.bind(this, this._displayPendingMessages));
},
for (let i = 0; i < msgs.length; i++) {
let msg = msgs[i];
this._messageReceived(this._channel, msg);
_displayPendingMessages: function(logManager, result) {
let [success, events] = logManager.get_filtered_events_finish(result);
let logMessages = events.map(makeMessageFromTplEvent);
for (let i = 0; i < logMessages.length; i++) {
this._notification.appendMessage(logMessages[i], true);
}
let pendingMessages = this._channel.get_pending_messages();
let hasPendingMessage = false;
for (let i = 0; i < pendingMessages.length; i++) {
let message = makeMessageFromTpMessage(pendingMessages[i], NotificationDirection.RECEIVED);
// Skip any pending messages that are in the logs.
let inLog = false;
for (let j = 0; j < logMessages.length; j++) {
let logMessage = logMessages[j];
if (logMessage.timestamp == message.timestamp && logMessage.text == message.body) {
inLog = true;
}
}
if (inLog)
continue;
this._notification.appendMessage(message, true);
hasPendingMessage = true;
}
// Only show the timestamp if we have at least one message.
if (hasPendingMessage || logMessages.length > 0)
this._notification.appendTimestamp();
if (hasPendingMessage)
this.notify();
},
_channelClosed: function() {
@ -205,25 +291,32 @@ Source.prototype = {
},
_messageReceived: function(channel, message) {
this._notification.appendMessage(message, NotificationDirection.RECEIVED);
message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED);
this._notification.appendMessage(message);
this.notify();
},
// This is called for both messages we send from
// our client and other clients as well.
_messageSent: function(channel, message, flags, token) {
this._notification.appendMessage(message, NotificationDirection.SENT);
message = makeMessageFromTpMessage(message, NotificationDirection.SENT);
this._notification.appendMessage(message);
},
notify: function() {
if (!Main.messageTray.contains(this))
Main.messageTray.add(this);
MessageTray.Source.prototype.notify.call(this, this._notification);
},
respond: function(text) {
let msg = Tp.ClientMessage.new_text(Tp.ChannelTextMessageType.NORMAL, text);
let type;
if (text.slice(0, 4) == '/me ') {
type = Tp.ChannelTextMessageType.ACTION;
text = text.slice(4);
} else {
type = Tp.ChannelTextMessageType.NORMAL;
}
let msg = Tp.ClientMessage.new_text(type, text);
this._channel.send_message_async(msg, 0, null);
},
@ -289,19 +382,40 @@ Notification.prototype = {
this._oldMaxScrollAdjustment = adjustment.upper;
}));
this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text });
this._history = [];
this._timestampTimeoutId = 0;
},
appendMessage: function(message, direction) {
let [text, flags] = message.to_text();
let timestamp = message.get_received_timestamp();
/**
* appendMessage:
* @message: An object with the properties:
* text: the body of the message,
* messageType: a #Tp.ChannelTextMessageType,
* sender: the name of the sender,
* timestamp: the time the message was sent
* direction: a #NotificationDirection
*
* @noTimestamp: Whether to add a timestamp. If %true, no timestamp
* will be added, regardless of the difference since the
* last timestamp
*/
appendMessage: function(message, noTimestamp) {
let messageBody = GLib.markup_escape_text(message.text, -1);
let styles = [message.direction];
this.update(this.source.title, text, { customContent: true });
this._append(text, direction, timestamp);
if (message.messageType == Tp.ChannelTextMessageType.ACTION) {
let senderAlias = GLib.markup_escape_text(message.sender, -1);
messageBody = '<i>%s</i> %s'.format(senderAlias, messageBody);
styles.push('chat-action');
}
this.update(this.source.title, messageBody, { customContent: true, bannerMarkup: true });
this._append(messageBody, styles, message.timestamp, noTimestamp);
},
_append: function(text, style, timestamp) {
_append: function(text, styles, timestamp, noTimestamp) {
let currentTime = (Date.now() / 1000);
if (!timestamp)
timestamp = currentTime;
@ -313,19 +427,22 @@ Notification.prototype = {
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
let body = this.addBody(text);
body.add_style_class_name(style);
let body = this.addBody(text, true);
for (let i = 0; i < styles.length; i ++)
body.add_style_class_name(styles[i]);
this._history.unshift({ actor: body, time: timestamp, realMessage: true });
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME)
this._appendTimestamp();
else
// Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME
// from the timestamp of the message.
this._timestampTimeoutId = Mainloop.timeout_add_seconds(
SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp),
Lang.bind(this, this._appendTimestamp));
if (!noTimestamp) {
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME)
this.appendTimestamp();
else
// Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME
// from the timestamp of the message.
this._timestampTimeoutId = Mainloop.timeout_add_seconds(
SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp),
Lang.bind(this, this.appendTimestamp));
}
if (this._history.length > 1) {
// Keep the scrollback from growing too long. If the most
@ -346,7 +463,7 @@ Notification.prototype = {
}
},
_appendTimestamp: function() {
appendTimestamp: function() {
let lastMessageTime = this._history[0].time;
let lastMessageDate = new Date(lastMessageTime * 1000);
@ -372,11 +489,28 @@ Notification.prototype = {
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
},
appendAliasChange: function(oldAlias, newAlias) {
// FIXME: uncomment this after 3.0 string freeze ends
// oldAlias = GLib.markup_escape_text(oldAlias, -1);
// newAlias = GLib.markup_escape_text(newAlias, -1);
// /* Translators: this is the other person changing their old IM name to their new
// IM name. */
// let message = '<i>' + _("%s is now known as %s").format(oldAlias, newAlias) + '</i>';
// let label = this.addBody(message, true);
// label.add_style_class_name('chat-meta-message');
// this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false });
// this.update(newAlias, null, { customContent: true });
},
_onEntryActivated: function() {
let text = this._responseEntry.get_text();
if (text == '')
return;
this._inputHistory.addItem(text);
// Telepathy sends out the Sent signal for us.
// see Source._messageSent
this._responseEntry.set_text('');

View File

@ -41,11 +41,14 @@ BaseTab.prototype = {
this.visible = false;
},
show: function() {
show: function(animate) {
this.visible = true;
this.page.opacity = 0;
this.page.show();
if (!animate)
return;
this.page.opacity = 0;
Tweener.addTween(this.page,
{ opacity: 255,
time: 0.1,
@ -393,6 +396,8 @@ ViewSelector.prototype = {
},
_switchTab: function(tab) {
let firstSwitch = this._activeTab == null;
if (this._activeTab && this._activeTab.visible) {
if (this._activeTab == tab)
return;
@ -408,11 +413,13 @@ ViewSelector.prototype = {
}
}
// Only fade when switching between tabs,
// not when setting the initially selected one.
if (!tab.visible)
tab.show();
tab.show(!firstSwitch);
// Pull a Meg Ryan:
if (Main.overview && Main.overview.workspaces) {
if (!firstSwitch && Main.overview.workspaces) {
if (tab != this._tabs[0]) {
Tweener.addTween(Main.overview.workspaces.actor,
{ opacity: 0,

View File

@ -123,11 +123,11 @@ WindowManager.prototype = {
Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
this._undimParentWindow(this._dimmedWindows[i], true);
this._undimWindow(this._dimmedWindows[i], true);
}));
Main.overview.connect('hiding', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
this._dimParentWindow(this._dimmedWindows[i], true);
this._dimWindow(this._dimmedWindows[i], true);
}));
},
@ -234,41 +234,39 @@ WindowManager.prototype = {
_unmaximizeWindowDone : function(shellwm, actor) {
},
_parentHasOtherAttachedDialog: function(parent, self) {
_hasAttachedDialogs: function(window, ignoreWindow) {
var count = 0;
parent.foreach_transient(function(win) {
if (win.get_window_type() == Meta.WindowType.MODAL_DIALOG && win != self)
window.foreach_transient(function(win) {
if (win != ignoreWindow && win.get_window_type() == Meta.WindowType.MODAL_DIALOG)
count++;
return false;
});
return count != 0;
},
_markParentWindowAsDimmable: function(actor, animate) {
if (Meta.prefs_get_attach_modal_dialogs()) {
this._dimmedWindows.push(actor);
if (this._shouldAnimate())
this._dimParentWindow(actor, animate);
_checkDimming: function(window, ignoreWindow) {
let shouldDim = Meta.prefs_get_attach_modal_dialogs() && this._hasAttachedDialogs(window, ignoreWindow);
if (shouldDim && !window._dimmed) {
window._dimmed = true;
this._dimmedWindows.push(window);
if (!Main.overview.visible)
this._dimWindow(window, true);
} else if (!shouldDim && window._dimmed) {
window._dimmed = false;
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
return win != window;
});
if (!Main.overview.visible)
this._undimWindow(window, true);
}
},
_unmarkParentWindowAsDimmable: function(actor, animate) {
if (!Main.overview.visible)
this._undimParentWindow(actor, true);
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
return win != actor;
});
},
_dimParentWindow: function(actor, animate) {
let meta = actor.get_meta_window();
let parent = meta.get_transient_for();
if (!parent)
_dimWindow: function(window, animate) {
let actor = window.get_compositor_private();
if (!actor)
return;
let parentActor = parent.get_compositor_private();
if (!parentActor || this._parentHasOtherAttachedDialog(parent, meta))
return;
let texture = parentActor.get_texture();
let texture = actor.get_texture();
if (animate)
Tweener.addTween(getWindowDimmer(texture),
{ dimFraction: 1.0,
@ -279,15 +277,11 @@ WindowManager.prototype = {
getWindowDimmer(texture).dimFraction = 1.0;
},
_undimParentWindow: function(actor, animate) {
let meta = actor.get_meta_window();
let parent = meta.get_transient_for();
if (!parent)
_undimWindow: function(window, animate) {
let actor = window.get_compositor_private();
if (!actor)
return;
let parentActor = parent.get_compositor_private();
if (!parentActor || this._parentHasOtherAttachedDialog(parent, meta))
return;
let texture = parentActor.get_texture();
let texture = actor.get_texture();
if (animate)
Tweener.addTween(getWindowDimmer(texture),
{ dimFraction: 0.0,
@ -304,17 +298,19 @@ WindowManager.prototype = {
let type = actor.meta_window.get_window_type();
if (type == actor._windowType)
return;
if (type == Meta.WindowType.MODAL_DIALOG)
this._markParentWindowAsDimmable(actor, true);
else if (actor._windowType == Meta.WindowType.MODAL_DIALOG)
this._unmarkParentWindowAsDimmable(actor, true);
if (type == Meta.WindowType.MODAL_DIALOG ||
actor._windowType == Meta.WindowType.MODAL_DIALOG) {
let parent = actor.get_meta_window().get_transient_for();
if (parent)
this._checkDimming(parent);
}
actor._windowType = type;
}));
if (actor.meta_window.get_window_type() == Meta.WindowType.MODAL_DIALOG
&& Meta.prefs_get_attach_modal_dialogs()
&& actor.get_meta_window().get_transient_for()) {
this._markParentWindowAsDimmable(actor, true);
this._checkDimming(actor.get_meta_window().get_transient_for());
if (this._shouldAnimate()) {
actor.set_scale(1.0, 0.0);
actor.show();
@ -374,14 +370,20 @@ WindowManager.prototype = {
},
_destroyWindow : function(shellwm, actor) {
let parent = actor.meta_window.get_transient_for();
let window = actor.meta_window;
let parent = window.get_transient_for();
if (actor._notifyWindowTypeSignalId) {
actor.meta_window.disconnect(actor._notifyWindowTypeSignalId);
window.disconnect(actor._notifyWindowTypeSignalId);
actor._notifyWindowTypeSignalId = 0;
}
while (actor.meta_window.get_window_type() == Meta.WindowType.MODAL_DIALOG
if (window._dimmed) {
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
return win != window;
});
}
while (window.get_window_type() == Meta.WindowType.MODAL_DIALOG
&& parent) {
this._unmarkParentWindowAsDimmable(actor, true);
this._checkDimming(parent, window);
if (!Meta.prefs_get_attach_modal_dialogs()
|| !this._shouldAnimate())
break;

View File

@ -221,8 +221,15 @@ WindowClone.prototype = {
let [width, height] = this.actor.get_transformed_size();
this.actor.x = _clamp(this.actor.x, 0, global.screen_width - width);
this.actor.y = _clamp(this.actor.y, Panel.PANEL_HEIGHT, global.screen_height - height);
let monitorIndex = this.metaWindow.get_monitor();
let availArea = global.get_monitors()[monitorIndex];
if (monitorIndex == global.get_primary_monitor_index()) {
availArea.y += Main.panel.actor.height;
availArea.height -= Main.panel.actor.height;
}
this.actor.x = _clamp(this.actor.x, availArea.x, availArea.x + availArea.width - width);
this.actor.y = _clamp(this.actor.y, availArea.y, availArea.y + availArea.height - height);
},
_zoomStart : function () {
@ -387,12 +394,6 @@ WindowOverlay.prototype = {
show: function() {
this._hidden = false;
let [x, y, mask] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
x, y);
if (actor == this._windowClone.actor) {
this.closeButton.show();
}
this.title.show();
},
@ -541,14 +542,14 @@ const WindowPositionFlags = {
};
/**
* @metaWorkspace: a #Meta.Workspace
* @metaWorkspace: a #Meta.Workspace, or null
*/
function Workspace(metaWorkspace) {
this._init(metaWorkspace);
function Workspace(metaWorkspace, monitorIndex) {
this._init(metaWorkspace, monitorIndex);
}
Workspace.prototype = {
_init : function(metaWorkspace) {
_init : function(metaWorkspace, monitorIndex) {
// When dragging a window, we use this slot for reserve space.
this._reservedSlot = null;
this.metaWorkspace = metaWorkspace;
@ -557,6 +558,8 @@ Workspace.prototype = {
this._width = 0;
this._height = 0;
this.monitorIndex = monitorIndex;
this._monitor = global.get_monitors()[this.monitorIndex];
this._windowOverlaysGroup = new Clutter.Group();
// Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0);
@ -572,7 +575,7 @@ Workspace.prototype = {
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
let windows = Main.getWindowActorsForWorkspace(this.metaWorkspace.index());
let windows = global.get_window_actors().filter(this._isMyWindow, this);
// Create clones for windows that should be
// visible in the Overview
@ -585,10 +588,16 @@ Workspace.prototype = {
}
// Track window changes
this._windowAddedId = this.metaWorkspace.connect('window-added',
Lang.bind(this, this._windowAdded));
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
Lang.bind(this, this._windowRemoved));
if (this.metaWorkspace) {
this._windowAddedId = this.metaWorkspace.connect('window-added',
Lang.bind(this, this._windowAdded));
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
Lang.bind(this, this._windowRemoved));
}
this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
Lang.bind(this, this._windowEnteredMonitor));
this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
Lang.bind(this, this._windowLeftMonitor));
this._repositionWindowsId = 0;
this.leavingOverview = false;
@ -896,7 +905,7 @@ Workspace.prototype = {
clones = this._orderWindowsByMotionAndStartup(clones, slots);
let currentWorkspace = global.screen.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == currentWorkspace;
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
for (let i = 0; i < clones.length; i++) {
let slot = slots[i];
@ -999,7 +1008,8 @@ Workspace.prototype = {
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
let overlay = this._windowOverlays[i];
this._showWindowOverlay(clone, overlay, this.metaWorkspace == currentWorkspace);
this._showWindowOverlay(clone, overlay,
this.metaWorkspace == null || this.metaWorkspace == currentWorkspace);
}
},
@ -1036,7 +1046,7 @@ Workspace.prototype = {
this._windowOverlaysGroup.hide();
},
_windowRemoved : function(metaWorkspace, metaWin) {
_doRemoveWindow : function(metaWin) {
let win = metaWin.get_compositor_private();
// find the position of the window in our list
@ -1045,6 +1055,10 @@ Workspace.prototype = {
if (index == -1)
return;
// Check if window still should be here
if (win && this._isMyWindow(win))
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
@ -1088,7 +1102,7 @@ Workspace.prototype = {
Lang.bind(this, this._delayedWindowRepositioning));
},
_windowAdded : function(metaWorkspace, metaWin) {
_doAddWindow : function(metaWin) {
if (this.leavingOverview)
return;
@ -1100,13 +1114,18 @@ Workspace.prototype = {
Mainloop.idle_add(Lang.bind(this,
function () {
if (this.actor && metaWin.get_compositor_private())
this._windowAdded(metaWorkspace, metaWin);
this._doAddWindow(metaWin);
return false;
}));
return;
}
if (!this._isOverviewWindow(win))
// We might have the window in our list already if it was on all workspaces and
// now was moved to this workspace
if (this._lookupIndex (metaWin) != -1)
return;
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
return;
let clone = this._addWindowClone(win);
@ -1131,6 +1150,26 @@ Workspace.prototype = {
this.positionWindows(WindowPositionFlags.ANIMATE);
},
_windowAdded : function(metaWorkspace, metaWin) {
this._doAddWindow(metaWin);
},
_windowRemoved : function(metaWorkspace, metaWin) {
this._doRemoveWindow(metaWin);
},
_windowEnteredMonitor : function(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin);
}
},
_windowLeftMonitor : function(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin);
}
},
// check for maximized windows on the workspace
hasMaximizedWindows: function() {
for (let i = 0; i < this._windows.length; i++) {
@ -1167,7 +1206,7 @@ Workspace.prototype = {
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
this._doneLeavingOverview));
if (this.metaWorkspace != currentWorkspace)
if (this.metaWorkspace != null && this.metaWorkspace != currentWorkspace)
return;
// Position and scale the windows.
@ -1211,8 +1250,12 @@ Workspace.prototype = {
}
Tweener.removeTweens(actor);
this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId);
if (this.metaWorkspace) {
this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId);
}
global.screen.disconnect(this._windowEnteredMonitorId);
global.screen.disconnect(this._windowLeftMonitorId);
if (this._repositionWindowsId > 0)
Mainloop.source_remove(this._repositionWindowsId);
@ -1231,9 +1274,10 @@ Workspace.prototype = {
this.leavingOverview = false;
},
// Tests if @win belongs to this workspaces
// Tests if @win belongs to this workspaces and monitor
_isMyWindow : function (win) {
return Main.isWindowActorDisplayedOnWorkspace(win, this.metaWorkspace.index());
return (this.metaWorkspace == null || Main.isWindowActorDisplayedOnWorkspace(win, this.metaWorkspace.index())) &&
(!win.get_meta_window() || win.get_meta_window().get_monitor() == this.monitorIndex);
},
// Tests if @win should be shown in the Overview
@ -1321,8 +1365,10 @@ Workspace.prototype = {
},
_onCloneSelected : function (clone, time) {
Main.activateWindow(clone.metaWindow, time,
this.metaWorkspace.index());
let wsIndex = undefined;
if (this.metaWorkspace)
wsIndex = this.metaWorkspace.index();
Main.activateWindow(clone.metaWindow, time, wsIndex);
},
// Draggable target interface
@ -1350,7 +1396,15 @@ Workspace.prototype = {
};
let metaWindow = win.get_meta_window();
metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
// We need to move the window before changing the workspace, because
// the move itself could cause a workspace change if the window enters
// the primary monitor
if (metaWindow.get_monitor() != this.monitorIndex)
metaWindow.move_to_monitor(this.monitorIndex);
let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index();
metaWindow.change_workspace_by_index(index,
false, // don't create workspace
time);
return true;

View File

@ -146,6 +146,7 @@ function WorkspaceThumbnail(metaWorkspace) {
WorkspaceThumbnail.prototype = {
_init : function(metaWorkspace) {
this.metaWorkspace = metaWorkspace;
this.monitorIndex = global.get_primary_monitor_index();
this.actor = new St.Group({ reactive: true,
clip_to_allocation: true,
@ -169,7 +170,8 @@ WorkspaceThumbnail.prototype = {
this._background = new Clutter.Clone({ source: global.background_actor });
this._contents.add_actor(this._background);
this.setPorthole(0, 0, global.screen_width, global.screen_height);
let monitor = global.get_primary_monitor();
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
let windows = global.get_window_actors().filter(this._isMyWindow, this);
@ -186,6 +188,10 @@ WorkspaceThumbnail.prototype = {
Lang.bind(this, this._windowAdded));
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
Lang.bind(this, this._windowRemoved));
this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
Lang.bind(this, this._windowEnteredMonitor));
this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
Lang.bind(this, this._windowLeftMonitor));
this.state = ThumbnailState.NORMAL;
this._slidePosition = 0; // Fully slid in
@ -193,6 +199,8 @@ WorkspaceThumbnail.prototype = {
},
setPorthole: function(x, y, width, height) {
this._portholeX = x;
this._portholeY = y;
this.actor.set_size(width, height);
this._contents.set_position(-x, -y);
},
@ -239,7 +247,7 @@ WorkspaceThumbnail.prototype = {
return this._collapseFraction;
},
_windowRemoved : function(metaWorkspace, metaWin) {
_doRemoveWindow : function(metaWin) {
let win = metaWin.get_compositor_private();
// find the position of the window in our list
@ -248,12 +256,16 @@ WorkspaceThumbnail.prototype = {
if (index == -1)
return;
// Check if window still should be here
if (win && this._isMyWindow(win))
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
clone.destroy();
},
_windowAdded : function(metaWorkspace, metaWin) {
_doAddWindow : function(metaWin) {
if (this.leavingOverview)
return;
@ -265,18 +277,43 @@ WorkspaceThumbnail.prototype = {
Mainloop.idle_add(Lang.bind(this,
function () {
if (this.actor && metaWin.get_compositor_private())
this._windowAdded(metaWorkspace, metaWin);
this._doAddWindow(metaWin);
return false;
}));
return;
}
if (!this._isOverviewWindow(win))
// We might have the window in our list already if it was on all workspaces and
// now was moved to this workspace
if (this._lookupIndex (metaWin) != -1)
return;
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
return;
let clone = this._addWindowClone(win);
},
_windowAdded : function(metaWorkspace, metaWin) {
this._doAddWindow(metaWin);
},
_windowRemoved : function(metaWorkspace, metaWin) {
this._doRemoveWindow(metaWin);
},
_windowEnteredMonitor : function(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin);
}
},
_windowLeftMonitor : function(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin);
}
},
destroy : function() {
this.actor.destroy();
},
@ -284,15 +321,17 @@ WorkspaceThumbnail.prototype = {
_onDestroy: function(actor) {
this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId);
global.screen.disconnect(this._windowEnteredMonitorId);
global.screen.disconnect(this._windowLeftMonitorId);
this._windows = [];
this.actor = null;
},
// Tests if @win belongs to this workspaces
// Tests if @win belongs to this workspace and monitor
_isMyWindow : function (win) {
return win.get_workspace() == this.metaWorkspace.index() ||
(win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
return Main.isWindowActorDisplayedOnWorkspace(win, this.metaWorkspace.index()) &&
(!win.get_meta_window() || win.get_meta_window().get_monitor() == this.monitorIndex);
},
// Tests if @win should be shown in the Overview
@ -340,6 +379,11 @@ WorkspaceThumbnail.prototype = {
// Draggable target interface
handleDragOver : function(source, actor, x, y, time) {
if (source == Main.xdndHandler) {
this.metaWorkspace.activate(time);
return DND.DragMotionResult.CONTINUE;
}
if (this.state > ThumbnailState.NORMAL)
return DND.DragMotionResult.CONTINUE;
@ -361,6 +405,13 @@ WorkspaceThumbnail.prototype = {
return false;
let metaWindow = win.get_meta_window();
// We need to move the window before changing the workspace, because
// the move itself could cause a workspace change if the window enters
// the primary monitor
if (metaWindow.get_monitor() != this.monitorIndex)
metaWindow.move_to_monitor(this.monitorIndex);
metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
false, // don't create workspace
time);
@ -442,11 +493,12 @@ ThumbnailsBox.prototype = {
// The "porthole" is the portion of the screen that we show in the workspaces
let panelHeight = Main.panel.actor.height;
let monitor = global.get_primary_monitor();
this._porthole = {
x: 0,
y: panelHeight,
width: global.screen_width,
height: global.screen_height - panelHeight
x: monitor.x,
y: monitor.y + panelHeight,
width: monitor.width,
height: monitor.height - panelHeight
};
this.addThumbnails(0, global.screen.n_workspaces);

View File

@ -51,6 +51,7 @@ WorkspacesView.prototype = {
this._height = 0;
this._x = 0;
this._y = 0;
this._workspaceRatioSpacing = 0;
this._spacing = 0;
this._lostWorkspaces = [];
this._animating = false; // tweening
@ -67,6 +68,18 @@ WorkspacesView.prototype = {
this._workspaces[w].actor.reparent(this.actor);
this._workspaces[activeWorkspaceIndex].actor.raise_top();
this._extraWorkspaces = [];
let monitors = global.get_monitors();
let m = 0;
for (let i = 0; i < monitors.length; i++) {
if (i == global.get_primary_monitor_index())
continue;
let ws = new Workspace.Workspace(null, i);
this._extraWorkspaces[m++] = ws;
ws.setGeometry(monitors[i].x, monitors[i].y, monitors[i].width, monitors[i].height);
global.overlay_group.add_actor(ws.actor);
}
// Position/scale the desktop windows and their children after the
// workspaces have been created. This cannot be done first because
// window movement depends on the Workspaces object being accessible
@ -76,6 +89,8 @@ WorkspacesView.prototype = {
Lang.bind(this, function() {
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomToOverview();
for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomToOverview();
}));
this._overviewShownId =
Main.overview.connect('shown',
@ -110,7 +125,7 @@ WorkspacesView.prototype = {
this._swipeScrollEndId = 0;
},
setGeometry: function(x, y, width, height) {
setGeometry: function(x, y, width, height, spacing) {
if (this._x == x && this._y == y &&
this._width == width && this._height == height)
return;
@ -118,6 +133,7 @@ WorkspacesView.prototype = {
this._height = height;
this._x = x;
this._y = y;
this._workspaceRatioSpacing = spacing;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setGeometry(x, y, width, height);
@ -146,6 +162,8 @@ WorkspacesView.prototype = {
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomFromOverview();
for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomFromOverview();
},
destroy: function() {
@ -155,6 +173,8 @@ WorkspacesView.prototype = {
syncStacking: function(stackIndices) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].syncStacking(stackIndices);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].syncStacking(stackIndices);
},
updateWindowPositions: function() {
@ -182,7 +202,7 @@ WorkspacesView.prototype = {
Tweener.removeTweens(workspace.actor);
let opacity = (this._inDrag && w != active) ? 200 : 255;
let y = (w - active) * (this._height + this._spacing);
let y = (w - active) * (this._height + this._spacing + this._workspaceRatioSpacing);
if (showAnimation) {
let params = { y: y,
@ -315,6 +335,8 @@ WorkspacesView.prototype = {
},
_onDestroy: function() {
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].destroy();
this._scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewShownId);
@ -365,6 +387,7 @@ WorkspacesView.prototype = {
return;
this._inDrag = true;
this._firstDragMotion = true;
this._dragMonitor = {
dragMotion: Lang.bind(this, this._onDragMotion)
@ -376,6 +399,14 @@ WorkspacesView.prototype = {
if (Main.overview.animationInProgress)
return DND.DragMotionResult.CONTINUE;
if (this._firstDragMotion) {
this._firstDragMotion = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
}
let primary = global.get_primary_monitor();
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
@ -389,7 +420,6 @@ WorkspacesView.prototype = {
let switchTop = (dragEvent.y <= topEdge && topWorkspace);
if (switchTop && this._dragOverLastY != topEdge) {
topWorkspace.metaWorkspace.activate(global.get_current_time());
topWorkspace.setReservedSlot(dragEvent.dragActor._delegate);
this._dragOverLastY = topEdge;
return DND.DragMotionResult.CONTINUE;
@ -398,7 +428,6 @@ WorkspacesView.prototype = {
let switchBottom = (dragEvent.y >= bottomEdge && bottomWorkspace);
if (switchBottom && this._dragOverLastY != bottomEdge) {
bottomWorkspace.metaWorkspace.activate(global.get_current_time());
bottomWorkspace.setReservedSlot(dragEvent.dragActor._delegate);
this._dragOverLastY = bottomEdge;
return DND.DragMotionResult.CONTINUE;
@ -433,7 +462,6 @@ WorkspacesView.prototype = {
this._timeoutId = Mainloop.timeout_add_seconds(1,
Lang.bind(this, function() {
hoverWorkspace.metaWorkspace.activate(global.get_current_time());
hoverWorkspace.setReservedSlot(dragEvent.dragActor._delegate);
return false;
}));
} else {
@ -456,6 +484,8 @@ WorkspacesView.prototype = {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(null);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(null);
},
_swipeScrollBegin: function() {
@ -534,6 +564,7 @@ WorkspacesDisplay.prototype = {
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.set_clip_to_allocation(true);
let controls = new St.Bin({ style_class: 'workspace-controls',
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT,
@ -549,6 +580,8 @@ WorkspacesDisplay.prototype = {
controls.connect('scroll-event',
Lang.bind(this, this._onScrollEvent));
this._monitorIndex = global.get_primary_monitor_index();
this._monitor = global.get_monitors()[this._monitorIndex];
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
controls.add_actor(this._thumbnailsBox.actor);
@ -557,13 +590,28 @@ WorkspacesDisplay.prototype = {
this._inDrag = false;
this._cancelledDrag = false;
this._alwaysZoomOut = false;
this._zoomOut = false;
this._zoomFraction = 0;
this._updateAlwaysZoom();
global.screen.connect('monitors-changed', Lang.bind(this, this._updateAlwaysZoom));
Main.xdndHandler.connect('drag-begin', Lang.bind(this, function(){
this._alwaysZoomOut = true;
}));
Main.xdndHandler.connect('drag-end', Lang.bind(this, function(){
this._alwaysZoomOut = false;
this._updateAlwaysZoom();
}));
this._nWorkspacesNotifyId = 0;
this._switchWorkspaceNotifyId = 0;
this._itemDragBeginId = 0;
this._itemDragCancelledId = 0;
this._itemDragEndId = 0;
this._windowDragBeginId = 0;
this._windowDragCancelledId = 0;
@ -571,13 +619,17 @@ WorkspacesDisplay.prototype = {
},
show: function() {
this._zoomOut = this._alwaysZoomOut;
this._zoomFraction = this._alwaysZoomOut ? 1 : 0;
this._updateZoom();
this._controls.show();
this._thumbnailsBox.show();
this._workspaces = [];
for (let i = 0; i < global.screen.n_workspaces; i++) {
let metaWorkspace = global.screen.get_workspace_by_index(i);
this._workspaces[i] = new Workspace.Workspace(metaWorkspace);
this._workspaces[i] = new Workspace.Workspace(metaWorkspace, this._monitorIndex);
}
if (this.workspacesView)
@ -596,6 +648,9 @@ WorkspacesDisplay.prototype = {
if (this._itemDragBeginId == 0)
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
Lang.bind(this, this._dragBegin));
if (this._itemDragCancelledId == 0)
this._itemDragCancelledId = Main.overview.connect('item-drag-cancelled',
Lang.bind(this, this._dragCancelled));
if (this._itemDragEndId == 0)
this._itemDragEndId = Main.overview.connect('item-drag-end',
Lang.bind(this, this._dragEnd));
@ -610,9 +665,6 @@ WorkspacesDisplay.prototype = {
Lang.bind(this, this._dragEnd));
this._onRestacked();
this._zoomOut = false;
this._zoomFraction = 0;
this._updateZoom();
},
hide: function() {
@ -631,7 +683,11 @@ WorkspacesDisplay.prototype = {
Main.overview.disconnect(this._itemDragBeginId);
this._itemDragBeginId = 0;
}
if (this._itemEndBeginId > 0) {
if (this._itemDragCancelledId > 0) {
Main.overview.disconnect(this._itemDragCancelledId);
this._itemDragCancelledId = 0;
}
if (this._itemDragEndId > 0) {
Main.overview.disconnect(this._itemDragEndId);
this._itemDragEndId = 0;
}
@ -666,6 +722,23 @@ WorkspacesDisplay.prototype = {
return this._zoomFraction;
},
_updateAlwaysZoom: function() {
this._alwaysZoomOut = false;
let monitors = global.get_monitors();
let primary = global.get_primary_monitor();
/* Look for any monitor to the right of the primary, if there is
* one, we always keep zoom out, otherwise its hard to reach
* the thumbnail area without passing into the next monitor. */
for (let i = 0; i < monitors.length; i++) {
if (monitors[i].x >= primary.x + primary.width) {
this._alwaysZoomOut = true;
break;
}
}
},
_getPreferredWidth: function (actor, forHeight, alloc) {
// pass through the call in case the child needs it, but report 0x0
this._controls.get_preferred_width(forHeight);
@ -708,8 +781,11 @@ WorkspacesDisplay.prototype = {
if (!this.workspacesView)
return;
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
let fullWidth = this.actor.allocation.x2 - this.actor.allocation.x1;
let fullHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
let width = fullWidth;
let height = fullHeight;
let [controlsMin, controlsNatural] = this._controls.get_preferred_width(height);
let controlsVisible = this._controls.get_theme_node().get_length('visible-width');
@ -728,7 +804,11 @@ WorkspacesDisplay.prototype = {
x += controlsVisible;
}
this.workspacesView.setGeometry(x, y, width, height);
height = (fullHeight / fullWidth) * width;
let difference = fullHeight - height;
y += difference / 2;
this.workspacesView.setGeometry(x, y, width, height, difference);
},
_onRestacked: function() {
@ -757,7 +837,7 @@ WorkspacesDisplay.prototype = {
// Assume workspaces are only added at the end
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w);
this._workspaces[w] = new Workspace.Workspace(metaWorkspace);
this._workspaces[w] = new Workspace.Workspace(metaWorkspace, this._monitorIndex);
}
this._thumbnailsBox.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
@ -794,7 +874,7 @@ WorkspacesDisplay.prototype = {
if (Main.overview.animationInProgress)
return;
let shouldZoom = this._controls.hover || (this._inDrag && !this._cancelledDrag);
let shouldZoom = this._alwaysZoomOut || this._controls.hover || (this._inDrag && !this._cancelledDrag);
if (shouldZoom != this._zoomOut) {
this._zoomOut = shouldZoom;
this._updateWorkspacesGeometry();

View File

@ -1,6 +1,7 @@
af
ar
bg
bn_IN
ca
cs
da
@ -23,6 +24,7 @@ ja
ko
kn
lt
lv
nb
nl
nn

View File

@ -13,6 +13,7 @@ js/ui/messageTray.js
js/ui/overview.js
js/ui/panel.js
js/ui/placeDisplay.js
js/ui/polkitAuthenticationAgent.js
js/ui/popupMenu.js
js/ui/runDialog.js
js/ui/searchDisplay.js
@ -20,6 +21,7 @@ js/ui/statusMenu.js
js/ui/status/accessibility.js
js/ui/status/bluetooth.js
js/ui/status/keyboard.js
js/ui/status/network.js
js/ui/status/power.js
js/ui/status/volume.js
js/ui/telepathyClient.js
@ -29,8 +31,10 @@ js/ui/workspacesView.js
src/gvc/gvc-mixer-control.c
src/gdmuser/gdm-user.c
src/main.c
src/shell-app.c
src/shell-app-system.c
src/shell-global.c
src/shell-mobile-providers.c
src/shell-polkit-authentication-agent.c
src/shell-util.c

434
po/ar.po
View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-09 01:12+0200\n"
"PO-Revision-Date: 2011-03-09 01:12+0300\n"
"POT-Creation-Date: 2011-03-22 20:58+0200\n"
"PO-Revision-Date: 2011-03-22 20:58+0300\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"MIME-Version: 1.0\n"
@ -144,47 +144,43 @@ msgstr ""
msgid "disabled OpenSearch providers"
msgstr ""
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "لم يُعثَر على الأمر"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "تعذّر تحليل الأمر:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "لا تطبيق بهذا الاسم"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "فشل تنفيذ '%s':"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "الكل"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "الإعدادات"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة"
@ -344,7 +340,7 @@ msgstr "هذا الأسبوع"
msgid "Next week"
msgstr "الأسبوع القادم"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:945
msgid "Remove"
msgstr "أزِل"
@ -399,7 +395,7 @@ msgstr "%A %Ol:%OM %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A %e %B، %Y"
@ -412,7 +408,7 @@ msgstr "العناصر الحديثة"
msgid "Log Out %s"
msgstr "اخرج%.0s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "اخرج"
@ -434,45 +430,42 @@ msgstr "ستُخرج تلقائيا بعد %d ثوان."
msgid "Logging out of the system."
msgstr "يخرج من النظام."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "أطفئ"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "انقر على \"أطفئ\" لغلق هذه التطبيقات وإطفاء النظام."
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "أطفئ الحاسوب"
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "سيُطفأ النظام تلقائيا خلال %d ثوان."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "انقر على \"أطفئ الحاسوب\" لغلق هذه التطبيقات وإطفاء النظام."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "يُغلق النظام."
#, c-format
msgid "The system will power off automatically in %d seconds."
msgstr "سيُطفأ النظام تلقائيا خلال %d ثوان."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "يُطفأ النظام."
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "أعِد التشغيل"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr "انقر على \"أعِد التشغيل\" لغلق هذه التطبيقات إعادة تشغيل النظام."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "سيُعاد تشغيل النظام تلقائيا خلال %d ثوان."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "يُعيد تشغيل النظام."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "أكّد"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "ألغِ"
@ -486,7 +479,7 @@ msgstr "مفعّل"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "معطّل"
@ -506,47 +499,47 @@ msgstr "اعرض المصدر"
msgid "Web Page"
msgstr "صفحة الوب"
#: ../js/ui/messageTray.js:926
#: ../js/ui/messageTray.js:938
msgid "Open"
msgstr "افتح"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:2018
msgid "System Information"
msgstr "معلومات النظام"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:89
msgid "Undo"
msgstr "تراجع"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:184
msgid "Windows"
msgstr "النوافذ"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:187
msgid "Applications"
msgstr "التطبيقات"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:203
msgid "Dash"
msgstr "الشريط"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "أغلق %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "الأنشطة"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "اللوحة"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "الشريط العلوي"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -561,7 +554,7 @@ msgstr "أعد المحاولة"
msgid "Connect to..."
msgstr "اتّصل ب‍..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "الأماكن والأجهزة"
@ -570,55 +563,55 @@ 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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "من فضلك اكتب أمرا:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "يبحث..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "لا نتائج مطابقة."
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "أطفئ..."
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "علّق"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "متاح"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "مشغول"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "حسابي"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "إعدادات النظام"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "أوصد الشاشة"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "بدّل المستخدم"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "اخرج..."
@ -626,14 +619,12 @@ msgstr "اخرج..."
msgid "Zoom"
msgstr "تقريب"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "قارئ الشاشة"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "لوحة مفاتيح على الشاشة"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "تنبيهات بصرية"
@ -658,17 +649,17 @@ msgstr "مفاتيح الفأرة"
msgid "Universal Access Settings"
msgstr "إعدادات الإتاحة"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "تباين عال"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "نص كبير"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "بلوتوث"
@ -688,94 +679,94 @@ msgstr "اضبط جهازا جديدا..."
msgid "Bluetooth Settings"
msgstr "إعدادات بلوتوث"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "الاتصال"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "أرسل ملفات..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "تصفح الملفات..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "عطل أثناء تصفّح الجهاز"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "تعذّر تصفح الجهاز، رسالة العطل '%s'"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "إعدادات لوحة المفاتيح"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "إعدادات الفأرة"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "إعدادات الصوت"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "طلب تخويل من %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "يريد الجهاز %s صلاحية الوصول للخدمة '%s'"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "امنح الصلاحية دائما"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "امنح هذه المرة فقط"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "أخرج"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "تأكيد مزاوجة %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "يريد الجهاز %s المزاوجة مع هذا الحاسوب"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "من فضلك أكد تطابق الرقم '%s' مع الموجود على الجهاز."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "مطابقات"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "لا تتطابق"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "طلب مزاوجة من %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "من فضلك أدخل الرقم المذكور على الجهاز."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "حسنا"
@ -787,17 +778,147 @@ msgstr "أظهر تخطيط لوحة المفاتيح..."
msgid "Localization Settings"
msgstr "إعدادات اللغة"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<غير معروفة>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "مُعَطَّلة"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "يتّصل..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "الاستيثاق مطلوب"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "الكبل مفصول"
#. 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:489
msgid "unavailable"
msgstr "غير متاح"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "فشل الاتصال"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "متّصل (شخصي)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "إيثرنت تلقائي"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "نطاق عريض تلقائي"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "اتصال هاتفي تلقائي"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "%s تلقائي"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "بلوتوث تلقائي"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "لاسلكي تلقائي"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "المزيد..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "فعّل الشبكات"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "سلكي"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "لاسلكي"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "شبكة هاتف محمول"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "اتصال ش‌خ‌ف"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "إعدادات الشّبكة"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "صرت الآن متّصلا بشبكة الهاتف المحمول '%s'"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "صرت الآن متّصلا بالشبكة اللاسلكية '%s'"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "صرت الآن متّصلا بالشبكة السلكية '%s'"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "صرت الآن متّصلا بشبكة ش‌خ‌ف '%s'"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "صرت الآن متّصلا بشبكة '%s'"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "تم الاتصال"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "عُطّلت الشبكات"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "مدير الشبكة"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "إعدادات الطاقة"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "يَحسِب..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -809,12 +930,12 @@ msgstr[4] "بقي %d ساعة"
msgstr[5] "بقي %d ساعة"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "بقي %d %s و %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "ساعة"
@ -824,7 +945,7 @@ msgstr[3] "ساعات"
msgstr[4] "ساعة"
msgstr[5] "ساعة"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "دقيقة"
@ -834,7 +955,7 @@ msgstr[3] "دقائق"
msgstr[4] "دقيقة"
msgstr[5] "دقيقة"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
@ -845,78 +966,78 @@ msgstr[3] "بقي %d دقائق"
msgstr[4] "بقي %d دقيقة"
msgstr[5] "بقي %d دقيقة"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "مقبس طاقة"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "بطارية حاسوب محمول"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "مزود طاقة لا منقطعة"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "شاشة"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "فأرة"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "لوحة المفاتيح"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "مساعد رقمي"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "هاتف محمول"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "مشغل وسائط"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "لوحة"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "حاسوب"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "مجهول"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "جزء"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "ميكروفون"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s متّصل."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s غير متّصل."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s غائب."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s مشغول."
@ -924,7 +1045,7 @@ msgstr "%s مشغول."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:348
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "أُرسلت الساعة %l:%M:%S في %A"
@ -933,11 +1054,11 @@ msgstr "أُرسلت الساعة %l:%M:%S في %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "اكتب نصا للبحث عنه..."
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "ابحث"
@ -953,7 +1074,7 @@ msgstr "'%s' جاهز"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -966,7 +1087,7 @@ msgstr[5] "%u مخرج"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -977,19 +1098,24 @@ msgstr[3] "%u مداخل"
msgstr[4] "%u مدخلا"
msgstr[5] "%u مدخل"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "أصوات النظام"
#: ../src/main.c:395
#: ../src/main.c:438
msgid "Print version"
msgstr "اطبع الإصدارة"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "فشل تشغيل '%s'"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "منذ أقل من دقيقة"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -1000,7 +1126,7 @@ msgstr[3] "منذ %d دقائق"
msgstr[4] "منذ %d دقيقة"
msgstr[5] "منذ %d دقيقة"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -1011,7 +1137,7 @@ msgstr[3] "منذ %d ساعات"
msgstr[4] "منذ %d ساعة"
msgstr[5] "منذ %d ساعة"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1022,7 +1148,7 @@ msgstr[3] "منذ %d أيام"
msgstr[4] "منذ %d يوما"
msgstr[5] "منذ %d يوم"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1033,6 +1159,14 @@ msgstr[3] "منذ %d أسابيع"
msgstr[4] "منذ %d أسبوعا"
msgstr[5] "منذ %d أسبوع"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "المملكة المتحدة"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "المبدئي"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
@ -1057,6 +1191,33 @@ msgstr "نظام الملفات"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Shut Down"
#~ msgstr "أطفئ"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "انقر على \"أطفئ\" لغلق هذه التطبيقات وإطفاء النظام."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "سيُطفأ النظام تلقائيا خلال %d ثوان."
#~ msgid "Shutting down the system."
#~ msgstr "يُغلق النظام."
#~ msgid "Confirm"
#~ msgstr "أكّد"
#~ msgid "Panel"
#~ msgstr "اللوحة"
#~ msgid "No such application"
#~ msgstr "لا تطبيق بهذا الاسم"
#~ msgid "Screen Reader"
#~ msgstr "قارئ الشاشة"
#~ msgid "Screen Keyboard"
#~ msgstr "لوحة مفاتيح على الشاشة"
#~ msgid "PREFERENCES"
#~ msgstr "التفضيلات"
@ -1125,9 +1286,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Frequent"
#~ msgstr "متكرر"
#~ msgid "More"
#~ msgstr "المزيد"
#~ msgid "(see all)"
#~ msgstr "(انظر الكل)"

1189
po/bn_IN.po Normal file

File diff suppressed because it is too large Load Diff

513
po/es.po
View File

@ -1,18 +1,18 @@
# Spanish translation of gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2011-03-09 21:00+0000\n"
"PO-Revision-Date: 2011-03-10 10:59+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-25 20:20+0000\n"
"PO-Revision-Date: 2011-03-25 21:35+0100\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -96,16 +96,16 @@ msgid ""
"at the optimal thread count on the system."
msgstr ""
"Establece la tubería GStreamer usada para codificar grabaciones. Sigue la "
"sintaxis usada para gst-launch. La tubería debería tener un sumidero («sink») "
"de ensamblaje/sesensamblaje donde el vídeo que se está grabando se graba. "
"Generalmente tendrá un origen de ensamblado/desensamblado; la salida de ese "
"punto se escibirá en el archivo de salida. No obstante la tubería también "
"puede tomar parte en su propia salida; esto se puede usar para enviar la "
"salida a un servidor «icecast» a través de shout2send o similar. Cuando no "
"está establecido o lo está a un valor vacío, se usará la tubería "
"predeterminada. Actualmente es «videorate ! vp8enc quality=10 speed=2 threads="
"%T ! queue ! webmmux» y greba en WEBM usando el códec VP8. Se usa %T como "
"suposición para el número de hilos óptimos en el sistema."
"sintaxis usada para gst-launch. La tubería debería tener un sumidero "
"(«sink») de ensamblaje/sesensamblaje donde el vídeo que se está grabando se "
"graba. Generalmente tendrá un origen de ensamblado/desensamblado; la salida "
"de ese punto se escibirá en el archivo de salida. No obstante la tubería "
"también puede tomar parte en su propia salida; esto se puede usar para "
"enviar la salida a un servidor «icecast» a través de shout2send o similar. "
"Cuando no está establecido o lo está a un valor vacío, se usará la tubería "
"predeterminada. Actualmente es «videorate ! vp8enc quality=10 speed=2 "
"threads=%T ! queue ! webmmux» y greba en WEBM usando el códec VP8. Se usa %T "
"como suposición para el número de hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
@ -174,47 +174,43 @@ msgstr ""
msgid "disabled OpenSearch providers"
msgstr "proveedores OpenSearch desactivados"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Comando no encontrado"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "No existe la aplicación"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -374,7 +370,7 @@ msgstr "Esta semana"
msgid "Next week"
msgstr "La semana que viene"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "Quitar"
@ -429,7 +425,7 @@ msgstr "%a %H:%M"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
@ -442,7 +438,7 @@ msgstr "ELEMENTOS RECIENTES"
msgid "Log Out %s"
msgstr "Cerrar la sesión %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "Cerrar la sesión"
@ -466,46 +462,44 @@ msgstr "Su sesión se cerrará automáticamente en %d segundos."
msgid "Logging out of the system."
msgstr "Cerrando la sesión."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
#: ../js/ui/endSessionDialog.js:76
msgid "Click Power Off to quit these applications and power off the system."
msgstr "Pulse «Apagar» para salir de esas aplicaciones y apagar el sistema."
#: ../js/ui/endSessionDialog.js:76
#: ../js/ui/endSessionDialog.js:77
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgid "The system will power off automatically in %d seconds."
msgstr "El sistema se apagará automáticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "Apagando el sistema."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Pulse «Reiniciar» para salir de esas aplicaciones y reiniciar el sistema."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "El sistema se reiniciará automáticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "Reiniciando el sistema."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Confirmar"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Cancelar"
@ -519,7 +513,7 @@ msgstr "Activado"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Desactivado"
@ -539,47 +533,47 @@ msgstr "Ver fuente"
msgid "Web Page"
msgstr "Página web"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "Información del sistema"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "Deshacer"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "Ventanas"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "Aplicaciones"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "Plano"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Salir de %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "Panel"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "Barra superior"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -594,64 +588,85 @@ msgstr "Reintentar"
msgid "Connect to..."
msgstr "Conectar a…"
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "Se necesita autenticación"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "Administrador"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "Autenticar"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "Inténtelo de nuevo,"
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "Contraseña:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "Introduzca un comando:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "No se encontró ningún resultado coincidente."
#: ../js/ui/statusMenu.js:113 ../js/ui/statusMenu.js:177
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163
#: ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "Apagar…"
#: ../js/ui/statusMenu.js:115 ../js/ui/statusMenu.js:176
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "Suspender"
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "Disponible"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "Mi cuenta"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "Configuración del sistema"
#: ../js/ui/statusMenu.js:160
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#: ../js/ui/statusMenu.js:164
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/statusMenu.js:169
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "Cerrar la sesión…"
@ -659,14 +674,12 @@ msgstr "Cerrar la sesión…"
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Lector de pantalla"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Teclado en pantalla"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Alertas visuales"
@ -689,19 +702,19 @@ msgstr "Teclas del ratón"
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "Preferencias del acceso universal"
msgstr "Configuración del acceso universal"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Contraste alto"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -721,94 +734,94 @@ msgstr "Configurar un dispositivo nuevo…"
msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Enviar archivos…"
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Examinar archivos…"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Error al examinar el dispositivo"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Configuración del teclado"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Ajustes del ratón…"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Configuración del sonido"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Solicitud de autorización de %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "El dispositivo %s quiere acceder al servicio «%s»"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Conceder acceso siempre"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Conceder sólo esta vez"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Rechazar"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confirme que el PIN mostrado en «%s» coincide con el del dispositivo."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Coincide"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "No coincide"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Solicitud de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Introduzca el PIN mencionado en el dispositivo."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "Aceptar"
@ -820,17 +833,153 @@ msgstr "Mostrar la distribución del teclado…"
msgid "Localization Settings"
msgstr "Configuración regional"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1437
msgid "<unknown>"
msgstr "<desconocido>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "desactivada"
#: ../js/ui/status/network.js:478
msgid "connecting..."
msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:481
msgid "authentication required"
msgstr "se necesita autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:491
msgid "firmware missing"
msgstr "falta el «firmware»"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:498
msgid "cable unplugged"
msgstr "cable desconectado"
#. 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:503
msgid "unavailable"
msgstr "no disponible"
#: ../js/ui/status/network.js:505
msgid "connection failed"
msgstr "falló la conexión"
#. 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:585 ../js/ui/status/network.js:1385
msgid "Connected (private)"
msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:666
msgid "Auto Ethernet"
msgstr "Ethernet automática"
#: ../js/ui/status/network.js:741
msgid "Auto broadband"
msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:744
msgid "Auto dial-up"
msgstr "Marcado automático"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:887 ../js/ui/status/network.js:1397
#, c-format
msgid "Auto %s"
msgstr "%s automática"
#: ../js/ui/status/network.js:889
msgid "Auto bluetooth"
msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1399
msgid "Auto wireless"
msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1457
msgid "More..."
msgstr "Más…"
#: ../js/ui/status/network.js:1480
msgid "Enable networking"
msgstr "Activar red"
#: ../js/ui/status/network.js:1492
msgid "Wired"
msgstr "Cableada"
#: ../js/ui/status/network.js:1503
msgid "Wireless"
msgstr "Inalámbrica"
#: ../js/ui/status/network.js:1513
msgid "Mobile broadband"
msgstr "Banda ancha móvil"
#: ../js/ui/status/network.js:1523
msgid "VPN Connections"
msgstr "Conexiones VPN"
#: ../js/ui/status/network.js:1532
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1827
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Ahora está conectado a la red de banda ancha móvil «%s»"
#: ../js/ui/status/network.js:1831
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Ahora está conectado a la red inalámbrica «%s»"
#: ../js/ui/status/network.js:1835
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Ahora está conectado a la red cableada «%s»"
#: ../js/ui/status/network.js:1839
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Ahora está conectado a la VPN «%s»"
#: ../js/ui/status/network.js:1844
#, c-format
msgid "You're now connected to '%s'"
msgstr "Ahora está conectado a «%s»"
#: ../js/ui/status/network.js:1852
msgid "Connection established"
msgstr "Conexión establecida"
#: ../js/ui/status/network.js:1974
msgid "Networking is disabled"
msgstr "La red está desactivada"
#: ../js/ui/status/network.js:2099
msgid "Network Manager"
msgstr "Gestor de la red"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
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:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Estimando…"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -838,102 +987,102 @@ msgstr[0] "Queda %d hora"
msgstr[1] "Queda %d horas"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Quedan %d %s %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "hora"
msgstr[1] "horas"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "Queda %d minuto"
msgstr[1] "Queda %d minutos"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Batería del portátil"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "SAI"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Ratón"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Tableta"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Equipo"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "Desconocido"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Volumen"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s está conectado/a."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s está desconectado/a."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s está ausente."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s está ocupado/a."
@ -941,7 +1090,7 @@ msgstr "%s está ocupado/a."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Enviado a las %X el %A"
@ -950,11 +1099,11 @@ msgstr "Enviado a las %X el %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Teclear para buscar…"
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
@ -970,7 +1119,7 @@ msgstr "«%s» está preparado"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -979,53 +1128,66 @@ msgstr[1] "%u salidas"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u entrada"
msgstr[1] "%u entradas"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Sonidos del sistema"
#: ../src/main.c:395
#: ../src/main.c:446
msgid "Print version"
msgstr "Imprimir versión"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Falló al lanzar «%s»"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "Hace menos de un minuto"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "Hace %d semana"
msgstr[1] "Hace %d semanas"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Reino Unido"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Predeterminada"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "El usuario rechazó el diálogo de autenticación"
@ -1050,6 +1212,36 @@ msgstr "Sistema de archivos"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Shut Down"
#~ msgstr "Apagar"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "Pulse «Apagar» para salir de esas aplicaciones y apagar el sistema."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "El sistema se apagará automáticamente en %d segundos."
#~ msgid "Shutting down the system."
#~ msgstr "Apagando el sistema."
#~ msgid "Confirm"
#~ msgstr "Confirmar"
#~ msgid "Panel"
#~ msgstr "Panel"
#~ msgid "No such application"
#~ msgstr "No existe la aplicación"
#~ msgid "Screen Reader"
#~ msgstr "Lector de pantalla"
#~ msgid "Screen Keyboard"
#~ msgstr "Teclado en pantalla"
#~ msgid "%s is now known as %s"
#~ msgstr "Ahora %s se llama %s"
#~ msgid "PREFERENCES"
#~ msgstr "PREFERENCIAS"
@ -1224,8 +1416,8 @@ msgstr "%1$s: %2$s"
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time."
#~ msgstr ""
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos "
#~ "en la hora."
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los "
#~ "segundos en la hora."
#~ msgid ""
#~ "This key specifies the format used by the panel clock when the format key "
@ -1242,18 +1434,19 @@ msgstr "%1$s: %2$s"
#~ msgid ""
#~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "format specified in the custom_format key. Note that if set to either "
#~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. "
#~ "1970-01-01. If set to \"custom\", the clock will display time according "
#~ "to the format specified in the custom_format key. Note that if set to "
#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are "
#~ "ignored."
#~ msgstr ""
#~ "Esta clave especifica el formato de la hora especificado por el reloj del "
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 horas), "
#~ "«unix» y «custom» (personalizado).Si se establece a «unix» el reloj mostrará "
#~ "la hora en segundos desde la época (1 de enero de 1970). Si se establece "
#~ "a «custom» el reloj mostrará la hora según el formato especificado en la "
#~ "clave «custom_format». Note que si se establece a «unix» o «custom» se "
#~ "ignoran las claves «show_date» y «show_seconds»."
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 "
#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el "
#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). "
#~ "Si se establece a «custom» el reloj mostrará la hora según el formato "
#~ "especificado en la clave «custom_format». Note que si se establece a "
#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»."
#~ msgid "Clock Format"
#~ msgstr "Formato del reloj"
@ -1319,9 +1512,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Frequent"
#~ msgstr "Frecuentes"
#~ msgid "More"
#~ msgstr "Más"
#~ msgid "(see all)"
#~ msgstr "(ver todo)"
@ -1349,8 +1539,5 @@ msgstr "%1$s: %2$s"
#~ msgid "DOCUMENTS"
#~ msgstr "DOCUMENTOS"
#~ msgid "Manager"
#~ msgstr "Gestor"
#~ msgid "The user manager object this user is controlled by."
#~ msgstr "El objeto de gestión de usuarios que controla a este usuario."

495
po/et.po
View File

@ -12,21 +12,21 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell MASTER\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2011-02-04 22:28+0000\n"
"PO-Revision-Date: 2011-02-06 08:43+0200\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-18 10:35+0000\n"
"PO-Revision-Date: 2011-03-18 21:33+0300\n"
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
"Language-Team: Estonian <gnome-et@linux.ee>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-Language: Estonian\n"
"X-Poedit-Country: Estonia\n"
msgid "GNOME Shell"
msgstr "GNOME kest"
msgstr "GNOME Shell"
msgid "Window management and application launching"
msgstr "Aknahaldur ja rakenduste käivitaja"
@ -58,6 +58,10 @@ msgstr ""
msgid "History for command (Alt-F2) dialog"
msgstr "Käsudialoogi (Alt-F2) ajalugu"
# suurendusklaasidialoog? miks ka mitte :)
msgid "History for the looking glass dialog"
msgstr "Otsingudialoogi ajalugu"
msgid "If true, display date in the clock, in addition to time."
msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva."
@ -83,6 +87,16 @@ msgid ""
"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 ""
"Määrab GStreameri toru, mida kasutatakse lindistuste kodeerimiseks. See peab "
"vastama gst-launch'i süntaksile. Torul peaks olema vaba plokk (pad), kuhu "
"lindistatav video salvestatakse. Tavaliselt on vaba plokk olemas; selle "
"ploki väljund kirjutatakse väljundfaili. Toru võib hoolitseda ka enda "
"väljundi eest - seda võib kasutada väljundi saatmiseks icecast serverisse "
"shout2send või sarnase tehnoloogia abil. Kui see on määramata või väärtus on "
"tühi, kasutatakse vaikimisi toru. See on praegu 'videorate ! vp8enc "
"quality=10 speed=2 threads=%T ! queue ! webmmux' ning lindistab WEBM "
"vormingusse VP8 koodekiga. %T asendatakse süsteemi oletatava optimaalseima "
"lõimede (thread) arvuga."
msgid "Show date in clock"
msgstr "Kell näitab kuupäeva"
@ -96,7 +110,7 @@ msgstr "Kellaaega näidatakse sekunditega"
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
msgstr "Nendele tunnustele vastavaid rakendusi kuvatakse lemmikutes."
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
@ -112,9 +126,10 @@ msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"GNOME Shelli lindistatava ekraanivideo kaadrisagedus (kaadrit sekundis)."
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
msgstr "GStreameri toru, mida ekraanivideo kodeerimiseks kasutatakse"
msgid ""
"The shell normally monitors active applications in order to present the most "
@ -122,125 +137,19 @@ msgid ""
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Shell tavaliselt seirab aktiivseid rakendusi, et näidata enamkasutatavaid "
"(näiteks käivitajaid). Kuigi neid andmeid hoitakse privaatselt, võid "
"privaatsuse suurendamiseks selle keelata. Selle keelamine siiski ei eemalda "
"juba salvestatud andmeid."
msgid "Uuids of extensions to disable"
msgstr "Keelatavate laienduste UUID-d"
msgid "Whether to collect stats about applications usage"
msgstr ""
msgstr "Kas rakenduste kasutuse kohta kogutakse andmeid"
msgid "disabled OpenSearch providers"
msgstr ""
msgid "Clip the crosshairs at the center"
msgstr "Niitristi keskel on auk"
msgid "Color of the crosshairs"
msgstr "Niitristi värvus"
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
msgid ""
"Determines the position of the magnified mouse image within the magnified "
"view and how it reacts to system mouse movement. The values are - none: no "
"mouse tracking; - centered: the mouse image is displayed at the center of "
"the zoom region (which also represents the point under the system mouse) and "
"the magnified contents are scrolled as the system mouse moves; - "
"proportional: the position of the magnified mouse in the zoom region is "
"proportionally the same as the position of the system mouse on screen; - "
"push: when the magnified mouse intersects a boundary of the zoom region, the "
"contents are scrolled into view."
msgstr ""
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr ""
"Määrab niitristi läbipaistvuse, alates täiesti läbipaistmatust kuni täiesti "
"läbipaistvani."
msgid ""
"Determines whether the crosshairs intersect the magnified mouse sprite, or "
"are clipped such that the ends of the horizontal and vertical lines surround "
"the mouse image."
msgstr ""
"Määrab, kas niitrist kattub suurendatud hiire pildiga või on keskelt ära "
"lõigatud nii, et jooned ümbritsevad hiirekursori pilti."
msgid "Enable lens mode"
msgstr "Läätsede režiimi lubamine"
msgid ""
"Enables/disables display of crosshairs centered on the magnified mouse "
"sprite."
msgstr "Lubab/keelab niitristi kuvamise suurendatud hiirekursori kohal."
msgid ""
"For centered mouse tracking, when the system pointer is at or near the edge "
"of the screen, the magnified contents continue to scroll such that the "
"screen edge moves into the magnified view."
msgstr ""
msgid "Length of the crosshairs"
msgstr "Niitristi pikkus"
msgid "Magnification factor"
msgstr "Suurendustegur"
msgid "Mouse Tracking Mode"
msgstr "Hiire jälitamise režiim"
msgid "Opacity of the crosshairs"
msgstr "Niitristi läbipaistvus"
msgid "Screen position"
msgstr "Ekraani asukoht"
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr "Suurendusklaas võib liikuda töölauapiiridest väljapoole"
msgid "Show or hide crosshairs"
msgstr "Niitristi kuvamine või peitmine"
msgid "Show or hide the magnifier"
msgstr "Suurendusklaasi kuvamine või peitmine"
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr ""
"Suurendusklaasi ja selle kõigi suurenduspiirkondade kuvamine või peitmine."
msgid ""
"The color of the the vertical and horizontal lines that make up the "
"crosshairs."
msgstr "Niitristi püst- ja rõhtjoone värvus."
msgid ""
"The magnified view either fills the entire screen, or occupies the top-half, "
"bottom-half, left-half, or right-half of the screen."
msgstr ""
"Suurendatud vaade täidab kas kogu ekraani või täidab ülemise, alumise, "
"vasaku või parema ekraanipoole."
msgid ""
"The power of the magnification. A value of 1.0 means no magnification. A "
"value of 2.0 doubles the size."
msgstr "Suurendustegur. 1,0 tähendab originaalsuurust. 2,0 muudab kaks korda."
msgid "Thickness of the crosshairs"
msgstr "Niitristi paksus"
msgid ""
"Whether the magnified view should be centered over the location of the "
"system mouse and move with it."
msgstr ""
"Kas suurendatud vaate keskkoht peaks asetsema süsteemi hiire kohal ning "
"liikuma sellega kaasa."
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr "Niitristi moodustavate püst- ja rõhtjoone laius"
msgstr "keelatud OpenSearch pakkujad"
msgid "Command not found"
msgstr "Käsku ei leitud"
@ -250,9 +159,6 @@ msgstr "Käsku ei leitud"
msgid "Could not parse command:"
msgstr "Käsku pole võimalik analüüsida:"
msgid "No such application"
msgstr "Sellist rakendust ei ole"
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' käivitamine nurjus:"
@ -264,8 +170,8 @@ msgstr "Kõik"
msgid "APPLICATIONS"
msgstr "Rakendused"
msgid "PREFERENCES"
msgstr "Eelistused"
msgid "SETTINGS"
msgstr "Seaded"
msgid "New Window"
msgstr "Uus aken"
@ -382,7 +288,7 @@ msgstr "L"
#. Translators: Text to show if there are no events
msgid "Nothing Scheduled"
msgstr ""
msgstr "Ühtegi sündmust pole plaanitud"
#. Translators: Shown on calendar heading when selected day occurs on current year
msgctxt "calendar heading"
@ -465,6 +371,8 @@ msgstr "Logi välja"
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
"Nende rakenduste sulgemiseks ja süsteemist väljalogimiseks klõpsa nupule "
"Logi välja."
#, c-format
msgid "%s will be logged out automatically in %d seconds."
@ -482,6 +390,8 @@ msgstr "Lülita välja"
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr ""
"Nende rakenduste sulgemiseks ja süsteemi väljalülitamiseks klõpsa nupule "
"Logi välja."
#, c-format
msgid "The system will shut down automatically in %d seconds."
@ -534,6 +444,9 @@ msgstr "Kuva lähtekoodi"
msgid "Web Page"
msgstr "Veebileht"
msgid "Open"
msgstr "Ava"
msgid "System Information"
msgstr "Süsteemi andmed"
@ -546,6 +459,11 @@ msgstr "Aknad"
msgid "Applications"
msgstr "Rakendused"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
msgid "Dash"
msgstr "Dokk"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#, c-format
msgid "Quit %s"
@ -556,6 +474,9 @@ msgstr "Lõpeta %s"
msgid "Activities"
msgstr "Tegevused"
msgid "Panel"
msgstr "Paneel"
#, c-format
msgid "Failed to unmount '%s'"
msgstr "'%s' lahtihaakimine nurjus"
@ -580,6 +501,18 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Palun sisesta käsk:"
msgid "Searching..."
msgstr "Otsimine..."
msgid "No matching results."
msgstr "Tulemused puuduvad."
msgid "Power Off..."
msgstr "Lülita välja..."
msgid "Suspend"
msgstr "Uinak"
msgid "Available"
msgstr "Saadaval"
@ -601,24 +534,15 @@ msgstr "Vaheta kasutajat"
msgid "Log Out..."
msgstr "Logi välja..."
#. This is temporarily removed, see
#. http://bugzilla.gnome.org/show_bug.cgi?id=636680
#. for details.
#. item = new PopupMenu.PopupMenuItem(_("Suspend..."));
#. item.connect('activate', Lang.bind(this, this._onShutDownActivate));
#. this.menu.addMenuItem(item);
msgid "Shut Down..."
msgstr "Lülita välja..."
msgid "Zoom"
msgstr ""
msgid "Screen Reader"
msgstr "Ekraanilugeja"
msgid "Screen Keyboard"
msgstr "Ekraaniklaviatuur"
msgstr "Suurendus"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
msgid "Visual Alerts"
msgstr "Visuaalsed märguanded"
@ -638,10 +562,10 @@ msgid "Universal Access Settings"
msgstr "Universaalse ligipääsu sätted"
msgid "High Contrast"
msgstr ""
msgstr "Kõrgkontrastne"
msgid "Large Text"
msgstr ""
msgstr "Suur tekst"
msgid "Bluetooth"
msgstr "Bluetooth"
@ -653,7 +577,7 @@ msgid "Send Files to Device..."
msgstr "Failide saatmine seadmesse..."
msgid "Setup a New Device..."
msgstr ""
msgstr "Uue seadme häälestamine..."
msgid "Bluetooth Settings"
msgstr "Bluetoothi sätted"
@ -672,7 +596,7 @@ msgstr "Viga seadme sirvimisel"
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr ""
msgstr "Küsitud seadet pole võimalik sirvida, viga on '%s'"
msgid "Keyboard Settings"
msgstr "Klaviatuurisätted"
@ -683,9 +607,6 @@ msgstr "Hiiresätted"
msgid "Sound Settings"
msgstr "Helisätted"
msgid "Bluetooth Agent"
msgstr "Bluetoothi agent"
#, c-format
msgid "Authorization request from %s"
msgstr "Autoriseerimise päring seadmelt %s"
@ -731,12 +652,121 @@ msgstr "Palun sisesta seadme poolt öeldav PIN-kood."
msgid "OK"
msgstr "Olgu"
msgid "Show Keyboard Layout..."
msgstr "Klaviatuuripaigutuse kuvamine..."
msgid "Localization Settings"
msgstr "Lokaliseerimissätted"
msgid "<unknown>"
msgstr "<tundmatu>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
msgid "disabled"
msgstr "keelatud"
msgid "connecting..."
msgstr "ühendumine..."
#. Translators: this is for network connections that require some kind of key or password
msgid "authentication required"
msgstr "vajalik on autentimine"
#. Translators: this is for wired network devices that are physically disconnected
msgid "cable unplugged"
msgstr "juhe eemaldatud"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
msgid "unavailable"
msgstr "pole saadaval"
msgid "connection failed"
msgstr "ühendumine nurjus"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
msgid "Connected (private)"
msgstr "Ühendatud (privaatne)"
msgid "Auto Ethernet"
msgstr "Automaatne ethernet"
msgid "Auto broadband"
msgstr "Automaatne lairibaühendus"
msgid "Auto dial-up"
msgstr "Automaatne sissehelistamine"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#, c-format
msgid "Auto %s"
msgstr "Automaatne %s"
msgid "Auto bluetooth"
msgstr "Automaatne bluetooth"
msgid "Auto wireless"
msgstr "Automaatne juhtmeta ühendus"
msgid "More..."
msgstr "Veel..."
msgid "Enable networking"
msgstr "Luba võrguühendused"
msgid "Wired"
msgstr "Juhtmega"
msgid "Wireless"
msgstr "Juhtmeta"
msgid "Mobile broadband"
msgstr "Mobiiliühendus"
msgid "VPN Connections"
msgstr "VPN-ühendused"
msgid "Network Settings"
msgstr "Võrgusätted"
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Loodi mobiiliühendus '%s'"
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Loodi ühendus juhtmeta võrguga '%s'"
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Loodi ühendus juhtmega võrguga '%s'"
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Loodi ühendus VPN-võrguga '%s'"
#, c-format
msgid "You're now connected to '%s'"
msgstr "Loodi võrguühendus '%s' kaudu"
msgid "Connection estabilished"
msgstr "Ühendus loodud"
msgid "Networking is disabled"
msgstr "Võrguühendused on keelatud"
msgid "Network Manager"
msgstr "Võrguhaldur"
msgid "Power Settings"
msgstr "Toitesätted..."
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
msgid "Estimating..."
msgstr "Andmete kogumine..."
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -829,8 +859,15 @@ msgstr "%s on hõivatud."
msgid "Sent at %X on %A"
msgstr "Saadetud: %a, kell %X"
msgid "Search your computer"
msgstr ""
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
msgid "Type to search..."
msgstr "Otsing..."
msgid "Search"
msgstr "Otsing"
#, c-format
msgid "%s has finished starting"
@ -840,32 +877,32 @@ msgstr "%s läks käima"
msgid "'%s' is ready"
msgstr "'%s' on valmis"
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "Pole võimalik uut tööala lisada, kuna tööalade piir on saavutatud."
msgid "Can't remove the first workspace."
msgstr "Esimest tööala pole võimalik eemaldada."
#. translators:
#. * The number of sound outputs on a particular device
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u väljund"
msgstr[1] "%u väljundit"
#. translators:
#. * The number of sound inputs on a particular device
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u sisend"
msgstr[1] "%u sisendit"
msgid "System Sounds"
msgstr "Süsteemi helid"
msgid "Print version"
msgstr "Printimise versioon"
#, c-format
msgid "Failed to launch '%s'"
msgstr "'%s' käivitamine nurjus"
msgid "Less than a minute ago"
msgstr "Vähem kui minuti eest"
@ -893,6 +930,15 @@ msgid_plural "%d weeks ago"
msgstr[0] "%d nädal tagasi"
msgstr[1] "%d nädalat tagasi"
msgid "United Kingdom"
msgstr "Suurbritannia"
msgid "Default"
msgstr "Vaikimisi"
msgid "Authentication dialog was dismissed by the user"
msgstr "Kasutaja katkestas autentimisdialoogi"
msgid "Home Folder"
msgstr "Kodukaust"
@ -901,9 +947,6 @@ msgstr "Kodukaust"
msgid "File System"
msgstr "Failisüsteem"
msgid "Search"
msgstr "Otsing"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
@ -913,8 +956,120 @@ msgstr "Otsing"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Suspend..."
#~ msgstr "Peata..."
#~ msgid "No such application"
#~ msgstr "Sellist rakendust ei ole"
#~ msgid "Screen Reader"
#~ msgstr "Ekraanilugeja"
#~ msgid "Screen Keyboard"
#~ msgstr "Ekraaniklaviatuur"
#~ msgid "Clip the crosshairs at the center"
#~ msgstr "Niitristi keskel on auk"
#~ msgid "Color of the crosshairs"
#~ msgstr "Niitristi värvus"
#~ msgid ""
#~ "Determines the transparency of the crosshairs, from fully opaque to fully "
#~ "transparent."
#~ msgstr ""
#~ "Määrab niitristi läbipaistvuse, alates täiesti läbipaistmatust kuni "
#~ "täiesti läbipaistvani."
#~ msgid ""
#~ "Determines whether the crosshairs intersect the magnified mouse sprite, "
#~ "or are clipped such that the ends of the horizontal and vertical lines "
#~ "surround the mouse image."
#~ msgstr ""
#~ "Määrab, kas niitrist kattub suurendatud hiire pildiga või on keskelt ära "
#~ "lõigatud nii, et jooned ümbritsevad hiirekursori pilti."
#~ msgid "Enable lens mode"
#~ msgstr "Läätsede režiimi lubamine"
#~ msgid ""
#~ "Enables/disables display of crosshairs centered on the magnified mouse "
#~ "sprite."
#~ msgstr "Lubab/keelab niitristi kuvamise suurendatud hiirekursori kohal."
#~ msgid "Length of the crosshairs"
#~ msgstr "Niitristi pikkus"
#~ msgid "Magnification factor"
#~ msgstr "Suurendustegur"
#~ msgid "Mouse Tracking Mode"
#~ msgstr "Hiire jälitamise režiim"
#~ msgid "Opacity of the crosshairs"
#~ msgstr "Niitristi läbipaistvus"
#~ msgid "Screen position"
#~ msgstr "Ekraani asukoht"
#~ msgid "Scroll magnified contents beyond the edges of the desktop"
#~ msgstr "Suurendusklaas võib liikuda töölauapiiridest väljapoole"
#~ msgid "Show or hide crosshairs"
#~ msgstr "Niitristi kuvamine või peitmine"
#~ msgid "Show or hide the magnifier"
#~ msgstr "Suurendusklaasi kuvamine või peitmine"
#~ msgid "Show or hide the magnifier and all of its zoom regions."
#~ msgstr ""
#~ "Suurendusklaasi ja selle kõigi suurenduspiirkondade kuvamine või peitmine."
#~ msgid ""
#~ "The color of the the vertical and horizontal lines that make up the "
#~ "crosshairs."
#~ msgstr "Niitristi püst- ja rõhtjoone värvus."
#~ msgid ""
#~ "The magnified view either fills the entire screen, or occupies the top-"
#~ "half, bottom-half, left-half, or right-half of the screen."
#~ msgstr ""
#~ "Suurendatud vaade täidab kas kogu ekraani või täidab ülemise, alumise, "
#~ "vasaku või parema ekraanipoole."
#~ msgid ""
#~ "The power of the magnification. A value of 1.0 means no magnification. A "
#~ "value of 2.0 doubles the size."
#~ msgstr ""
#~ "Suurendustegur. 1,0 tähendab originaalsuurust. 2,0 muudab kaks korda."
#~ msgid "Thickness of the crosshairs"
#~ msgstr "Niitristi paksus"
#~ msgid ""
#~ "Whether the magnified view should be centered over the location of the "
#~ "system mouse and move with it."
#~ msgstr ""
#~ "Kas suurendatud vaate keskkoht peaks asetsema süsteemi hiire kohal ning "
#~ "liikuma sellega kaasa."
#~ msgid ""
#~ "Width of the vertical and horizontal lines that make up the crosshairs."
#~ msgstr "Niitristi moodustavate püst- ja rõhtjoone laius"
#~ msgid "PREFERENCES"
#~ msgstr "Eelistused"
#~ msgid "Shut Down..."
#~ msgstr "Lülita välja..."
#~ msgid "Bluetooth Agent"
#~ msgstr "Bluetoothi agent"
#~ msgid ""
#~ "Can't add a new workspace because maximum workspaces limit has been "
#~ "reached."
#~ msgstr "Pole võimalik uut tööala lisada, kuna tööalade piir on saavutatud."
#~ msgid "Can't remove the first workspace."
#~ msgstr "Esimest tööala pole võimalik eemaldada."
#~ msgid "Clock"
#~ msgstr "Kell"
@ -958,11 +1113,5 @@ msgstr "%1$s: %2$s"
#~ msgid "Find"
#~ msgstr "Otsi"
#~ msgid "Searching..."
#~ msgstr "Otsimine..."
#~ msgid "No matching results."
#~ msgstr "Tulemused puuduvad."
#~ msgid "Invisible"
#~ msgstr "Nähtamatu"

1157
po/fr.po

File diff suppressed because it is too large Load Diff

980
po/gl.po

File diff suppressed because it is too large Load Diff

342
po/he.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-10 18:43+0200\n"
"PO-Revision-Date: 2011-03-10 18:45+0200\n"
"POT-Creation-Date: 2011-03-17 00:33+0200\n"
"PO-Revision-Date: 2011-03-17 00:37+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
"MIME-Version: 1.0\n"
@ -171,21 +171,17 @@ msgstr "Whether to collect stats about applications usage"
msgid "disabled OpenSearch providers"
msgstr "disabled OpenSearch providers"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "הפקודה לא נמצאה"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "לא ניתן לפענח את הפקודה:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "אין כזה יישום"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "ההרצה של '%s' נכשלה:"
@ -371,7 +367,7 @@ msgstr "השבוע"
msgid "Next week"
msgstr "בשבוע הבא"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "הסרה"
@ -426,7 +422,7 @@ msgstr "%a %l:%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A ה־%e ב%B, %Y"
@ -499,7 +495,7 @@ msgstr "המערכת מופעלת מחדש"
msgid "Confirm"
msgstr "אישור"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:465
msgid "Cancel"
msgstr "ביטול"
@ -513,7 +509,7 @@ msgstr "פעיל"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "מנוטרל"
@ -533,11 +529,11 @@ msgstr "צפייה במקור"
msgid "Web Page"
msgstr "דף אינטרנט"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "פתיחה"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:1986
msgid "System Information"
msgstr "פרטי המערכת"
@ -560,18 +556,18 @@ msgid "Dash"
msgstr "חלונית"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:514
#, c-format
msgid "Quit %s"
msgstr "יציאה מ־%s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:873
msgid "Activities"
msgstr "פעילויות"
#: ../js/ui/panel.js:1020
#: ../js/ui/panel.js:974
msgid "Panel"
msgstr "לוח"
@ -588,7 +584,7 @@ msgstr "ניסיון חוזר"
msgid "Connect to..."
msgstr "התחברות אל..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים"
@ -597,7 +593,7 @@ 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:618
#: ../js/ui/popupMenu.js:636
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -613,39 +609,39 @@ msgstr "בחיפוש..."
msgid "No matching results."
msgstr "אין תוצאות תואמות."
#: ../js/ui/statusMenu.js:113 ../js/ui/statusMenu.js:177
#: ../js/ui/statusMenu.js:114 ../js/ui/statusMenu.js:178
msgid "Power Off..."
msgstr "כיבוי..."
#: ../js/ui/statusMenu.js:115 ../js/ui/statusMenu.js:176
#: ../js/ui/statusMenu.js:116 ../js/ui/statusMenu.js:177
msgid "Suspend"
msgstr "השהיה"
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:137
msgid "Available"
msgstr "זמין"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Busy"
msgstr "עסוק"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:150
msgid "My Account"
msgstr "החשבון שלי"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:154
msgid "System Settings"
msgstr "הגדרות המערכת"
#: ../js/ui/statusMenu.js:160
#: ../js/ui/statusMenu.js:161
msgid "Lock Screen"
msgstr "נעילת המסך"
#: ../js/ui/statusMenu.js:164
#: ../js/ui/statusMenu.js:165
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/statusMenu.js:169
#: ../js/ui/statusMenu.js:170
msgid "Log Out..."
msgstr "ניתוק..."
@ -653,14 +649,12 @@ msgstr "ניתוק..."
msgid "Zoom"
msgstr "תקריב"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "מקריא מסך"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "מקלדת מסך"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "התראות חזותיות"
@ -685,17 +679,17 @@ msgstr "מקשי עכבר"
msgid "Universal Access Settings"
msgstr "הגדרות גישה אוניברסלית"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "ניגודיות גבוהה"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "טקסט גדול"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:236
#: ../js/ui/status/bluetooth.js:332 ../js/ui/status/bluetooth.js:366
#: ../js/ui/status/bluetooth.js:406 ../js/ui/status/bluetooth.js:439
msgid "Bluetooth"
msgstr "Bluetooth"
@ -715,94 +709,94 @@ msgstr "הגדרת התקן חדש..."
msgid "Bluetooth Settings"
msgstr "הגדרות Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:187
msgid "Connection"
msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:223
msgid "Send Files..."
msgstr "שליחת קבצים..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:228
msgid "Browse Files..."
msgstr "עיון בקבצים..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:237
msgid "Error browsing device"
msgstr "שגיאה בעיון בהתקן"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:238
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:246
msgid "Keyboard Settings"
msgstr "הגדרות מקלדת"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:251
msgid "Mouse Settings"
msgstr "הגדרות עכבר"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "הגדרות שמע"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:367
#, c-format
msgid "Authorization request from %s"
msgstr "בקשת אישור מאת %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:373
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:375
msgid "Always grant access"
msgstr "תמיד להעניק גישה"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:376
msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:377
msgid "Reject"
msgstr "סירוב"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:407
#, c-format
msgid "Pairing confirmation for %s"
msgstr "אישור צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:413 ../js/ui/status/bluetooth.js:447
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:414
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "נא לאשר האם קוד ה־PIN '%s' תואם את זה שמופיע בהתקן."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:416
msgid "Matches"
msgstr "התאמות"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:417
msgid "Does not match"
msgstr "אינו תואם"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:440
#, c-format
msgid "Pairing request for %s"
msgstr "בקשת צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:448
msgid "Please enter the PIN mentioned on the device."
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:464
msgid "OK"
msgstr "אישור"
@ -814,17 +808,147 @@ msgstr "הצגת פריסת המקלדת..."
msgid "Localization Settings"
msgstr "הגדרות אזוריות"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<לא ידוע>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "מנוטרל"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "בהתחברות..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "נדרש אימות"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "הכבל מנותק"
#. 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:489
msgid "unavailable"
msgstr "לא זמין"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "החיבור נכשל"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "מחובר (פרטי)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "אתרנט אוטומטי"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "פס רחב אוטומטי"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "חיוג אוטומטי"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Bluetooth אוטומטי"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "אלחוטי אוטומטי"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "עוד..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "הפעלת תכונת הרשת"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "קווי"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "אלחוטי"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "פס־רחב נייד"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "חיבורי VPN"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "הגדרות הרשת"
#: ../js/ui/status/network.js:1782
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "כרגע ישנו חיבור בינך ובין רשת הפס הרחב הניידת '%s'"
#: ../js/ui/status/network.js:1786
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "כרגע ישנו חיבור בינך ובין הרשת האלחוטית '%s'"
#: ../js/ui/status/network.js:1790
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "כרגע ישנו חיבור בינך ובין הרשת הקווית '%s'"
#: ../js/ui/status/network.js:1794
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "כרגע ישנו חיבור בינך ובין רשת ה־VPN '%s'"
#: ../js/ui/status/network.js:1799
#, c-format
msgid "You're now connected to '%s'"
msgstr "כעת ישנו חיבור בינך ובין '%s'"
#: ../js/ui/status/network.js:1807
msgid "Connection established"
msgstr "ההתחברות הצליחה"
#: ../js/ui/status/network.js:1929
msgid "Networking is disabled"
msgstr "תכונת הרשת מנוטרלת"
#: ../js/ui/status/network.js:2054
msgid "Network Manager"
msgstr "מנהל הרשתות"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "הגדרות צריכת החשמל"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "מתבצע שיערוך..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -833,26 +957,26 @@ msgstr[1] "נותרו %d שעות"
msgstr[2] "נותרו שעתיים"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s נותרו"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "שעה"
msgstr[1] "שעות"
msgstr[2] "שעתיים"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "דקה"
msgstr[1] "דקות"
msgstr[2] "דקות"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
@ -860,78 +984,78 @@ msgstr[0] "דקה אחת נותרה"
msgstr[1] "%d דקות נותרו"
msgstr[2] "שתי דקות נותרו"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "מתאם חשמל"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "סוללת נייד"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "אל־פסק"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "צג"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "עכבר"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "מקלדת"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "מחשב כף יד"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "טלפון סלולרי"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "נגן מדיה"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "טבלת שליטה"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "מחשב"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:961
msgid "Unknown"
msgstr "לא ידוע"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "עצמה"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "מיקרופון"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s התחבר/ה."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s התנתק/ה."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "'%s' מרוחק/ת."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s עסוק/ה."
@ -939,7 +1063,7 @@ msgstr "%s עסוק/ה."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "נשלח ב־%X בשעה %A"
@ -948,11 +1072,11 @@ msgstr "נשלח ב־%X בשעה %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:119
msgid "Type to search..."
msgstr "יש להקליד כדי לחפש..."
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:139 ../src/shell-util.c:250
msgid "Search"
msgstr "חיפוש"
@ -968,7 +1092,7 @@ msgstr "'%s' מוכן"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -978,7 +1102,7 @@ msgstr[2] "2 פלטים"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -986,7 +1110,7 @@ msgstr[0] "קלט אחד"
msgstr[1] "%u קלטים"
msgstr[2] "2 קלטים"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "צלילי מערכת"
@ -994,11 +1118,16 @@ msgstr "צלילי מערכת"
msgid "Print version"
msgstr "Print version"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:442
#, c-format
msgid "Failed to launch '%s'"
msgstr "אירע כשל בטעינת '%s'"
#: ../src/shell-global.c:1340
msgid "Less than a minute ago"
msgstr "לפני פחות מדקה"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1344
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -1006,7 +1135,7 @@ msgstr[0] "לפני דקה"
msgstr[1] "לפני %d דקות"
msgstr[2] "לפני 2 דקות"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1349
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -1014,7 +1143,7 @@ msgstr[0] "לפני שעה"
msgstr[1] "לפני %d שעות"
msgstr[2] "לפני שעתיים"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1354
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1022,7 +1151,7 @@ msgstr[0] "לפני יום"
msgstr[1] "לפני %d ימים"
msgstr[2] "לפני יומיים"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1359
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1030,6 +1159,14 @@ msgstr[0] "לפני שבוע"
msgstr[1] "לפני %d שבועות"
msgstr[2] "לפני שבועיים"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "בריטניה"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "בררת מחדל"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
@ -1054,6 +1191,15 @@ msgstr "מערכת הקבצים"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "No such application"
#~ msgstr "אין כזה יישום"
#~ msgid "Screen Reader"
#~ msgstr "מקריא מסך"
#~ msgid "Screen Keyboard"
#~ msgstr "מקלדת מסך"
#~ msgid "PREFERENCES"
#~ msgstr "העדפות"

478
po/hu.po

File diff suppressed because it is too large Load Diff

1162
po/id.po

File diff suppressed because it is too large Load Diff

479
po/it.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-11 01:54+0100\n"
"PO-Revision-Date: 2011-03-11 01:56+0100\n"
"POT-Creation-Date: 2011-03-24 22:46+0100\n"
"PO-Revision-Date: 2011-03-24 22:58+0100\n"
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
@ -174,47 +174,43 @@ msgstr ""
msgid "disabled OpenSearch providers"
msgstr "Fornitori OpenSearch disabilitati"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Comando non trovato"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Impossibile analizzare il comando:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Applicazione inesistente"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "Tutte"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "APPLICAZIONI"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "IMPOSTAZIONI"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "Nuova finestra"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
@ -376,7 +372,7 @@ msgstr "Questa settimana"
msgid "Next week"
msgstr "Prossima settimana"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "Rimuovi"
@ -431,7 +427,7 @@ msgstr "%a %l.%M %P"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%a %e %B %Y"
@ -444,7 +440,7 @@ msgstr "ELEMENTI RECENTI"
msgid "Log Out %s"
msgstr "Termina sessione di %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "Termina sessione"
@ -469,50 +465,45 @@ msgstr "La sessione verrà terminata automaticamente tra %d secondi."
msgid "Logging out of the system."
msgstr "Chiusura della sessione."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "Arresta"
# usato un termine diverso, magari si capisce meglio (LF)
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr ""
"Fare clic su «Arresta» per chiudere queste applicazioni e spegnere il "
"sistema."
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "Spegni"
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Il sistema verrà arrestato automaticamente tra %d secondi."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "Fare clic su «Spegni» per chiudere queste applicazioni e spegnere il sistema."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "Arresto del sistema."
#, c-format
msgid "The system will power off automatically in %d seconds."
msgstr "Il sistema verrà spento automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "pegnimento del sistema."
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "Riavvia"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Fare clic su «Riavvia» per chiudere queste applicazioni e riavviare il "
"sistema."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Il sistema verrà riavviato automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "Riavvio del sistema."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Conferma"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Annulla"
@ -528,7 +519,7 @@ msgstr "Abilitato"
# (ndt) o disabilitata?
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Disabilitato"
@ -548,48 +539,48 @@ msgstr "Visualizza sorgente"
msgid "Web Page"
msgstr "Pagina web"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "Apri"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "Informazione di sistema"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "Annulla"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "Finestre"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "Applicazioni"
# cruscotto?!?!?!?!?!?!?
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "Dash"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Chiudi %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "Attività"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "Pannello"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "Barra superiore"
# (ndt) libera, ma unmount non si può proprio vedere...
#: ../js/ui/placeDisplay.js:122
@ -605,64 +596,85 @@ msgstr "Riprova"
msgid "Connect to..."
msgstr "Connetti a..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "RISORSE E DISPOSITIVI"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "Richiesta autenticazione"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "Amministratore"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "Autentica"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr ""
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "Password:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "Inserire un comando:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "Ricerca..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "Nessun risultato corrispondente."
#: ../js/ui/statusMenu.js:113 ../js/ui/statusMenu.js:177
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163
#: ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "Spegni..."
#: ../js/ui/statusMenu.js:115 ../js/ui/statusMenu.js:176
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "Sospendi"
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "Disponibile"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "Non disponibile"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "Account personale"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "Impostazioni di sistema"
#: ../js/ui/statusMenu.js:160
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "Blocca schermo"
#: ../js/ui/statusMenu.js:164
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "Cambia utente"
#: ../js/ui/statusMenu.js:169
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "Termina sessione..."
@ -670,29 +682,27 @@ msgstr "Termina sessione..."
msgid "Zoom"
msgstr "Ingrandimento"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Lettore schermo"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Tastiera a schermo"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Allerte visive"
#: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys"
msgstr "Permanenza tasti"
msgstr "Tasti singoli"
#: ../js/ui/status/accessibility.js:83
msgid "Slow Keys"
msgstr "Rallentamento tasti"
msgstr "Tasti lenti"
#: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys"
msgstr "Pressione ravvicinata tasti"
msgstr "Tasti rimbalzati"
#: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys"
@ -702,24 +712,24 @@ msgstr "Mouse da tastiera"
msgid "Universal Access Settings"
msgstr "Impostazioni accesso universale"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Contrasto elevato"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Caratteri grandi"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
# as on Android :P
# su Android è Rilevabile :P
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Rilevabile"
msgstr "Visibile"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
@ -735,94 +745,94 @@ msgstr "Impostazioni Bluetooth"
# indica lo stato del device BT, per esempio gli auricolari
# credo sia meglio l'aggettivo che il sostantivo
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Collegato"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Invia file..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Esplora file..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Errore nell'esplorare il dispositivo"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Non è possibile esplorare il dispositivo richiesto, l'errore è «%s»"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Impostazioni tastiera"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Impostazioni mouse"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Impostazioni audio"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Richesta autorizzazione da %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Il dispositivo %s vuole accedere al servizio «%s»"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Consenti sempre accesso"
msgstr "Accorda sempre l'accesso"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Consenti solo stavolta"
msgstr "Accorda solo stavolta"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Rifiuta"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Conferma associazione per %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Il dispositivo %s vuole associarsi con questo computer"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confermare la corrispondenza del PIN «%s» con quello sul dispositivo."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Corrisponde"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Non corrisponde"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Richiesta associazione per %s"
msgstr "Richiesta di associazione per %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Inserire il PIN indicato sul dispositivo."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "OK"
@ -834,17 +844,147 @@ msgstr "Mostra disposizione tastiera..."
msgid "Localization Settings"
msgstr "Impostazioni localizzazione"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<sconosciuto>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "disabilitata"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "connessione..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "richiesta autenticazione"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "cavo scollegato"
#. 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:489
msgid "unavailable"
msgstr "non disponibile"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "connessione non riuscita"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Connessa (privata)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Ethernet automatica"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Banda larga automatica"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Dial-up automatica"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "%s automatica"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Bluetooth automatica"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Wireless automatica"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Altro..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Abilita rete"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Via cavo"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Wireless"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Banda larga mobile"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "Connessioni VPN"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Impostazioni rete"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Connessi alla rete mobile «%s»"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Connessi alla rete wireless «%s»"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Connessi alla rete via cavo «%s»"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Connessi alla rete VPN «%s»"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "Connessi a «%s»"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "Connessione stabilita"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Rete disabilitata"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Gestore reti"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Impostazioni alimentazione"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "In stima..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -852,103 +992,103 @@ msgstr[0] "%d ora rimanente"
msgstr[1] "%d ore rimanenti"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s e %d %s rimanenti"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "ora"
msgstr[1] "ore"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minuti"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuto rimanente"
msgstr[1] "%d minuti rimanenti"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Alimentatore di corrente"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Batteria del portatile"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Mouse"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Tastiera"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDS"
# c'era una discussione su tp...
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Cellulare"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Lettore multimediale"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Computer"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "Sconosciuto"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Microfono"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s è disponibile."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s è fuori rete."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s è assente."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s non è disponibile."
@ -956,7 +1096,7 @@ msgstr "%s non è disponibile."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Inviato alle %-H.%M di %A"
@ -965,11 +1105,11 @@ msgstr "Inviato alle %-H.%M di %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Digitare per cercare..."
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Cerca"
@ -986,7 +1126,7 @@ msgstr "«%s» è pronto"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -995,58 +1135,69 @@ msgstr[1] "%u uscite"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u ingresso"
msgstr[1] "%u ingressi"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Audio di sistema"
#: ../src/main.c:395
#: ../src/main.c:446
msgid "Print version"
msgstr "Stampa la versione"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Avvio di «%s» non riuscito"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "Meno di un minuto fa"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minuto fa"
msgstr[1] "%d minuti fa"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ora fa"
msgstr[1] "%d ore fa"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d giorno fa"
msgstr[1] "%d giorni fa"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d settimana fa"
msgstr[1] "%d settimane fa"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Regno Unito"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Predefinito"
#: ../src/shell-polkit-authentication-agent.c:334
#, fuzzy
msgid "Authentication dialog was dismissed by the user"
msgstr ""
"Il dialogo di autenticazione è stato scartato|respinto|rimosso dall'utente"
msgstr "Il dialogo di autenticazione è stato annullato dall'utente"
#: ../src/shell-util.c:89
msgid "Home Folder"
@ -1069,6 +1220,36 @@ msgstr "File system"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Shut Down"
#~ msgstr "Arresta"
# usato un termine diverso, magari si capisce meglio (LF)
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr ""
#~ "Fare clic su «Arresta» per chiudere queste applicazioni e spegnere il "
#~ "sistema."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "Il sistema verrà arrestato automaticamente tra %d secondi."
#~ msgid "Shutting down the system."
#~ msgstr "Arresto del sistema."
#~ msgid "Confirm"
#~ msgstr "Conferma"
#~ msgid "Panel"
#~ msgstr "Pannello"
#~ msgid "No such application"
#~ msgstr "Applicazione inesistente"
#~ msgid "Screen Reader"
#~ msgstr "Lettore schermo"
#~ msgid "Screen Keyboard"
#~ msgstr "Tastiera a schermo"
#~ msgid "PREFERENCES"
#~ msgstr "PREFERENZE"

454
po/ko.po
View File

@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2011-03-08 05:43+0000\n"
"PO-Revision-Date: 2011-03-14 10:40+0900\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-24 08:03+0000\n"
"PO-Revision-Date: 2011-03-25 21:56+0900\n"
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@ -161,47 +161,43 @@ msgstr "프로그램 사용 통계를 저장할지 여부"
msgid "disabled OpenSearch providers"
msgstr "OpenSearch 서비스 사용하지 않음"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "명령이 없습니다"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "명령어를 파싱할 수 없습니다:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "그런 프로그램이 없습니다"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' 실행이 실패했습니다:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "모두"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "프로그램"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "설정"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "새 창"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "즐겨찾기에서 제거"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "즐겨찾기에 추가"
@ -361,7 +357,7 @@ msgstr "이번주"
msgid "Next week"
msgstr "다음주"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "제거"
@ -416,7 +412,7 @@ msgstr "(%a) %p %l:%M"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%Y년 %B %e일 %A"
@ -429,7 +425,7 @@ msgstr "최근 항목"
msgid "Log Out %s"
msgstr "로그아웃 %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "로그아웃"
@ -451,45 +447,43 @@ msgstr "%d초 뒤에 자동으로 로그아웃합니다."
msgid "Logging out of the system."
msgstr "시스템에서 로그아웃."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "컴퓨터 끄기"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "컴퓨터 끄기를 누르면 이 프로그램을 끝내고 시스템을 끕니다."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "시스템이 %d초 뒤에 자동으로 꺼집니다."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "컴퓨터 끄기를 누르면 이 프로그램을 끝내고 시스템의 전원을 끕니다."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "시스템을 끕니다."
#, c-format
msgid "The system will power off automatically in %d seconds."
msgstr "시스템이 %d초 뒤에 자동으로 꺼집니다."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "시스템 전원 끄기."
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "다시 시작"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr "다시 시작을 누르면 이 프로그램을 끝내고 시스템을 다시 시작합니다."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "시스템이 %d초 뒤에 자동으로 다시 시작합니다."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "시스템을 다시 시작합니다."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "확인"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "취소"
@ -503,7 +497,7 @@ msgstr "사용"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "사용 않음"
@ -523,47 +517,47 @@ msgstr "소스 보기"
msgid "Web Page"
msgstr "웹페이지"
#: ../js/ui/messageTray.js:926
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "열기"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "시스템 정보"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "실행 취소"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "창"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "프로그램"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "대시보드"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:532
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "%s 끝내기"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:893
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "현재 활동"
#: ../js/ui/panel.js:994
msgid "Panel"
msgstr "패널"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "위 막대"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -578,64 +572,84 @@ msgstr "다시 시도"
msgid "Connect to..."
msgstr "연결..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "위치 및 장치"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "인증이 필요합니다"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "관리자"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "인증"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "죄송합니다. 동작하지 않았습니다. 다시 시도하십시오."
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "암호:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "명령을 입력하십시오:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "검색하는 중..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "일치하는 결과가 없습니다."
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "컴퓨터 끄기..."
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "절전"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "대화 가능"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "다른 용무 중"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "내 계정"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "시스템 설정"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "화면 잠그기"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "사용자 바꾸기"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "로그아웃..."
@ -643,14 +657,12 @@ msgstr "로그아웃..."
msgid "Zoom"
msgstr "크기 조정"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "화면 읽기"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "화면 키보드"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "화면 알림"
@ -673,19 +685,19 @@ msgstr "마우스 키"
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "보편적 접근성 설정"
msgstr "접근성 설정"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "고대비"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "큰 글자"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "블루투스"
@ -705,94 +717,94 @@ msgstr "새 장치 준비..."
msgid "Bluetooth Settings"
msgstr "블루투스 설정"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "연결"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "파일 보내기..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "파일 찾아보기..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "장치를 찾아보는데 오류"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "요청한 장치를 찾아볼 수 없습니다. 오류는 '%s'"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "키보드 설정"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "마우스 설정"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "소리 설정"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "%s 장치에서 권한 확인 요청"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "%s 장치에서 '%s' 서비스에 접근을 요청합니다"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "항상 접근 허용"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "이번에만 허용"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "거부"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "연결 확인 (%s)"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "%s 장치가 이 컴퓨터와 연결하려 합니다."
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "PIN '%s'이(가) 해당 장치의 PIN과 일치하는지 확인하십시오."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "일치"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "일치하지 않음"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "연결 요청 (%s)"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "해당 장치에 표시된 PIN을 입력하십시오."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "확인"
@ -804,117 +816,247 @@ msgstr "키보드 배치 보기..."
msgid "Localization Settings"
msgstr "지역화 설정"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<알 수 없음>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "사용 않음"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "연결하는 중..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "인증이 필요합니다"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "케이블이 분리되었습니다"
#. 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:489
msgid "unavailable"
msgstr "사용 불가"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "연결이 실패했습니다"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "연결됨 (개인)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "자동 이더넷"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "자동 고속 통신망"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "자동 전화접속"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "자동 %s"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "자동 블루투스"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "자동 무선"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "더 보기..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "네트워크 사용"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "유선"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "무선"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "휴대전화 네트워크"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "VPN 연결"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "네트워크 설정"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "'%s' 휴대전화 네트워크에 연결되었습니다"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "'%s' 무선 네트워크에 연결되었습니다"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "'%s' 유선 네트워크에 연결되었습니다"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "'%s' VPN 네트워크에 연결되었습니다"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "이제 '%s'에 연결되었습니다"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "연결이 되었습니다"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "네트워크를 사용하지 않습니다"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "네트워크 관리"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "전원 설정"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "예상치 계산 중..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d시간 남음"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d%s %d%s 남음"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "시간"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "분"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d분 남음"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "AC 어댑터"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "노트북 배터리"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "모니터"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "마우스"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "키보드"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "휴대전화"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "미디어 플레이어"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "태블릿"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "컴퓨터"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "알 수 없음"
# 오디오 볼륨
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "볼륨"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "마이크"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s 연결 중."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s 연결 중지."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s 다른 용무 중."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s 부재중."
@ -922,7 +1064,7 @@ msgstr "%s 부재중."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:348
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "보낸 때: %A %H시 %M분"
@ -931,11 +1073,11 @@ msgstr "보낸 때: %A %H시 %M분"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "검색하려면 입력하십시오..."
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "검색"
@ -951,7 +1093,7 @@ msgstr "'%s' 프로그램이 준비되었습니다"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -959,49 +1101,62 @@ msgstr[0] "%u개 출력"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u개 입력"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "시스템 소리"
# 커맨드라인 옵션 설명
#: ../src/main.c:395
#: ../src/main.c:446
msgid "Print version"
msgstr "버전을 표시합니다"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "'%s' 실행에 실패했습니다"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "1분 이내"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d분 전"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d시간 전"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d일 전"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d주 전"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "영국"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "기본값"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "인증 대화 창을 사용자가 닫았습니다"
@ -1026,5 +1181,32 @@ msgstr "파일시스템"
msgid "%1$s: %2$s"
msgstr "%s: %s"
#~ msgid "Shut Down"
#~ msgstr "컴퓨터 끄기"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "컴퓨터 끄기를 누르면 이 프로그램을 끝내고 시스템을 끕니다."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "시스템이 %d초 뒤에 자동으로 꺼집니다."
#~ msgid "Shutting down the system."
#~ msgstr "시스템을 끕니다."
#~ msgid "Confirm"
#~ msgstr "확인"
#~ msgid "Panel"
#~ msgstr "패널"
#~ msgid "No such application"
#~ msgstr "그런 프로그램이 없습니다"
#~ msgid "Screen Reader"
#~ msgstr "화면 읽기"
#~ msgid "Screen Keyboard"
#~ msgstr "화면 키보드"
#~ msgid "PREFERENCES"
#~ msgstr "기본 설정"

1240
po/lt.po

File diff suppressed because it is too large Load Diff

1287
po/lv.po Normal file

File diff suppressed because it is too large Load Diff

427
po/nb.po
View File

@ -4,12 +4,13 @@
#
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2011.
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
#: ../js/ui/polkitAuthenticationAgent.js:142
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 2.91.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-08 15:24+0100\n"
"PO-Revision-Date: 2011-03-08 15:29+0100\n"
"POT-Creation-Date: 2011-03-23 21:46+0100\n"
"PO-Revision-Date: 2011-03-23 21:47+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@ -145,49 +146,45 @@ msgstr "Om det skal samles statistikk om bruk av programmer"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "disabled OpenSearch providers"
msgstr ""
msgstr "OpenSearch tilbydere slått av"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Kommando ikke funnet"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Klarte ikke å lese kommando:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Programmet finnes ikke"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "Alle"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "INNSTILLINGER"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
@ -347,7 +344,7 @@ msgstr "Denne uken"
msgid "Next week"
msgstr "Neste uke"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "Fjern"
@ -402,7 +399,7 @@ msgstr "%a %l.%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y"
@ -415,7 +412,7 @@ msgstr "SISTE OPPFØRINGER"
msgid "Log Out %s"
msgstr "Logg ut %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "Logg ut"
@ -438,47 +435,46 @@ msgstr "Du vil bli logget ut automatisk om %d sekunder."
msgid "Logging out of the system."
msgstr "Logger ut av systemet"
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "Avslutt"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "Klikk Avslutt for å avslutte disse programmene og stenge ned systemet."
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "Slå av"
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Systemet vil slås av automatisk om %d sekunder."
msgid "Click Power Off to quit these applications and power off the system."
msgstr ""
"Klikk «Slå av» for å avslutte disse programmene og logge ut av systemet."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
#, c-format
msgid "The system will power off automatically in %d seconds."
msgstr "Systemet vil slås av automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "Slår av systemet."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "Start på nytt"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Klikk Start på nytt for å avslutte disse programmene og starte systemet på "
"nytt."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Systemet vil starte på nytt automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "Starter systemet på nytt."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Bekreft"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Avbryt"
@ -492,7 +488,7 @@ msgstr "Aktivert"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Deaktivert"
@ -512,47 +508,47 @@ msgstr "Vis kildekode"
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/messageTray.js:926
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "Åpne"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "Systeminformasjon"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "Angre"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "Vinduer"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "Programmer"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "Favoritter"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:532
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Avslutt %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:893
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "Aktiviteter"
#: ../js/ui/panel.js:994
msgid "Panel"
msgstr "Panel"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "Topp-panel"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -567,64 +563,84 @@ msgstr "Prøv igjen"
msgid "Connect to..."
msgstr "Koble til …"
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "Autentisering kreves"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "Administrator"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "Autentiser"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "Passord:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "Oppgi en kommando:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "Søker …"
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "Ingen treff."
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "Slå av …"
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "Hvilemodus"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "Tilgjengelig"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "Opptatt"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "Min konto"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "Systeminnstillinger"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "Lås skjerm"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "Bytt bruker"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "Logg ut …"
@ -632,14 +648,12 @@ msgstr "Logg ut …"
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Skjermleser"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Tastatur på skjermen"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Synlig varsling"
@ -664,17 +678,17 @@ msgstr "Mustaster"
msgid "Universal Access Settings"
msgstr "Innstillinger for tilgjengelighet"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Høy kontrast"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Stor tekst"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -694,94 +708,94 @@ msgstr "Sett opp en ny enhet …"
msgid "Bluetooth Settings"
msgstr "Innstillinger for Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Tilkobling"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Send filer …"
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Bla gjennom filer …"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Feil under lesing av enhet"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Kan ikke bla gjennom forespurt enhet. Feilen er «%s»"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Innstillinger for tastatur"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Innstillinger for mus"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Innstillinger for lyd"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Forespørsel om autorisering fra %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Enhet %s vil ha tilgang til tjenesten «%s»"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Alltid gi tilgang"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Gi tilgang kun denne ene gangen"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Avvis"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Bekreftelse for tilkobling for %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Enhet %s vil koble seg sammen med denne datamaskinen"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Vennligst bekreft om PIN «%s» er lik den som brukes på enheten."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Stemmer overens"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Stemmer ikke overens"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Forespørsel om tilkobling for %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Vennligst oppgi PIN som oppgitt på enheten."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "OK"
@ -793,17 +807,147 @@ msgstr "Vis tastaturutforming …"
msgid "Localization Settings"
msgstr "Innstillinger for lokalisering"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<ukjent>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "slått av"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "kobler til …"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "autentisering kreves"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "kabel koblet fra"
#. 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:489
msgid "unavailable"
msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "tilkobling feilet"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Automatisk oppringt"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "Automatisk %s"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Mer …"
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Kablet"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Trådløst"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "VPN-tilkoblinger"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Du er nå koblet til mobil bredbåndstilkobling «%s»"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Du er nå koblet til trådløst nettverk «%s»"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Du er nå koblet til kablet nettverk «%s»"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Du er nå koblet til virtuelt privat nettverk «%s»"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "Du er nå koblet til «%s»"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "Tilkobling etablert"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Nettverk er slått av"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Nettverkshåndtering"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Innstillinger for strøm"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Estimerer …"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -811,102 +955,102 @@ msgstr[0] "%d time gjenstår"
msgstr[1] "%d timer gjenstår"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s gjenstår"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "time"
msgstr[1] "timer"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minutt"
msgstr[1] "minutter"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Strømadapter"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Skjerm"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Mus"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Medieavspiller"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Nettbrett"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Datamaskin"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "Ukjent"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Volum"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s er tilkoblet."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s er frakoblet."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "«%s» er borte."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s er opptatt."
@ -914,7 +1058,7 @@ msgstr "%s er opptatt."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:348
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Sendt %X på %A"
@ -923,11 +1067,11 @@ msgstr "Sendt %X på %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Skriv for å søke …"
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Søk"
@ -943,7 +1087,7 @@ msgstr "«%s» er klar"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -952,53 +1096,66 @@ msgstr[1] "%u utganger"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u inngang"
msgstr[1] "%u innganger"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/main.c:395
#: ../src/main.c:438
msgid "Print version"
msgstr "Skriv ut versjon"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Klarte ikke å starte «%s»"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minutt siden"
msgstr[1] "%d minutter siden"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d time siden"
msgstr[1] "%d timer siden"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dag siden"
msgstr[1] "%d dager siden"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d uke siden"
msgstr[1] "%d uker siden"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr ""
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Forvalg"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Autentiseringsdialogen ble lukket av brukeren"

344
po/nl.po
View File

@ -6,12 +6,15 @@
# Reinout van Schouwen <reinouts@gnome.org>, 2010
# Wouter Bolsterlee <wbolster@gnome.org>, 2011
#
# Aangezien dit een erg zichtbare module is graag eerst contact opnemen met
# Wouter Bolsterlee alvorens zaken te wijzigen!
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-12 23:52+0100\n"
"PO-Revision-Date: 2011-03-12 23:52+0100\n"
"POT-Creation-Date: 2011-03-19 01:15+0100\n"
"PO-Revision-Date: 2011-03-19 01:14+0100\n"
"Last-Translator: Wouter Bolsterlee <wbolster@gnome.org>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n"
@ -44,11 +47,11 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr "Bestandsextensie voor het opslaan van de screencast"
msgstr "Bestandsextensie voor het opslaan van de schermopname"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Framerate voor het opnemen van de screencasts."
msgstr "Framerate voor het opnemen van de schermopnamen."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
@ -149,7 +152,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "De gstreamer-pijplijn voor het coderen van de screencast"
msgstr "De gstreamer-pijplijn voor het coderen van de schermopname"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
@ -175,21 +178,17 @@ msgstr "Of statistieken worden bijgehouden over gebruik van toepassingen"
msgid "disabled OpenSearch providers"
msgstr "uitgeschakelde OpenSearch-providers"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Opdracht niet gevonden"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Kon opdracht niet parsen:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Toepassing niet gevonden"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Uitvoeren van %s mislukt:"
@ -375,13 +374,13 @@ msgstr "Deze week"
msgid "Next week"
msgstr "Volgende week"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "Verwijderen"
#: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "Datum- en tijdinstellingen"
msgstr "Instellingen voor datum en tijd"
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
@ -427,13 +426,12 @@ msgstr "%a %l:%M:%S %p"
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
# Dagnaam bewust afgekort (Wouter Bolsterlee)
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%a %e %B %Y"
msgstr "%A %e %B %Y"
#: ../js/ui/docDisplay.js:19
msgid "RECENT ITEMS"
@ -509,7 +507,7 @@ msgstr "Computer opnieuw opstarten"
msgid "Confirm"
msgstr "Bevestigen"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Annuleren"
@ -543,11 +541,11 @@ msgstr "Broncode weergeven"
msgid "Web Page"
msgstr "Webpagina"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Openen"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:1986
msgid "System Information"
msgstr "Systeeminformatie"
@ -571,18 +569,18 @@ msgid "Dash"
msgstr "Zijbalk"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "%s afsluiten"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:874
msgid "Activities"
msgstr "Activiteiten"
#: ../js/ui/panel.js:1020
#: ../js/ui/panel.js:975
msgid "Panel"
msgstr "Paneel"
@ -599,7 +597,7 @@ msgstr "Opnieuw"
msgid "Connect to..."
msgstr "Verbinding maken met…"
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "LOCATIES & APPARATEN"
@ -608,7 +606,7 @@ msgstr "LOCATIES & APPARATEN"
#. "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:618
#: ../js/ui/popupMenu.js:636
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -624,39 +622,39 @@ msgstr "Zoeken…"
msgid "No matching results."
msgstr "Geen overeenkomende resultaten."
#: ../js/ui/statusMenu.js:113 ../js/ui/statusMenu.js:177
#: ../js/ui/statusMenu.js:114 ../js/ui/statusMenu.js:178
msgid "Power Off..."
msgstr "Uitschakelen…"
#: ../js/ui/statusMenu.js:115 ../js/ui/statusMenu.js:176
#: ../js/ui/statusMenu.js:116 ../js/ui/statusMenu.js:177
msgid "Suspend"
msgstr "Slaapstand"
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:137
msgid "Available"
msgstr "Beschikbaar"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Busy"
msgstr "Bezig"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:150
msgid "My Account"
msgstr "Mijn account"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:154
msgid "System Settings"
msgstr "Systeeminstellingen"
#: ../js/ui/statusMenu.js:160
#: ../js/ui/statusMenu.js:161
msgid "Lock Screen"
msgstr "Scherm vergrendelen"
#: ../js/ui/statusMenu.js:164
#: ../js/ui/statusMenu.js:165
msgid "Switch User"
msgstr "Gebruiker wisselen"
#: ../js/ui/statusMenu.js:169
#: ../js/ui/statusMenu.js:170
msgid "Log Out..."
msgstr "Afmelden…"
@ -664,14 +662,12 @@ msgstr "Afmelden…"
msgid "Zoom"
msgstr "Zoomen"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Schermlezer"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Schermtoetsenbord"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Visuele alerteringen"
@ -696,17 +692,17 @@ msgstr "Muistoetsen"
msgid "Universal Access Settings"
msgstr "Instellingen voor toegankelijkheid"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Hoog contrast"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Grote tekst"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -726,94 +722,94 @@ msgstr "Nieuw apparaat instellen…"
msgid "Bluetooth Settings"
msgstr "Bluetooth-instellingen"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Verbinding"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Bestanden sturen…"
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Bestanden doorbladeren…"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Fout bij doorbladeren van apparaat"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Het gekozen apparaat kon niet doorgebladerd worden. De fout is %s"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Toetsenbordvoorkeuren"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Muisvoorkeuren"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:66
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Geluidsvoorkeuren"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Autorisatie-aanvraag van %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Het apparaat %s wil toegang tot de dienst %s"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Altijd toestaan"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Eenmalig toestaan"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Afwijzen"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Koppelbevestiging voor %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Het apparaat %s wil aankoppelen met deze computer"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Bevestig dat de PIN-code %s hetzelfde is als die van het apparaat."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Komt overeen"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Komt niet overeen"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Verzoek tot koppelen met %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Geef de op het apparaat aangegeven PIN-code."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "OK"
@ -825,17 +821,149 @@ msgstr "Toetsenbordindeling tonen…"
msgid "Localization Settings"
msgstr "Regionale instellingen"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<onbekend>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "uitgeschakeld"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "verbinden…"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "authenticatie nodig"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "kabel niet verbonden"
#. 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:489
msgid "unavailable"
msgstr "niet beschikbaar"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "verbinding mislukt"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Verbonden (persoonlijke verbinding)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Automatisch ethernetverbinding"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Automatische breedbandverbinding"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Automatisch inbellen"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "%s (automatisch)"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Automatische Bluetooth"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Automatisch draadloos netwerk"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Meer…"
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Netwerk inschakelen"
# Expliciet "netwerk" toegevoegd (Wouter Bolsterlee)
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Bekabeld netwerk"
# Expliciet "netwerk" toegevoegd (Wouter Bolsterlee)
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Draadloos netwerk"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Mobiel breedband"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "VPN-verbindingen"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Netwerkinstellingen"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "U bent nu verbonden met de mobiele breedbandverbinding %s"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "U bent nu verbonden met het draadloze netwerk %s"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "U bent nu verbonden met het bekabelde netwerk %s"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "U bent nu verbonden met het VPN-netwerk %s"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "U bent nu verbonden met %s"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "Verbinding gemaakt"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Netwerk is uitgeschakeld"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Netwerk-manager"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Energievoorkeuren"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Schatten…"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -843,75 +971,75 @@ msgstr[0] "%d uur resterend"
msgstr[1] "%d uur resterend"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s resterend"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "uur"
msgstr[1] "uur"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuut"
msgstr[1] "minuten"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuut resterend"
msgstr[1] "%d minuten resterend"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Netstroom"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Laptop-accu"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Muis"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Toetsenbord"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Mobiele telefoon"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Mediaspeler"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Computer"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:961
msgid "Unknown"
msgstr "Onbekend"
@ -923,22 +1051,22 @@ msgstr "Volume"
msgid "Microphone"
msgstr "Microfoon"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s is online."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s is offline."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s is afwezig."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s is bezig."
@ -946,7 +1074,7 @@ msgstr "%s is bezig."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Verzonden om %H:%M op %A %e %B %Y"
@ -995,42 +1123,55 @@ msgstr[1] "%u invoerkanalen"
msgid "System Sounds"
msgstr "Systeemgeluiden"
#: ../src/main.c:395
#: ../src/main.c:397
msgid "Print version"
msgstr "Versie weergeven"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Kon %s niet starten"
#: ../src/shell-global.c:1340
msgid "Less than a minute ago"
msgstr "Minder dan een minuut geleden"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1344
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minuut geleden"
msgstr[1] "%d minuten geleden"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1349
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d uur geleden"
msgstr[1] "%d uur geleden"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1354
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dag geleden"
msgstr[1] "%d dagen geleden"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1359
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d week geleden"
msgstr[1] "%d weken geleden"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Verenigd Koninkrijk"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Standaard"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Authenticatievenster is door de gebruiker afgesloten"
@ -1055,6 +1196,15 @@ msgstr "Bestandssysteem"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "No such application"
#~ msgstr "Toepassing niet gevonden"
#~ msgid "Screen Reader"
#~ msgstr "Schermlezer"
#~ msgid "Screen Keyboard"
#~ msgstr "Schermtoetsenbord"
#~ msgid "PREFERENCES"
#~ msgstr "VOORKEUREN"

474
po/pa.po
View File

@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2011-03-07 16:15+0000\n"
"PO-Revision-Date: 2011-03-08 08:27+0530\n"
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-24 08:03+0000\n"
"PO-Revision-Date: 2011-03-25 08:16+0530\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"MIME-Version: 1.0\n"
@ -164,47 +164,43 @@ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵਰਤੋਂ ਬਾਰੇ ਅੰਕੜੇ
msgid "disabled OpenSearch providers"
msgstr "ਓਪਨਸਰਚ ਉਪਲੱਬਧ ਕਰਵਾਉਣ ਵਾਲੇ ਬੰਦ ਹਨ"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "ਕਮਾਂਡ ਨਹੀਂ ਲੱਭੀ"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "ਕਮਾਂਡ ਪਾਰਸ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "ਇੰਞ ਦੀ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਹੈ"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "ਸਭ"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "ਸੈਟਿੰਗ"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
@ -364,7 +360,7 @@ msgstr "ਇਹ ਹਫ਼ਤਾ"
msgid "Next week"
msgstr "ਹਫ਼ਤਾ ਅੱਗੇ"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "ਹਟਾਓ"
@ -419,7 +415,7 @@ msgstr "%a %l:%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y"
@ -432,7 +428,7 @@ msgstr "ਤਾਜ਼ਾ ਆਈਟਮਾਂ"
msgid "Log Out %s"
msgstr "%s ਲਾਗਆਉਟ"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "ਲਾਗਆਉਟ"
@ -455,46 +451,48 @@ msgstr "ਤੁਹਾਨੂੰ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਆਟੋਮ
msgid "Logging out of the system."
msgstr "ਸਿਸਟਮ ਲਾਗ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
#| msgid "Power Off..."
msgid "Power Off"
msgstr "ਬੰਦ ਕਰੋ"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਕੇ ਸਿਸਟਮ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਬੰਦ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।"
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "ਸਿਸਟਮ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।"
#| msgid "Click Log Out to quit these applications and log out of the system."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨਾਂ ਬੰਦ ਕਰਨ ਅਤੇ ਸਿਸਟਮ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਬੰਦ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।"
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
#, c-format
#| msgid "The system will restart automatically in %d seconds."
msgid "The system will power off automatically in %d seconds."
msgstr "ਸਿਸਟਮ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।"
#: ../js/ui/endSessionDialog.js:78
#| msgid "Logging out of the system."
msgid "Powering off the system."
msgstr "ਸਿਸਟਮ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਨ ਤੇ ਸਿਸਟਮ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "ਸਿਸਟਮ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਜਾਵੇਗਾ।"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "ਸਿਸਟਮ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "ਪੁਸ਼ਟੀ"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "ਰੱਦ ਕਰੋ"
@ -508,7 +506,7 @@ msgstr "ਚਾਲੂ ਹੈ"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "ਬੰਦ ਹੈ"
@ -528,48 +526,47 @@ msgstr "ਸਰੋਤ ਵੇਖੋ"
msgid "Web Page"
msgstr "ਵੈੱਬ ਪੇਜ਼"
#: ../js/ui/messageTray.js:926
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "ਖੋਲ੍ਹੋ"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "ਵਾਪਸ"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "ਵਿੰਡੋ"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "ਡੈਸ਼"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:532
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "%s ਬੰਦ ਕਰੋ"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:893
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "ਸਰਗਰਮੀਆਂ"
#: ../js/ui/panel.js:994
#| msgid "Cancel"
msgid "Panel"
msgstr "ਪੈਨਲ"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "ਉੱਤਲੀ ਪੱਟੀ"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -584,64 +581,84 @@ msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼"
msgid "Connect to..."
msgstr "...ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ"
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "ਪਰਸ਼ਾਸ਼ਕ"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "ਪਰਮਾਣਕਿਤਾ"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "ਅਫਸੋਸ, ਉਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।"
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "ਪਾਸਵਰਡ:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "...ਬੰਦ ਕਰੋ"
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "ਸਸਪੈਂਡ"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "ਉਪਲੱਬਧ"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "ਰੁਝਿਆ"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "ਮੇਰਾ ਅਕਾਊਂਟ"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "...ਲਾਗਆਉਟ"
@ -649,14 +666,12 @@ msgstr "...ਲਾਗਆਉਟ"
msgid "Zoom"
msgstr "ਜ਼ੂਮ"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "ਸਕਰੀਨ ਰੀਡਰ"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "ਦਿੱਖ ਚੇਤਾਵਨੀ"
@ -681,17 +696,17 @@ msgstr "ਮਾਊਸ ਸਵਿੱਚਾਂ"
msgid "Universal Access Settings"
msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "ਵੱਧ ਕਨਟਰਾਸਟ"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "ਵੱਡੇ ਅੱਖਰ"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "ਬਲਿਊਟੁੱਥ"
@ -711,94 +726,94 @@ msgstr "...ਨਵਾਂ ਜੰਤਰ ਸੈਟਅੱਪ"
msgid "Bluetooth Settings"
msgstr "ਬਲਿਊਟੁੱਥ ਸੈਟਿੰਗ"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "ਕੁਨੈਕਸ਼ਨ"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "...ਫਾਇਲਾਂ ਭੇਜੋ"
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "...ਫਾਇਲਾਂ ਦੀ ਝਲਕ"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "ਜੰਤਰ ਬਰਾਊਜ਼ ਕਰਨ ਲਈ ਗਲਤੀ"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "ਮੰਗ ਕੀਤੇ ਗਏ ਜੰਤਰ ਨੂੰ ਬਰਾਊਜ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਗਲਤੀ ਸੀ '%s'"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "ਕੀਬੋਰਡ ਸੈਟਿੰਗ"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "ਮਾਊਸ ਸੈਟਿੰਗ"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "ਸਾਊਂਡ ਸੈਟਿੰਗ"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "'%s' ਤੋਂ ਪਰਮਾਣਕਿਤਾ ਮੰਗ"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "ਜੰਤਰ %s ਸਰਵਿਸ '%s' ਨੂੰ ਵਰਤਣੀ ਚਾਹੁੰਦਾ ਹੈ।"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "ਹਮੇਸ਼ਾ ਪਹੁੰਚ ਮਨਜ਼ੂਰ"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "ਕੇਵਲ ਇਸ ਸਮੇਂ ਹੀ ਮਨਜ਼ੂਰ"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "ਨਾ-ਮਨਜ਼ੂਰ"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "%s ਲਈ ਪੇਅਰ ਕਰਨ ਦੀ ਪੁਸ਼ਟੀ"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "ਜੰਤਰ %s ਇਸ ਕੰਪਿਊਟਰ ਨਾਲ ਪੇਅਰ ਹੋਣਾ ਚਾਹੁੰਦਾ ਹੈ"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "ਪੁਸ਼ਟੀ ਕਰੋ ਜੀ ਕਿ ਪਿੰਨ '%s' ਜੰਤਰ ਉੱਤੇ ਮੌਜੂਦ ਪਿੰਨ ਨਾਲ ਮਿਲਦਾ ਹੈ।"
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "ਮਿਲਦਾ ਹੈ"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "ਮਿਲਦਾ ਨਹੀਂ ਹੈ"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "%s ਲਈ ਪੇਅਰ ਕਰਨ ਦੀ ਮੰਗ"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "ਜੰਤਰ ਉੱਤੇ ਦਿੱਤਾ ਗਿਆ ਪਿੰਨ ਦਿਉ ਜੀ।"
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "ਠੀਕ ਹੈ"
@ -810,17 +825,158 @@ msgstr "...ਕੀਬੋਰਡ ਲੇਆਉਟ ਵੇਖੋ"
msgid "Localization Settings"
msgstr "ਲੋਕਲਾਈਜ਼ੇਸ਼ਨ ਸੈਟਿੰਗ"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
#| msgid "Unknown"
msgid "<unknown>"
msgstr "<ਅਣਜਾਣ>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
#| msgid "Disabled"
msgid "disabled"
msgstr "ਬੰਦ ਹੈ"
#: ../js/ui/status/network.js:476
#| msgid "Connection"
msgid "connecting..."
msgstr "ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "ਕੇਬਲ ਕੱਢੀ ਹੋਈ ਹੈ"
#. 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:489
#| msgid "Available"
msgid "unavailable"
msgstr "ਨਾ-ਉਪਲੱਬਧ"
#: ../js/ui/status/network.js:491
#| msgid "Connection"
msgid "connection failed"
msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "ਕੁਨੈਕਟ ਹੈ (ਪ੍ਰਾਈਵੇਟ)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "ਆਟੋ ਈਥਰਨੈੱਟ"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "ਆਟੋ ਬਰਾਡਬੈਂਡ"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "ਆਟੋ ਡਾਇਲ-ਅੱਪ"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
#| msgid "Quit %s"
msgid "Auto %s"
msgstr "ਆਟੋ %s"
#: ../js/ui/status/network.js:845
#| msgid "Bluetooth"
msgid "Auto bluetooth"
msgstr "ਆਟੋ ਬਲਿਊਟੁੱਥ"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "ਆਟੋ ਬੇਤਾਰ"
#: ../js/ui/status/network.js:1413
#| msgid "More"
msgid "More..."
msgstr "ਹੋਰ..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "ਨੈੱਟਵਰਕਿੰਗ ਚਾਲੂ ਹੈ"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "ਤਾਰ"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "ਬੇਤਾਰ"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ"
#: ../js/ui/status/network.js:1479
#| msgid "Connection"
msgid "VPN Connections"
msgstr "VPN ਕੁਨੈਕਸ਼ਨ"
#: ../js/ui/status/network.js:1488
#| msgid "Power Settings"
msgid "Network Settings"
msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗ"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "ਹੁਣ ਤੁਸੀਂ ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਗਏ ਹੋ"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "ਹੁਣ ਤੁਸੀਂ ਬੇਤਾਰ ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਗਏ ਹੋ"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "ਹੁਣ ਤੁਸੀਂ ਤਾਰ ਵਾਲੇ ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਗਏ ਹੋ"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "ਤੁਸੀਂ ਹੁਣ VPN ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਚੁੱਕੇ ਹੋ"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "ਤੁਸੀਂ ਹੁਣ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ"
#: ../js/ui/status/network.js:1808
#| msgid "Connection"
msgid "Connection established"
msgstr "ਕੁਨੈਕਸ਼ਨ ਬਣਾਇਆ ਗਿਆ"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "ਨੈੱਟਵਰਕਿੰਗ ਬੰਦ ਹੈ"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "ਨੈੱਟਵਰਕ ਮੈਨੇਜਰ"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "ਪਾਵਰ ਸੈਟਿੰਗ"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "...ਅਨੁਮਾਨ ਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -828,102 +984,102 @@ msgstr[0] "%d ਘੰਟਾ ਬਾਕੀ"
msgstr[1] "%d ਘੰਟੇ ਬਾਕੀ"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s ਬਾਕੀ"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "ਘੰਟਾ"
msgstr[1] "ਘੰਟੇ"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "ਮਿੰਟ"
msgstr[1] "ਮਿੰਟ"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d ਮਿੰਟ ਬਾਕੀ"
msgstr[1] "%d ਮਿੰਟ ਬਾਕੀ"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "AC ਐਡਪਟਰ"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "ਲੈਪਟਾਪ ਬੈਟਰੀ"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "ਮਾਨੀਟਰ"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "ਮਾਊਸ"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "ਕੀਬੋਰਡ"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "ਸੈੱਲ ਫੋਨ"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "ਮੀਡਿਆ ਪਲੇਅਰ"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "ਟੇਬਲੇਟ"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "ਕੰਪਿਊਟਰ"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "ਅਣਜਾਣ"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "ਆਵਾਜ਼"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "ਮਾਈਕਰੋਫੋਨ"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s ਆਨਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s ਆਫਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s ਦੂਰ ਹੈ।"
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
@ -931,7 +1087,7 @@ msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:348
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
@ -940,11 +1096,11 @@ msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "...ਲੱਭਣ ਲਈ ਲਿਖੋ"
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "ਖੋਜ"
@ -960,7 +1116,7 @@ msgstr "'%s' ਤਿਆਰ ਹੈ"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -969,51 +1125,68 @@ msgstr[1] "%u ਆਉਟਪੁੱਟ"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u ਇੰਪੁੱਟ"
msgstr[1] "%u ਇੰਪੁੱਟ"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "ਸਿਸਟਮ ਸਾਊਂਡ"
#: ../src/shell-global.c:1298
#: ../src/main.c:446
msgid "Print version"
msgstr "ਵਰਜਨ ਛਾਪੋ"
#: ../src/shell-app.c:454
#, c-format
#| msgid "Failed to unmount '%s'"
msgid "Failed to launch '%s'"
msgstr "'%s' ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1302
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1307
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "ਬਰਤਾਨੀਆ"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "ਡਿਫਾਲਟ"
#: ../src/shell-polkit-authentication-agent.c:334
#| msgid "Authentation dialog was dismissed by the user"
msgid "Authentication dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋਂ ਰੱਦ ਕੀਤਾ"
@ -1037,6 +1210,34 @@ msgstr "ਫਾਇਲ ਸਿਸਟਮ"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "No such application"
#~ msgstr "ਇੰਞ ਦੀ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਹੈ"
#~ msgid "Shut Down"
#~ msgstr "ਬੰਦ ਕਰੋ"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਕੇ ਸਿਸਟਮ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਬੰਦ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।"
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "ਸਿਸਟਮ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।"
#~ msgid "Shutting down the system."
#~ msgstr "ਸਿਸਟਮ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
#~ msgid "Confirm"
#~ msgstr "ਪੁਸ਼ਟੀ"
#~| msgid "Cancel"
#~ msgid "Panel"
#~ msgstr "ਪੈਨਲ"
#~ msgid "Screen Reader"
#~ msgstr "ਸਕਰੀਨ ਰੀਡਰ"
#~ msgid "Screen Keyboard"
#~ msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ"
#~ msgid "PREFERENCES"
#~ msgstr "ਪਸੰਦ"
@ -1246,9 +1447,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Frequent"
#~ msgstr "ਅਕਸਰ"
#~ msgid "More"
#~ msgstr "ਹੋਰ"
#~ msgid "(see all)"
#~ msgstr "(ਸਭ ਵੇਖੋ)"

345
po/pl.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-09 21:48+0100\n"
"PO-Revision-Date: 2011-03-09 21:49+0100\n"
"POT-Creation-Date: 2011-03-19 16:19+0100\n"
"PO-Revision-Date: 2011-03-19 16:20+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n"
@ -176,21 +176,17 @@ msgstr "Określa, czy zbierać statystyki o użyciu programów"
msgid "disabled OpenSearch providers"
msgstr "Wyłączeni dostawcy OpenSearch"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Nie odnaleziono polecenia"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Nie można przetworzyć polecenia:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Nie ma takiego programu"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Wykonanie polecenia \"%s\" się nie powiodło:"
@ -208,15 +204,15 @@ msgstr "Programy"
msgid "SETTINGS"
msgstr "Ustawienia"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:616
msgid "New Window"
msgstr "Nowe okno"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:619
msgid "Remove from Favorites"
msgstr "Usuń z ulubionych"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:620
msgid "Add to Favorites"
msgstr "Dodaj do ulubionych"
@ -376,7 +372,7 @@ msgstr "Ten tydzień"
msgid "Next week"
msgstr "Następny tydzień"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "Usuń"
@ -431,7 +427,7 @@ msgstr "%a, %l:%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y"
@ -507,7 +503,7 @@ msgstr "Ponowne uruchamianie systemu."
msgid "Confirm"
msgstr "Potwierdź"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Anuluj"
@ -521,7 +517,7 @@ msgstr "Włączone"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Wyłączone"
@ -541,11 +537,11 @@ msgstr "Wyświetl źródło"
msgid "Web Page"
msgstr "Strona WWW"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Otwórz"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:1986
msgid "System Information"
msgstr "Informacje systemowe"
@ -568,18 +564,18 @@ msgid "Dash"
msgstr "Ulubione"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Zakończ program %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:874
msgid "Activities"
msgstr "Podgląd"
#: ../js/ui/panel.js:1020
#: ../js/ui/panel.js:975
msgid "Panel"
msgstr "Panel"
@ -596,7 +592,7 @@ msgstr "Ponów"
msgid "Connect to..."
msgstr "Połącz z..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "Miejsca i urządzenia"
@ -605,7 +601,7 @@ msgstr "Miejsca i urządzenia"
#. "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:618
#: ../js/ui/popupMenu.js:636
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -613,47 +609,47 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Proszę wprowadzić polecenie:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:287
msgid "Searching..."
msgstr "Wyszukiwanie..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:301
msgid "No matching results."
msgstr "Brak wyników."
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:114 ../js/ui/statusMenu.js:178
msgid "Power Off..."
msgstr "Wyłącz..."
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#: ../js/ui/statusMenu.js:116 ../js/ui/statusMenu.js:177
msgid "Suspend"
msgstr "Uśpij"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:137
msgid "Available"
msgstr "Dostępny"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:142
msgid "Busy"
msgstr "Zajęty"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:150
msgid "My Account"
msgstr "Moje konto"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:154
msgid "System Settings"
msgstr "Ustawienia systemu"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:161
msgid "Lock Screen"
msgstr "Zablokuj ekran"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:165
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:170
msgid "Log Out..."
msgstr "Wyloguj się..."
@ -661,14 +657,12 @@ msgstr "Wyloguj się..."
msgid "Zoom"
msgstr "Powiększenie"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Czytnik ekranu"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Klawiatura ekranowa"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Ostrzeżenia wzrokowe"
@ -693,17 +687,17 @@ msgstr "Klawisze myszy"
msgid "Universal Access Settings"
msgstr "Ustawienia uniwersalnego dostępu"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Wysoki kontrast"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Duży tekst"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -723,94 +717,94 @@ msgstr "Ustaw nowe urządzenie..."
msgid "Bluetooth Settings"
msgstr "Ustawienia Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Połączenie"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Wyślij pliki..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Przeglądaj pliki..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Błąd podczas przeglądania urządzenia"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Nie można przeglądać żądanego urządzenia. Błąd: \"%s\""
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Ustawienia klawiatury"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Ustawienia myszy"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Ustawienia dźwięku"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Żądanie upoważnienia z %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Urządzenie %s żąda dostępu do usługi \"%s\""
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Zawsze udzielaj dostęp"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Udziel dostęp tylko tym razem"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Odrzuć"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Potwierdzenie wiązania dla %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Urządzenie %s żąda powiązania z tym komputerem"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Proszę potwierdzić, czy PIN \"%s\" zgadza się z tym na urządzeniu."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Zgadza się"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Nie zgadza się"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Żądanie powiązania dla %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Proszę wprowadzić PIN wyświetlony na urządzeniu."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "OK"
@ -822,17 +816,147 @@ msgstr "Wyświetl układ klawiatury..."
msgid "Localization Settings"
msgstr "Ustawienia lokalizacji"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<nieznane>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "wyłączone"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "łączenie..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "wymagane jest uwierzytelnienie"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "kabel jest niepodłączony"
#. 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:489
msgid "unavailable"
msgstr "niedostępne"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "połączenie się nie powiodło"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Połączono (prywatne)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Automatyczne Ethernet"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Automatyczne komórkowe"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Automatyczne wdzwaniane"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "Automatyczne %s"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Automatyczne Bluetooth"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Automatyczne bezprzewodowe"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Więcej..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Włącz sieć"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Przewodowe"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Bezprzewodowe"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Komórkowe"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "Połączenia VPN"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Ustawienia sieci"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Połączono z siecią komórkową \"%s\""
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Połączono z siecią bezprzewodową \"%s\""
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Połączono z siecią przewodową \"%s\""
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Połączono z siecią VPN \"%s\""
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "Połączono z siecią \"%s\""
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "Nawiązano połączenie"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Sieć jest wyłączona"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Menedżer sieci"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Ustawienia zasilania"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Obliczanie..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -841,26 +965,26 @@ msgstr[1] "Pozostały %d godziny"
msgstr[2] "Pozostało %d godzin"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Pozostało %d %s i %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "godzina"
msgstr[1] "godziny"
msgstr[2] "godzin"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuta"
msgstr[1] "minuty"
msgstr[2] "minut"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
@ -868,78 +992,78 @@ msgstr[0] "Pozostała %d minuta"
msgstr[1] "Pozostały %d minuty"
msgstr[2] "Pozostało %d minut"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Zasilacz sieciowy"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Akumulator laptopa"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Mysz"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Klawiatura"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "Urządzenie PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Telefon komórkowy"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Odtwarzacz multimedialny"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Komputer"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:961
msgid "Unknown"
msgstr "Nieznane"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Głośność"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "Użytkownik %s jest online."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "Użytkownik %s jest offline."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "Użytkownik %s jest nieobecny."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "Użytkownik %s jest zajęty."
@ -947,7 +1071,7 @@ msgstr "Użytkownik %s jest zajęty."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Wysłano o %H:%M w dniu %e %b"
@ -956,11 +1080,11 @@ msgstr "Wysłano o %H:%M w dniu %e %b"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Wyszukiwanie..."
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Wyszukaj"
@ -976,7 +1100,7 @@ msgstr "Program \"%s\" jest gotowy"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -986,7 +1110,7 @@ msgstr[2] "%u wyjść"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -994,19 +1118,24 @@ msgstr[0] "%u wejście"
msgstr[1] "%u wejścia"
msgstr[2] "%u wejść"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Dźwięki systemowe"
#: ../src/main.c:395
#: ../src/main.c:397
msgid "Print version"
msgstr "Wyświetla wersję"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Uruchomienie \"%s\" się nie powiodło"
#: ../src/shell-global.c:1340
msgid "Less than a minute ago"
msgstr "Mniej niż minutę temu"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1344
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -1014,7 +1143,7 @@ msgstr[0] "%d minuta temu"
msgstr[1] "%d minuty temu"
msgstr[2] "%d minut temu"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1349
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -1022,7 +1151,7 @@ msgstr[0] "%d godzina temu"
msgstr[1] "%d godziny temu"
msgstr[2] "%d godzin temu"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1354
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1030,7 +1159,7 @@ msgstr[0] "%d dzień temu"
msgstr[1] "%d dni temu"
msgstr[2] "%d dni temu"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1359
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1038,6 +1167,14 @@ msgstr[0] "%d tydzień temu"
msgstr[1] "%d tygodnie temu"
msgstr[2] "%d tygodni temu"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Zjednoczone Królestwo"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Domyślne"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Okno dialogowe uwierzytelnienia zostało odrzucone przez użytkownika"

1246
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

316
po/ro.po
View File

@ -8,8 +8,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: 2011-03-13 00:31+0000\n"
"PO-Revision-Date: 2011-03-13 01:25+0200\n"
"POT-Creation-Date: 2011-03-17 21:07+0000\n"
"PO-Revision-Date: 2011-03-17 11:00+0200\n"
"Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
"Language-Team: Romanian Gnome Team <gnomero-list@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
@ -177,21 +177,17 @@ msgstr "Dacă să se colecteze statistici despre utilizarea aplicațiilor"
msgid "disabled OpenSearch providers"
msgstr "furnizori OpenSearch dezactivați"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Comanda nu a fost găsită"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Nu s-a putut analiza comanda:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Nu există această aplicație"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Execuția comenzii „%s” a eșuat:"
@ -377,7 +373,7 @@ msgstr "Această săptămână"
msgid "Next week"
msgstr "Săptămâna viitoare"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "Elimină"
@ -432,7 +428,7 @@ msgstr "%a %l:%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y"
@ -510,7 +506,7 @@ msgstr "Repornirea sistemului."
msgid "Confirm"
msgstr "Confirm"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:465
msgid "Cancel"
msgstr "Anulează"
@ -544,11 +540,11 @@ msgstr "Vezi sursa"
msgid "Web Page"
msgstr "Pagină web"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Deschide"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:1986
msgid "System Information"
msgstr "Informații despre sistem"
@ -564,25 +560,26 @@ msgstr "Ferestre"
msgid "Applications"
msgstr "Aplicații"
# LG: WTF? cum traducem asta?
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
msgid "Dash"
msgstr ""
msgstr "Dash"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Închide %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:874
msgid "Activities"
msgstr "Activități"
#: ../js/ui/panel.js:1020
#: ../js/ui/panel.js:975
msgid "Panel"
msgstr "Panou"
@ -599,7 +596,7 @@ msgstr "Reîncearcă"
msgid "Connect to..."
msgstr "Conectare la..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "LOCAȚII & DISPOZITIVE"
@ -608,7 +605,7 @@ msgstr "LOCAȚII & DISPOZITIVE"
#. "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:618
#: ../js/ui/popupMenu.js:636
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -664,14 +661,12 @@ msgstr "Ieși din sesiune..."
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Cititor de ecran"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Tastatură pe ecran"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Alerte vizuale"
@ -696,17 +691,17 @@ msgstr "Taste maus"
msgid "Universal Access Settings"
msgstr "Configurări acces universal"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Contrast puternic"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Text mare"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:236
#: ../js/ui/status/bluetooth.js:332 ../js/ui/status/bluetooth.js:366
#: ../js/ui/status/bluetooth.js:406 ../js/ui/status/bluetooth.js:439
msgid "Bluetooth"
msgstr "Bluetooth"
@ -726,94 +721,94 @@ msgstr "Configurează un dispozitiv nou..."
msgid "Bluetooth Settings"
msgstr "Configurări Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:187
msgid "Connection"
msgstr "Conexiune"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:223
msgid "Send Files..."
msgstr "Trimite fișiere..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:228
msgid "Browse Files..."
msgstr "Alege fișiere..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:237
msgid "Error browsing device"
msgstr "Eroare la navigarea dispozitivului"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:238
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Dispozitivul cerut nu poate fi navigat, eroarea este „%s”"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:246
msgid "Keyboard Settings"
msgstr "Configurări tastatură"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:251
msgid "Mouse Settings"
msgstr "Configurări maus"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:66
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Configurări sunet"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:367
#, c-format
msgid "Authorization request from %s"
msgstr "Cerere de autorizare de la %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:373
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Dispozitivul %s dorește acces la serviciul „%s”"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:375
msgid "Always grant access"
msgstr "Acordă acces întotdeauna"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:376
msgid "Grant this time only"
msgstr "Acordă acces doar de data aceasta"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:377
msgid "Reject"
msgstr "Respinge"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:407
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Se asociază confirmarea pentru %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:413 ../js/ui/status/bluetooth.js:447
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Dispozitivul %s dorește să se asocieze cu acest computer"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:414
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confirmați dacă codul PIN „%s” se potrivește cu cel de pe dispozitiv."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:416
msgid "Matches"
msgstr "Se potrivește"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:417
msgid "Does not match"
msgstr "Nu se potrivește"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:440
#, c-format
msgid "Pairing request for %s"
msgstr "Cerere de asociere de la %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:448
msgid "Please enter the PIN mentioned on the device."
msgstr "Introduceți codul PIN menționat pe dispozitiv."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:464
msgid "OK"
msgstr "OK"
@ -825,17 +820,147 @@ msgstr "Arată aranjamentu tastaturii..."
msgid "Localization Settings"
msgstr "Configurări de localizare"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<necunoscut>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "dezactivat"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "se conectează..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "necesită autentificare"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "cablu deconectat"
#. 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:489
msgid "unavailable"
msgstr "indisponibil"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "conexiune eșuată"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Conectat (privat)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Ethernet (automat)"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Rețea de bandă largă (automat)"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Dial-up (automat)"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "%s (automat)"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Bluetooth (automat)"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Rețea fără fir (automat)"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Mai multe..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Activează rețeaua"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Cu fir"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Fără fir"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Internet mobil de bandă largă"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "Conexiuni VPN"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Configurări de rețea"
#: ../js/ui/status/network.js:1782
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "V-ați conectat la rețeaua mobilă de bandă largă „%s”"
#: ../js/ui/status/network.js:1786
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "V-ați conectat la rețeaua fără fir „%s”"
#: ../js/ui/status/network.js:1790
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "V-ați conectat la rețeaua cu fir „%s”"
#: ../js/ui/status/network.js:1794
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "V-ați conectat la rețeaua VPN „%s”"
#: ../js/ui/status/network.js:1799
#, c-format
msgid "You're now connected to '%s'"
msgstr "V-ați conectat la „%s”"
#: ../js/ui/status/network.js:1807
msgid "Connection established"
msgstr "Conexiune stabilită"
#: ../js/ui/status/network.js:1929
msgid "Networking is disabled"
msgstr "Reţeaua este dezactivată"
#: ../js/ui/status/network.js:2054
msgid "Network Manager"
msgstr "Administrator de rețea"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Configurări de alimentare"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Se estimează..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -844,26 +969,26 @@ msgstr[1] "Au mai rămas %d ore"
msgstr[2] "Au mai rămas %d de ore"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Au mai rămas %d %s %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "oră"
msgstr[1] "ore"
msgstr[2] "de ore"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minut"
msgstr[1] "minute"
msgstr[2] "de minute"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
@ -871,51 +996,51 @@ msgstr[0] "A mai rămas un minut"
msgstr[1] "Au mai rămas %d minute"
msgstr[2] "Au mai rămas %d de minute"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Adaptor conectat la rețeaua electrică"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Baterie laptop"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Maus"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Tastatură"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Telefon mobil"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Media player"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Tabletă"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Calculator"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:961
msgid "Unknown"
msgstr "Necunoscut"
@ -927,22 +1052,22 @@ msgstr "Volum"
msgid "Microphone"
msgstr "Microfon"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s este conectat."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s este deconectat."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s este absent."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s este ocupat."
@ -950,7 +1075,7 @@ msgstr "%s este ocupat."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Trimis la %X pe data de %A"
@ -1001,15 +1126,20 @@ msgstr[2] "%u de intrări"
msgid "System Sounds"
msgstr "Sunetele sistemului"
#: ../src/main.c:395
#: ../src/main.c:397
msgid "Print version"
msgstr "Tipărește versiunea"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Nu s-a putut lansa „%s”"
#: ../src/shell-global.c:1340
msgid "Less than a minute ago"
msgstr "Cu mai puțin de un minut în urmă"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1344
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -1017,7 +1147,7 @@ msgstr[0] "Acum un minut"
msgstr[1] "Acum %d minute"
msgstr[2] "Acum %d de minute"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1349
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -1025,7 +1155,7 @@ msgstr[0] "Acum o oră"
msgstr[1] "Acum %d ore"
msgstr[2] "Acum %d de ore"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1354
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1033,7 +1163,7 @@ msgstr[0] "Acum o zi"
msgstr[1] "Acum %d zile"
msgstr[2] "Acum %d de zile"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1359
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1041,6 +1171,14 @@ msgstr[0] "Acum o săptămână"
msgstr[1] "Acum %d săptămâni"
msgstr[2] "Acum %d de săptămâni"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Marea Britanie"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Implicit"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogul de autentificare a fost respins de utilizator"
@ -1065,6 +1203,15 @@ msgstr "Sistem de fișiere"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "No such application"
#~ msgstr "Nu există această aplicație"
#~ msgid "Screen Reader"
#~ msgstr "Cititor de ecran"
#~ msgid "Screen Keyboard"
#~ msgstr "Tastatură pe ecran"
#~ msgid "PREFERENCES"
#~ msgstr "PREFERINȚE"
@ -1308,9 +1455,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Frequent"
#~ msgstr "Frecvent"
#~ msgid "More"
#~ msgstr "Mai multe"
#~ msgid "(see all)"
#~ msgstr "(arată tot)"

1223
po/ru.po

File diff suppressed because it is too large Load Diff

691
po/sl.po

File diff suppressed because it is too large Load Diff

1320
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1245
po/sv.po

File diff suppressed because it is too large Load Diff

451
po/uk.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-10 18:48+0200\n"
"PO-Revision-Date: 2011-03-10 20:18+0300\n"
"POT-Creation-Date: 2011-03-24 23:56+0200\n"
"PO-Revision-Date: 2011-03-24 23:59+0300\n"
"Last-Translator: Korostil Daniel <ted.korostiled@gmail.com>\n"
"Language-Team: translation@linux.org.ua\n"
"Language: uk\n"
@ -173,47 +173,43 @@ msgstr "Чи потрібно збирати статистику про вжи
msgid "disabled OpenSearch providers"
msgstr "вимкнено постачальника OpenSearch"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
msgid "Command not found"
msgstr "Команди не знайдено"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Неможливо розібрати команду:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Нема такої програми"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Не вдалось виконати «%s»:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:226
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "Всі"
#: ../js/ui/appDisplay.js:324
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "ПРОГРАМИ"
#: ../js/ui/appDisplay.js:350
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "ПАРАМЕТРИ"
#: ../js/ui/appDisplay.js:612
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "Нове вікно"
#: ../js/ui/appDisplay.js:615
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "Вилучити з улюбленого"
#: ../js/ui/appDisplay.js:616
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "Додати до улюбленого"
@ -373,7 +369,7 @@ msgstr "Цей тиждень"
msgid "Next week"
msgstr "Наступний тиждень"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:931
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "Вилучити"
@ -428,7 +424,7 @@ msgstr "%a %l:%M %p"
#. 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:209
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
@ -441,7 +437,7 @@ msgstr "ОСТАННІ ПУНКТИ"
msgid "Log Out %s"
msgstr "Завершити сеанс %s…"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "Завершити сеанс"
@ -463,46 +459,44 @@ msgstr "Буде завершено сеанс автоматично через
msgid "Logging out of the system."
msgstr "Вихід із системи."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off"
msgstr "Вимкнути"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "Натисніть «Вимкнути», щоб вийти з усіх програм і вимкнути систему."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Систему буде вимкнено автоматично через %d секунд."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "Натисніть «Вимкнути», щоб вийти з усіх програм і системи."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
#, c-format
msgid "The system will power off automatically in %d seconds."
msgstr "Система автоматично вимкнеться через %d секунд."
#: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system."
msgstr "Вимкнення системи."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "Перезапустити"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Натисніть «Перезапустити», щоб вийти з усіх програм і перезапустити систему."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Система автоматично перезапуститься через %d секунд."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "Перезапуск системи."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Підтвердити"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Скасувати"
@ -516,7 +510,7 @@ msgstr "Увімкнено"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Вимкнено"
@ -536,47 +530,47 @@ msgstr "Переглянути джерело"
msgid "Web Page"
msgstr "Веб-сторінка"
#: ../js/ui/messageTray.js:924
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "Відкрити"
#: ../js/ui/messageTray.js:1961
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "Інформація про систему"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "Повернути"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "Вікна"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "Програми"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "Риска"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:560
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Вийти з %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "Дії"
msgstr "Діяльність"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "Панель"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "Верхня панель"
#: ../js/ui/placeDisplay.js:122
#, c-format
@ -591,64 +585,85 @@ msgstr "Повторити"
msgid "Connect to..."
msgstr "З'єднатися з…"
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "МІСЦЯ ТА ПРИСТРОЇ"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "Потрібна автентифікація"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "Адміністратор"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "Аутентифікація"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "Вибачте, це не працює. Спробуйте ще."
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "Пароль:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:618
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "Будь ласка, введіть команду:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "Пошук…"
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "Нема збігів."
#: ../js/ui/statusMenu.js:113 ../js/ui/statusMenu.js:177
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163
#: ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "Вимкнення живлення…"
#: ../js/ui/statusMenu.js:115 ../js/ui/statusMenu.js:176
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "Призупинити"
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "Доступний"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "Зайнятий"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "Мій обліковий запис"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "Системні параметри"
#: ../js/ui/statusMenu.js:160
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "Заблокувати екран"
#: ../js/ui/statusMenu.js:164
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "Змінити користувача"
#: ../js/ui/statusMenu.js:169
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "Завершити сеанс…"
@ -656,14 +671,12 @@ msgstr "Завершити сеанс…"
msgid "Zoom"
msgstr "Масштаб"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Читання з екрану"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Екранна клавіатура"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Візуальні тривоги"
@ -688,17 +701,17 @@ msgstr "Клавіші миші"
msgid "Universal Access Settings"
msgstr "Параметри універсального доступу"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Висока контрастність"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Більший текст"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -718,94 +731,94 @@ msgstr "Встановити новий пристрій…"
msgid "Bluetooth Settings"
msgstr "Параметри Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "З'єднання"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Відправити файли…"
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Огляд файлів…"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Помилка перегляду пристрою…"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Потрібний пристрій неможливо переглянути, помилка — «%s»"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Параметри клавіатури"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Параметри миші"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Параметри звуку"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Запит про авторизацію від %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Пристрій %s потребує доступ до служби «%s»"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Завжди надавати доступ"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Надати лише цього разу"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Відмовити"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Сполучення підтвердження для %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Пристрій %s потребує прив'язання до цього комп'ютера"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Будь ласка, підвердьте, чи «%s» збігається з PIN на пристрої."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Збігається"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Не збігається"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Запит на сполучення для %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Будь ласка, введіть PIN, згаданий на пристрої."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "Гаразд"
@ -817,17 +830,147 @@ msgstr "Показувати розкладку клавіатури…"
msgid "Localization Settings"
msgstr "Параметри локалізації"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
msgid "<unknown>"
msgstr "<невідомо>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
msgid "disabled"
msgstr "вимкнено"
#: ../js/ui/status/network.js:476
msgid "connecting..."
msgstr "з'єднання…"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "Потрібна аутентифікація"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "кабель від'єднано"
#. 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:489
msgid "unavailable"
msgstr "недоступний"
#: ../js/ui/status/network.js:491
msgid "connection failed"
msgstr "не вдалось з'єднатись"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "З'єднано (приватно)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Автоматично Ethernet"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Автоматично радіомережа"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Автоматично додзвін"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
msgid "Auto %s"
msgstr "Автоматично %s"
#: ../js/ui/status/network.js:845
msgid "Auto bluetooth"
msgstr "Автоматично Bluetooth"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Автоматично бездротова мережа"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Більше…"
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Увімкнути мережу"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Дротова"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Бездротова"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Мобільна радіомережа"
#: ../js/ui/status/network.js:1479
msgid "VPN Connections"
msgstr "З'єднання VPN"
#: ../js/ui/status/network.js:1488
msgid "Network Settings"
msgstr "Налаштування мережі"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Зараз ви з'єднані через мобільну радіомережу «%s»"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Зараз ви з'єднані через бездротову мережу «%s»"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Зараз ви з'єднані через дротову мережу «%s»"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Зараз ви з'єднані через мережу VPN «%s»"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "Зараз ви з'єднані через «%s»"
#: ../js/ui/status/network.js:1808
msgid "Connection established"
msgstr "З'єднання встановлено"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Мережу вимкнено"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Керування мережею"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Енергетичні параметри"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Оцінювання…"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -836,26 +979,26 @@ msgstr[1] "Залишилось %d години"
msgstr[2] "Залишилось %d годин"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Залишилось %d %s %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "година"
msgstr[1] "години"
msgstr[2] "годин"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "хвилина"
msgstr[1] "хвилини"
msgstr[2] "хвилин"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
@ -863,78 +1006,78 @@ msgstr[0] "Залишилось %d хвилина"
msgstr[1] "Залишилось %d хвилини"
msgstr[2] "Залишилось %d хвилин"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Блок живлення"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Батарея ноутбука"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Монітор"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Миша"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Клавіатура"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "КПК"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Мобільний телефон"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Програвач"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Планшет"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Комп'ютер"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "Невідомо"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Гучність"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Мікрофон"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s в мережі."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s поза мережею."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s відійшов."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s зайнятий."
@ -942,7 +1085,7 @@ msgstr "%s зайнятий."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:357
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Відправити на %X в %A"
@ -951,11 +1094,11 @@ msgstr "Відправити на %X в %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:117
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Введіть для пошуку…"
#: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Пошук"
@ -971,7 +1114,7 @@ msgstr "«%s» готовий"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -981,7 +1124,7 @@ msgstr[2] "%u виходів"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -989,19 +1132,24 @@ msgstr[0] "%u вхід"
msgstr[1] "%u входи"
msgstr[2] "%u входів"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Системні звуки"
#: ../src/main.c:395
#: ../src/main.c:446
msgid "Print version"
msgstr "Показати версію"
#: ../src/shell-global.c:1308
#: ../src/shell-app.c:454
#, c-format
msgid "Failed to launch '%s'"
msgstr "Не вдалось запустити «%s»"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "Менше хвилини тому"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -1009,7 +1157,7 @@ msgstr[0] "%d хвилина тому"
msgstr[1] "%d хвилини тому"
msgstr[2] "%d хвилин тому"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -1017,7 +1165,7 @@ msgstr[0] "%d година тому"
msgstr[1] "%d години тому"
msgstr[2] "%d годин тому"
#: ../src/shell-global.c:1322
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1025,7 +1173,7 @@ msgstr[0] "%d день тому"
msgstr[1] "%d дні тому"
msgstr[2] "%d днів тому"
#: ../src/shell-global.c:1327
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1033,6 +1181,14 @@ msgstr[0] "%d тиждень тому"
msgstr[1] "%d тижні тому"
msgstr[2] "%d тижнів тому"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Великобританія"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Типово"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Вікно авторизації відхилено користувачем"
@ -1057,6 +1213,33 @@ msgstr "Файлова система"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Shut Down"
#~ msgstr "Вимкнути"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "Натисніть «Вимкнути», щоб вийти з усіх програм і вимкнути систему."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "Систему буде вимкнено автоматично через %d секунд."
#~ msgid "Shutting down the system."
#~ msgstr "Вимкнення системи."
#~ msgid "Confirm"
#~ msgstr "Підтвердити"
#~ msgid "Panel"
#~ msgstr "Панель"
#~ msgid "No such application"
#~ msgstr "Нема такої програми"
#~ msgid "Screen Reader"
#~ msgstr "Читання з екрану"
#~ msgid "Screen Keyboard"
#~ msgstr "Екранна клавіатура"
#~ msgid "PREFERENCES"
#~ msgstr "ПАРАМЕТРИ"

515
po/vi.po
View File

@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2011-03-05 08:37+0000\n"
"PO-Revision-Date: 2011-03-05 15:41+0700\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-24 08:03+0000\n"
"PO-Revision-Date: 2011-03-25 00:31+0700\n"
"Last-Translator: Duy <pclouds@gmail.com>\n"
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@ -59,7 +59,6 @@ msgid "History for command (Alt-F2) dialog"
msgstr "Hộp thoại lịch sử lệnh (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#| msgid "History for command (Alt-F2) dialog"
msgid "History for the looking glass dialog"
msgstr "Lịch sử hộp thoại looking glass"
@ -150,7 +149,10 @@ msgid ""
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr "GNOME Shell bình thường sẽ theo dõi các ứng dụng tích cực để thể hiện phù hợp (ví dụ, bộ phóng). Mặc dù thông tin này là riêng tư, bạn vẫn có thể tắt vì lý do cá nhân. Chú ý là làm vậy sẽ không xoá bỏ những dữ liệu đã có."
msgstr ""
"GNOME Shell bình thường sẽ theo dõi các ứng dụng tích cực để thể hiện phù "
"hợp (ví dụ, bộ phóng). Mặc dù thông tin này là riêng tư, bạn vẫn có thể tắt "
"vì lý do cá nhân. Chú ý là làm vậy sẽ không xoá bỏ những dữ liệu đã có."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Uuids of extensions to disable"
@ -164,47 +166,43 @@ msgstr "Có thu thập thống kê sử dụng ứng dụng không"
msgid "disabled OpenSearch providers"
msgstr "Phần cung cấp OpenSearch bị tắt"
#: ../js/misc/util.js:86
#: ../js/misc/util.js:71
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:113
#: ../js/misc/util.js:98
msgid "Could not parse command:"
msgstr "Không thể phân tích lệnh:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr "Không có ứng dụng đó"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:106
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Lỗi thực hiện '%s':"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195
#: ../js/ui/appDisplay.js:230
msgid "All"
msgstr "Tất cả"
#: ../js/ui/appDisplay.js:285
#: ../js/ui/appDisplay.js:328
msgid "APPLICATIONS"
msgstr "ỨNG DỤNG"
#: ../js/ui/appDisplay.js:311
#: ../js/ui/appDisplay.js:354
msgid "SETTINGS"
msgstr "THIẾT LẬP"
#: ../js/ui/appDisplay.js:565
#: ../js/ui/appDisplay.js:625
msgid "New Window"
msgstr "Cửa sổ mới"
#: ../js/ui/appDisplay.js:568
#: ../js/ui/appDisplay.js:628
msgid "Remove from Favorites"
msgstr "Bỏ đánh dấu ưa thích"
#: ../js/ui/appDisplay.js:569
#: ../js/ui/appDisplay.js:629
msgid "Add to Favorites"
msgstr "Đánh dấu ưa thích"
@ -224,7 +222,7 @@ msgstr "Đã bỏ đánh dấu ưa thích cho %s"
#: ../js/ui/calendar.js:66
msgctxt "event list time"
msgid "All Day"
msgstr "Nguyên ngày"
msgstr "Cả ngày"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:71
@ -364,7 +362,7 @@ msgstr "Tuần này"
msgid "Next week"
msgstr "Tuần tới"
#: ../js/ui/dash.js:174
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
msgid "Remove"
msgstr "Loại bỏ"
@ -372,54 +370,54 @@ msgstr "Loại bỏ"
msgid "Date and Time Settings"
msgstr "Thiết lập ngày giờ"
#: ../js/ui/dateMenu.js:110
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Mở lịch"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:162
#: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S"
msgstr "%R:%S, %a %b %e"
msgstr "%a %R:%S, %e %b"
#: ../js/ui/dateMenu.js:163
#: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R"
msgstr "%R, %a %b %e"
msgstr "%a %R, %e %b"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:167
#: ../js/ui/dateMenu.js:169
msgid "%a %R:%S"
msgstr "%R:%S %a"
msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:168
#: ../js/ui/dateMenu.js:170
msgid "%a %R"
msgstr "%R %a"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:175
#: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:176
#: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:181
#: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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:207
#: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y"
@ -432,7 +430,7 @@ msgstr "MỤC GẦN ĐÂY"
msgid "Log Out %s"
msgstr "Đăng xuất %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
msgstr "Đăng xuất"
@ -454,46 +452,48 @@ msgstr "Bạn sẽ tự động đăng xuất sau %d giây."
msgid "Logging out of the system."
msgstr "Đang xuất khỏi hệ thống."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
#| msgid "Power Off..."
msgid "Power Off"
msgstr "Tắt máy"
#: ../js/ui/endSessionDialog.js:75
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."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Hệ thống sẽ tự động tắt sau %d giây."
#| msgid "Click Log Out to quit these applications and log out of the system."
msgid "Click Power Off to quit these applications and power off the system."
msgstr "Nhấn Tắt máy để thoát những ứng dụng này và tắt máy."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "Tắt hệ thống."
#, c-format
#| msgid "The system will restart automatically in %d seconds."
msgid "The system will power off automatically in %d seconds."
msgstr "Hệ thống sẽ tự động tắt sau %d giây."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:78
#| msgid "Logging out of the system."
msgid "Powering off the system."
msgstr "Tắt máy."
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:93
msgid "Restart"
msgstr "Khởi động lại"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:89
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Nhấn Khởi động lại để thoát những ứng dụng này và khởi động lại hệ thống."
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:90
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Hệ thống sẽ tự động khởi động lại sau %d giây."
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system."
msgstr "Khởi động lại hệ thống."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Xác nhận"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:466
msgid "Cancel"
msgstr "Thôi"
@ -507,7 +507,7 @@ msgstr "Bật"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled"
msgstr "Tắt"
@ -527,34 +527,48 @@ msgstr "Xem mã nguồn"
msgid "Web Page"
msgstr "Trang Web"
#: ../js/ui/messageTray.js:1907
#: ../js/ui/messageTray.js:987
msgid "Open"
msgstr "Mở"
#: ../js/ui/messageTray.js:2145
msgid "System Information"
msgstr "Thông tin hệ thống"
#: ../js/ui/overview.js:88
#: ../js/ui/overview.js:91
msgid "Undo"
msgstr "Hoàn lại"
#: ../js/ui/overview.js:183
#: ../js/ui/overview.js:186
msgid "Windows"
msgstr "Cửa sổ"
#: ../js/ui/overview.js:186
#: ../js/ui/overview.js:189
msgid "Applications"
msgstr "Ứng dụng"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:205
msgid "Dash"
msgstr "Khung ứng dụng"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:531
#: ../js/ui/panel.js:515
#, c-format
msgid "Quit %s"
msgstr "Thoát %s"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:899
#: ../js/ui/panel.js:878
msgid "Activities"
msgstr "Hoạt động"
#: ../js/ui/panel.js:979
msgid "Top Bar"
msgstr "Thanh đỉnh"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
@ -568,65 +582,84 @@ msgstr "Thử lại"
msgid "Connect to..."
msgstr "Kết nối đến..."
#: ../js/ui/placeDisplay.js:409
#: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES"
msgstr "ĐỊA ĐIỂM & THIẾT BỊ"
#: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required"
msgstr "Cần xác thực"
#: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator"
msgstr "Quản trị"
#: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate"
msgstr "Xác thực"
#: ../js/ui/polkitAuthenticationAgent.js:260
msgid "Sorry, that didn't work. Please try again."
msgstr "Rất tiếc, không được. Vui lòng thử lại."
#: ../js/ui/polkitAuthenticationAgent.js:272
msgid "Password:"
msgstr "Mật khẩu:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:612
#: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:201
#: ../js/ui/runDialog.js:205
msgid "Please enter a command:"
msgstr "Vui lòng nhập lệnh:"
#: ../js/ui/searchDisplay.js:283
#: ../js/ui/searchDisplay.js:310
msgid "Searching..."
msgstr "Đang tìm..."
#: ../js/ui/searchDisplay.js:297
#: ../js/ui/searchDisplay.js:324
msgid "No matching results."
msgstr "Không tìm thấy."
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
msgid "Power Off..."
msgstr "Tắt máy..."
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#| msgid "Suspend..."
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend"
msgstr "Ngưng"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:184
msgid "Available"
msgstr "Có mặt"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:189
msgid "Busy"
msgstr "Bận"
#: ../js/ui/statusMenu.js:138
#: ../js/ui/statusMenu.js:197
msgid "My Account"
msgstr "Tài khoản"
#: ../js/ui/statusMenu.js:142
#: ../js/ui/statusMenu.js:201
msgid "System Settings"
msgstr "Thiết lập hệ thống"
#: ../js/ui/statusMenu.js:149
#: ../js/ui/statusMenu.js:208
msgid "Lock Screen"
msgstr "Khoá màn hình"
#: ../js/ui/statusMenu.js:153
#: ../js/ui/statusMenu.js:213
msgid "Switch User"
msgstr "Chuyển người dùng"
#: ../js/ui/statusMenu.js:158
#: ../js/ui/statusMenu.js:218
msgid "Log Out..."
msgstr "Đăng xuất..."
@ -634,14 +667,12 @@ msgstr "Đăng xuất..."
msgid "Zoom"
msgstr "Phóng to"
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Trình đọc màn hình"
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Bàn phím màn hình"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Cảnh báo trực quan"
@ -666,17 +697,17 @@ msgstr "Phím chuột"
msgid "Universal Access Settings"
msgstr "Thiết lập hỗ trợ truy cập"
#: ../js/ui/status/accessibility.js:145
#: ../js/ui/status/accessibility.js:146
msgid "High Contrast"
msgstr "Tương phản cao"
#: ../js/ui/status/accessibility.js:182
#: ../js/ui/status/accessibility.js:183
msgid "Large Text"
msgstr "Chữ lớn"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth"
msgstr "Bluetooth"
@ -696,94 +727,94 @@ msgstr "Thiết lập thiết bị mới..."
msgid "Bluetooth Settings"
msgstr "Thiết lập Bluetooth"
#: ../js/ui/status/bluetooth.js:192
#: ../js/ui/status/bluetooth.js:188
msgid "Connection"
msgstr "Kết nối"
#: ../js/ui/status/bluetooth.js:228
#: ../js/ui/status/bluetooth.js:224
msgid "Send Files..."
msgstr "Gửi tập tin..."
#: ../js/ui/status/bluetooth.js:233
#: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..."
msgstr "Duyệt tập tin..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device"
msgstr "Lỗi duyệt tập tin"
#: ../js/ui/status/bluetooth.js:243
#: ../js/ui/status/bluetooth.js:239
#, c-format
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'"
#: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings"
msgstr "Thiết lập bàn phím"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings"
msgstr "Thiết lập chuột"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:65
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings"
msgstr "Thiết lập âm thanh"
#: ../js/ui/status/bluetooth.js:372
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Authorization request from %s"
msgstr "Yêu cầu cấp quyền từ %s"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:374
#, 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'"
#: ../js/ui/status/bluetooth.js:380
#: ../js/ui/status/bluetooth.js:376
msgid "Always grant access"
msgstr "Luôn cho phép"
#: ../js/ui/status/bluetooth.js:381
#: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only"
msgstr "Chỉ cho phép lần này"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/status/bluetooth.js:378
msgid "Reject"
msgstr "Từ chối"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Xác nhận kết nối cho %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Thiết bị %s muốn kết nối với máy tính này"
#: ../js/ui/status/bluetooth.js:419
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Vui lòng xác nhận PIN '%s' khớp với số trên thiết bị."
#: ../js/ui/status/bluetooth.js:421
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Khớp"
#: ../js/ui/status/bluetooth.js:422
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Không khớp"
#: ../js/ui/status/bluetooth.js:445
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "Yêu cầu kết nối cho %s"
#: ../js/ui/status/bluetooth.js:453
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
msgstr "Vui lòng nhập số PIN ghi trên thiết bị."
#: ../js/ui/status/bluetooth.js:469
#: ../js/ui/status/bluetooth.js:465
msgid "OK"
msgstr "OK"
@ -795,116 +826,256 @@ msgstr "Hiện bố trí bàn phím..."
msgid "Localization Settings"
msgstr "Thiết lập bản địa hoá"
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
#| msgid "Unknown"
msgid "<unknown>"
msgstr "<không rõ>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:295
#| msgid "Disabled"
msgid "disabled"
msgstr "tắt"
#: ../js/ui/status/network.js:476
#| msgid "Connection"
msgid "connecting..."
msgstr "đang kết nối..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:479
msgid "authentication required"
msgstr "cần xác thực"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:485
msgid "cable unplugged"
msgstr "cáp bị tháo"
#. 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:489
#| msgid "Available"
msgid "unavailable"
msgstr "không có mặt"
#: ../js/ui/status/network.js:491
#| msgid "Connection"
msgid "connection failed"
msgstr "lỗi kết nối"
#. 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:571 ../js/ui/status/network.js:1341
msgid "Connected (private)"
msgstr "Đã kết nối (riêng)"
#: ../js/ui/status/network.js:636
msgid "Auto Ethernet"
msgstr "Ethernet tự động"
#: ../js/ui/status/network.js:697
msgid "Auto broadband"
msgstr "Băng thông rộng tự động"
#: ../js/ui/status/network.js:700
msgid "Auto dial-up"
msgstr "Quay số tự động"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
#, c-format
#| msgid "Quit %s"
msgid "Auto %s"
msgstr "%s tự động"
#: ../js/ui/status/network.js:845
#| msgid "Bluetooth"
msgid "Auto bluetooth"
msgstr "Bluetooth tự động"
#: ../js/ui/status/network.js:1355
msgid "Auto wireless"
msgstr "Mạng không dây tự động"
#: ../js/ui/status/network.js:1413
msgid "More..."
msgstr "Nữa..."
#: ../js/ui/status/network.js:1436
msgid "Enable networking"
msgstr "Bật nối mạng"
#: ../js/ui/status/network.js:1448
msgid "Wired"
msgstr "Mạng dây"
#: ../js/ui/status/network.js:1459
msgid "Wireless"
msgstr "Mạng không dây"
#: ../js/ui/status/network.js:1469
msgid "Mobile broadband"
msgstr "Mạng băng thông rộng"
#: ../js/ui/status/network.js:1479
#| msgid "Connection"
msgid "VPN Connections"
msgstr "Kết nối VPN"
#: ../js/ui/status/network.js:1488
#| msgid "Power Settings"
msgid "Network Settings"
msgstr "Thiết lập mạng"
#: ../js/ui/status/network.js:1783
#, c-format
msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Bạn đã kết nối vào mạng băng thông rộng '%s'"
#: ../js/ui/status/network.js:1787
#, c-format
msgid "You're now connected to wireless network '%s'"
msgstr "Bạn đã kết nối vào mạng không dây '%s'"
#: ../js/ui/status/network.js:1791
#, c-format
msgid "You're now connected to wired network '%s'"
msgstr "Bạn đã kết nối vào mạng (dây) '%s'"
#: ../js/ui/status/network.js:1795
#, c-format
msgid "You're now connected to VPN network '%s'"
msgstr "Bạn đã kết nối vào mạng VPN '%s'"
#: ../js/ui/status/network.js:1800
#, c-format
msgid "You're now connected to '%s'"
msgstr "Bạn đã kết nối vào '%s'"
#: ../js/ui/status/network.js:1808
#| msgid "Connection"
msgid "Connection established"
msgstr "Đã tạo kết nối"
#: ../js/ui/status/network.js:1930
msgid "Networking is disabled"
msgstr "Mạng bị tắt"
#: ../js/ui/status/network.js:2055
msgid "Network Manager"
msgstr "Trình quản lý mạng"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Thiết lập năng lượng"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
#: ../js/ui/status/power.js:111
msgid "Estimating..."
msgstr "Ước lượng..."
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d giờ còn lại"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:121
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s còn lại"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "hour"
msgid_plural "hours"
msgstr[0] "giờ"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:123
msgid "minute"
msgid_plural "minutes"
msgstr[0] "%d phút"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:126
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d phút còn lại"
#: ../js/ui/status/power.js:227
#: ../js/ui/status/power.js:228
msgid "AC adapter"
msgstr "Bộ đổi điện AC"
#: ../js/ui/status/power.js:229
#: ../js/ui/status/power.js:230
msgid "Laptop battery"
msgstr "Pin laptop"
#: ../js/ui/status/power.js:231
#: ../js/ui/status/power.js:232
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:233
#: ../js/ui/status/power.js:234
msgid "Monitor"
msgstr "Màn hình"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:236
msgid "Mouse"
msgstr "Chuột"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:238
msgid "Keyboard"
msgstr "Bàn phím"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:240
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:242
msgid "Cell phone"
msgstr "Điện thoại cầm tay"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:244
msgid "Media player"
msgstr "Máy phát"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:246
msgid "Tablet"
msgstr "Bảng"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:248
msgid "Computer"
msgstr "Máy tính"
#: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown"
msgstr "Không biết"
#: ../js/ui/status/volume.js:44
#: ../js/ui/status/volume.js:45
msgid "Volume"
msgstr "Âm lượng"
#: ../js/ui/status/volume.js:57
#: ../js/ui/status/volume.js:58
msgid "Microphone"
msgstr "Micrô"
#: ../js/ui/telepathyClient.js:239
#: ../js/ui/telepathyClient.js:332
#, c-format
msgid "%s is online."
msgstr "%s trực tuyến."
#: ../js/ui/telepathyClient.js:244
#: ../js/ui/telepathyClient.js:337
#, c-format
msgid "%s is offline."
msgstr "%s ngoại tuyến."
#: ../js/ui/telepathyClient.js:247
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is away."
msgstr "%s đi vắng."
#: ../js/ui/telepathyClient.js:250
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is busy."
msgstr "%s bận."
@ -912,7 +1083,7 @@ msgstr "%s bận."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:348
#: ../js/ui/telepathyClient.js:474
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Đã gửi %X lúc %A"
@ -921,10 +1092,14 @@ msgstr "Đã gửi %X lúc %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:103
#: ../js/ui/viewSelector.js:122
msgid "Type to search..."
msgstr "Nhập để tìm..."
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search"
msgstr "Tìm"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format
msgid "%s has finished starting"
@ -937,7 +1112,7 @@ msgstr "'%s' đã sẵn sàng"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#: ../src/gvc/gvc-mixer-control.c:1098
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -945,44 +1120,62 @@ msgstr[0] "%u đầu ra"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#: ../src/gvc/gvc-mixer-control.c:1108
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u đầu vào"
#: ../src/gvc/gvc-mixer-control.c:1402
#: ../src/gvc/gvc-mixer-control.c:1406
msgid "System Sounds"
msgstr "Âm thanh hệ thống"
#: ../src/shell-global.c:1298
#: ../src/main.c:446
msgid "Print version"
msgstr "In phiên bản"
#: ../src/shell-app.c:454
#, c-format
#| msgid "Failed to unmount '%s'"
msgid "Failed to launch '%s'"
msgstr "Lỗi chạy '%s'"
#: ../src/shell-global.c:1395
msgid "Less than a minute ago"
msgstr "Chưa đến một phút"
#: ../src/shell-global.c:1302
#: ../src/shell-global.c:1399
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d phút trước"
#: ../src/shell-global.c:1307
#: ../src/shell-global.c:1404
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d giờ trước"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1409
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d ngày trước"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1414
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d tuần trước"
#: ../src/shell-mobile-providers.c:80
msgid "United Kingdom"
msgstr "Vương quốc Anh"
#: ../src/shell-mobile-providers.c:526
msgid "Default"
msgstr "Mặc định"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentication dialog was dismissed by the user"
msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
@ -997,10 +1190,6 @@ msgstr "Thư mục chính"
msgid "File System"
msgstr "Hệ tập tin"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Tìm"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
@ -1011,6 +1200,30 @@ msgstr "Tìm"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "No such application"
#~ msgstr "Không có ứng dụng đó"
#~ 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 "Screen Reader"
#~ msgstr "Trình đọc màn hình"
#~ msgid "Screen Keyboard"
#~ msgstr "Bàn phím màn hình"
#~ msgid "Clip the crosshairs at the center"
#~ msgstr "Cắt lưới chéo ở giữa"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -38,13 +38,16 @@ generated_script_substitutions = \
-e "s|@datadir[@]|$(datadir)|" \
-e "s|@libexecdir[@]|$(libexecdir)|" \
-e "s|@libdir[@]|$(libdir)|" \
-e "s|@JHBUILD_TYPELIBDIR[@]|$(JHBUILD_TYPELIBDIR)|" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
-e "s|@PYTHON[@]|$(PYTHON)|" \
-e "s|@VERSION[@]|$(VERSION)|" \
-e "s|@sysconfdir[@]|$(sysconfdir)|"
gnome-shell-jhbuild: gnome-shell-jhbuild.in Makefile
gnome-shell-jhbuild: gnome-shell-jhbuild.in gnome-shell-real Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
@# Regenerate libtool wrapper so Alt+F2 restart will work
@$(LIBTOOL) --mode=execute test -f gnome-shell-real
gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
@ -62,7 +65,8 @@ gnome_shell_cflags = \
$(GNOME_SHELL_CFLAGS) \
-I$(srcdir)/tray \
-DVERSION=\"$(VERSION)\" \
-DLOCALEDIR=\"$(datadir)/locale\" \
-DLOCALEDIR=\"$(datadir)/locale\" \
-DDATADIR=\"$(datadir)\" \
-DGNOME_SHELL_LIBEXECDIR=\"$(libexecdir)\" \
-DGNOME_SHELL_DATADIR=\"$(pkgdatadir)\" \
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\" \
@ -90,6 +94,7 @@ shell_public_headers_h = \
shell-generic-container.h \
shell-gtk-embed.h \
shell-global.h \
shell-mobile-providers.h \
shell-perf-log.h \
shell-slicer.h \
shell-stack.h \
@ -121,6 +126,7 @@ libgnome_shell_la_SOURCES = \
shell-generic-container.c \
shell-gtk-embed.c \
shell-global.c \
shell-mobile-providers.c \
shell-perf-log.c \
shell-polkit-authentication-agent.h \
shell-polkit-authentication-agent.c \
@ -262,7 +268,7 @@ libgnome_shell_la_LIBADD = \
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
Shell-0.1.gir: libgnome-shell.la St-1.0.gir
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-2.91 TelepathyGLib-0.12
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-2.91 TelepathyGLib-0.12 TelepathyLogger-0.2
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
Shell_0_1_gir_LIBS = libgnome-shell.la
Shell_0_1_gir_FILES = $(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources))

View File

@ -407,7 +407,9 @@ gdm_user_get_uid (GdmUser *user)
* gdm_user_get_real_name:
* @user: the user object to examine.
*
* Retrieves the display name of @user.
* Retrieves a displayable name for @user. By default this is the real name
* of the user, but will fall back to the user name if there is no real name
* defined.
*
* Returns: (transfer none): a pointer to an array of characters which must not be modified or
* freed, or %NULL.
@ -417,7 +419,12 @@ gdm_user_get_real_name (GdmUser *user)
{
g_return_val_if_fail (GDM_IS_USER (user), NULL);
return (user->real_name ? user->real_name : user->user_name);
if (user->real_name == NULL ||
user->real_name[0] == '\0') {
return user->user_name;
}
return user->real_name;
}
/**

View File

@ -197,12 +197,16 @@ def start_shell(perf_output=None):
if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')):
running_from_source_tree = True
top_dir = os.path.dirname(self_dir)
typelib_dir = os.path.join(top_dir, "src")
typelib_dir = '@JHBUILD_TYPELIBDIR@:' + os.path.join(top_dir, "src")
js_dir = os.path.join(top_dir, "js")
data_dir = os.path.join(top_dir, "data")
else:
running_from_source_tree = False
js_dir = os.path.join('@pkgdatadir@', 'js')
typelib_dir = '@JHBUILD_TYPELIBDIR@'
if os.environ.has_key('GI_TYPELIB_PATH'):
typelib_dir = typelib_dir + ":" + os.environ.get('GI_TYPELIB_PATH')
# Set up environment
env = dict(os.environ)
@ -215,14 +219,12 @@ def start_shell(perf_output=None):
# run". See bug #642084
env.update({'GNOME_SHELL_JS' : js_dir,
'PATH' : '@bindir@:' + os.environ.get('PATH', ''),
'GI_TYPELIB_PATH' : typelib_dir,
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share')})
if running_from_source_tree:
if os.environ.has_key('GI_TYPELIB_PATH'):
typelib_dir = typelib_dir + ":" + os.environ.get('GI_TYPELIB_PATH')
env.update({'GNOME_SHELL_BINDIR' : self_dir,
'GNOME_SHELL_DATADIR' : data_dir,
'GI_TYPELIB_PATH' : typelib_dir,
'GSETTINGS_SCHEMA_DIR' : data_dir })
else:
# This is just broken to set in the installed case; see bug #642084

View File

@ -321,20 +321,28 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
}
#endif
/* When the pointer leaves the stage to enter a child of the stage
* (like a notification icon), we don't want to produce Clutter leave
* events. But Clutter treats all leave events identically, so we
* need hide the detail = NotifyInferior events from it.
*
* Since Clutter doesn't see any event at all, this does mean that
* it won't produce an enter event on a Clutter actor that surrounds
* the child (unless it gets a MotionNotify before the Enter event).
* Other weirdness is likely also possible.
*/
if ((xev->xany.type == EnterNotify || xev->xany.type == LeaveNotify)
&& xev->xcrossing.detail == NotifyInferior
&& xev->xcrossing.window == clutter_x11_get_stage_window (CLUTTER_STAGE (clutter_stage_get_default ())))
return TRUE;
{
/* If the pointer enters a child of the stage window (eg, a
* trayicon), we want to consider it to still be in the stage,
* so don't let Clutter see the event.
*/
if (xev->xcrossing.detail == NotifyInferior)
return TRUE;
/* If the pointer is grabbed by a window it is not currently in,
* filter that out as well. In particular, if a trayicon grabs
* the pointer after a click on its label, we don't want to hide
* the message tray. Filtering out this event will leave Clutter
* out of sync, but that happens fairly often with grabs, and we
* can work around it. (Eg, shell_global_sync_pointer().)
*/
if (xev->xcrossing.mode == NotifyGrab &&
(xev->xcrossing.detail == NotifyNonlinear ||
xev->xcrossing.detail == NotifyNonlinearVirtual))
return TRUE;
}
/*
* Pass the event to shell-global

View File

@ -31,11 +31,12 @@ extern GType gnome_shell_plugin_get_type (void);
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
static void
shell_dbus_init (void)
shell_dbus_init (gboolean replace)
{
GError *error = NULL;
DBusGConnection *session;
DBusGProxy *bus;
guint32 request_name_flags;
guint32 request_name_result;
/** TODO:
@ -51,18 +52,25 @@ shell_dbus_init (void)
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
request_name_flags = DBUS_NAME_FLAG_DO_NOT_QUEUE | DBUS_NAME_FLAG_ALLOW_REPLACEMENT;
if (replace)
request_name_flags |= DBUS_NAME_FLAG_REPLACE_EXISTING;
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, SHELL_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_UINT, request_name_flags,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire org.gnome.Shell: %s\n", error->message);
/* If we somehow got started again, it's not an error to be running
* already. So just exit 0.
*/
exit (0);
g_printerr ("failed to acquire org.gnome.Shell: %s\n", error->message);
exit (1);
}
if (!(request_name_result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
|| request_name_result == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER))
{
g_printerr ("%s already exists on bus and --replace not specified\n",
SHELL_DBUS_SERVICE);
exit (1);
}
/* Also grab org.gnome.Panel to replace any existing panel process,
@ -108,6 +116,45 @@ shell_dbus_init (void)
g_object_unref (bus);
}
static void
constrain_tooltip (StTooltip *tooltip,
const ClutterGeometry *geometry,
ClutterGeometry *adjusted_geometry,
gpointer data)
{
const ClutterGeometry *tip_area = st_tooltip_get_tip_area (tooltip);
ShellGlobal *global = shell_global_get ();
MetaScreen *screen = shell_global_get_screen (global);
int n_monitors = meta_screen_get_n_monitors (screen);
int i;
*adjusted_geometry = *geometry;
/* A point that determines what screen we'll constrain to */
int x = tip_area->x + tip_area->width / 2;
int y = tip_area->y + tip_area->height / 2;
for (i = 0; i < n_monitors; i++)
{
MetaRectangle rect;
meta_screen_get_monitor_geometry (screen, i, &rect);
if (x >= rect.x && x < rect.x + rect.width &&
y >= rect.y && y < rect.y + rect.height)
{
if (adjusted_geometry->x + adjusted_geometry->width > rect.x + rect.width)
adjusted_geometry->x = rect.x + rect.width - adjusted_geometry->width;
if (adjusted_geometry->x < rect.x)
adjusted_geometry->x = rect.x;
if (adjusted_geometry->y + adjusted_geometry->height > rect.y + rect.height)
adjusted_geometry->y = rect.y + rect.height - adjusted_geometry->height;
if (adjusted_geometry->y < rect.y)
adjusted_geometry->y = rect.y;
return;
}
}
}
static void
update_font_options (GtkSettings *settings)
@ -139,6 +186,8 @@ update_font_options (GtkSettings *settings)
else
st_theme_context_set_default_resolution (context);
st_tooltip_set_constrain_func (stage, constrain_tooltip, NULL, NULL);
/* Clutter (as of 0.9) passes comprehensively wrong font options
* override whatever set_font_flags() did above.
*
@ -221,6 +270,8 @@ shell_prefs_init (void)
{
meta_prefs_override_preference_location ("/apps/mutter/general/attach_modal_dialogs",
"/desktop/gnome/shell/windows/attach_modal_dialogs");
meta_prefs_override_preference_location ("/apps/mutter/general/workspaces_only_on_primary",
"/desktop/gnome/shell/windows/workspaces_only_on_primary");
meta_prefs_override_preference_location ("/apps/metacity/general/button_layout",
"/desktop/gnome/shell/windows/button_layout");
meta_prefs_override_preference_location ("/apps/metacity/general/edge_tiling",
@ -432,7 +483,7 @@ main (int argc, char **argv)
g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE);
g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE);
shell_dbus_init ();
shell_dbus_init (meta_get_replace_current_wm ());
shell_a11y_init ();
shell_fonts_init ();
shell_perf_log_init ();

View File

@ -23,10 +23,10 @@
/* Vendor prefixes are something that can be preprended to a .desktop
* file name. Undo this.
*/
static const char*const known_vendor_prefixes[] = { "gnome",
"fedora",
"mozilla",
NULL };
static const char*const vendor_prefixes[] = { "gnome-",
"fedora-",
"mozilla-",
NULL };
enum {
PROP_0,
@ -49,12 +49,14 @@ struct _ShellAppSystemPrivate {
GSList *cached_flattened_apps; /* ShellAppInfo */
GSList *cached_settings; /* ShellAppInfo */
GSList *known_vendor_prefixes;
gint app_monitor_id;
guint app_change_timeout_id;
};
static char *shell_app_info_get_prefix (ShellAppInfo *info);
static void shell_app_system_finalize (GObject *object);
static gboolean on_tree_changed (gpointer user_data);
static void on_tree_changed_cb (GMenuTree *tree, gpointer user_data);
@ -159,20 +161,6 @@ shell_app_info_new_from_window (MetaWindow *window)
return info;
}
static ShellAppInfo *
shell_app_info_new_from_keyfile_take_ownership (GKeyFile *keyfile,
const char *path)
{
ShellAppInfo *info;
info = g_slice_alloc0 (sizeof (ShellAppInfo));
info->type = SHELL_APP_INFO_TYPE_DESKTOP_FILE;
info->refcount = 1;
info->keyfile = keyfile;
info->keyfile_path = g_strdup (path);
return info;
}
static void shell_app_system_class_init(ShellAppSystemClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *)klass;
@ -212,7 +200,7 @@ shell_app_system_init (ShellAppSystem *self)
* case by case.
*/
priv->apps_tree = gmenu_tree_lookup ("applications.menu", GMENU_TREE_FLAGS_INCLUDE_NODISPLAY);
priv->settings_tree = gmenu_tree_lookup ("settings.menu", GMENU_TREE_FLAGS_NONE);
priv->settings_tree = gmenu_tree_lookup ("gnomecc.menu", GMENU_TREE_FLAGS_INCLUDE_NODISPLAY);
priv->app_change_timeout_id = 0;
@ -240,6 +228,11 @@ shell_app_system_finalize (GObject *object)
g_slist_foreach (priv->cached_flattened_apps, (GFunc)shell_app_info_unref, NULL);
g_slist_free (priv->cached_flattened_apps);
priv->cached_flattened_apps = NULL;
g_slist_foreach (priv->known_vendor_prefixes, (GFunc)g_free, NULL);
g_slist_free (priv->known_vendor_prefixes);
priv->known_vendor_prefixes = NULL;
g_slist_foreach (priv->cached_settings, (GFunc)shell_app_info_unref, NULL);
g_slist_free (priv->cached_settings);
priv->cached_settings = NULL;
@ -323,10 +316,20 @@ cache_by_id (ShellAppSystem *self, GSList *apps)
for (iter = apps; iter; iter = iter->next)
{
ShellAppInfo *info = iter->data;
const char *id = shell_app_info_get_id (info);
char *prefix = shell_app_info_get_prefix (info);
shell_app_info_ref (info);
/* the name is owned by the info itself */
g_hash_table_replace (self->priv->app_id_to_info, (char*)shell_app_info_get_id (info),
info);
if (prefix
&& !g_slist_find_custom (self->priv->known_vendor_prefixes, prefix,
(GCompareFunc)g_strcmp0))
self->priv->known_vendor_prefixes = g_slist_append (self->priv->known_vendor_prefixes,
prefix);
else
g_free (prefix);
g_hash_table_replace (self->priv->app_id_to_info, (char*)id, info);
}
}
@ -335,6 +338,10 @@ reread_menus (ShellAppSystem *self)
{
GHashTable *unique = g_hash_table_new (g_str_hash, g_str_equal);
g_slist_foreach (self->priv->known_vendor_prefixes, (GFunc)g_free, NULL);
g_slist_free (self->priv->known_vendor_prefixes);
self->priv->known_vendor_prefixes = NULL;
reread_entries (self, &(self->priv->cached_flattened_apps), unique, self->priv->apps_tree);
g_hash_table_remove_all (unique);
reread_entries (self, &(self->priv->cached_settings), unique, self->priv->settings_tree);
@ -576,44 +583,6 @@ _shell_app_system_register_app (ShellAppSystem *self,
g_object_weak_ref (G_OBJECT (app), shell_app_system_on_app_weakref, ref);
}
ShellAppInfo *
shell_app_system_load_from_desktop_file (ShellAppSystem *system,
const char *filename,
GError **error)
{
ShellAppInfo *appinfo;
GKeyFile *keyfile;
char *full_path = NULL;
gboolean success;
keyfile = g_key_file_new ();
if (strchr (filename, '/') != NULL)
{
success = g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, error);
full_path = g_strdup (filename);
}
else
{
char *app_path = g_build_filename ("applications", filename, NULL);
success = g_key_file_load_from_data_dirs (keyfile, app_path, &full_path,
G_KEY_FILE_NONE, error);
g_free (app_path);
}
if (!success)
{
g_key_file_free (keyfile);
g_free (full_path);
return NULL;
}
appinfo = shell_app_info_new_from_keyfile_take_ownership (keyfile, full_path);
g_free (full_path);
return appinfo;
}
/**
* shell_app_system_create_from_window:
*
@ -645,16 +614,13 @@ shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *name)
{
ShellApp *result;
char **vendor_prefixes;
GSList *prefix;
result = shell_app_system_get_app (system, name);
if (result != NULL)
return result;
for (vendor_prefixes = (char**)known_vendor_prefixes;
*vendor_prefixes; vendor_prefixes++)
for (prefix = system->priv->known_vendor_prefixes; prefix; prefix = g_slist_next (prefix))
{
char *tmpid = g_strjoin (NULL, *vendor_prefixes, "-", name, NULL);
char *tmpid = g_strconcat ((char*)prefix->data, name, NULL);
result = shell_app_system_get_app (system, tmpid);
g_free (tmpid);
if (result != NULL)
@ -993,6 +959,115 @@ shell_app_info_get_id (ShellAppInfo *info)
return NULL;
}
static char *
shell_app_info_get_prefix (ShellAppInfo *info)
{
char *prefix = NULL, *file_prefix = NULL;
const char *id;
GFile *file;
char *name;
int i = 0;
if (info->type != SHELL_APP_INFO_TYPE_ENTRY)
return NULL;
id = gmenu_tree_entry_get_desktop_file_id ((GMenuTreeEntry*)info->entry);
file = g_file_new_for_path (gmenu_tree_entry_get_desktop_file_path ((GMenuTreeEntry*)info->entry));
name = g_file_get_basename (file);
if (!name)
{
g_object_unref (file);
return NULL;
}
for (i = 0; vendor_prefixes[i]; i++)
{
if (g_str_has_prefix (name, vendor_prefixes[i]))
{
file_prefix = g_strdup (vendor_prefixes[i]);
break;
}
}
while (strcmp (name, id) != 0)
{
char *t;
char *pname;
GFile *parent = g_file_get_parent (file);
if (!parent)
{
g_warn_if_reached ();
break;
}
pname = g_file_get_basename (parent);
if (!pname)
{
g_object_unref (parent);
break;
}
if (!g_strstr_len (id, -1, pname))
{
/* handle <LegacyDir prefix="..."> */
char *t;
size_t name_len = strlen (name);
size_t id_len = strlen (id);
char *t_id = g_strdup (id);
t_id[id_len - name_len] = '\0';
t = g_strdup(t_id);
g_free (prefix);
g_free (t_id);
g_free (name);
name = g_strdup (id);
prefix = t;
g_object_unref (file);
file = parent;
g_free (pname);
g_free (file_prefix);
file_prefix = NULL;
break;
}
t = g_strconcat (pname, "-", name, NULL);
g_free (name);
name = t;
t = g_strconcat (pname, "-", prefix, NULL);
g_free (prefix);
prefix = t;
g_object_unref (file);
file = parent;
g_free (pname);
}
if (file)
g_object_unref (file);
if (strcmp (name, id) == 0)
{
g_free (name);
if (file_prefix && !prefix)
return file_prefix;
if (file_prefix)
{
char *t = g_strconcat (prefix, "-", file_prefix, NULL);
g_free (prefix);
g_free (file_prefix);
prefix = t;
}
return prefix;
}
g_free (name);
g_free (prefix);
g_free (file_prefix);
g_return_val_if_reached (NULL);
}
#define DESKTOP_ENTRY_GROUP "Desktop Entry"
char *
@ -1260,21 +1335,27 @@ shell_app_info_create_icon_texture (ShellAppInfo *info, float size)
GIcon *icon;
ClutterActor *ret;
ret = NULL;
if (info->type == SHELL_APP_INFO_TYPE_WINDOW)
{
return st_texture_cache_bind_pixbuf_property (st_texture_cache_get_default (),
G_OBJECT (info->window),
"icon");
}
icon = shell_app_info_get_icon (info);
if (icon == NULL)
{
ret = clutter_texture_new ();
g_object_set (ret, "opacity", 0, "width", size, "height", size, NULL);
ret = st_texture_cache_bind_pixbuf_property (st_texture_cache_get_default (),
G_OBJECT (info->window),
"icon");
}
else
{
icon = shell_app_info_get_icon (info);
if (icon != NULL)
{
ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, (int)size);
g_object_unref (icon);
}
}
if (ret == NULL)
{
icon = g_themed_icon_new ("application-x-executable");
ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, (int)size);
g_object_unref (icon);
}
@ -1386,12 +1467,23 @@ shell_app_info_launch_full (ShellAppInfo *info,
shell_app = shell_app_system_get_app (shell_app_system_get_default (),
shell_app_info_get_id (info));
ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
G_APP_LAUNCH_CONTEXT (context),
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL,
_gather_pid_callback, shell_app,
error);
/* In the case where we know an app, we handle reaping the child internally,
* in the window tracker.
*/
if (shell_app != NULL)
ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
G_APP_LAUNCH_CONTEXT (context),
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL,
_gather_pid_callback, shell_app,
error);
else
ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
G_APP_LAUNCH_CONTEXT (context),
G_SPAWN_SEARCH_PATH,
NULL, NULL,
NULL, NULL,
error);
g_object_unref (G_OBJECT (gapp));

View File

@ -81,9 +81,6 @@ ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *sel
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *id);
ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system,
const char *filename,
GError **error);
ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system,
MetaWindow *window);

View File

@ -4,6 +4,8 @@
#include <string.h>
#include <glib/gi18n-lib.h>
#include <meta/display.h>
#include "shell-app-private.h"
@ -139,14 +141,26 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
app = data->app;
size = data->size;
icon = shell_app_info_get_icon (app->info);
if (icon == NULL)
return COGL_INVALID_HANDLE;
info = NULL;
icon = shell_app_info_get_icon (app->info);
if (icon != NULL)
{
info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
icon, (int) (size + 0.5),
GTK_ICON_LOOKUP_FORCE_SIZE);
g_object_unref (icon);
}
if (info == NULL)
{
icon = g_themed_icon_new ("application-x-executable");
info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
icon, (int) (size + 0.5),
GTK_ICON_LOOKUP_FORCE_SIZE);
g_object_unref (icon);
}
info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
icon, (int) (size + 0.5),
GTK_ICON_LOOKUP_FORCE_SIZE);
g_object_unref (icon);
if (info == NULL)
return COGL_INVALID_HANDLE;
@ -427,13 +441,24 @@ shell_app_activate (ShellApp *app,
switch (app->state)
{
case SHELL_APP_STATE_STOPPED:
/* TODO sensibly handle this error */
shell_app_info_launch_full (app->info,
0,
NULL,
workspace,
NULL,
NULL);
{
GError *error = NULL;
if (!shell_app_info_launch_full (app->info,
0,
NULL,
workspace,
NULL,
&error))
{
char *msg;
msg = g_strdup_printf (_("Failed to launch '%s'"), shell_app_get_name (app));
shell_global_notify_error (shell_global_get (),
msg,
error->message);
g_free (msg);
g_clear_error (&error);
}
}
break;
case SHELL_APP_STATE_STARTING:
break;
@ -755,9 +780,6 @@ _shell_app_add_window (ShellApp *app,
g_object_freeze_notify (G_OBJECT (app));
if (app->state != SHELL_APP_STATE_STARTING)
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
if (!app->running_state)
create_running_state (app);
@ -770,6 +792,9 @@ _shell_app_add_window (ShellApp *app,
if (user_time > app->running_state->last_user_time)
app->running_state->last_user_time = user_time;
if (app->state != SHELL_APP_STATE_STARTING)
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
g_object_thaw_notify (G_OBJECT (app));
g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0);

View File

@ -21,6 +21,7 @@
#include <gdk/gdkx.h>
#include <gio/gio.h>
#include <gjs/gjs-module.h>
#include <girepository.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlmemory.h>
@ -102,6 +103,7 @@ enum
XDND_POSITION_CHANGED,
XDND_LEAVE,
XDND_ENTER,
NOTIFY_ERROR,
LAST_SIGNAL
};
@ -293,6 +295,17 @@ shell_global_class_init (ShellGlobalClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
shell_global_signals[NOTIFY_ERROR] =
g_signal_new ("notify-error",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
gi_cclosure_marshal_generic,
G_TYPE_NONE, 2,
G_TYPE_STRING,
G_TYPE_STRING);
g_object_class_install_property (gobject_class,
PROP_OVERLAY_GROUP,
g_param_spec_object ("overlay-group",
@ -871,6 +884,61 @@ shell_global_display_is_grabbed (ShellGlobal *global)
return meta_display_get_grab_op (display) != META_GRAB_OP_NONE;
}
/**
* shell_global_create_pointer_barrier
* @global: a #ShellGlobal
* @x1: left X coordinate
* @y1: top Y coordinate
* @x2: right X coordinate
* @y2: bottom Y coordinate
* @directions: The directions we're allowed to pass through
*
* If supported by X creates a pointer barrier.
*
* Return value: value you can pass to shell_global_destroy_pointer_barrier()
*/
guint32
shell_global_create_pointer_barrier (ShellGlobal *global,
int x1, int y1, int x2, int y2,
int directions)
{
#if XFIXES_MAJOR >= 5
Display *xdpy;
xdpy = meta_plugin_get_xdisplay (global->plugin);
return (guint32)
XFixesCreatePointerBarrier (xdpy, DefaultRootWindow(xdpy),
x1, y1,
x2, y2,
directions,
0, NULL);
#else
return 0;
#endif
}
/**
* shell_global_destroy_pointer_barrier
* @global: a #ShellGlobal
* @barrier: a pointer barrier
*
* Destroys the @barrier created by shell_global_create_pointer_barrier().
*/
void
shell_global_destroy_pointer_barrier (ShellGlobal *global, guint32 barrier)
{
#if XFIXES_MAJOR >= 5
Display *xdpy;
g_return_if_fail (barrier > 0);
xdpy = meta_plugin_get_xdisplay (global->plugin);
XFixesDestroyPointerBarrier (xdpy, (PointerBarrier)barrier);
#endif
}
/**
* shell_global_add_extension_importer:
* @target_object_script: JavaScript code evaluating to a target object
@ -1238,6 +1306,25 @@ shell_global_maybe_gc (ShellGlobal *global)
gjs_context_maybe_gc (global->js_context);
}
/**
* shell_global_notify_error:
* @global: a #ShellGlobal
* @msg: Error message
* @details: Error details
*
* Show a system error notification. Use this function
* when a user-initiated action results in a non-fatal problem
* from causes that may not be under system control. For
* example, an application crash.
*/
void
shell_global_notify_error (ShellGlobal *global,
const char *msg,
const char *details)
{
g_signal_emit_by_name (global, "notify-error", msg, details);
}
static void
grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
{
@ -1368,48 +1455,33 @@ shell_global_get_monitors (ShellGlobal *global)
MetaRectangle *
shell_global_get_primary_monitor (ShellGlobal *global)
{
GdkScreen *screen = shell_global_get_gdk_screen (global);
GdkRectangle gdk_rect;
MetaScreen *screen = shell_global_get_screen (global);
MetaRectangle rect;
gint primary = 0;
/* gdk_screen_get_primary_monitor is only present in gtk-2.20+
* and is in a useable state (supports heuristics and fallback modes)
* starting with 2.20.1
*/
#if !GTK_CHECK_VERSION (2, 20, 1)
gint i;
gchar *output_name = NULL;
gint num_monitors = gdk_screen_get_n_monitors (screen);
for (i = 0; i < num_monitors; i++)
{
/* Prefer the laptop's internal screen if present */
output_name = gdk_screen_get_monitor_plug_name (screen, i);
if (output_name)
{
gboolean is_lvds = g_ascii_strncasecmp (output_name, "LVDS", 4) == 0;
g_free (output_name);
if (is_lvds)
{
primary = i;
break;
}
}
}
#else
primary = gdk_screen_get_primary_monitor (screen);
#endif
gdk_screen_get_monitor_geometry (screen, primary, &gdk_rect);
rect.x = gdk_rect.x;
rect.y = gdk_rect.y;
rect.width = gdk_rect.width;
rect.height = gdk_rect.height;
primary = meta_screen_get_primary_monitor (screen);
meta_screen_get_monitor_geometry (screen, primary, &rect);
return meta_rectangle_copy (&rect);
}
/**
* shell_global_get_primary_monitor_index:
* @global: the #ShellGlobal
*
* Gets the index of the primary monitor (the one that the
* panel is on).
*
* Return value: the index of the primary monitor
*/
int
shell_global_get_primary_monitor_index (ShellGlobal *global)
{
MetaScreen *screen = shell_global_get_screen (global);
return meta_screen_get_primary_monitor (screen);
}
/**
* shell_global_get_focus_monitor:
* @global: the #ShellGlobal
@ -1473,6 +1545,48 @@ shell_global_get_pointer (ShellGlobal *global,
*mods = raw_mods & GDK_MODIFIER_MASK;
}
/**
* shell_global_sync_pointer:
* @global: the #ShellGlobal
*
* Ensures that clutter is aware of the current pointer position,
* causing enter and leave events to be emitted if the pointer moved
* behind our back (ie, during a pointer grab).
*/
void
shell_global_sync_pointer (ShellGlobal *global)
{
int x, y;
GdkModifierType mods;
ClutterMotionEvent event;
gdk_display_get_pointer (gdk_display_get_default (), NULL, &x, &y, &mods);
event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global);
event.flags = 0;
/* This is wrong: we should be setting event.stage to NULL if the
* pointer is not inside the bounds of the stage given the current
* stage_input_mode. For our current purposes however, this works.
*/
event.stage = CLUTTER_STAGE (meta_plugin_get_stage (global->plugin));
event.x = x;
event.y = y;
event.modifier_state = mods;
event.axes = NULL;
event.device = clutter_device_manager_get_core_device (clutter_device_manager_get_default (),
CLUTTER_POINTER_DEVICE);
/* Leaving event.source NULL will force clutter to look it up, which
* will generate enter/leave events as a side effect, if they are
* needed. We need a better way to do this though... see
* http://bugzilla.clutter-project.org/show_bug.cgi?id=2615.
*/
event.source = NULL;
clutter_event_put ((ClutterEvent *)&event);
}
/**
* shell_get_event_state:
* @event: a #ClutterEvent
@ -2048,3 +2162,70 @@ shell_global_launch_calendar_server (ShellGlobal *global)
g_free (calendar_server_exe);
}
static void
shell_global_get_self_contact_features_cb (TpConnection *connection,
guint n_contacts,
TpContact * const *contacts,
const GError *error,
gpointer user_data,
GObject *weak_object)
{
if (error != NULL) {
g_print ("Failed to upgrade self contact: %s", error->message);
return;
}
((ShellGetSelfContactFeaturesCb)user_data)(connection, *contacts);
}
/**
* shell_get_self_contact_features:
* @self: A connection, which must be ready
* @n_features: Number of features in features
* @features: (array length=n_features) (allow-none) (element-type uint):
* Array of features
* @callback: (scope async): User callback to run when the contact is ready
*
* Wrap tp_connection_upgrade_contacts due to the lack of support for
* proper arrays arguments in GJS.
*/
void
shell_get_self_contact_features (TpConnection *self,
guint n_features,
const TpContactFeature *features,
ShellGetSelfContactFeaturesCb callback)
{
TpContact *self_contact = tp_connection_get_self_contact (self);
tp_connection_upgrade_contacts (self, 1, &self_contact,
n_features, features,
shell_global_get_self_contact_features_cb,
callback, NULL, NULL);
}
/**
* shell_get_contact_events:
* @log_manager: A #TplLogManager
* @account: A #TpAccount
* @entity: A #TplEntity
* @num_events: The number of events to retrieve
* @callback: (scope async): User callback to run when the contact is ready
*
* Wrap tpl_log_manager_get_filtered_events_async because gjs cannot support
* multiple callbacks in the same function call.
*/
void
shell_get_contact_events (TplLogManager *log_manager,
TpAccount *account,
TplEntity *entity,
guint num_events,
GAsyncReadyCallback callback)
{
tpl_log_manager_get_filtered_events_async (log_manager,
account,
entity,
TPL_EVENT_MASK_TEXT,
num_events,
NULL, NULL,
callback, NULL);
}

View File

@ -8,6 +8,7 @@
#include <gtk/gtk.h>
#include <meta/meta-plugin.h>
#include <telepathy-glib/telepathy-glib.h>
#include <telepathy-logger/telepathy-logger.h>
G_BEGIN_DECLS
@ -99,12 +100,20 @@ void shell_global_format_time_relative_pretty (ShellGlobal *global, guint delta,
GSList *shell_global_get_monitors (ShellGlobal *global);
MetaRectangle *shell_global_get_primary_monitor (ShellGlobal *global);
int shell_global_get_primary_monitor_index (ShellGlobal *global);
MetaRectangle *shell_global_get_focus_monitor (ShellGlobal *global);
void shell_global_get_pointer (ShellGlobal *global,
int *x,
int *y,
ClutterModifierType *mods);
guint32 shell_global_create_pointer_barrier (ShellGlobal *global,
int x1, int y1, int x2, int y2,
int directions);
void shell_global_destroy_pointer_barrier (ShellGlobal *global,
guint32 barrier);
void shell_global_get_pointer (ShellGlobal *global,
int *x,
int *y,
ClutterModifierType *mods);
void shell_global_sync_pointer (ShellGlobal *global);
GSettings *shell_global_get_settings (ShellGlobal *global);
@ -142,6 +151,11 @@ void shell_global_play_theme_sound (ShellGlobal *global,
void shell_global_cancel_theme_sound (ShellGlobal *global,
guint id);
void shell_global_notify_error (ShellGlobal *global,
const char *msg,
const char *details);
void shell_global_init_xdnd (ShellGlobal *global);
typedef void (*ShellGetTpContactCb) (TpConnection *connection,
@ -157,6 +171,20 @@ void shell_get_tp_contacts (TpConnection *self,
void shell_global_launch_calendar_server (ShellGlobal *global);
typedef void (*ShellGetSelfContactFeaturesCb) (TpConnection *connection,
TpContact *contact);
void shell_get_self_contact_features (TpConnection *self,
guint n_features,
const TpContactFeature *features,
ShellGetSelfContactFeaturesCb callback);
void shell_get_contact_events (TplLogManager *log_manager,
TpAccount *account,
TplEntity *entity,
guint num_events,
GAsyncReadyCallback callback);
G_END_DECLS
#endif /* __SHELL_GLOBAL_H__ */

View File

@ -0,0 +1,816 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright (C) 2009 Novell, Inc.
* Author: Tambet Ingo (tambet@gmail.com).
*
* Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#include "config.h"
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <glib/gi18n.h>
#include "shell-mobile-providers.h"
#ifndef MOBILE_BROADBAND_PROVIDER_INFO
#define MOBILE_BROADBAND_PROVIDER_INFO DATADIR "/mobile-broadband-provider-info/serviceproviders.xml"
#endif
#define ISO_3166_COUNTRY_CODES DATADIR "/zoneinfo/iso3166.tab"
static GHashTable *
read_country_codes (void)
{
GHashTable *table;
GIOChannel *channel;
GString *buffer;
GError *error = NULL;
GIOStatus status;
channel = g_io_channel_new_file (ISO_3166_COUNTRY_CODES, "r", &error);
if (!channel) {
if (error) {
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": %s", error->message);
g_error_free (error);
} else
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": Unknown error");
return NULL;
}
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
buffer = g_string_sized_new (32);
status = G_IO_STATUS_NORMAL;
while (status == G_IO_STATUS_NORMAL) {
status = g_io_channel_read_line_string (channel, buffer, NULL, &error);
switch (status) {
case G_IO_STATUS_NORMAL:
if (buffer->str[0] != '#') {
char **pieces;
pieces = g_strsplit (buffer->str, "\t", 2);
/* Hack for rh#556292; iso3166.tab is just wrong */
pieces[1] = pieces[1] ? g_strchomp (pieces[1]) : NULL;
if (pieces[1] && !strcmp (pieces[1], "Britain (UK)")) {
g_free (pieces[1]);
pieces[1] = g_strdup (_("United Kingdom"));
}
g_hash_table_insert (table, pieces[0], pieces[1]);
g_free (pieces);
}
g_string_truncate (buffer, 0);
break;
case G_IO_STATUS_EOF:
break;
case G_IO_STATUS_ERROR:
g_warning ("Error while reading: %s", error->message);
g_error_free (error);
break;
case G_IO_STATUS_AGAIN:
/* FIXME: Try again a few times, but really, it never happes, right? */
break;
}
}
g_string_free (buffer, TRUE);
g_io_channel_unref (channel);
return table;
}
/* XML Parser */
typedef enum {
PARSER_TOPLEVEL = 0,
PARSER_COUNTRY,
PARSER_PROVIDER,
PARSER_METHOD_GSM,
PARSER_METHOD_GSM_APN,
PARSER_METHOD_CDMA,
PARSER_ERROR
} MobileContextState;
typedef struct {
GHashTable *country_codes;
GHashTable *table;
char *current_country;
GSList *current_providers;
ShellMobileProvider *current_provider;
ShellMobileAccessMethod *current_method;
char *text_buffer;
MobileContextState state;
} MobileParser;
static ShellGsmMccMnc *
mcc_mnc_new (const char *mcc, const char *mnc)
{
ShellGsmMccMnc *m;
m = g_slice_new (ShellGsmMccMnc);
m->mcc = g_strstrip (g_strdup (mcc));
m->mnc = g_strstrip (g_strdup (mnc));
return m;
}
/* added in porting */
static ShellGsmMccMnc *
mcc_mnc_copy (const ShellGsmMccMnc *other) {
ShellGsmMccMnc *ret;
ret = g_slice_new (ShellGsmMccMnc);
ret->mcc = g_strdup (other->mcc);
ret->mnc = g_strdup (other->mnc);
return ret;
}
static void
mcc_mnc_free (ShellGsmMccMnc *m)
{
g_return_if_fail (m != NULL);
g_free (m->mcc);
g_free (m->mnc);
g_slice_free (ShellGsmMccMnc, m);
}
/* added in porting */
G_DEFINE_BOXED_TYPE (ShellGsmMccMnc, shell_gsm_mcc_mnc, mcc_mnc_copy, mcc_mnc_free)
static ShellMobileAccessMethod *
access_method_new (void)
{
ShellMobileAccessMethod *method;
method = g_slice_new0 (ShellMobileAccessMethod);
method->refs = 1;
method->lcl_names = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) g_free);
return method;
}
ShellMobileAccessMethod *
shell_mobile_access_method_ref (ShellMobileAccessMethod *method)
{
g_return_val_if_fail (method != NULL, NULL);
g_return_val_if_fail (method->refs > 0, NULL);
method->refs++;
return method;
}
void
shell_mobile_access_method_unref (ShellMobileAccessMethod *method)
{
g_return_if_fail (method != NULL);
g_return_if_fail (method->refs > 0);
if (--method->refs == 0) {
g_free (method->name);
g_hash_table_destroy (method->lcl_names);
g_free (method->username);
g_free (method->password);
g_free (method->gateway);
g_free (method->gsm_apn);
g_slist_foreach (method->dns, (GFunc) g_free, NULL);
g_slist_free (method->dns);
g_slice_free (ShellMobileAccessMethod, method);
}
}
GType
shell_mobile_access_method_get_type (void)
{
static GType type = 0;
if (G_UNLIKELY (type == 0)) {
type = g_boxed_type_register_static ("ShellMobileAccessMethod",
(GBoxedCopyFunc) shell_mobile_access_method_ref,
(GBoxedFreeFunc) shell_mobile_access_method_unref);
}
return type;
}
static ShellMobileProvider *
provider_new (void)
{
ShellMobileProvider *provider;
provider = g_slice_new0 (ShellMobileProvider);
provider->refs = 1;
provider->lcl_names = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) g_free);
return provider;
}
ShellMobileProvider *
shell_mobile_provider_ref (ShellMobileProvider *provider)
{
provider->refs++;
return provider;
}
void
shell_mobile_provider_unref (ShellMobileProvider *provider)
{
if (--provider->refs == 0) {
g_free (provider->name);
g_hash_table_destroy (provider->lcl_names);
g_slist_foreach (provider->methods, (GFunc) shell_mobile_access_method_unref, NULL);
g_slist_free (provider->methods);
g_slist_foreach (provider->gsm_mcc_mnc, (GFunc) mcc_mnc_free, NULL);
g_slist_free (provider->gsm_mcc_mnc);
g_slist_free (provider->cdma_sid);
g_slice_free (ShellMobileProvider, provider);
}
}
GType
shell_mobile_provider_get_type (void)
{
static GType type = 0;
if (G_UNLIKELY (type == 0)) {
type = g_boxed_type_register_static ("ShellMobileProvider",
(GBoxedCopyFunc) shell_mobile_provider_ref,
(GBoxedFreeFunc) shell_mobile_provider_unref);
}
return type;
}
static void
provider_list_free (gpointer data)
{
GSList *list = (GSList *) data;
while (list) {
shell_mobile_provider_unref ((ShellMobileProvider *) list->data);
list = g_slist_delete_link (list, list);
}
}
static void
parser_toplevel_start (MobileParser *parser,
const char *name,
const char **attribute_names,
const char **attribute_values)
{
int i;
if (!strcmp (name, "serviceproviders")) {
for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "format")) {
if (strcmp (attribute_values[i], "2.0")) {
g_warning ("%s: mobile broadband provider database format '%s'"
" not supported.", __func__, attribute_values[i]);
parser->state = PARSER_ERROR;
break;
}
}
}
} else if (!strcmp (name, "country")) {
for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "code")) {
char *country_code;
char *country;
country_code = g_ascii_strup (attribute_values[i], -1);
country = g_hash_table_lookup (parser->country_codes, country_code);
if (country) {
parser->current_country = g_strdup (country);
g_free (country_code);
} else
parser->current_country = country_code;
parser->state = PARSER_COUNTRY;
break;
}
}
}
}
static void
parser_country_start (MobileParser *parser,
const char *name,
const char **attribute_names,
const char **attribute_values)
{
if (!strcmp (name, "provider")) {
parser->state = PARSER_PROVIDER;
parser->current_provider = provider_new ();
}
}
static void
parser_provider_start (MobileParser *parser,
const char *name,
const char **attribute_names,
const char **attribute_values)
{
if (!strcmp (name, "gsm"))
parser->state = PARSER_METHOD_GSM;
else if (!strcmp (name, "cdma")) {
parser->state = PARSER_METHOD_CDMA;
parser->current_method = access_method_new ();
}
}
static void
parser_gsm_start (MobileParser *parser,
const char *name,
const char **attribute_names,
const char **attribute_values)
{
if (!strcmp (name, "network-id")) {
const char *mcc = NULL, *mnc = NULL;
int i;
for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "mcc"))
mcc = attribute_values[i];
else if (!strcmp (attribute_names[i], "mnc"))
mnc = attribute_values[i];
if (mcc && strlen (mcc) && mnc && strlen (mnc)) {
parser->current_provider->gsm_mcc_mnc = g_slist_prepend (parser->current_provider->gsm_mcc_mnc,
mcc_mnc_new (mcc, mnc));
break;
}
}
} else if (!strcmp (name, "apn")) {
int i;
for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "value")) {
parser->state = PARSER_METHOD_GSM_APN;
parser->current_method = access_method_new ();
parser->current_method->gsm_apn = g_strstrip (g_strdup (attribute_values[i]));
break;
}
}
}
}
static void
parser_cdma_start (MobileParser *parser,
const char *name,
const char **attribute_names,
const char **attribute_values)
{
if (!strcmp (name, "sid")) {
int i;
for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "value")) {
unsigned long tmp;
errno = 0;
tmp = strtoul (attribute_values[i], NULL, 10);
if (errno == 0 && tmp > 0)
parser->current_provider->cdma_sid = g_slist_prepend (parser->current_provider->cdma_sid,
GUINT_TO_POINTER ((guint32) tmp));
break;
}
}
}
}
static void
mobile_parser_start_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer data,
GError **error)
{
MobileParser *parser = (MobileParser *) data;
if (parser->text_buffer) {
g_free (parser->text_buffer);
parser->text_buffer = NULL;
}
switch (parser->state) {
case PARSER_TOPLEVEL:
parser_toplevel_start (parser, element_name, attribute_names, attribute_values);
break;
case PARSER_COUNTRY:
parser_country_start (parser, element_name, attribute_names, attribute_values);
break;
case PARSER_PROVIDER:
parser_provider_start (parser, element_name, attribute_names, attribute_values);
break;
case PARSER_METHOD_GSM:
parser_gsm_start (parser, element_name, attribute_names, attribute_values);
break;
case PARSER_METHOD_CDMA:
parser_cdma_start (parser, element_name, attribute_names, attribute_values);
break;
default:
break;
}
}
static void
parser_country_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "country")) {
g_hash_table_insert (parser->table, parser->current_country, parser->current_providers);
parser->current_country = NULL;
parser->current_providers = NULL;
parser->text_buffer = NULL;
parser->state = PARSER_TOPLEVEL;
}
}
static void
parser_provider_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "name")) {
if (!parser->current_provider->name) {
/* Use the first one. */
parser->current_provider->name = parser->text_buffer;
parser->text_buffer = NULL;
}
} else if (!strcmp (name, "provider")) {
parser->current_provider->methods = g_slist_reverse (parser->current_provider->methods);
parser->current_provider->gsm_mcc_mnc = g_slist_reverse (parser->current_provider->gsm_mcc_mnc);
parser->current_provider->cdma_sid = g_slist_reverse (parser->current_provider->cdma_sid);
parser->current_providers = g_slist_prepend (parser->current_providers, parser->current_provider);
parser->current_provider = NULL;
parser->text_buffer = NULL;
parser->state = PARSER_COUNTRY;
}
}
static void
parser_gsm_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "gsm")) {
parser->text_buffer = NULL;
parser->state = PARSER_PROVIDER;
}
}
static void
parser_gsm_apn_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "name")) {
if (!parser->current_method->name) {
/* Use the first one. */
parser->current_method->name = parser->text_buffer;
parser->text_buffer = NULL;
}
} else if (!strcmp (name, "username")) {
parser->current_method->username = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "password")) {
parser->current_method->password = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "dns")) {
parser->current_method->dns = g_slist_prepend (parser->current_method->dns, parser->text_buffer);
parser->text_buffer = NULL;
} else if (!strcmp (name, "gateway")) {
parser->current_method->gateway = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "apn")) {
parser->current_method->type = SHELL_MOBILE_ACCESS_METHOD_TYPE_GSM;
parser->current_method->dns = g_slist_reverse (parser->current_method->dns);
if (!parser->current_method->name)
parser->current_method->name = g_strdup (_("Default"));
parser->current_provider->methods = g_slist_prepend (parser->current_provider->methods,
parser->current_method);
parser->current_method = NULL;
parser->text_buffer = NULL;
parser->state = PARSER_METHOD_GSM;
}
}
static void
parser_cdma_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "username")) {
parser->current_method->username = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "password")) {
parser->current_method->password = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "dns")) {
parser->current_method->dns = g_slist_prepend (parser->current_method->dns, parser->text_buffer);
parser->text_buffer = NULL;
} else if (!strcmp (name, "gateway")) {
parser->current_method->gateway = parser->text_buffer;
parser->text_buffer = NULL;
} else if (!strcmp (name, "cdma")) {
parser->current_method->type = SHELL_MOBILE_ACCESS_METHOD_TYPE_CDMA;
parser->current_method->dns = g_slist_reverse (parser->current_method->dns);
if (!parser->current_method->name)
parser->current_method->name = g_strdup (parser->current_provider->name);
parser->current_provider->methods = g_slist_prepend (parser->current_provider->methods,
parser->current_method);
parser->current_method = NULL;
parser->text_buffer = NULL;
parser->state = PARSER_PROVIDER;
}
}
static void
mobile_parser_end_element (GMarkupParseContext *context,
const gchar *element_name,
gpointer data,
GError **error)
{
MobileParser *parser = (MobileParser *) data;
switch (parser->state) {
case PARSER_COUNTRY:
parser_country_end (parser, element_name);
break;
case PARSER_PROVIDER:
parser_provider_end (parser, element_name);
break;
case PARSER_METHOD_GSM:
parser_gsm_end (parser, element_name);
break;
case PARSER_METHOD_GSM_APN:
parser_gsm_apn_end (parser, element_name);
break;
case PARSER_METHOD_CDMA:
parser_cdma_end (parser, element_name);
break;
default:
break;
}
}
static void
mobile_parser_characters (GMarkupParseContext *context,
const gchar *text,
gsize text_len,
gpointer data,
GError **error)
{
MobileParser *parser = (MobileParser *) data;
g_free (parser->text_buffer);
parser->text_buffer = g_strdup (text);
}
static const GMarkupParser mobile_parser = {
mobile_parser_start_element,
mobile_parser_end_element,
mobile_parser_characters,
NULL, /* passthrough */
NULL /* error */
};
/**
* shell_mobile_providers_parse:
* @out_ccs: (out) (allow-none): (element-type utf8 utf8): a #GHashTable containing
* country codes
*
* Returns: (element-type utf8 GList<Shell.MobileProvider>) (transfer container): a
* hash table where keys are country names 'char *', values are a 'GSList *'
* of 'ShellMobileProvider *'. Everything is destroyed with g_hash_table_destroy ().
*/
GHashTable *
shell_mobile_providers_parse (GHashTable **out_ccs)
{
GMarkupParseContext *ctx;
GIOChannel *channel;
MobileParser parser;
GError *error = NULL;
char buffer[4096];
GIOStatus status;
gsize len = 0;
memset (&parser, 0, sizeof (MobileParser));
parser.country_codes = read_country_codes ();
if (!parser.country_codes)
goto out;
channel = g_io_channel_new_file (MOBILE_BROADBAND_PROVIDER_INFO, "r", &error);
if (!channel) {
if (error) {
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": %s", error->message);
g_error_free (error);
} else
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": Unknown error");
goto out;
}
parser.table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, provider_list_free);
parser.state = PARSER_TOPLEVEL;
ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL);
status = G_IO_STATUS_NORMAL;
while (status == G_IO_STATUS_NORMAL) {
status = g_io_channel_read_chars (channel, buffer, sizeof (buffer), &len, &error);
switch (status) {
case G_IO_STATUS_NORMAL:
if (!g_markup_parse_context_parse (ctx, buffer, len, &error)) {
status = G_IO_STATUS_ERROR;
g_warning ("Error while parsing XML: %s", error->message);
g_error_free (error);;
}
break;
case G_IO_STATUS_EOF:
break;
case G_IO_STATUS_ERROR:
g_warning ("Error while reading: %s", error->message);
g_error_free (error);
break;
case G_IO_STATUS_AGAIN:
/* FIXME: Try again a few times, but really, it never happes, right? */
break;
}
}
g_io_channel_unref (channel);
g_markup_parse_context_free (ctx);
if (parser.current_provider) {
g_warning ("pending current provider");
shell_mobile_provider_unref (parser.current_provider);
}
if (parser.current_providers) {
g_warning ("pending current providers");
provider_list_free (parser.current_providers);
}
g_free (parser.current_country);
g_free (parser.text_buffer);
out:
if (parser.country_codes) {
if (out_ccs)
*out_ccs = parser.country_codes;
else
g_hash_table_destroy (parser.country_codes);
}
return parser.table;
}
static void
dump_generic (ShellMobileAccessMethod *method)
{
GSList *iter;
GString *dns;
g_print (" username: %s\n", method->username ? method->username : "");
g_print (" password: %s\n", method->password ? method->password : "");
dns = g_string_new (NULL);
for (iter = method->dns; iter; iter = g_slist_next (iter))
g_string_append_printf (dns, "%s%s", dns->len ? ", " : "", (char *) iter->data);
g_print (" dns : %s\n", dns->str);
g_string_free (dns, TRUE);
g_print (" gateway : %s\n", method->gateway ? method->gateway : "");
}
static void
dump_cdma (ShellMobileAccessMethod *method)
{
g_print (" CDMA: %s\n", method->name);
dump_generic (method);
}
static void
dump_gsm (ShellMobileAccessMethod *method)
{
g_print (" APN: %s (%s)\n", method->name, method->gsm_apn);
dump_generic (method);
}
static void
dump_country (gpointer key, gpointer value, gpointer user_data)
{
GSList *citer, *miter;
for (citer = value; citer; citer = g_slist_next (citer)) {
ShellMobileProvider *provider = citer->data;
g_print ("Provider: %s (%s)\n", provider->name, (const char *) key);
for (miter = provider->methods; miter; miter = g_slist_next (miter)) {
ShellMobileAccessMethod *method = miter->data;
GSList *liter;
for (liter = provider->gsm_mcc_mnc; liter; liter = g_slist_next (liter)) {
ShellGsmMccMnc *m = liter->data;
g_print (" MCC/MNC: %s-%s\n", m->mcc, m->mnc);
}
for (liter = provider->cdma_sid; liter; liter = g_slist_next (liter))
g_print (" SID: %d\n", GPOINTER_TO_UINT (liter->data));
switch (method->type) {
case SHELL_MOBILE_ACCESS_METHOD_TYPE_CDMA:
dump_cdma (method);
break;
case SHELL_MOBILE_ACCESS_METHOD_TYPE_GSM:
dump_gsm (method);
break;
default:
break;
}
g_print ("\n");
}
}
}
void
shell_mobile_providers_dump (GHashTable *providers)
{
g_return_if_fail (providers != NULL);
g_hash_table_foreach (providers, dump_country, NULL);
}
/* All the following don't exist in nm-applet, because C doesn't need
those. They're only needed for the introspection annotations
*/
/**
* shell_mobile_provider_get_gsm_mcc_mnc:
* @provider: a #ShellMobileProvider
*
* Returns: (element-type Shell.GsmMccMnc) (transfer none): the
* list of #ShellGsmMccMnc this provider exposes
*/
GSList *
shell_mobile_provider_get_gsm_mcc_mnc (ShellMobileProvider *provider)
{
return provider->gsm_mcc_mnc;
}
/**
* shell_mobile_provider_get_cdma_sid:
* @provider: a #ShellMobileProvider
*
* Returns: (element-type guint32) (transfer none): the
* list of CDMA sids this provider exposes
*/
GSList *
shell_mobile_provider_get_cdma_sid (ShellMobileProvider *provider)
{
return provider->cdma_sid;
}

View File

@ -0,0 +1,96 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright (C) 2009 Novell, Inc.
* Author: Tambet Ingo (tambet@gmail.com).
*
* Copyright (C) 2009 - 2010 Red Hat, Inc.
*
* Ported to GNOME Shell by Giovanni Campagna <scampa.giovanni@gmail.com>
* Porting consisted only in replacing nmn with shell, to be compatible with
* GObject Introspection namespacing
*/
#ifndef SHELL_MOBILE_PROVIDERS_H
#define SHELL_MOBILE_PROVIDERS_H
#include <glib.h>
#include <glib-object.h>
#define SHELL_TYPE_MOBILE_PROVIDER (shell_mobile_provider_get_type ())
#define SHELL_TYPE_MOBILE_ACCESS_METHOD (shell_mobile_access_method_get_type ())
typedef enum {
SHELL_MOBILE_ACCESS_METHOD_TYPE_UNKNOWN = 0,
SHELL_MOBILE_ACCESS_METHOD_TYPE_GSM,
SHELL_MOBILE_ACCESS_METHOD_TYPE_CDMA
} ShellMobileAccessMethodType;
typedef struct {
char *mcc;
char *mnc;
} ShellGsmMccMnc;
typedef struct {
char *name;
/* maps lang (char *) -> name (char *) */
GHashTable *lcl_names;
char *username;
char *password;
char *gateway;
GSList *dns; /* GSList of 'char *' */
/* Only used with SHELL_PROVIDER_TYPE_GSM */
char *gsm_apn;
ShellMobileAccessMethodType type;
gint refs;
} ShellMobileAccessMethod;
typedef struct {
char *name;
/* maps lang (char *) -> name (char *) */
GHashTable *lcl_names;
GSList *methods; /* GSList of ShellMobileAccessMethod */
GSList *gsm_mcc_mnc; /* GSList of ShellGsmMccMnc */
GSList *cdma_sid; /* GSList of guint32 */
gint refs;
} ShellMobileProvider;
GType shell_gsm_mcc_mnc_get_type (void); /* added in porting */
GType shell_mobile_provider_get_type (void);
GType shell_mobile_access_method_get_type (void);
ShellMobileProvider *shell_mobile_provider_ref (ShellMobileProvider *provider);
void shell_mobile_provider_unref (ShellMobileProvider *provider);
GSList * shell_mobile_provider_get_gsm_mcc_mnc (ShellMobileProvider *provider);
GSList * shell_mobile_provider_get_cdma_sid (ShellMobileProvider *provider);
ShellMobileAccessMethod *shell_mobile_access_method_ref (ShellMobileAccessMethod *method);
void shell_mobile_access_method_unref (ShellMobileAccessMethod *method);
GHashTable *shell_mobile_providers_parse (GHashTable **out_ccs);
void shell_mobile_providers_dump (GHashTable *providers);
#endif /* SHELL_MOBILE_PROVIDERS_H */

View File

@ -165,3 +165,76 @@ shell_tray_icon_new (ShellEmbeddedWindow *window)
"window", window,
NULL);
}
/**
* shell_tray_icon_click:
* @icon: a #ShellTrayIcon
* @event: the #ClutterEvent triggering the fake click
*
* Fakes a press and release on @icon. @event must be a
* %CLUTTER_BUTTON_RELEASE event. Its relevant details will be passed
* on to the icon, but its coordinates will be ignored; the click is
* always made on the center of @icon.
*/
void
shell_tray_icon_click (ShellTrayIcon *icon,
ClutterEvent *event)
{
XButtonEvent xbevent;
XCrossingEvent xcevent;
GdkWindow *remote_window;
GdkScreen *screen;
int x_root, y_root;
Display *xdisplay;
Window xwindow, xrootwindow;
g_return_if_fail (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE);
gdk_error_trap_push ();
remote_window = gtk_socket_get_plug_window (GTK_SOCKET (icon->priv->socket));
xwindow = GDK_WINDOW_XID (remote_window);
xdisplay = GDK_WINDOW_XDISPLAY (remote_window);
screen = gdk_window_get_screen (remote_window);
xrootwindow = GDK_WINDOW_XID (gdk_screen_get_root_window (screen));
gdk_window_get_origin (remote_window, &x_root, &y_root);
/* First make the icon believe the pointer is inside it */
xcevent.type = EnterNotify;
xcevent.window = xwindow;
xcevent.root = xrootwindow;
xcevent.subwindow = None;
xcevent.time = clutter_event_get_time (event);
xcevent.x = gdk_window_get_width (remote_window) / 2;
xcevent.y = gdk_window_get_height (remote_window) / 2;
xcevent.x_root = x_root + xcevent.x;
xcevent.y_root = y_root + xcevent.y;
xcevent.mode = NotifyNormal;
xcevent.detail = NotifyNonlinear;
xcevent.same_screen = True;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xcevent);
/* Now do the click */
xbevent.type = ButtonPress;
xbevent.window = xwindow;
xbevent.root = xrootwindow;
xbevent.subwindow = None;
xbevent.time = xcevent.time;
xbevent.x = xcevent.x;
xbevent.y = xcevent.y;
xbevent.x_root = xcevent.x_root;
xbevent.y_root = xcevent.y_root;
xbevent.state = clutter_event_get_state (event);
xbevent.button = clutter_event_get_button (event);
xbevent.same_screen = True;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
xbevent.type = ButtonRelease;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
/* And move the pointer back out */
xcevent.type = LeaveNotify;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xcevent);
gdk_error_trap_pop_ignored ();
}

View File

@ -31,4 +31,7 @@ struct _ShellTrayIconClass
GType shell_tray_icon_get_type (void) G_GNUC_CONST;
ClutterActor *shell_tray_icon_new (ShellEmbeddedWindow *window);
void shell_tray_icon_click (ShellTrayIcon *icon,
ClutterEvent *event);
#endif /* __SHELL_TRAY_ICON_H__ */

View File

@ -225,23 +225,6 @@ get_appid_from_window (MetaWindow *window)
return appid_guess;
}
/**
* window_is_tracked:
*
* We don't attempt to associate override-redirect windows with applications
* at all, since there's no reason to do so yet.
*
* Returns: %TRUE iff we want to scan this window for application association
*/
static gboolean
window_is_tracked (MetaWindow *window)
{
if (meta_window_is_override_redirect (window))
return FALSE;
return TRUE;
}
/**
* shell_window_tracker_is_window_interesting:
*
@ -529,7 +512,7 @@ track_window (ShellWindowTracker *self,
{
ShellApp *app;
if (!window_is_tracked (window))
if (!shell_window_tracker_is_window_interesting (window))
return;
app = get_app_for_window (self, window);
@ -539,10 +522,6 @@ track_window (ShellWindowTracker *self,
/* At this point we've stored the association from window -> application */
g_hash_table_insert (self->window_to_app, window, app);
/* However, only put interesting windows in the window list for an app. */
if (!shell_window_tracker_is_window_interesting (window))
return;
if (shell_app_is_transient (app))
{
/* For a transient application, it's possible one of our title regexps

View File

@ -232,7 +232,10 @@ st_button_key_release (ClutterActor *actor,
if (event->keyval == CLUTTER_KEY_space ||
event->keyval == CLUTTER_KEY_Return)
{
st_button_release (button, ST_BUTTON_ONE, 1);
gboolean is_click;
is_click = (button->priv->pressed & ST_BUTTON_ONE);
st_button_release (button, ST_BUTTON_ONE, is_click ? 1 : 0);
return TRUE;
}
}

View File

@ -445,33 +445,35 @@ filter_by_position (GList *children,
clutter_actor_get_allocation_box (child, &cbox);
/* Filter out children if they are in the wrong direction from
* @rbox, or if they don't overlap it.
* @rbox, or if they don't overlap it. To account for floating-
* point imprecision, an actor is "down" (etc.) from an another
* actor even if it overlaps it by up to 0.1 pixels.
*/
switch (direction)
{
case GTK_DIR_UP:
if (cbox.y2 > rbox->y1)
if (cbox.y2 > rbox->y1 + 0.1)
continue;
if (cbox.x1 >= rbox->x2 || cbox.x2 <= rbox->x1)
continue;
break;
case GTK_DIR_DOWN:
if (cbox.y1 < rbox->y2)
if (cbox.y1 < rbox->y2 - 0.1)
continue;
if (cbox.x1 >= rbox->x2 || cbox.x2 <= rbox->x1)
continue;
break;
case GTK_DIR_LEFT:
if (cbox.x2 > rbox->x1)
if (cbox.x2 > rbox->x1 + 0.1)
continue;
if (cbox.y1 >= rbox->y2 || cbox.y2 <= rbox->y1)
continue;
break;
case GTK_DIR_RIGHT:
if (cbox.x1 < rbox->x2)
if (cbox.x1 < rbox->x2 - 0.1)
continue;
if (cbox.y1 >= rbox->y2 || cbox.y2 <= rbox->y1)
continue;

View File

@ -243,10 +243,11 @@ st_label_paint (ClutterActor *actor)
priv->text_shadow_material = material;
}
_st_paint_shadow_with_opacity (shadow_spec,
priv->text_shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->label));
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
_st_paint_shadow_with_opacity (shadow_spec,
priv->text_shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->label));
}
clutter_actor_paint (priv->label);

View File

@ -435,11 +435,12 @@ blur_pixels (guchar *pixels_in,
guchar *pixels_out;
float sigma;
/* we use an approximation of the sigma - blur radius relationship used
in Firefox for doing SVG blurs; see
http://mxr.mozilla.org/mozilla-central/source/gfx/thebes/src/gfxBlur.cpp#280
*/
sigma = blur / 1.9;
/* The CSS specification defines (or will define) the blur radius as twice
* the Gaussian standard deviation. See:
*
* http://lists.w3.org/Archives/Public/www-style/2010Sep/0002.html
*/
sigma = blur / 2.;
if ((guint) blur == 0)
{
@ -604,32 +605,41 @@ _st_create_shadow_material_from_actor (StShadow *shadow_spec,
{
CoglHandle buffer, offscreen;
ClutterActorBox box;
CoglColor clear_color;
float width, height;
clutter_actor_get_allocation_box (actor, &box);
clutter_actor_box_get_size (&box, &width, &height);
if (width == 0 || height == 0)
return COGL_INVALID_HANDLE;
buffer = cogl_texture_new_with_size (width,
height,
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY);
if (buffer == COGL_INVALID_HANDLE)
return COGL_INVALID_HANDLE;
offscreen = cogl_offscreen_new_to_texture (buffer);
if (offscreen != COGL_INVALID_HANDLE)
if (offscreen == COGL_INVALID_HANDLE)
{
CoglColor clear_color;
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_push_framebuffer (offscreen);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
cogl_ortho (0, width, height, 0, 0, 1.0);
clutter_actor_paint (actor);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
shadow_material = _st_create_shadow_material (shadow_spec, buffer);
cogl_handle_unref (buffer);
return COGL_INVALID_HANDLE;
}
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_push_framebuffer (offscreen);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
cogl_ortho (0, width, height, 0, 0, 1.0);
clutter_actor_paint (actor);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
shadow_material = _st_create_shadow_material (shadow_spec, buffer);
cogl_handle_unref (buffer);
}

View File

@ -143,7 +143,7 @@ st_texture_cache_init (StTextureCache *self)
g_free, cogl_handle_unref);
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
self->priv->thumbnails = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
self->priv->thumbnails = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
}
static void
@ -777,6 +777,7 @@ typedef struct {
char *key;
char *uri;
gboolean thumbnail;
gboolean enforced_square;
char *mimetype;
GtkRecentInfo *recent_info;
char *checksum;
@ -788,15 +789,47 @@ typedef struct {
} AsyncTextureLoadData;
static CoglHandle
pixbuf_to_cogl_handle (GdkPixbuf *pixbuf)
pixbuf_to_cogl_handle (GdkPixbuf *pixbuf,
gboolean add_padding)
{
return cogl_texture_new_from_data (gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf),
COGL_TEXTURE_NONE,
gdk_pixbuf_get_has_alpha (pixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
gdk_pixbuf_get_rowstride (pixbuf),
gdk_pixbuf_get_pixels (pixbuf));
CoglHandle texture, offscreen;
CoglColor clear_color;
int width, height;
guint size;
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
size = MAX (width, height);
if (!add_padding || width == height)
return cogl_texture_new_from_data (width,
height,
COGL_TEXTURE_NONE,
gdk_pixbuf_get_has_alpha (pixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
gdk_pixbuf_get_rowstride (pixbuf),
gdk_pixbuf_get_pixels (pixbuf));
texture = cogl_texture_new_with_size (size, size,
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY);
offscreen = cogl_offscreen_new_to_texture (texture);
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_push_framebuffer (offscreen);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
cogl_texture_set_region (texture,
0, 0,
(size - width) / 2, (size - height) / 2,
width, height,
width, height,
gdk_pixbuf_get_has_alpha (pixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
gdk_pixbuf_get_rowstride (pixbuf),
gdk_pixbuf_get_pixels (pixbuf));
return texture;
}
static cairo_surface_t *
@ -882,7 +915,7 @@ on_pixbuf_loaded (GObject *source,
if (pixbuf == NULL)
goto out;
texdata = pixbuf_to_cogl_handle (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, data->enforced_square);
g_object_unref (pixbuf);
@ -956,7 +989,7 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind,
if (pixbuf != NULL)
{
texdata = pixbuf_to_cogl_handle (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
g_object_unref (pixbuf);
clutter_texture_set_cogl_texture (bind->texture, texdata);
@ -1183,6 +1216,7 @@ load_gicon_with_colors (StTextureCache *cache,
request->icon = g_object_ref (icon);
request->icon_info = info;
request->width = request->height = size;
request->enforced_square = TRUE;
load_icon_pixbuf_async (cache, icon, info, size, colors, NULL, on_pixbuf_loaded, request);
}
@ -1195,6 +1229,8 @@ load_gicon_with_colors (StTextureCache *cache,
g_slist_free (request->textures);
g_free (request);
g_hash_table_remove (cache->priv->outstanding_requests, key);
g_object_unref (texture);
texture = NULL;
}
g_free (key);
@ -1216,7 +1252,7 @@ load_gicon_with_colors (StTextureCache *cache,
* This will load @icon as a full-color icon; if you want a symbolic
* icon, you must use st_texture_cache_load_icon_name().
*
* Return Value: (transfer none): A new #ClutterActor for the icon
* Return Value: (transfer none): A new #ClutterActor for the icon, or %NULL if not found
*/
ClutterActor *
st_texture_cache_load_gicon (StTextureCache *cache,
@ -1245,7 +1281,7 @@ load_from_pixbuf (GdkPixbuf *pixbuf)
clutter_actor_set_size (CLUTTER_ACTOR (texture), width, height);
texdata = pixbuf_to_cogl_handle (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
set_texture_cogl_texture (texture, texdata);
@ -1461,10 +1497,27 @@ st_texture_cache_load_icon_name (StTextureCache *cache,
switch (icon_type)
{
case ST_ICON_APPLICATION:
themed = g_themed_icon_new (name);
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
if (texture == NULL)
{
themed = g_themed_icon_new ("application-x-executable");
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
}
return CLUTTER_ACTOR (texture);
break;
case ST_ICON_DOCUMENT:
themed = g_themed_icon_new (name);
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
if (texture == NULL)
{
themed = g_themed_icon_new ("x-office-document");
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
}
return CLUTTER_ACTOR (texture);
break;
@ -1482,6 +1535,12 @@ st_texture_cache_load_icon_name (StTextureCache *cache,
themed = g_themed_icon_new_with_default_fallbacks (name);
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
if (texture == NULL)
{
themed = g_themed_icon_new ("image-missing");
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
}
return CLUTTER_ACTOR (texture);
break;
@ -1549,7 +1608,7 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache,
if (!pixbuf)
goto out;
texdata = pixbuf_to_cogl_handle (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
g_object_unref (pixbuf);
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
@ -1800,7 +1859,7 @@ st_texture_cache_load_from_data (StTextureCache *cache,
return NULL;
}
texdata = pixbuf_to_cogl_handle (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, TRUE);
g_object_unref (pixbuf);
set_texture_cogl_texture (texture, texdata);
@ -1924,6 +1983,7 @@ st_texture_cache_load_thumbnail (StTextureCache *cache,
data->thumbnail = TRUE;
data->width = size;
data->height = size;
data->enforced_square = TRUE;
data->textures = g_slist_prepend (data->textures, g_object_ref (texture));
load_thumbnail_async (cache, uri, mimetype, size, NULL, on_pixbuf_loaded, data);
}
@ -2000,6 +2060,7 @@ st_texture_cache_load_recent_thumbnail (StTextureCache *cache,
data->recent_info = gtk_recent_info_ref (info);
data->width = size;
data->height = size;
data->enforced_square = TRUE;
data->textures = g_slist_prepend (data->textures, g_object_ref (texture));
load_recent_thumbnail_async (cache, info, size, NULL, on_pixbuf_loaded, data);
}

View File

@ -2518,6 +2518,15 @@ st_theme_node_get_border_image (StThemeNode *node)
char *filename;
/* Support border-image: none; to suppress a previously specified border image */
if (term_is_none (term))
{
if (term->next == NULL)
return NULL;
else
goto next_property;
}
/* First term must be the URL to the image */
if (term->type != TERM_URI)
goto next_property;

View File

@ -31,6 +31,7 @@
#include "config.h"
#endif
#include <math.h>
#include <stdlib.h>
#include <string.h>
@ -59,9 +60,6 @@ struct _StTooltipPrivate
{
StLabel *label;
gfloat arrow_offset;
gboolean actor_below;
ClutterGeometry *tip_area;
};
@ -73,6 +71,10 @@ static void st_tooltip_show (ClutterActor *self);
static void st_tooltip_show_all (ClutterActor *self);
static void st_tooltip_hide_all (ClutterActor *self);
static void st_tooltip_constrain (StTooltip *tooltip,
const ClutterGeometry *geometry,
ClutterGeometry *adjusted_geometry);
static void
st_tooltip_set_property (GObject *gobject,
guint prop_id,
@ -208,26 +210,6 @@ st_tooltip_paint (ClutterActor *self)
clutter_actor_paint (CLUTTER_ACTOR (priv->label));
}
static void
st_tooltip_map (ClutterActor *self)
{
StTooltipPrivate *priv = ST_TOOLTIP (self)->priv;
CLUTTER_ACTOR_CLASS (st_tooltip_parent_class)->map (self);
clutter_actor_map (CLUTTER_ACTOR (priv->label));
}
static void
st_tooltip_unmap (ClutterActor *self)
{
StTooltipPrivate *priv = ST_TOOLTIP (self)->priv;
CLUTTER_ACTOR_CLASS (st_tooltip_parent_class)->unmap (self);
clutter_actor_unmap (CLUTTER_ACTOR (priv->label));
}
static void
st_tooltip_dispose (GObject *self)
{
@ -259,8 +241,6 @@ st_tooltip_class_init (StTooltipClass *klass)
actor_class->get_preferred_height = st_tooltip_get_preferred_height;
actor_class->allocate = st_tooltip_allocate;
actor_class->paint = st_tooltip_paint;
actor_class->map = st_tooltip_map;
actor_class->unmap = st_tooltip_unmap;
actor_class->show = st_tooltip_show;
actor_class->show_all = st_tooltip_show_all;
actor_class->hide_all = st_tooltip_hide_all;
@ -301,17 +281,14 @@ st_tooltip_update_position (StTooltip *tooltip)
{
StTooltipPrivate *priv = tooltip->priv;
ClutterGeometry *tip_area = tooltip->priv->tip_area;
ClutterGeometry geometry;
ClutterGeometry adjusted_geometry;
gfloat tooltip_w, tooltip_h, tooltip_x, tooltip_y;
gfloat stage_w, stage_h;
ClutterActor *stage;
/* ensure the tooltip with is not fixed size */
clutter_actor_set_size ((ClutterActor*) tooltip, -1, -1);
/* if no area set, just position ourselves top left */
if (!priv->tip_area)
{
clutter_actor_set_position ((ClutterActor*) tooltip, 0, 0);
clutter_actor_set_anchor_point ((ClutterActor*) tooltip, 0, 0);
return;
}
@ -326,47 +303,22 @@ st_tooltip_update_position (StTooltip *tooltip)
tooltip_x = (int)(tip_area->x + (tip_area->width / 2) - (tooltip_w / 2));
tooltip_y = (int)(tip_area->y + tip_area->height);
stage = clutter_actor_get_stage ((ClutterActor *) tooltip);
if (!stage)
{
return;
}
clutter_actor_get_size (stage, &stage_w, &stage_h);
geometry.x = tooltip_x;
geometry.y = tooltip_y;
geometry.width = ceil (tooltip_w);
geometry.height = ceil (tooltip_h);
/* make sure the tooltip is not off screen vertically */
if (tooltip_w > stage_w)
{
tooltip_x = 0;
clutter_actor_set_width ((ClutterActor*) tooltip, stage_w);
}
else if (tooltip_x < 0)
{
tooltip_x = 0;
}
else if (tooltip_x + tooltip_w > stage_w)
{
tooltip_x = (int)(stage_w) - tooltip_w;
}
st_tooltip_constrain (tooltip, &geometry, &adjusted_geometry);
/* make sure the tooltip is not off screen horizontally */
if (tooltip_y + tooltip_h > stage_h)
{
priv->actor_below = TRUE;
tooltip_x = adjusted_geometry.x;
tooltip_y = adjusted_geometry.y;
/* re-query size as may have changed */
clutter_actor_get_preferred_height ((ClutterActor*) tooltip,
-1, NULL, &tooltip_h);
tooltip_y = tip_area->y - tooltip_h;
}
else
{
priv->actor_below = FALSE;
}
/* calculate the arrow offset */
priv->arrow_offset = tip_area->x + tip_area->width / 2 - tooltip_x;
clutter_actor_set_position ((ClutterActor*) tooltip, tooltip_x, tooltip_y);
/* Since we are updating the position out of st_widget_allocate(), we can't
* call clutter_actor_set_position(), since that would trigger another
* allocation cycle. Instead, we adjust the anchor position which moves
* the tooltip actor on the screen without changing its allocation
*/
clutter_actor_set_anchor_point ((ClutterActor*) tooltip, -tooltip_x, -tooltip_y);
}
/**
@ -411,32 +363,6 @@ static void
st_tooltip_show (ClutterActor *self)
{
StTooltip *tooltip = ST_TOOLTIP (self);
ClutterActor *parent;
ClutterActor *stage;
parent = clutter_actor_get_parent (self);
stage = clutter_actor_get_stage (self);
if (!stage)
{
g_warning ("StTooltip is not on any stage.");
return;
}
/* make sure we're parented on the stage */
if (G_UNLIKELY (parent != stage))
{
g_object_ref (self);
clutter_actor_unparent (self);
clutter_actor_set_parent (self, stage);
g_object_unref (self);
parent = stage;
}
/* raise the tooltip to the top */
clutter_container_raise_child (CLUTTER_CONTAINER (stage),
CLUTTER_ACTOR (tooltip),
NULL);
st_tooltip_update_position (tooltip);
@ -477,7 +403,8 @@ st_tooltip_set_tip_area (StTooltip *tooltip,
g_boxed_free (CLUTTER_TYPE_GEOMETRY, tooltip->priv->tip_area);
tooltip->priv->tip_area = g_boxed_copy (CLUTTER_TYPE_GEOMETRY, area);
st_tooltip_update_position (tooltip);
if (clutter_actor_get_stage (CLUTTER_ACTOR (tooltip)))
st_tooltip_update_position (tooltip);
}
/**
@ -496,3 +423,102 @@ st_tooltip_get_tip_area (StTooltip *tooltip)
return tooltip->priv->tip_area;
}
typedef struct {
StTooltipConstrainFunc func;
gpointer data;
GDestroyNotify notify;
} ConstrainFuncClosure;
static void
constrain_func_closure_free (gpointer data)
{
ConstrainFuncClosure *closure = data;
if (closure->notify)
closure->notify (closure->data);
g_slice_free (ConstrainFuncClosure, data);
}
static GQuark
st_tooltip_constrain_func_quark (void)
{
static GQuark value = 0;
if (G_UNLIKELY (value == 0))
value = g_quark_from_static_string ("st-tooltip-constrain-func");
return value;
}
/**
* st_tooltip_set_constrain_func:
* @stage: a #ClutterStage
* @func: (allow-none): function to be called to constrain tooltip position
* @data: (allow-none): user data to pass to @func
* @notify: (allow-none): function to be called when @data is no longer needed
*
* Sets a callback function that will be used to constrain the position
* of tooltips within @stage. This can be used, for example, if the stage
* spans multiple monitors and tooltips should be positioned not to cross
* monitors.
*/
void
st_tooltip_set_constrain_func (ClutterStage *stage,
StTooltipConstrainFunc func,
gpointer data,
GDestroyNotify notify)
{
ConstrainFuncClosure *closure;
g_return_if_fail (CLUTTER_IS_STAGE (stage));
if (func)
{
closure = g_slice_new (ConstrainFuncClosure);
closure->func = func;
closure->data = data;
closure->notify = notify;
}
else
closure = NULL;
g_object_set_qdata_full (G_OBJECT (stage), st_tooltip_constrain_func_quark (),
closure, constrain_func_closure_free);
}
static void
st_tooltip_constrain (StTooltip *tooltip,
const ClutterGeometry *geometry,
ClutterGeometry *adjusted_geometry)
{
ConstrainFuncClosure *closure;
ClutterActor *stage = clutter_actor_get_stage (CLUTTER_ACTOR (tooltip));
*adjusted_geometry = *geometry;
if (stage == NULL)
return;
closure = g_object_get_qdata (G_OBJECT (stage), st_tooltip_constrain_func_quark ());
if (closure)
{
closure->func (tooltip, geometry, adjusted_geometry, closure->data);
}
else
{
ClutterActor *parent;
gfloat parent_w, parent_h;
parent = clutter_actor_get_parent ((ClutterActor *) tooltip);
clutter_actor_get_size (parent, &parent_w, &parent_h);
/* make sure the tooltip is not off parent horizontally */
if (adjusted_geometry->x < 0)
adjusted_geometry->x = 0;
else if (adjusted_geometry->x + adjusted_geometry->width > parent_w)
adjusted_geometry->x = (int)(parent_w) - adjusted_geometry->width;
/* make sure the tooltip is not off parent vertically */
if (adjusted_geometry->y + adjusted_geometry->height > parent_h)
adjusted_geometry->y = parent_h - adjusted_geometry->height;
}
}

View File

@ -68,6 +68,24 @@ void st_tooltip_set_tip_area (StTooltip *tooltip,
const ClutterGeometry *area);
const ClutterGeometry* st_tooltip_get_tip_area (StTooltip *tooltip);
/**
* StTooltipConstrainFunc:
* @tooltip: the #StTooltip that is being positioned
* @geometry: size and position of the tooltip without any constraints
* @adjusted_geometry: (out): new position of the tooltip.
* The width and height fields will be ignored.
* @data: (closure): user data passed to st_tooltip_set_constrain_func()
*/
typedef void (*StTooltipConstrainFunc) (StTooltip *tooltip,
const ClutterGeometry *geometry,
ClutterGeometry *adjusted_geometry,
gpointer data);
void st_tooltip_set_constrain_func (ClutterStage *stage,
StTooltipConstrainFunc func,
gpointer data,
GDestroyNotify notify);
G_END_DECLS
#endif /* __ST_TOOLTIP_H__ */

Some files were not shown because too many files have changed in this diff Show More