Compare commits

..

170 Commits

Author SHA1 Message Date
adc811ff8f Bump version to 3.23.91
Update NEWS.
2017-03-01 15:29:03 +01:00
5117ccdeef Update Kazakh translation 2017-03-01 11:05:13 +00:00
19816523c7 mpris: Make forward/backward insensitive when unavailable
Media notifications currently always show the forward and backward
buttons as clickable, regardless of whether the corresponding action
is available or not. Media players usually address this by rendering
controls insensitive in this case, so do the same here.

https://bugzilla.gnome.org/show_bug.cgi?id=773884
2017-03-01 10:55:56 +01:00
846e3f8243 calendar: Add calendar icon to events
Without the boxy background, event messages look a bit plain and
unaligned with other messages. Adding an icon addresses this,
however as repeating the same icon over and over again in case of
many events would be rather noisy, only show it for the top event
as in the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:55:46 +01:00
d3c050b88d Refine notification style
Update the notification style according to the latest mockups:
 - make notification icons smaller and prefer symbolic variants
 - remove background box when not hovered/focused
 - increase spacing between elements
 - use normal text sizes

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:55:42 +01:00
f3d1c78c7d calendar: Use relative times for notification timestamps
For notifications in the message list, it is usually less relevant
when exactly it occurred, but how long ago. So rather than showing
the exact time and expecting the user to figuring out the timespan
themselves, change the format to something human readable.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:55:21 +01:00
c4f2bb5fe0 messageList: Keep secondary actor when showing close button
Currently the secondary actor (if set) and the close button are
exclusive, that is the latter replaces the former on hover. As
the swapping feels rather busy and there's no real reason both
cannot be shown at the same time, keep the secondary actor always
visible.
A welcome side effect is that it no longer needs to be placed at
the end, so we can move the notification timestamp right next to
the corresponding title.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:55:21 +01:00
fec511c786 calendar: Only show section title for other days
The section titles usually don't provide a lot of value - messages
themselves are usually pretty unambiguous about their type, and
having a hidden shortcut to some settings panel or application isn't
essential either - except when showing the selected date when browsing
other days, as it adds context to the listed events. Based on that,
remove the section title as a general MessageListSection feature and
move it into the EventsSection, where we only show it when it is useful.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:55:09 +01:00
8a6157c7c1 messageList: Remove section clear button
With the new "Clear All" button in the message list as a replacement,
we can remove the individual clear buttons from the sections.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:54:32 +01:00
d3bb7903e2 calendar: Add "Clear All" button to message list
We will eventually remove section titles from the message list to
reduce visual noise and give the actual information provided by
the messages more space. So in order to not lose the ability to
mass-dismiss messages, the latest mockups spot a "Clear All" button
at the bottom - implement that.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:53:52 +01:00
239b67eff6 messageList: Make canClear public and notify on changes
The latest mockups contain a button to clear all sections at once.
As some elements cannot be cleared, we need to provide that information
to avoid offering an action that has no effect.

https://bugzilla.gnome.org/show_bug.cgi?id=775763
2017-03-01 10:52:43 +01:00
0e0caee6ba weather: Skip loading indication when updating frequently
Weather conditions - at least as far as online services are
concerned - don't usually change in a couple of minutes.
So when updating shortly after a previous update, assume
the current conditions are still valid and trigger an
update without showing a loading indication. This should
help a bit with not getting stuck permanently in loading
state when on a shitty network.

https://bugzilla.gnome.org/show_bug.cgi?id=754031
2017-03-01 10:52:43 +01:00
62606c68b9 dateMenu: Add Weather section
Similar to the Clocks integration we've had in the date+time drop-down for
a while, the designs have called for a similar section that integrates
GNOME weather as well. Use the WeatherClient added in the previous commit
to implement that section and add it to the popover.

https://bugzilla.gnome.org/show_bug.cgi?id=754031
2017-03-01 10:52:13 +01:00
da831e894c weather: Add WeatherClient
In preparation of integrating GNOME Weather, add a helper class that
retrieves weather information according to Weather's configuration
if the application is installed.

https://bugzilla.gnome.org/show_bug.cgi?id=754031
2017-02-28 16:12:46 +01:00
4b166dcc79 dateMenu: Do a better job at size freezing while browsing dates
In order to avoid distracting popup size changes while browsing
other dates, we freeze the size to the last size request. However
in case of more complex size negotiations - wrapping or ellipsizing
labels, scrollable elements etc. - there's a chance of stray calls
to get_preferred_width/height() that are not used for the actual
allocation. If such a call happens to be the last size request
before the layout is frozen, the saved size will be wrong. To fix
this, save the allocated size rather than the requested one.

https://bugzilla.gnome.org/show_bug.cgi?id=754031
2017-02-27 21:23:48 +01:00
796fdca5c5 dateMenu: Enforce calendar column width
We want the width of the calendar column to be determined by the
calendar, other elements should adjust their allocation accordingly.
However neither ellipsization nor wrapping will kick in unless the
parent's width is restricted, so use a small custom layout manager
that enforces the desired behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=754031
2017-02-27 21:23:47 +01:00
c6f22826cf telepathyClient: Update notification time from message
As the telepathy integration picks up existing channels on startup,
ChatNotifications are another case where the real time the message
was received may be before the time it is picked up by the shell.
While this is less of an annoyance than restored GNotifications, as
it generally only affects restarts from the run dialog, it's an
easy fix now ...

https://bugzilla.gnome.org/show_bug.cgi?id=775799
2017-02-27 20:04:09 +01:00
4e491b6f75 notificationDaemon: Include timestamp in serialized notifications
GNotifications are persistent until dismissed or withdrawn, including
across restarts. As we show the time a notification was received in the
calendar, we need to include that information when serializing the
notification in order to be correct.

https://bugzilla.gnome.org/show_bug.cgi?id=775799
2017-02-27 20:04:09 +01:00
0569bb18f5 messageTray: Add optional datetime parameter to notifications
Since the last notification redesign, we've been showing the time a
notification was received in the calendar drop-down. However as the
time is in fact added by the NotificationSection, it is actually the
time a notification was added to the list. Usually that difference is
not significant, except when previously received notifications are
restored on startup.
In order to be able to address those cases, we need a time that is
associated with the notification itself, so add a datetime property
that defaults to the current time, but may be set from an optional
parameter as well.

https://bugzilla.gnome.org/show_bug.cgi?id=775799
2017-02-27 20:04:08 +01:00
0353ebde5d dateMenu: Use AppSettingsMonitor for world clocks
When gnome-clocks is installed, there is currently a race between the
GSettings schema being added to the database and the world clocks
session trying to use it. The prize if we win that race is an abort
in GIO, so use the newly added AppSettingsMonitor skip the race
altogether.

https://bugzilla.gnome.org/show_bug.cgi?id=766410
2017-02-27 20:02:16 +01:00
b5130c5943 util: Add AppSettingsMonitor
When integrating with optional components like Clocks, it is not safe
to access their GSettings right after the application became visible
to the AppSystem:
Installation is usually not atomic, so the .desktop file may appear
before the settings schema, in which case Gio will abort due to an
"invalid" schema ID.
To address this, add a small helper class that wraps the settings
access in a safe way.

https://bugzilla.gnome.org/show_bug.cgi?id=766410
2017-02-27 20:02:16 +01:00
d54db8ffb3 Update Chinese (Taiwan) translation 2017-02-27 00:09:50 +00:00
0ff5fc8dbb viewSelector: Fix another case of mixing GJS and GObject signals
This is the same issue fixed in commit e08f2a4a04 for several other
classes, but this one somehow slipped through ...
2017-02-26 15:01:24 +01:00
32ec9959ef Update Hungarian translation 2017-02-26 11:57:03 +00:00
838721fc31 Updated Serbian translation 2017-02-26 10:05:55 +01:00
63e9c98248 Updated Serbian translation 2017-02-26 08:50:16 +01:00
6df30cbb64 Updated Galician translations 2017-02-26 02:24:50 +01:00
c102a89962 Update Brazilian Portuguese translation 2017-02-25 11:50:10 +00:00
ff5e39ab79 Update Friulian translation 2017-02-23 23:40:42 +00:00
607b2efcce network: Don't start portal helper under GDM
https://bugzilla.gnome.org/show_bug.cgi?id=769546
2017-02-22 16:21:40 +01:00
27d010110a Update Italian translation 2017-02-21 18:10:58 +00:00
e13602b896 Update Indonesian translation 2017-02-21 14:51:26 +00:00
6777670f0d Updated Ukrainian translation 2017-02-20 13:49:49 +02:00
b05739fa7e Update Polish translation 2017-02-19 21:48:47 +01:00
38854fb06a Updated Norwegian bokmål translation. 2017-02-19 16:34:42 +01:00
b091cfea80 Update Finnish translation 2017-02-18 18:41:55 +00:00
a8955ffe05 Updated Lithuanian translation 2017-02-18 17:35:15 +02:00
475fd72ae1 Update Slovak translation 2017-02-18 08:54:07 +00:00
31675d1812 Update Spanish translation 2017-02-17 10:46:15 +00:00
cbb0c1c091 Update Basque language 2017-02-16 22:00:08 +01:00
c1234f7793 Update Basque language 2017-02-16 16:58:12 +01:00
1e6c44cb6b autogen: Drop usage of gnome-common 2017-02-16 16:45:44 +01:00
2202b9330f Updated Danish translation 2017-02-16 14:24:52 +01:00
0b332fc019 Update Catalan translation 2017-02-16 06:34:51 +01:00
4f4163eb05 Update Kazakh translation 2017-02-16 04:06:43 +00:00
649d360289 Use Unicode in translatable strings
See https://developer.gnome.org/hig/stable/typography.html

https://bugzilla.gnome.org/show_bug.cgi?id=772210
2017-02-16 02:07:14 +01:00
9bcdd9c274 Update POTFILES.in 2017-02-16 02:02:40 +01:00
fbc60199bc Bump version to 3.23.90
Update NEWS.
2017-02-16 01:27:39 +01:00
785c813771 status: Add nightLight indicator
The display configuration now exposes a setting to automatically
shift the display color at nighttime. As there are cases where
disabling the filtering temporarily is useful, it makes sense to
expose the feature in the system menu for quick access.

https://bugzilla.gnome.org/show_bug.cgi?id=741224
2017-02-15 23:20:14 +01:00
75f8279a19 extensionPrefs: Tweak UI
Update according to the latest mockups:
 - don't use a border around the list as specified
   by the latest HIG version
 - use more generous spacing between controls
 - allow extension descriptions to take up two lines
 - drop GNOME branding from the window title
 - make the app name consistent with the window title

https://bugzilla.gnome.org/show_bug.cgi?id=778672
2017-02-15 23:20:14 +01:00
5d07832e96 extensionPrefs: Expose kill-switch
While the extension prefs tool is not meant as the primary way for
users to configure extensions - that will be Tweak Tool - it still
doesn't hurt to expose the extension kill switch to easily turn
extensions back on after a session crash.

https://bugzilla.gnome.org/show_bug.cgi?id=778664
2017-02-15 23:20:14 +01:00
7395aaf9b4 extensionSystem: Add kill-switch setting to disable user extensions
When gnome-shell fails to start on login, gnome-session tries to
re-launch it again with all extensions disabled. This is currently
implemented by clearing the list of enabled extensions, which means
the user needs to re-enable their extensions manually again.
To make this process less annoying, add a single 'kill-switch' setting
gnome-session can use without interfering with the user setting.

https://bugzilla.gnome.org/show_bug.cgi?id=778664
2017-02-15 23:20:14 +01:00
2c070d38fb system: Switch between alternatives on long-press
On systems that support both shutdown and suspend, the latter operation
is currently only accessible via pressing the Alt key. As using the
keyboard may be inconvenient or simply not possible (e.g. on touch),
allow switching between alternatives via long-press as well.

https://bugzilla.gnome.org/show_bug.cgi?id=721173
2017-02-15 23:20:14 +01:00
2c5bc4a1a9 appFavorites: Only use renamed ID if it can be resolved
We currently assume that if a .desktop file has been renamed (that
is, it is in our rename list), the updated ID will be used. That
assumption was mostly sound when the list contained only GNOME apps
following the same release cycle as gnome-shell, but as applications
with less ties to the GNOME schedule adopt the reverse DNS notation,
it becomes more likely for apps to appear in the list before actually
being updated on the system. Handle this case by only renaming IDs
for which the replacement can be resolved to an existing application.

https://bugzilla.gnome.org/show_bug.cgi?id=745626
2017-02-15 23:20:14 +01:00
fa82af251f location: Initialize permissions
The permissions hash is initialized after consulting the permission
store, however the lookup is skipped for requests that cannot be
resolved to an application, resulting in an error when accessing
the uninitialized hash for saving. Just make sure that the property
is always initialized to avoid that error.

https://bugzilla.gnome.org/show_bug.cgi?id=778661
2017-02-15 23:20:14 +01:00
e08f2a4a04 Don't mix GJS and GObject signal systems
GJS implements a basic signal system that allows monkey-patching
JS objects with signal methods resembling the GObject ones. However
it's clearly not a good idea to replace the actual GObject methods,
so use the proper GObject facilities when inheriting from GObject.

https://bugzilla.gnome.org/show_bug.cgi?id=778660
2017-02-15 23:20:14 +01:00
30e17036e8 network: Ensure the connection list is sorted after rename
Items were inserted correctly but the synchronisation was lost if the
name of a connection was changed. Simply making sure the position is
correct after a connection is updated fixes the issue.

Reported-by: Oliver Haessler <ohaessle@redhat.com>

https://bugzilla.gnome.org/show_bug.cgi?id=778686
2017-02-15 22:49:07 +01:00
c75785efff ui: Allow moving menu items to a certain position
This function is a helper to simplify keeping menu items ordered when
their order is updated on the fly (e.g. network connections being
renamed).

https://bugzilla.gnome.org/show_bug.cgi?id=778686
2017-02-15 22:49:04 +01:00
3bf89055e3 extensionDownloader: return tuple of string on success
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=777544
2017-02-15 23:15:20 +04:00
a76869216a portalHelper: Don't fail to load because of TLS errors
Accept self-signed and expired certificates as if we errored out, we
couldn't access the network at all. Consider this insecure though.

https://bugzilla.gnome.org/show_bug.cgi?id=778253
2017-02-15 14:30:07 +01:00
a9fd8bfa5e Updated Ukrainian translation 2017-02-15 15:13:51 +02:00
02a7b0dcfd tests: require given version of Gtk 2017-02-15 12:04:53 +00:00
dd8c06f2c5 tests: load required version of Clutter/Gtk early 2017-02-15 12:04:53 +00:00
c63b7f0c3f Updated Spanish translation 2017-02-14 20:33:27 +01:00
a46ea3f8a0 Use the versioned libmutter*.so versions
Mutter now provides versioned libraries and pkg-config files, meaning
an application using libmutter and friends need to depend on a specific
version of the API.

https://bugzilla.gnome.org/show_bug.cgi?id=777317
2017-02-14 11:23:09 +08:00
93071d9167 loginDialog: don't allow type ahead at the login screen
It's weird if after you select a username from the user list, there's
a password already filled in.

This commit disables at that feature for the login screen
(but keeps it in tact for the unlock screen)

https://bugzilla.gnome.org/show_bug.cgi?id=766139
2017-02-14 03:05:33 +01:00
2b2e9d4098 Updated Czech translation 2017-02-13 23:26:32 +01:00
0429aad8bf Updated Norwegian bokmål translation. 2017-02-13 20:43:07 +01:00
2e74920a64 Update Indonesian translation 2017-02-13 15:05:26 +00:00
b5bf82b5db portalHelper: Fix signal arguments
How did this work in tests?!

https://bugzilla.gnome.org/show_bug.cgi?id=778552
2017-02-13 11:54:35 +01:00
98cdd44543 portalHelper: Fix runtime warning
When there is no URI, then the title should be empty, not null:
Gjs-WARNING **: JS ERROR: Error: Argument 'str' (type utf8) may not be null

https://bugzilla.gnome.org/show_bug.cgi?id=778552
2017-02-13 11:54:35 +01:00
304b68eff9 portalHelper: Add security icon to titlebar
This adds a security icon (either secure or insecure) to the portal
helper's title bar. As soon as a part or all of the page and its content
is served insecurely, the icon shown will be a broken padlock.

https://bugzilla.gnome.org/show_bug.cgi?id=749197
2017-02-13 10:26:56 +01:00
18074951b9 Updated Czech translation 2017-02-11 15:14:44 +01:00
0008ef70e1 windowManager: Use g-s-d wacom dbus helpers to update pad leds/oleds
This keeps feedback on the device itself in sync with the overall pad
state, a feature we had previously through g-s-d.

https://bugzilla.gnome.org/show_bug.cgi?id=776543
2017-02-10 23:55:04 +01:00
c3cdbd0dac windowManager: Handle MetaDisplay::show-osd signal
Propagate as-is to the OsdWindowManager.

https://bugzilla.gnome.org/show_bug.cgi?id=771098
2017-02-10 23:55:04 +01:00
aefd61c3db js: Avoid double declarations with let
The following code is a syntax error in ES6:

    let a = 'something';
    let a = 'other thing';

Previously GJS would silently accept this code, but in the next release the
SpiderMonkey JS engine will be more ES6-compliant.

https://bugzilla.gnome.org/show_bug.cgi?id=778425
2017-02-10 13:35:50 -08:00
f7752ac699 ibusManager: Use const correctly
Per ES6, a variable declared const should only be valid inside its lexical
scope. Previously, GJS would accept this code, but that will change in the
SpiderMonkey JS engine in the next release of GJS.

https://bugzilla.gnome.org/show_bug.cgi?id=778425
2017-02-10 13:19:08 -08:00
d017e6749c main: Destroy GjsContext before exit
Here are a few places where I missed it before: the GjsContext must be
unrefed before exiting, or it will crash on exit.

https://bugzilla.gnome.org/show_bug.cgi?id=778425
2017-02-10 13:19:01 -08:00
ddfdfaed78 Use /proc/self/cmdline on Solaris as well in shell_global_reexec_self()
Solaris 11.3.5 and later have a Linux-compatible implementation of
/proc/self/cmdline, so the code to use it can be enabled in gnome-shell
on Solaris - if used on an older OS, it simply fails to open the file
and returns without doing anything, just as the code did before enabling
this.

https://bugzilla.gnome.org/show_bug.cgi?id=776199

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2017-02-10 11:22:30 +01:00
a870a4d6de widget: Only include visible actors in focus chain
It isn't useful to move the keyboard focus to a hidden actor, so
only include visible actors in the focus chain - this is in fact
the documented behavior of st_widget_get_focus_chain(), so having
the default implementation return all children has always been
unexpected.

https://bugzilla.gnome.org/show_bug.cgi?id=778158
2017-02-08 14:50:36 +01:00
e6e786a19c st-theme-node: Fix lookup of time values
We have a time when the content type is seconds *or* milliseconds,
not seconds *and* milliseconds. Whoops ...

https://bugzilla.gnome.org/show_bug.cgi?id=778145
2017-02-06 14:30:18 +01:00
01975b61f5 AppFavorites: order alphabetically by key 2017-02-06 09:40:43 +02:00
3c61bef92d Update zh_CN translation 2017-02-05 17:58:50 +08:00
050f2090fb Update Finnish translation 2017-02-04 18:30:23 +00:00
7746f1a5c4 Make all our window clones use the MetaWindowActor as source
Using a MetaWindowActor's shaped texture as the source for window
clones means that if there are further MetaSurfaceActor children
(e.g. a wayland client using sub-surfaces) they don't get cloned.

This obviously wasn't an issue until wayland clients introduced the
possibility of having multiple MetaSurfaceActors under a
MetaWindowActor but there's no fundamental reason we can't clone the
toplevel actor.

WorkspaceThumbnail.WindowClone is the one class that was already using
the MetaWindowActor instead of the texture although it seems to have
been an unintended change in commit
8b99617513.

https://bugzilla.gnome.org/show_bug.cgi?id=756715
2017-02-02 14:28:00 +01:00
97a1cdbe7a Update Belarusian translation 2017-02-02 12:41:21 +00:00
b1dcea7cf1 background: Disconnect from 'prepare-for-sleep' signal
This signal connection was keeping Background instances from being
garbage collected.

https://bugzilla.gnome.org/show_bug.cgi?id=777934
2017-01-31 13:53:26 +01:00
9f6f48025d background: Remove a couple of unused variables
Nothing uses these.

https://bugzilla.gnome.org/show_bug.cgi?id=777934
2017-01-31 13:48:11 +01:00
5e66ac2674 Update Polish translation 2017-01-30 03:02:45 +01:00
93c66b3537 Fix a translator comment
They need to be exactly one line above a string to show up in .po files.
2017-01-28 02:01:14 +01:00
e0d7d28c20 windowManager: Avoid fullscreen animation if the window has no texture
There is hardly anything to animate, so just avoid the animation in this
case.

https://bugzilla.gnome.org/show_bug.cgi?id=777784
2017-01-26 17:51:39 +01:00
a82c564a73 windowManager: Avoid reentrancy on the ::size-changed handler
We have no guarantees on the number of ::size-changed signals that we may
receive, so the _sizeChangedWindow handler may run multiple times, which
leads to multiple calls to meta_plugin_size_change_completed(). So double
check the actor is not already being animated in the _sizeChangedWindow
handler to avoid reentrancy.

https://bugzilla.gnome.org/show_bug.cgi?id=777784
2017-01-26 17:51:39 +01:00
6a40e72329 Update Kazakh translation 2017-01-25 09:02:11 +00:00
3737a9950c Update Slovak translation 2017-01-24 19:35:56 +00:00
7784bc0905 build: Remove C++ check
As it's not used any more since commit
ed99bef458.

https://bugzilla.gnome.org/show_bug.cgi?id=762444
2017-01-24 14:17:36 +01:00
49607e1313 portalHelper: Don't change the main window title
The title of the window should not be in control of a potentially
hostile hotspot provider, so only set the subtitle to be that of the
page, the main title will stay the same.

The subtitle will also be set to a URI, so that the hotspot cannot be
used to control the title shown in our UI.

Helps https://bugzilla.gnome.org/show_bug.cgi?id=749197
2017-01-24 13:36:09 +01:00
a81f18592a portalHelper: Set a minimum window size
Even though the window is maximised when created, the window is still
resizable. This avoids making the window smaller than usable. If the
screen is smaller than the minimum window size, the maximise should make
it fullscreen and non-resizable.

https://bugzilla.gnome.org/show_bug.cgi?id=735233
2017-01-24 13:36:09 +01:00
2ff988ef37 portalHelper: Use private data/cache directories
https://bugzilla.gnome.org/show_bug.cgi?id=775639
2017-01-24 13:36:09 +01:00
5136369c18 Properly detect changes in .desktop files
This fixes the shell not picking updates to the contents of the underlying
.desktop files for application launchers, or when a .desktop file is
overriden by a user-installed one under ~/.local/share/applications

https://bugzilla.gnome.org/show_bug.cgi?id=773636
2017-01-23 17:25:39 -06:00
7557207b47 Update French translation
(cherry picked from commit 3c6c51125c)
2017-01-22 18:13:16 +00:00
f9d1e2fec0 Update Polish translation 2017-01-21 20:16:24 +01:00
f9a03f212c ibusCandidatePopup: handle mouse scroll event on candidates
When use mouse scroll button on input method candidates,
move the cursor up/down on candidates.

https://bugzilla.gnome.org/show_bug.cgi?id=776032
2017-01-19 15:18:43 +01:00
d200fb1d14 portalHelper: Handle Ctrl+W/Ctrl+Q to close window
https://bugzilla.gnome.org/show_bug.cgi?id=764133
2017-01-19 14:04:34 +01:00
eb844b095a Update Slovak translation 2017-01-15 19:28:34 +00:00
dc638c04a6 Update Catalan translation 2017-01-15 19:51:00 +01:00
b3cbce97ed Update Brazilian Portuguese translation 2017-01-15 13:20:27 +00:00
14a32c128d Fix Icon filename in translations 2017-01-12 18:01:27 +01:00
2e332ffd12 Revert "objectManager: handle proxies coming and going"
This reverts commit 1ef6262139.

https://bugzilla.gnome.org/show_bug.cgi?id=772589
2017-01-09 22:34:40 -05:00
71d9d483f2 Update Slovak translation 2017-01-07 16:03:47 +00:00
1ef6262139 objectManager: handle proxies coming and going
Ever since commit b8e29ae8c7
(I think), start up is littered with this message:

 Gjs-WARNING **: JS ERROR: could not get remote objects for service
 org.gnome.SettingsDaemon.Smartcard path

since gnome-shell is now started before gnome-settings-daemon.

This commit addresses the problem by making the object manager code
not try to autostart its proxy, and instead wait for it to appear.

https://bugzilla.gnome.org/show_bug.cgi?id=772589
2017-01-05 13:11:21 -05:00
da7db509e7 network: Avoid JS error when activating VPN connection
If the call to settings.get_connection_by_path in
ensureActiveConnectionProps returns null, we'll hit a JS error here.
Seems to happen always when activating a VPN connection. Avoid that.

Giovanni says:

"I believe this is papering over an existing bug, but it's possible for
settings.get_connection_by_path() to legitimately return null (if the
connection is owned by a different user and invisible to the current
one), so the fix is correct anyway."

https://bugzilla.gnome.org/show_bug.cgi?id=759793
2016-12-27 12:14:19 -06:00
2a525bd8e8 Updated Spanish translation 2016-12-22 20:15:20 +01:00
51da2bf363 Update Hungarian translation 2016-12-20 15:12:34 +00:00
d2c0ade880 Update Hungarian translation 2016-12-20 15:10:07 +00:00
bcc3eccdab Update Finnish translation 2016-12-16 20:30:27 +00:00
e581e249ad Bump version to 3.23.3
Update NEWS.
2016-12-15 16:10:22 +01:00
c131c44ef6 gtk-embed: Don't try to compare with unrealized window
After having embedded a Gtk window, we start to listen for the
corresponding MetaWindow to know when it has been mapped by the
compositor. If the embedder does not realize the window immediately,
and some other window is created and mapped before the embedder
realizes the window, we would prior to this patch try to dereference
the not created GdkWindow. Fix this by NULL checking the GdkWindow
before dereferencing. We will never miss the needed MetaWindow creation
since it can not have been mapped have it not yet been realized.

https://bugzilla.gnome.org/show_bug.cgi?id=776130
2016-12-15 19:42:48 +08:00
cdd23d9cc7 appFavorites: add Calculator to rename list again
So far it's only the second app to be on the rename list twice, but no
doubt there will soon be more....
2016-12-12 18:48:51 -06:00
dc110db4e0 tests: Destroy GjsContext before exit
This will be required in the upcoming version of GJS.

https://bugzilla.gnome.org/show_bug.cgi?id=775374
2016-12-09 18:50:39 -08:00
678670bf1b appFavorites: add Epiphany to rename list 2016-12-09 12:39:12 -06:00
07fc15a1eb Update Italian translation
(cherry picked from commit 473158db8e)
2016-12-09 10:35:25 +00:00
83005e27da main: Destroy GjsContext before exit
This will be required in the upcoming version of GJS.

The reference count on ShellGlobal is 2 at this point, because JS holds a
reference due to the "window.global = Shell.Global.get()" line in
ui/environment.js. Therefore, destroy the GjsContext first, then unref
the ShellGlobal object.

Cleaning up ShellGlobal was previously only enabled behind a debug
environment variable, but it should be required now.

https://bugzilla.gnome.org/show_bug.cgi?id=775374
2016-12-07 11:34:15 -08:00
56b20ef779 helpers: Destroy GjsContext before exit
This will be required in the upcoming version of GJS.

https://bugzilla.gnome.org/show_bug.cgi?id=775374
2016-12-07 11:34:15 -08:00
04adeec8f5 appFavorites: add Geary in rename list
Signed-off-by: Niels De Graef <nielsdegraef@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=775507
2016-12-07 14:48:46 +01:00
62d640cd9e updated Punjabi Translation 2016-12-05 18:27:32 -06:00
9d7ad6748c Update Chinese (Taiwan) translation 2016-11-28 16:10:44 +00:00
accd24e379 notificationDaemon: Keep source alive when replacing notification
When a GNotification has the same ID as a previous one, it should
be shown as a new notification after withdrawing the old one.
However for this to work, we must not destroy the corresponding
source if withdrawing the old notification lets the notification
count drop to zero, so make sure the source is kept alive until
the replace operation has completed.

https://bugzilla.gnome.org/show_bug.cgi?id=775149
2016-11-28 15:42:23 +01:00
75d797a0ac Update Kazakh translation 2016-11-27 15:40:12 +00:00
e1e321d3a7 NotificationDaemon: create the application proxy asynchronously
Clicking on calendar notifications might block till the DBus request times
out if the application being poked happens to be non-responsive. Perform
this asynchronously so we don't block if that is the case.
2016-11-26 15:00:35 +01:00
f14f238150 Update German translation 2016-11-26 10:56:44 +00:00
ab3200019a Update German translation 2016-11-25 22:24:45 +00:00
28c028f7ac Update Turkish translation 2016-11-24 09:49:54 +00:00
08a159d0d8 Bump version to 3.23.2
Update NEWS.
2016-11-23 22:23:26 +01:00
26aa32c6cc build: Fix file reference 2016-11-23 22:23:26 +01:00
09e6bb5d56 appDisplay: Fix completion handler for empty animations
If an onComplete handler is passed to animate(), it is set to run at
the end of the animation via the icon grid's ::animation-done signal.
Currently the signal is connected after starting the animation, with
the result that the handler doesn't run when the animation completes
immediately (because there are no icons to animate). Fix this by only
starting the animation after connecting the signal.

https://bugzilla.gnome.org/show_bug.cgi?id=774381
2016-11-23 22:11:00 +01:00
e661d904de appDisplay: Use correct view for animation
We currently assume that the current view matches the 'app-picker-view'
setting. While that is usually the case, there is one notable exception:
While there isn't sufficient usage data (yet), we show all applications
instead of an empty frequent view regardless of the setting. We should
animate the actually visible icons in that case, not the (non-existent)
ones from the hidden frequent view.

https://bugzilla.gnome.org/show_bug.cgi?id=774381
2016-11-23 22:11:00 +01:00
407d51e871 Update Russian translation
(cherry picked from commit f395d3892c)
2016-11-23 21:08:42 +00:00
c4a07fad83 portalHelper: Use a constant for the host name and URI
https://bugzilla.gnome.org/show_bug.cgi?id=769940
2016-11-23 21:38:24 +01:00
9ea8fdc1d1 portalHelper: Address intermittent TLS failures
Users are currently experiencing intermittent (and hard to debug) TLS
errors when loading the portal authentication page. This could be
caused by using http://www.gnome.org/ for our connectivity checks
because it redirects to HTTPS.

We can completely remove TLS from the equation by not using HTTPS.
http://nmcheck.gnome.org/ is a good choice because it doesn't redirect
to HTTPS and was created for NetworkManager's connectivity check.

https://bugzilla.gnome.org/show_bug.cgi?id=769940
2016-11-23 21:38:24 +01:00
3d6bf43649 windowManager: Handle fullscreening from zero sized windows
Wayland clients can request their surfaces to be fullscreened before
commiting a buffer which means that we need to handle fullscreen
requests for which the old size is 0x0, preferably without warnings.

Since the mapping animation also runs for these windows, we can simply
bail out and ignore the fullscreen size change.

https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:43:11 +01:00
7bc1d57ad7 windowManager: Fix fullscreen animations of wayland clients
Wayland clients are in control of their window size so the existing
mutter plugin API, which assumes size changes are synchronous, doesn't
work for them since when our size-change handler runs the MetaWindow's
size isn't final yet.

To fix this, the mutter plugin API was extended with a size-changed
vfunc that lets us know when the MetaWindow size has actually
changed. This way we can make the window snapshot and get the old
window size on the existing size-change handler and later, on the new
size-changed handler, get the new size and start the animation.

https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:43:07 +01:00
68b671a4f4 shell-wm: Add a size-changed signal to handle the new plugin vfunc
https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:42:59 +01:00
1de1fd44c5 texture-cache: Warn when loading sliced image fails
Sliced images are loaded into a group actor with one child actor
per slice. In case loading the image fails, we currently quietly
return the empty group actor, which makes diagnosing problems
unnecessarily hard - just be a bit more verbose on failure.

https://bugzilla.gnome.org/show_bug.cgi?id=774805
2016-11-22 18:38:10 +01:00
e5101eb407 animations: Guard against empty animations
Our animation code not only relies on the animation being loaded
(which we handle), but also on having at least one frame - otherwise
the computation of the next frame index will turn up NaN through
division by zero. Guard against this case by treating empty animations
as not loaded.

https://bugzilla.gnome.org/show_bug.cgi?id=774805
2016-11-22 18:38:10 +01:00
48e0d86340 Updated Norwegian bokmål translation. 2016-11-21 08:32:50 +01:00
c64cf30160 Update Friulian translation 2016-11-20 04:05:59 +00:00
ff9d777c01 Update Finnish translation
(cherry picked from commit d0e811214b)
2016-11-19 17:11:46 +00:00
d8c33deb33 Update Kazakh translation
(cherry picked from commit 52bbee80a0)
2016-11-19 12:05:43 +00:00
c03ff0bd4f Update Brazilian Portuguese translation
(cherry picked from commit 7098d6930f)
2016-11-18 23:41:47 +00:00
d597633d8f Updated Czech translation 2016-11-18 00:44:06 +01:00
4f6eb49be3 Update Polish translation 2016-11-18 00:05:56 +01:00
d23bd4c4a6 runDialog: Mark error message as translatable
https://bugzilla.gnome.org/show_bug.cgi?id=774643
2016-11-17 22:14:30 +01:00
7f12265685 Updated Czech translation 2016-11-12 12:13:02 +01:00
250023b823 Update Friulian translation 2016-11-10 20:34:06 +00:00
3b52691ab4 Update Spanish translation 2016-11-10 15:39:40 +00:00
b6cd548186 network: Always show primary icon when connected
The top bar's network menu only supports a subset of device types
supported by NetworkManager. While not having lesser used options
in the menu itself is perfectly reasonable, not showing any network
icon at all in the top bar when the system is fully connected is
weird.

https://bugzilla.gnome.org/show_bug.cgi?id=773890
2016-11-10 14:32:07 +01:00
b3fabf11b1 network: Summarize sections with too many devices
Any network devices appear as top level items in the system status
menu, so on system with an unusually high number of devices, the
menu can end up exceeding the available screen height. While this
is a corner case, leaving important system actions unreachable is
bad. The system menu does not lend itself to scrolling, so handle
this case instead by summarizing sections ("n connections") where
the number of devices exceeds a threshold.

https://bugzilla.gnome.org/show_bug.cgi?id=773892
2016-11-10 14:32:07 +01:00
15be562fdf networkAgent: Invalidate VPN plugin cache on changes
Currently the cache is built once when the first VPN request is
handled, so plugins that are installed or uninstalled after that
aren't picked up. Fix this by invalidating the cache on changes
to the plugin directory.

https://bugzilla.gnome.org/show_bug.cgi?id=773893
2016-11-10 14:32:07 +01:00
599fa0b76c Update Russian translation
(cherry picked from commit 5858b2266a)
2016-11-08 18:24:56 +00:00
c520eb4de0 Updated Czech translation 2016-11-08 13:05:31 +01:00
e33c68a415 popupMenu: don't handle key presses directly if there are modifiers
commit 1d58ea25ab changed the
popupMenu code to handle key presses on source actors directly.

This fixed keynav into the session gear menu at the login screen.

Unfortunately, it also causes spurious pop ups if a modifier happens
to be held down.

This commit checks for modifiers and short circuits the up front
key handling if any are found.

https://bugzilla.gnome.org/show_bug.cgi?id=740043
2016-11-07 14:01:23 -05:00
97bd224261 Update Hungarian translation 2016-11-05 20:20:39 +00:00
503e086c56 Update Friulian translation 2016-11-04 20:03:16 +00:00
7dd6b7f04f theme: Update from SASS 2016-11-04 16:55:49 +01:00
0b05b7a527 viewSelection: Handle touchpad 3-finger pinches
In order to show the overview, just like touchscreens do.

https://bugzilla.gnome.org/show_bug.cgi?id=765937
2016-11-04 16:35:11 +01:00
7e5274619a windowManager: Update API call
This function has now a more generic name, so it caters for both
swipe and pinch touchpad gestures.

https://bugzilla.gnome.org/show_bug.cgi?id=765937
2016-11-04 16:35:11 +01:00
900957d658 Update gnome-shell-sass module 2016-11-04 16:33:43 +01:00
e006b9b400 ui: Add PadOsd
This is an implementation of the pad OSD that's been previously
present in gnome-settings-daemon. Since things are moving closer
to the compositor, it makes sense to have this implemented as shell
UI.

https://bugzilla.gnome.org/show_bug.cgi?id=771067
2016-11-04 16:08:10 +01:00
d042dd73aa Update Hungarian translation 2016-11-04 06:17:53 +00:00
347972e45f screenShield: Raise lightbox on blank
The lightboxes used for screen blanking are created during initialization
and shown each time the screen should blank. During the (potentially long)
time where the lightbox is hidden, any actor could be raised above the
lightbox - in particular any popup menu raises itself to the top when
opened. To not exclude those elements from screen blanking, raise the
lightbox every time it is shown.

https://bugzilla.gnome.org/show_bug.cgi?id=773875
2016-11-03 21:15:20 +01:00
124 changed files with 12239 additions and 7103 deletions

90
NEWS
View File

@ -1,3 +1,93 @@
3.23.91
=======
* Use the original timestamps for restored notifications [Florian; #766410]
* Add weather information to date+time drop-down [Florian; #754031]
* Refine message list layout in date+time drop-down [Florian; #775763]
* Make next/prev media controls insensitive when unavailable [Florian; #773884]
* Misc. bug fixes [Piotr, Bastien, Florian; #772210, #769546, #775799]
Contributors:
Piotr Drąg, Carlos Garnacho, Florian Müllner, Bastien Nocera
Translations:
Baurzhan Muftakhidinov [kk], Jordi Mas [ca], Ask Hjorth Larsen [da],
Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Dušan Kazik [sk],
Aurimas Černius [lt], Jiri Grönroos [fi], Kjartan Maraas [nb],
Piotr Drąg [pl], Daniel Korostil [uk], Kukuh Syafaat [id],
Milo Casagrande [it], Fabio Tomat [fur], Rafael Fontenelle [pt_BR],
Fran Dieguez [gl], Мирослав Николић [sr, sr@latin], Balázs Meskó [hu],
Chao-Hsiung Liao [zh_TW]
3.23.90
=======
* Handle Ctrl+Q and Ctrl+W in portal window [Bastien; #764133]
* Allow to scroll through ibus candidates with mouse [Peng; #776032]
* Reload apps on .desktop file content changes [Adrian; #773636]
* Use private data/cache directories in portal helper [Bastien; #775639]
* Fix subsurfaces not showing up in previews [Rui; #756715]
* Fix theme node transitions [Florian; #778145]
* Update pad (o)leds on mode switches [Carlos; #776543]
* Add security indicators to defend against malicious portals [Bastien; #749197]
* Don't allow type ahead at the login screen [Ray; #766139]
* Don't fail to load because of TLS errors [Bastien; #778253]
* Ensure the network lists remains sorted on rename [Benjamin; #778686]
* Toggle power-off/suspend button on long-press [Florian; #721173]
* Add "kill-switch" for user extensions [Florian; #778664]
* Add night light indicator to status area [Florian; #741224]
* Misc. bug fixes [Michael, Bastien, Carlos, Rui, Florian, Alan, Philip, Jonas;
#759793, #735233, #762444, #777784, #777934, #778158, #776199, #778425,
#771098, #778552, #777317, #778660, #778661, #745626, #778672]
Contributors:
Jonas Ådahl, Benjamin Berg, Michael Catanzaro, Philip Chimento,
Alan Coopersmith, Piotr Drąg, Carlos Garnacho, Yuri Konotopov,
Lionel Landwerlin, Rui Matos, Florian Müllner, Bastien Nocera,
Adrian Perez de Castro, Robert Roth, Ray Strode, Peng Wu
Translations:
Jiri Grönroos [fi], Balázs Meskó [hu], Gábor Kelemen [hu],
Daniel Mustieles [es], Dušan Kazik [sk],
Piotr Drąg [ar, eu, fa, hr, pa, pt, sr, sr@latin], Rafael Fontenelle [pt_BR],
Jordi Mas [ca], Piotr Drąg [pl], Alexandre Franke [fr],
Baurzhan Muftakhidinov [kk], Yuras Shumovich [be], Mandy Wang [zh_CN],
Marek Černocký [cs], Kukuh Syafaat [id], Kjartan Maraas [nb],
Daniel Korostil [uk]
3.23.3
======
* Fix replacing of GNotifications [Florian; #775149]
* Prepare for mozjs31 GJS [Philip; #775374]
* Misc. bug fixes [Niels, Jonas; #775507, #776130]
Contributors:
Jonas Ådahl, Michael Catanzaro, Philip Chimento, Niels De Graef,
Carlos Garnacho, Florian Müllner
Translations:
Muhammet Kara [tr], Christian Kirbach [de], Baurzhan Muftakhidinov [kk],
Cheng-Chia Tseng [zh_TW], A S Alam [pa], Gianvito Cavasoli [it]
3.23.2
======
* Implement Pad configuration OSD [Carlos; #771067]
* Show overview on three-finger touchpad pinch [Carlos; #765937]
* Summarize network sections with too many devices [Florian; #773892]
* Always show primary network icon when connected [Florian; #773890]
* Fix fullscreen transitions on wayland [Rui; #770345]
* Work around portal failures by using a URL without HTPPS redirect [Debarshi; #769940]
* Fix app view hiding when no usage data is available [Florian, Xiaoguang; #774381]
* Misc. bug fixes [Florian, Ray; #773875, #740043, #773893, #774643, #774805]
Contributors:
Carlos Garnacho, Rui Matos, Florian Müllner, Debarshi Ray, Ray Strode,
Xiaoguang Wang
Translations:
Balázs Meskó [hu], Fabio Tomat [fur], Marek Cernocky [cs], Stas Solovey [ru],
Daniel Mustieles [es], Marek Černocký [cs], Piotr Drąg [pl],
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Jiri Grönroos [fi],
Kjartan Maraas [nb]
3.23.1
======
* Request periodic scans while WiFi list is open [Dan; #767918]

View File

@ -4,15 +4,15 @@
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
(test -f $srcdir/configure.ac \
&& test -d $srcdir/src) || {
pushd $srcdir
(test -f configure.ac \
&& test -d src) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level gnome-shell directory"
exit 1
}
pushd $srcdir
# Fetch submodules if needed
if test ! -f src/gvc/Makefile.am || test ! -f data/theme/gnome-shell-sass/COPYING;
then
@ -21,11 +21,13 @@ then
fi
git submodule update
aclocal --install || exit 1
gtkdocize --copy || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --verbose --force --install || exit 1
popd
which gnome-autogen.sh || {
echo "You need to install gnome-common from GNOME Git (or from"
echo "your OS vendor's package manager)."
exit 1
}
. gnome-autogen.sh
if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1
fi

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.23.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.23.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h])
@ -17,7 +17,6 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Checks for programs.
AC_PROG_CC
AC_PROG_CXX
# Initialize libtool
LT_PREREQ([2.2.6])
@ -42,6 +41,15 @@ GLIB_GSETTINGS
AM_PATH_PYTHON([3])
AC_SUBST(PYTHON)
# We depend on a specific version of the libmutter API. The mutter variants of
# the Cogl and Clutter libraries also use this API version.
LIBMUTTER_API_VERSION=0
LIBMUTTER=libmutter-$LIBMUTTER_API_VERSION
LIBMUTTER_COGL=mutter-cogl-$LIBMUTTER_API_VERSION
LIBMUTTER_COGL_PANGO=mutter-cogl-pango-$LIBMUTTER_API_VERSION
LIBMUTTER_CLUTTER=mutter-clutter-$LIBMUTTER_API_VERSION
# We need at least this, since gst_plugin_register_static() was added
# in 0.10.16, but nothing older than 0.10.21 has been tested.
GSTREAMER_MIN_VERSION=0.11.92
@ -53,7 +61,7 @@ if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes)
build_recorder=true
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules mutter-clutter-1.0)
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules $LIBMUTTER_CLUTTER)
else
AC_MSG_RESULT(no)
fi
@ -75,10 +83,9 @@ AS_IF([test x$enable_systemd != xno], [
AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=1.49.1
GJS_MIN_VERSION=1.47.0
MUTTER_MIN_VERSION=3.23.1
MUTTER_MIN_VERSION=3.23.91
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3
@ -99,8 +106,8 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
gjs-1.0 >= $GJS_MIN_VERSION
$recorder_modules
gdk-x11-3.0 libsoup-2.4
mutter-clutter-1.0 >= $CLUTTER_MIN_VERSION
mutter-cogl-pango-1.0
$LIBMUTTER_CLUTTER >= $MUTTER_MIN_VERSION
$LIBMUTTER_COGL_PANGO
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra libcanberra-gtk3
@ -112,16 +119,18 @@ if test x$have_systemd = xyes; then
fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
PKG_CHECK_MODULES(MUTTER, $LIBMUTTER >= $MUTTER_MIN_VERSION)
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, mutter-clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(ST, $LIBMUTTER_CLUTTER gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(TRAY, mutter-clutter-1.0 gtk+-3.0)
PKG_CHECK_MODULES(TRAY, $LIBMUTTER_CLUTTER gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.21.3)
AC_SUBST(LIBMUTTER_API_VERSION)
AC_ARG_ENABLE(browser-plugin,
[AS_HELP_STRING([--enable-browser-plugin],
[Enable browser plugin [default=yes]])],,
@ -146,10 +155,10 @@ AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir $LIBMUTTER`
AC_SUBST(MUTTER_GIR_DIR)
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir $LIBMUTTER`
AC_SUBST(MUTTER_TYPELIB_DIR)
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`

View File

@ -38,6 +38,7 @@ endif
introspectiondir = $(datadir)/dbus-1/interfaces
introspection_DATA = \
org.gnome.Shell.PadOsd.xml \
org.gnome.Shell.Screencast.xml \
org.gnome.Shell.Screenshot.xml \
org.gnome.ShellSearchProvider.xml \
@ -63,6 +64,7 @@ dist_theme_files = \
theme/gnome-shell-sass/NEWS \
theme/gnome-shell-sass/README \
theme/gnome-shell-sass/gnome-shell-sass.doap \
theme/pad-osd.css \
theme/parse-sass.sh \
$(NULL)

View File

@ -1,6 +1,6 @@
[Desktop Entry]
Type=Application
Name=GNOME Shell Extension Preferences
Name=Shell Extensions
Comment=Configure GNOME Shell Extensions
Exec=@bindir@/gnome-shell-extension-prefs %u
X-GNOME-Bugzilla-Bugzilla=GNOME

View File

@ -22,6 +22,7 @@
<file>no-events.svg</file>
<file>no-notifications.svg</file>
<file>noise-texture.png</file>
<file>pad-osd.css</file>
<file>page-indicator-active.svg</file>
<file>page-indicator-inactive.svg</file>
<file>page-indicator-checked.svg</file>

View File

@ -0,0 +1,28 @@
<!DOCTYPE node PUBLIC
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
<node>
<!--
org.gnome.Shell.PadOSD:
@short_description: Pad OSD interface
The interface used to show button map OSD on pad devices.
-->
<interface name='org.gnome.Shell.Wacom.PadOsd'>
<!--
Show:
@device_node: device node file, usually in /dev/input/...
@edition_mode: whether toggling edition mode on when showing
Shows the pad button map OSD for the requested device, the OSD
will be shown according the current device settings (output
mapping, left handed mode, ...)
-->
<method name='Show'>
<arg name='device_node' direction='in' type='o'/>
<arg name='edition_mode' direction='in' type='b'/>
</method>
</interface>
</node>

View File

@ -21,6 +21,14 @@
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
</description>
</key>
<key name="disable-user-extensions" type="b">
<default>false</default>
<summary>Disable user extensions</summary>
<description>
Disable all extensions the user has enabled without affecting
the “enabled-extension” setting.
</description>
</key>
<key name="disable-extension-version-validation" type="b">
<default>true</default>
<summary>Disables the validation of extension version compatibility</summary>
@ -56,9 +64,9 @@
</key>
<key name="always-show-log-out" type="b">
<default>false</default>
<summary>Always show the 'Log out' menu item in the user menu.</summary>
<summary>Always show the Log out menu item in the user menu.</summary>
<description>
This key overrides the automatic hiding of the 'Log out'
This key overrides the automatic hiding of the Log out
menu item in single-user, single-session situations.
</description>
</key>
@ -68,7 +76,7 @@
<description>
The shell will request a password when an encrypted device or a
remote filesystem is mounted. If the password can be saved for
future use a 'Remember Password' checkbox will be present.
future use a Remember Password checkbox will be present.
This key sets the default state of the checkbox.
</description>
</key>
@ -97,9 +105,9 @@
</key>
<key name="toggle-application-view" type="as">
<default>["&lt;Super&gt;a"]</default>
<summary>Keybinding to open the "Show Applications" view</summary>
<summary>Keybinding to open the Show Applications view</summary>
<description>
Keybinding to open the "Show Applications" view of the Activities
Keybinding to open the Show Applications view of the Activities
Overview.
</description>
</key>
@ -168,8 +176,8 @@
<summary>The application icon mode.</summary>
<description>
Configures how the windows are shown in the switcher. Valid possibilities
are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only'
(shows only the application icon) or 'both'.
are thumbnail-only (shows a thumbnail of the window), app-icon-only
(shows only the application icon) or both.
</description>
</key>
<key type="b" name="current-workspace-only">

View File

@ -562,6 +562,14 @@ StScrollBar {
background-color: #eeeeec;
border-radius: 0.3em; }
/* Pad OSD */
.pad-osd-window {
padding: 32px;
background-color: rgba(0, 0, 0, 0.8); }
.combo-box-label {
width: 15em; }
/* App Switcher */
.switcher-popup {
padding: 8px;
@ -728,7 +736,8 @@ StScrollBar {
.datemenu-today-button,
.world-clocks-button,
.message-list-section-title {
.weather-button,
.events-section-title {
border-radius: 4px;
padding: .4em; }
@ -741,12 +750,15 @@ StScrollBar {
.datemenu-today-button:hover, .datemenu-today-button:focus,
.world-clocks-button:hover,
.world-clocks-button:focus,
.message-list-section-title:hover,
.message-list-section-title:focus {
.weather-button:hover,
.weather-button:focus,
.events-section-title:hover,
.events-section-title:focus {
background-color: #0d0d0d; }
.datemenu-today-button:active,
.world-clocks-button:active,
.message-list-section-title:active {
.weather-button:active,
.events-section-title:active {
color: white;
background-color: #215d9c; }
@ -754,13 +766,17 @@ StScrollBar {
font-size: 1.5em; }
.world-clocks-header,
.message-list-section-title {
.weather-header,
.events-section-title {
color: #999999;
font-weight: bold; }
.world-clocks-grid {
spacing-rows: 0.4em; }
.weather-box {
spacing: 0.4em; }
.calendar-month-label {
color: #f2f2f2;
font-weight: bold;
@ -845,69 +861,62 @@ StScrollBar {
.message-list {
width: 31.5em; }
.message-list-clear-button.button {
background-color: transparent;
margin: 1.5em 1.5em 0; }
.message-list-clear-button.button:hover, .message-list-clear-button.button:focus {
background-color: #0d0d0d; }
.message-list-sections {
spacing: 1.5em; }
spacing: 1em; }
.message-list-section,
.message-list-section-list {
spacing: 0.7em; }
.message-list-section-title-box {
spacing: 0.4em; }
.message-list-section-close > StIcon {
icon-size: 16px;
border-radius: 8px;
color: #000;
background-color: #666666; }
/* FIXME: how do you do this in sass? */
.message-list-section-close:hover > StIcon,
.message-list-section-close:focus > StIcon {
background-color: #999999; }
.message {
background-color: #0d0d0d;
border-radius: 3px; }
.message:hover, .message:focus {
background-color: #262626; }
background-color: #0d0d0d; }
.message-icon-bin {
padding: 8px 0px 8px 8px; }
padding: 10px 3px 10px 10px; }
.message-icon-bin:rtl {
padding: 8px 8px 8px 0px; }
padding: 10px 10px 10px 3px; }
.message-icon-bin > StIcon {
icon-size: 32px; }
.message-secondary-bin:ltr {
padding-left: 8px; }
.message-secondary-bin:rtl {
padding-right: 8px; }
color: #cccccc;
icon-size: 16px;
-st-icon-style: symbolic; }
.message-secondary-bin {
color: #999999; }
padding: 0 12px; }
.message-secondary-bin > .event-time {
color: #999999;
font-size: 0.7em; }
.message-secondary-bin > StIcon {
icon-size: 16px; }
.message-title {
font-weight: bold;
font-size: 1.1em; }
color: #f2f2f2; }
.message-content {
padding: 8px;
font-size: .9em; }
color: #cccccc;
padding: 10px; }
.message-media-control {
padding: 6px; }
padding: 12px; }
.message-media-control:last-child:ltr {
padding-right: 18px; }
.message-media-control:last-child:rtl {
padding-left: 18px; }
.message-media-control:insensitive {
color: #999999; }
.media-message-cover-icon {
icon-size: 32px; }
icon-size: 48px !important; }
.media-message-cover-icon.fallback {
color: #1a1a1a;
background-color: #000;

View File

@ -562,6 +562,14 @@ StScrollBar {
background-color: #eeeeec;
border-radius: 0.3em; }
/* Pad OSD */
.pad-osd-window {
padding: 32px;
background-color: rgba(0, 0, 0, 0.8); }
.combo-box-label {
width: 15em; }
/* App Switcher */
.switcher-popup {
padding: 8px;
@ -728,7 +736,8 @@ StScrollBar {
.datemenu-today-button,
.world-clocks-button,
.message-list-section-title {
.weather-button,
.events-section-title {
border-radius: 4px;
padding: .4em; }
@ -741,12 +750,15 @@ StScrollBar {
.datemenu-today-button:hover, .datemenu-today-button:focus,
.world-clocks-button:hover,
.world-clocks-button:focus,
.message-list-section-title:hover,
.message-list-section-title:focus {
.weather-button:hover,
.weather-button:focus,
.events-section-title:hover,
.events-section-title:focus {
background-color: #454c4c; }
.datemenu-today-button:active,
.world-clocks-button:active,
.message-list-section-title:active {
.weather-button:active,
.events-section-title:active {
color: white;
background-color: #215d9c; }
@ -754,13 +766,17 @@ StScrollBar {
font-size: 1.5em; }
.world-clocks-header,
.message-list-section-title {
.weather-header,
.events-section-title {
color: #8e8e80;
font-weight: bold; }
.world-clocks-grid {
spacing-rows: 0.4em; }
.weather-box {
spacing: 0.4em; }
.calendar-month-label {
color: #e2e2df;
font-weight: bold;
@ -845,69 +861,62 @@ StScrollBar {
.message-list {
width: 31.5em; }
.message-list-clear-button.button {
background-color: transparent;
margin: 1.5em 1.5em 0; }
.message-list-clear-button.button:hover, .message-list-clear-button.button:focus {
background-color: #454c4c; }
.message-list-sections {
spacing: 1.5em; }
spacing: 1em; }
.message-list-section,
.message-list-section-list {
spacing: 0.7em; }
.message-list-section-title-box {
spacing: 0.4em; }
.message-list-section-close > StIcon {
icon-size: 16px;
border-radius: 8px;
color: #393f3f;
background-color: #59594f; }
/* FIXME: how do you do this in sass? */
.message-list-section-close:hover > StIcon,
.message-list-section-close:focus > StIcon {
background-color: #8e8e80; }
.message {
background-color: #454c4c;
border-radius: 3px; }
.message:hover, .message:focus {
background-color: #5d6767; }
background-color: #454c4c; }
.message-icon-bin {
padding: 8px 0px 8px 8px; }
padding: 10px 3px 10px 10px; }
.message-icon-bin:rtl {
padding: 8px 8px 8px 0px; }
padding: 10px 10px 10px 3px; }
.message-icon-bin > StIcon {
icon-size: 32px; }
.message-secondary-bin:ltr {
padding-left: 8px; }
.message-secondary-bin:rtl {
padding-right: 8px; }
color: #bebeb6;
icon-size: 16px;
-st-icon-style: symbolic; }
.message-secondary-bin {
color: #8e8e80; }
padding: 0 12px; }
.message-secondary-bin > .event-time {
color: #8e8e80;
font-size: 0.7em; }
.message-secondary-bin > StIcon {
icon-size: 16px; }
.message-title {
font-weight: bold;
font-size: 1.1em; }
color: #e2e2df; }
.message-content {
padding: 8px;
font-size: .9em; }
color: #bebeb6;
padding: 10px; }
.message-media-control {
padding: 6px; }
padding: 12px; }
.message-media-control:last-child:ltr {
padding-right: 18px; }
.message-media-control:last-child:rtl {
padding-left: 18px; }
.message-media-control:insensitive {
color: #8e8e80; }
.media-message-cover-icon {
icon-size: 32px; }
icon-size: 48px !important; }
.media-message-cover-icon.fallback {
color: #515a5a;
background-color: #393f3f;

30
data/theme/pad-osd.css Normal file
View File

@ -0,0 +1,30 @@
.Leader {
stroke-width: .5 !important;
stroke: #535353;
fill: none !important;
}
.Button {
stroke-width: .25;
stroke: #ededed;
fill: #ededed;
}
.Ring {
stroke-width: .5 !important;
stroke: #535353 !important;
fill: none !important;
}
.Label {
stroke: none !important;
stroke-width: .1 !important;
font-size: .1 !important;
fill: transparent !important;
}
.TouchStrip, .TouchRing {
stroke-width: .1 !important;
stroke: #ededed !important;
fill: #535353 !important;
}

View File

@ -11,6 +11,7 @@ misc/config.js: misc/config.js.in Makefile
-e "s|[@]datadir@|$(datadir)|g" \
-e "s|[@]libexecdir@|$(libexecdir)|g" \
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
-e "s|[@]LIBMUTTER_API_VERSION@|$(LIBMUTTER_API_VERSION)|g" \
$< > $@
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)

View File

@ -143,17 +143,21 @@ const Application = new Lang.Class({
this._window = new Gtk.ApplicationWindow({ application: app,
window_position: Gtk.WindowPosition.CENTER });
this._window.set_size_request(800, 500);
this._window.set_default_size(800, 500);
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
title: _("GNOME Shell Extensions") });
title: _("Shell Extensions") });
this._window.set_titlebar(this._titlebar);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
shadow_type: Gtk.ShadowType.IN,
halign: Gtk.Align.CENTER,
propagate_natural_width: true,
margin: 18 });
let killSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER });
this._titlebar.pack_end(killSwitch);
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._settings.bind('disable-user-extensions', killSwitch, 'active',
Gio.SettingsBindFlags.BIND_DEFAULT |
Gio.SettingsBindFlags.INVERT_BOOLEAN);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
this._window.add(scroll);
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
@ -246,6 +250,18 @@ const Application = new Lang.Class({
}
});
const DescriptionLabel = new Lang.Class({
Name: 'DescriptionLabel',
Extends: Gtk.Label,
vfunc_get_preferred_height_for_width: function(width) {
// Hack: Request the maximum height allowed by the line limit
if (this.lines > 0)
return this.parent(0);
return this.parent(width);
}
});
const ExtensionRow = new Lang.Class({
Name: 'ExtensionRow',
Extends: Gtk.ListBoxRow,
@ -264,6 +280,10 @@ const ExtensionRow = new Lang.Class({
Lang.bind(this, function() {
this._switch.sensitive = this._canEnable();
}));
this._settings.connect('changed::disable-user-extensions',
Lang.bind(this, function() {
this._switch.sensitive = this._canEnable();
}));
this._buildUI();
},
@ -272,7 +292,8 @@ const ExtensionRow = new Lang.Class({
let extension = ExtensionUtils.extensions[this.uuid];
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
hexpand: true, margin: 12, spacing: 6 });
hexpand: true, margin_end: 24, spacing: 24,
margin: 12 });
this.add(hbox);
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
@ -286,9 +307,9 @@ const ExtensionRow = new Lang.Class({
vbox.add(label);
let desc = extension.metadata.description.split('\n')[0];
label = new Gtk.Label({ label: desc,
ellipsize: Pango.EllipsizeMode.END,
halign: Gtk.Align.START });
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
ellipsize: Pango.EllipsizeMode.END,
xalign: 0, yalign: 0 });
vbox.add(label);
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
@ -319,7 +340,8 @@ const ExtensionRow = new Lang.Class({
let extension = ExtensionUtils.extensions[this.uuid];
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
return !this._settings.get_boolean('disable-user-extensions') &&
!(checkVersion && ExtensionUtils.isOutOfDate(extension));
},
_isEnabled: function() {

View File

@ -1225,7 +1225,7 @@ const LoginDialog = new Lang.Class({
},
addCharacter: function(unichar) {
this._authPrompt.addCharacter(unichar);
// Don't allow type ahead at the login screen
},
finish: function(onComplete) {

View File

@ -25,6 +25,7 @@
<file>misc/params.js</file>
<file>misc/smartcardManager.js</file>
<file>misc/util.js</file>
<file>misc/weather.js</file>
<file>perf/core.js</file>
<file>perf/hwtest.js</file>
@ -72,6 +73,7 @@
<file>ui/osdMonitorLabeler.js</file>
<file>ui/overview.js</file>
<file>ui/overviewControls.js</file>
<file>ui/padOsd.js</file>
<file>ui/panel.js</file>
<file>ui/panelMenu.js</file>
<file>ui/pointerWatcher.js</file>
@ -116,6 +118,7 @@
<file>ui/status/brightness.js</file>
<file>ui/status/location.js</file>
<file>ui/status/keyboard.js</file>
<file>ui/status/nightLight.js</file>
<file>ui/status/network.js</file>
<file>ui/status/power.js</file>
<file>ui/status/rfkill.js</file>

View File

@ -15,3 +15,5 @@ const LOCALEDIR = '@datadir@/locale';
/* other standard directories */
const LIBEXECDIR = '@libexecdir@';
const SYSCONFDIR = '@sysconfdir@';
/* g-i package versions */
const LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'

View File

@ -6,10 +6,11 @@ const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
let IBusCandidatePopup;
try {
var IBus = imports.gi.IBus;
_checkIBusVersion(1, 5, 2);
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
IBusCandidatePopup = imports.ui.ibusCandidatePopup;
} catch (e) {
var IBus = null;
log(e);

View File

@ -128,7 +128,8 @@ const KeyboardManager = new Lang.Class({
if (!found)
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
let _layout, _variant;
[found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
if (found)
return { layout: _layout, variant: _variant };
else

View File

@ -1,9 +1,12 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Gettext = imports.gettext;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
@ -161,6 +164,41 @@ function _handleSpawnError(command, err) {
Main.notifyError(title, err.message);
}
function formatTimeSpan(date) {
let now = GLib.DateTime.new_now_local();
let timespan = now.difference(date);
let minutesAgo = timespan / GLib.TIME_SPAN_MINUTE;
let hoursAgo = timespan / GLib.TIME_SPAN_HOUR;
let daysAgo = timespan / GLib.TIME_SPAN_DAY;
let weeksAgo = daysAgo / 7;
let monthsAgo = daysAgo / 30;
let yearsAgo = weeksAgo / 52;
if (minutesAgo < 5)
return _("Just now");
if (hoursAgo < 1)
return Gettext.ngettext("%d minute ago",
"%d minutes ago", minutesAgo).format(minutesAgo);
if (daysAgo < 1)
return Gettext.ngettext("%d hour ago",
"%d hours ago", hoursAgo).format(hoursAgo);
if (daysAgo < 2)
return _("Yesterday");
if (daysAgo < 15)
return Gettext.ngettext("%d day ago",
"%d days ago", daysAgo).format(daysAgo);
if (weeksAgo < 8)
return Gettext.ngettext("%d week ago",
"%d weeks ago", weeksAgo).format(weeksAgo);
if (yearsAgo < 1)
return Gettext.ngettext("%d month ago",
"%d months ago", monthsAgo).format(monthsAgo);
return Gettext.ngettext("%d year ago",
"%d years ago", yearsAgo).format(yearsAgo);
}
function formatTime(time, params) {
let date;
// HACK: The built-in Date type sucks at timezones, which we need for the
@ -398,3 +436,94 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
time: SCROLL_TIME,
transition: 'easeOutQuad' });
}
const AppSettingsMonitor = new Lang.Class({
Name: 'AppSettingsMonitor',
_init: function(appId, schemaId) {
this._appId = appId;
this._schemaId = schemaId;
this._app = null;
this._settings = null;
this._handlers = [];
this._schemaSource = Gio.SettingsSchemaSource.get_default();
this._appSystem = Shell.AppSystem.get_default();
this._appSystem.connect('installed-changed',
Lang.bind(this, this._onInstalledChanged));
this._onInstalledChanged();
},
get available() {
return this._app != null && this._settings != null;
},
activateApp: function() {
if (this._app)
this._app.activate();
},
watchSetting: function(key, callback) {
let handler = { id: 0, key: key, callback: callback };
this._handlers.push(handler);
this._connectHandler(handler);
},
_connectHandler: function(handler) {
if (!this._settings || handler.id > 0)
return;
handler.id = this._settings.connect('changed::' + handler.key,
handler.callback);
handler.callback(this._settings, handler.key);
},
_disconnectHandler: function(handler) {
if (this._settings && handler.id > 0)
this._settings.disconnect(handler.id);
handler.id = 0;
},
_onInstalledChanged: function() {
let hadApp = (this._app != null);
this._app = this._appSystem.lookup_app(this._appId);
let haveApp = (this._app != null);
if (hadApp == haveApp)
return;
if (haveApp)
this._checkSettings();
else
this._setSettings(null);
},
_setSettings(settings) {
this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
let hadSettings = (this._settings != null);
this._settings = settings;
let haveSettings = (this._settings != null);
this._handlers.forEach((handler) => { this._connectHandler(handler); });
if (hadSettings != haveSettings)
this.emit('available-changed');
},
_checkSettings: function() {
let schema = this._schemaSource.lookup(this._schemaId, true);
if (schema) {
this._setSettings(new Gio.Settings({ settings_schema: schema }));
} else if (this._app) {
Mainloop.timeout_add_seconds(1, () => {
this._checkSettings();
return GLib.SOURCE_REMOVE;
});
}
}
});
Signals.addSignalMethods(AppSettingsMonitor.prototype);

190
js/misc/weather.js Normal file
View File

@ -0,0 +1,190 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Geoclue = imports.gi.Geoclue;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GWeather = imports.gi.GWeather;
const Lang = imports.lang;
const Signals = imports.signals;
const Util = imports.misc.util;
// Minimum time between updates to show loading indication
const UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
const WeatherClient = new Lang.Class({
Name: 'WeatherClient',
_init: function() {
this._loading = false;
this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
this._useAutoLocation = false;
this._mostRecentLocation = null;
this._gclueService = null;
this._gclueStarted = false;
this._gclueFailed = false;
this._gclueLocationChangedId = 0;
this._world = GWeather.Location.get_world();
let providers = GWeather.Provider.METAR |
GWeather.Provider.YR_NO |
GWeather.Provider.OWM;
this._weatherInfo = new GWeather.Info({ enabled_providers: providers });
this._weatherInfo.connect_after('updated', () => {
this._lastUpdate = GLib.DateTime.new_now_local();
this.emit('changed');
});
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.Application.desktop',
'org.gnome.Weather.Application');
this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
this._weatherAppMon.watchSetting('automatic-location',
Lang.bind(this, this._onAutomaticLocationChanged));
this._weatherAppMon.watchSetting('locations',
Lang.bind(this, this._onLocationsChanged));
},
get available() {
return this._weatherAppMon.available;
},
get loading() {
return this._loading;
},
get info() {
return this._weatherInfo;
},
activateApp: function() {
this._weatherAppMon.activateApp();
},
update: function() {
let now = GLib.DateTime.new_now_local();
// Update without loading indication if the current info is recent enough
if (this._weatherInfo.is_valid() &&
now.difference(this._lastUpdate) < UPDATE_THRESHOLD)
this._weatherInfo.update();
else
this._loadInfo();
},
_loadInfo: function() {
let id = this._weatherInfo.connect('updated', () => {
this._weatherInfo.disconnect(id);
this._loading = false;
});
this._loading = true;
this.emit('changed');
this._weatherInfo.update();
},
_locationsEqual: function(loc1, loc2) {
if (loc1 == loc2)
return true;
if (loc1 == null || loc2 == null)
return false;
return loc1.equal(loc2);
},
_setLocation: function(location) {
if (this._locationsEqual(this._weatherInfo.location, location))
return;
this._weatherInfo.abort();
this._weatherInfo.set_location(location);
if (location)
this._loadInfo();
else
this.emit('changed');
},
_updateLocationMonitoring: function() {
if (this._useAutoLocation) {
if (this._gclueLocationChangedId != 0 || this._gclueService == null)
return;
this._gclueLocationChangedId =
this._gclueService.connect('notify::location',
Lang.bind(this, this._onGClueLocationChanged));
this._onGClueLocationChanged();
} else {
if (this._gclueLocationChangedId)
this._gclueService.disconnect(this._gclueLocationChangedId);
this._gclueLocationChangedId = 0;
}
},
_startGClueService: function() {
if (this._gclueStarted)
return;
this._gclueStarted = true;
Geoclue.Simple.new('org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null,
(o, res) => {
try {
this._gclueService = Geoclue.Simple.new_finish(res);
} catch(e) {
log('Failed to connect to Geoclue2 service: ' + e.message);
this._gclueFailed = true;
this._setLocation(this._mostRecentLocation);
return;
}
this._gclueService.get_client().distance_threshold = 100;
this._updateLocationMonitoring();
});
},
_onGClueLocationChanged: function() {
let geoLocation = this._gclueService.location;
let location = GWeather.Location.new_detached(geoLocation.description,
null,
geoLocation.latitude,
geoLocation.longitude);
this._setLocation(location);
},
_onAutomaticLocationChanged: function(settings, key) {
let useAutoLocation = settings.get_boolean(key);
if (this._useAutoLocation == useAutoLocation)
return;
this._useAutoLocation = useAutoLocation;
this._updateLocationMonitoring();
if (this._useAutoLocation) {
if (!this._gclueStarted)
this._startGClueService();
} else {
this._setLocation(this._mostRecentLocation);
}
},
_onLocationsChanged: function(settings, key) {
let serialized = settings.get_value(key).deep_unpack().shift();
let mostRecentLocation = null;
if (serialized)
mostRecentLocation = this._world.deserialize(serialized);
if (this._locationsEqual(this._mostRecentLocation, mostRecentLocation))
return;
this._mostRecentLocation = mostRecentLocation;
if (!this._useAutoLocation || this._gclueFailed)
this._setLocation(this._mostRecentLocation);
}
});
Signals.addSignalMethods(WeatherClient.prototype);

View File

@ -12,6 +12,7 @@ const WebKit = imports.gi.WebKit2;
const _ = Gettext.gettext;
const Config = imports.misc.config;
const FileUtils = imports.misc.fileUtils;
const PortalHelperResult = {
CANCELLED: 0,
@ -19,7 +20,15 @@ const PortalHelperResult = {
RECHECK: 2
};
const PortalHelperSecurityLevel = {
NOT_YET_DETERMINED: 0,
SECURE: 1,
INSECURE: 2
};
const INACTIVITY_TIMEOUT = 30000; //ms
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
const HelperDBusInterface = '<node> \
@ -42,6 +51,71 @@ const HelperDBusInterface = '<node> \
</interface> \
</node>';
const PortalHeaderBar = new Lang.Class({
Name: 'PortalHeaderBar',
Extends: Gtk.HeaderBar,
_init: function() {
this.parent({ show_close_button: true });
// See ephy-title-box.c in epiphany for the layout
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
spacing: 0 });
this.set_custom_title(vbox);
/* TRANSLATORS: this is the title of the wifi captive portal login window */
let titleLabel = new Gtk.Label({ label: _("Hotspot Login"),
wrap: false,
single_line_mode: true,
ellipsize: Pango.EllipsizeMode.END });
titleLabel.get_style_context().add_class('title');
vbox.add(titleLabel);
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
spacing: 4,
halign: Gtk.Align.CENTER,
valign: Gtk.Align.BASELINE });
hbox.get_style_context().add_class('subtitle');
vbox.add(hbox);
this._lockImage = new Gtk.Image({ icon_size: Gtk.IconSize.MENU,
valign: Gtk.Align.BASELINE });
hbox.add(this._lockImage);
this.subtitleLabel = new Gtk.Label({ wrap: false,
single_line_mode: true,
ellipsize: Pango.EllipsizeMode.END,
valign: Gtk.Align.BASELINE,
selectable: true});
this.subtitleLabel.get_style_context().add_class('subtitle');
hbox.add(this.subtitleLabel);
vbox.show_all();
},
setSubtitle: function(label) {
this.subtitleLabel.set_text(label);
},
setSecurityIcon: function(securityLevel) {
switch (securityLevel) {
case PortalHelperSecurityLevel.NOT_YET_DETERMINED:
this._lockImage.hide();
break;
case PortalHelperSecurityLevel.SECURE:
this._lockImage.show();
this._lockImage.set_from_icon_name("channel-secure-symbolic", Gtk.IconSize.MENU);
this._lockImage.set_tooltip_text(null);
break;
case PortalHelperSecurityLevel.INSECURE:
this._lockImage.show();
this._lockImage.set_from_icon_name("channel-insecure-symbolic", Gtk.IconSize.MENU);
this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.'));
break;
}
},
});
const PortalWindow = new Lang.Class({
Name: 'PortalWindow',
Extends: Gtk.ApplicationWindow,
@ -49,8 +123,14 @@ const PortalWindow = new Lang.Class({
_init: function(application, url, timestamp, doneCallback) {
this.parent({ application: application });
this.connect('delete-event', Lang.bind(this, this.destroyWindow));
this._headerBar = new PortalHeaderBar();
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
this.set_titlebar(this._headerBar);
this._headerBar.show();
if (!url) {
url = 'http://www.gnome.org';
url = CONNECTIVITY_CHECK_URI;
this._originalUrlWasGnome = true;
} else {
this._originalUrlWasGnome = false;
@ -61,29 +141,43 @@ const PortalWindow = new Lang.Class({
this._doneCallback = doneCallback;
this._lastRecheck = 0;
this._recheckAtExit = false;
let cacheDir = GLib.Dir.make_tmp("gnome-shell-portal-helper-XXXXXXXX");
this._cacheDir = Gio.File.new_for_path(cacheDir);
this._webView = new WebKit.WebView();
let dataManager = new WebKit.WebsiteDataManager({ base_data_directory: cacheDir,
base_cache_directory: cacheDir });
this._webContext = new WebKit.WebContext({ website_data_manager: dataManager });
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
this._webView = WebKit.WebView.new_with_context(this._webContext);
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
this._webView.connect('load-changed', Lang.bind(this, this._onLoadChanged));
this._webView.connect('insecure-content-detected', Lang.bind(this, this._onInsecureContentDetected));
this._webView.connect('load-failed-with-tls-errors', Lang.bind(this, this._onLoadFailedWithTlsErrors));
this._webView.load_uri(url);
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
this._syncTitle();
this._webView.connect('notify::uri', Lang.bind(this, this._syncUri));
this._syncUri();
this.add(this._webView);
this._webView.show();
this.set_size_request(600, 450);
this.maximize();
this.present_with_time(timestamp);
this.application.set_accels_for_action('app.quit', ['<Primary>q', '<Primary>w']);
},
_syncTitle: function() {
let title = this._webView.title;
destroyWindow: function() {
this.destroy();
FileUtils.recursivelyDeleteDir(this._cacheDir, true);
},
if (title) {
this.title = title;
} else {
/* TRANSLATORS: this is the title of the wifi captive portal login
* window, until we know the title of the actual login page */
this.title = _("Web Authentication Redirect");
}
_syncUri: function() {
let uri = this._webView.uri;
if (uri)
this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null));
else
this._headerBar.setSubtitle('');
},
refresh: function() {
@ -99,6 +193,32 @@ const PortalWindow = new Lang.Class({
return false;
},
_onLoadChanged: function(view, loadEvent) {
if (loadEvent == WebKit.LOAD_STARTED) {
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
} else if (loadEvent == WebKit.LOAD_COMMITTED) {
let tlsInfo = this._webView.get_tls_info();
let ret = tlsInfo[0];
let flags = tlsInfo[2];
if (ret && flags == 0)
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.SECURE);
else
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
}
},
_onInsecureContentDetected: function () {
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
},
_onLoadFailedWithTlsErrors: function (view, failingURI, certificate, errors) {
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
let uri = new Soup.URI(failingURI);
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
this._webView.load_uri(failingURI);
return true;
},
_onDecidePolicy: function(view, decision, type) {
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
decision.ignore();
@ -112,12 +232,12 @@ const PortalWindow = new Lang.Class({
let uri = new Soup.URI(request.get_uri());
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
if (uri.get_host() == CONNECTIVITY_CHECK_HOST && this._everSeenRedirect) {
// Yay, we got to gnome!
decision.ignore();
this._doneCallback(PortalHelperResult.COMPLETED);
return true;
} else if (uri.get_host() != 'www.gnome.org') {
} else if (uri.get_host() != CONNECTIVITY_CHECK_HOST) {
this._everSeenRedirect = true;
}
}
@ -166,6 +286,10 @@ const WebPortalHelper = new Lang.Class({
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
this._queue = [];
let action = new Gio.SimpleAction({ name: 'quit' });
action.connect('activate', () => { this.active_window.destroyWindow(); });
this.add_action(action);
},
vfunc_dbus_register: function(connection, path) {
@ -197,7 +321,7 @@ const WebPortalHelper = new Lang.Class({
if (obj.connection == connection) {
if (obj.window)
obj.window.destroy();
obj.window.destroyWindow();
this._queue.splice(i, 1);
break;
}

View File

@ -33,10 +33,9 @@ const AppIconMode = {
};
function _createWindowClone(window, size) {
let windowTexture = window.get_texture();
let [width, height] = windowTexture.get_size();
let [width, height] = window.get_size();
let scale = Math.min(1.0, size / width, size / height);
return new Clutter.Clone({ source: windowTexture,
return new Clutter.Clone({ source: window,
width: width * scale,
height: height * scale,
x_align: Clutter.ActorAlign.CENTER,

View File

@ -67,7 +67,7 @@ const Animation = new Lang.Class({
},
_animationsLoaded: function() {
this._isLoaded = true;
this._isLoaded = this._animations.get_n_children() > 0;
if (this._isPlaying)
this.play();

View File

@ -210,6 +210,14 @@ const BaseAppView = new Lang.Class({
},
animate: function(animationDirection, onComplete) {
if (onComplete) {
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
function () {
this._grid.disconnect(animationDoneId);
onComplete();
}));
}
if (animationDirection == IconGrid.AnimationDirection.IN) {
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
function() {
@ -225,14 +233,6 @@ const BaseAppView = new Lang.Class({
} else {
this._doSpringAnimation(animationDirection);
}
if (onComplete) {
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
function () {
this._grid.disconnect(animationDoneId);
onComplete();
}));
}
},
animateSwitch: function(animationDirection) {
@ -899,6 +899,8 @@ const ControlsBoxLayout = Lang.Class({
const ViewStackLayout = new Lang.Class({
Name: 'ViewStackLayout',
Extends: Clutter.BinLayout,
Signals: { 'allocated-size-changed': { param_types: [GObject.TYPE_INT,
GObject.TYPE_INT] } },
vfunc_allocate: function (actor, box, flags) {
let availWidth = box.x2 - box.x1;
@ -909,7 +911,6 @@ const ViewStackLayout = new Lang.Class({
this.parent(actor, box, flags);
}
});
Signals.addSignalMethods(ViewStackLayout.prototype);
const AppDisplay = new Lang.Class({
Name: 'AppDisplay',
@ -1010,7 +1011,7 @@ const AppDisplay = new Lang.Class({
},
animate: function(animationDirection, onComplete) {
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
// Animate controls opacity using iconGrid animation time, since
// it will be the time the AllView or FrequentView takes to show

View File

@ -10,8 +10,10 @@ const RENAMED_DESKTOP_IDS = {
'baobab.desktop': 'org.gnome.baobab.desktop',
'cheese.desktop': 'org.gnome.Cheese.desktop',
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
'gcalctool.desktop': 'gnome-calculator.desktop',
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
'geary.desktop': 'org.gnome.Geary.desktop',
'gedit.desktop': 'org.gnome.gedit.desktop',
'glchess.desktop': 'gnome-chess.desktop',
'glines.desktop': 'five-or-more.desktop',
@ -19,6 +21,7 @@ const RENAMED_DESKTOP_IDS = {
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnobots2.desktop': 'gnome-robots.desktop',
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
@ -56,12 +59,14 @@ const AppFavorites = new Lang.Class({
reload: function() {
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
let appSys = Shell.AppSystem.get_default();
// Map old desktop file names to the current ones
let updated = false;
ids = ids.map(function (id) {
let newId = RENAMED_DESKTOP_IDS[id];
if (newId !== undefined) {
if (newId !== undefined &&
appSys.lookup_app(newId) != null) {
updated = true;
return newId;
}
@ -71,7 +76,6 @@ const AppFavorites = new Lang.Class({
if (updated)
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
let appSys = Shell.AppSystem.get_default();
let apps = ids.map(function (id) {
return appSys.lookup_app(id);
}).filter(function (app) {

View File

@ -142,7 +142,6 @@ const BackgroundCache = new Lang.Class({
Name: 'BackgroundCache',
_init: function() {
this._pendingFileLoads = [];
this._fileMonitors = {};
this._backgroundSources = {};
this._animations = {};
@ -255,7 +254,8 @@ const Background = new Lang.Class({
this._loadAnimation(this._animation.file);
}));
LoginManager.getLoginManager().connect('prepare-for-sleep',
let loginManager = LoginManager.getLoginManager();
this._prepareForSleepId = loginManager.connect('prepare-for-sleep',
(lm, aboutToSuspend) => {
if (aboutToSuspend)
return;
@ -284,6 +284,10 @@ const Background = new Lang.Class({
this._clock.disconnect(this._timezoneChangedId);
this._timezoneChangedId = 0;
if (this._prepareForSleepId != 0)
LoginManager.getLoginManager().disconnect(this._prepareForSleepId);
this._prepareForSleepId = 0;
if (this._settingsChangedSignalId != 0)
this._settings.disconnect(this._settingsChangedSignalId);
this._settingsChangedSignalId = 0;
@ -377,11 +381,9 @@ const Background = new Lang.Class({
let cache = Meta.BackgroundImageCache.get_default();
let numPendingImages = files.length;
let images = [];
for (let i = 0; i < files.length; i++) {
this._watchFile(files[i]);
let image = cache.load(files[i]);
images.push(image);
if (image.is_loaded()) {
numPendingImages--;
if (numPendingImages == 0)

View File

@ -20,7 +20,7 @@ const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
const SHOW_WEEKDATE_KEY = 'show-weekdate';
const ELLIPSIS_CHAR = '\u2026';
const MESSAGE_ICON_SIZE = 32;
const MESSAGE_ICON_SIZE = 16;
// alias to prevent xgettext from picking up strings translated in GTK+
const gtk30_ = Gettext_gtk30.gettext;
@ -706,6 +706,14 @@ const EventMessage = new Lang.Class({
this._date = date;
this.parent(this._formatEventTime(), event.summary);
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
this.setIcon(this._icon);
this.actor.connect('style-changed', () => {
let iconVisible = this.actor.get_parent().has_style_pseudo_class('first-child');
this._icon.opacity = (iconVisible ? 255 : 0);
});
},
_formatEventTime: function() {
@ -811,7 +819,16 @@ const EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', Lang.bind(this, this._reloadEvents));
this._eventSource = new EmptyEventSource();
this.parent('');
this.parent();
this._title = new St.Button({ style_class: 'events-section-title',
label: '',
x_align: St.Align.START,
can_focus: true });
this.actor.insert_child_below(this._title, null);
this._title.connect('clicked', Lang.bind(this, this._onTitleClicked));
this._title.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._appInstalledChanged));
@ -832,10 +849,10 @@ const EventsSection = new Lang.Class({
},
_updateTitle: function() {
if (isToday(this._date)) {
this._title.label = _("Events");
this._title.visible = !isToday(this._date);
if (!this._title.visible)
return;
}
let dayFormat;
let now = new Date();
@ -897,7 +914,8 @@ const EventsSection = new Lang.Class({
},
_onTitleClicked: function() {
this.parent();
Main.overview.hide();
Main.panel.closeCalendar();
let app = this._getCalendarApp();
if (app.get_id() == 'evolution.desktop')
@ -928,7 +946,7 @@ const NotificationSection = new Lang.Class({
Extends: MessageList.MessageListSection,
_init: function() {
this.parent(_("Notifications"));
this.parent();
this._sources = new Map();
this._nUrgent = 0;
@ -946,10 +964,14 @@ const NotificationSection = new Lang.Class({
!Main.sessionMode.isGreeter;
},
_createTimeLabel: function() {
let label = Util.createTimeLabel(new Date());
label.style_class = 'event-time',
label.x_align = Clutter.ActorAlign.END;
_createTimeLabel: function(datetime) {
let label = new St.Label({ style_class: 'event-time',
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.END });
label.connect('notify::mapped', () => {
if (label.mapped)
label.text = Util.formatTimeSpan(datetime);
});
return label;
},
@ -970,13 +992,13 @@ const NotificationSection = new Lang.Class({
_onNotificationAdded: function(source, notification) {
let message = new NotificationMessage(notification);
message.setSecondaryActor(this._createTimeLabel());
message.setSecondaryActor(this._createTimeLabel(notification.datetime));
let isUrgent = notification.urgency == MessageTray.Urgency.CRITICAL;
let updatedId = notification.connect('updated', Lang.bind(this,
function() {
message.setSecondaryActor(this._createTimeLabel());
message.setSecondaryActor(this._createTimeLabel(notification.datetime));
this.moveMessage(message, isUrgent ? 0 : this._nUrgent, this.actor.mapped);
}));
let destroyId = notification.connect('destroy', Lang.bind(this,
@ -1017,26 +1039,8 @@ const NotificationSection = new Lang.Class({
message.notification.acknowledged = true;
},
_onTitleClicked: function() {
this.parent();
let app = Shell.AppSystem.get_default().lookup_app('gnome-notifications-panel.desktop');
if (!app) {
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
return;
}
app.activate();
},
_shouldShow: function() {
return !this.empty && isToday(this._date);
},
_sync: function() {
this.parent();
this._title.reactive = Main.sessionMode.allowSettings;
}
});
@ -1098,12 +1102,26 @@ const CalendarMessageList = new Lang.Class({
this._placeholder = new Placeholder();
this.actor.add_actor(this._placeholder.actor);
let box = new St.BoxLayout({ vertical: true,
x_expand: true, y_expand: true });
this.actor.add_actor(box);
this._scrollView = new St.ScrollView({ style_class: 'vfade',
overlay_scrollbars: true,
x_expand: true, y_expand: true,
x_fill: true, y_fill: true });
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this.actor.add_actor(this._scrollView);
box.add_actor(this._scrollView);
this._clearButton = new St.Button({ style_class: 'message-list-clear-button button',
label: _("Clear All"),
can_focus: true });
this._clearButton.set_x_align(Clutter.ActorAlign.END);
this._clearButton.connect('clicked', () => {
let sections = [...this._sections.keys()];
sections.forEach((s) => { s.clear(); });
});
box.add_actor(this._clearButton);
this._sectionList = new St.BoxLayout({ style_class: 'message-list-sections',
vertical: true,
@ -1129,6 +1147,7 @@ const CalendarMessageList = new Lang.Class({
destroyId: 0,
visibleId: 0,
emptyChangedId: 0,
canClearChangedId: 0,
keyFocusId: 0
};
obj.destroyId = section.actor.connect('destroy', Lang.bind(this,
@ -1139,6 +1158,8 @@ const CalendarMessageList = new Lang.Class({
Lang.bind(this, this._sync));
obj.emptyChangedId = section.connect('empty-changed',
Lang.bind(this, this._sync));
obj.canClearChangedId = section.connect('can-clear-changed',
Lang.bind(this, this._sync));
obj.keyFocusId = section.connect('key-focus-in',
Lang.bind(this, this._onKeyFocusIn));
@ -1152,6 +1173,7 @@ const CalendarMessageList = new Lang.Class({
section.actor.disconnect(obj.destroyId);
section.actor.disconnect(obj.visibleId);
section.disconnect(obj.emptyChangedId);
section.disconnect(obj.canClearChangedId);
section.disconnect(obj.keyFocusId);
this._sections.delete(section);
@ -1172,10 +1194,16 @@ const CalendarMessageList = new Lang.Class({
if (!visible)
return;
let showPlaceholder = sections.every(function(s) {
let empty = sections.every(function(s) {
return s.empty || !s.actor.visible;
});
this._placeholder.actor.visible = showPlaceholder;
this._placeholder.actor.visible = empty;
this._clearButton.visible = !empty;
let canClear = sections.some(function(s) {
return s.canClear && s.actor.visible;
});
this._clearButton.reactive = canClear;
},
setEventSource: function(eventSource) {

View File

@ -615,6 +615,14 @@ const NetworkAgent = new Lang.Class({
this._vpnRequests = { };
this._notifications = { };
this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
try {
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
} catch(e) {
log('Failed to create monitor for VPN plugin dir: ' + e.message);
}
this._native.connect('new-request', Lang.bind(this, this._newRequest));
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
@ -765,9 +773,8 @@ const NetworkAgent = new Lang.Class({
this._vpnCacheBuilt = true;
this._vpnBinaries = { };
let dir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
try {
let fileEnum = dir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
let info;
while ((info = fileEnum.next_file(null))) {
@ -777,7 +784,7 @@ const NetworkAgent = new Lang.Class({
try {
let keyfile = new GLib.KeyFile();
keyfile.load_from_file(dir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
let service = keyfile.get_string('VPN Connection', 'service');
let binary = keyfile.get_string('GNOME', 'auth-dialog');
let externalUIMode = false;
@ -810,7 +817,7 @@ const NetworkAgent = new Lang.Class({
}
} catch(e) {
log('Error \'%s\' while processing VPN keyfile \'%s\''.
format(e.message, dir.get_child(name).get_path()));
format(e.message, this._pluginDir.get_child(name).get_path()));
continue;
}
}

View File

@ -298,7 +298,7 @@ const AuthenticationDialog = new Lang.Class({
* requested authentication was not gained; this can happen
* because of an authentication error (like invalid password),
* for instance. */
this._errorMessageLabel.set_text(_("Sorry, that didn\'t work. Please try again."));
this._errorMessageLabel.set_text(_("Sorry, that didnt work. Please try again."));
this._errorMessageLabel.show();
this._infoMessageLabel.hide();
this._nullMessageLabel.hide();

View File

@ -670,6 +670,8 @@ const ChatNotification = new Lang.Class({
styles: styles,
timestamp: message.timestamp,
noTimestamp: noTimestamp });
this.update(this.title, this.bannerBodyText,
{ datetime: GLib.DateTime.new_from_unix_local (message.timestamp) });
},
_filterMessages: function() {

View File

@ -8,6 +8,7 @@ const Gtk = imports.gi.Gtk;
const GWeather = imports.gi.GWeather;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Pango = imports.gi.Pango;
const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter;
const Shell = imports.gi.Shell;
@ -20,6 +21,7 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Calendar = imports.ui.calendar;
const Weather = imports.misc.weather;
function _isToday(date) {
let now = new Date();
@ -36,7 +38,7 @@ const TodayButton = new Lang.Class({
// on the current date can be confusing. So don't make the button reactive
// until the selected date changes.
this.actor = new St.Button({ style_class: 'datemenu-today-button',
x_align: St.Align.START,
x_expand: true, x_align: St.Align.START,
can_focus: true,
reactive: false
});
@ -77,7 +79,7 @@ const TodayButton = new Lang.Class({
* below the time in the shell; it should combine the weekday and the
* date, e.g. "Tuesday February 17 2015".
*/
let dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
this.actor.accessible_name = date.toLocaleFormat(dateFormat);
}
});
@ -87,9 +89,7 @@ const WorldClocksSection = new Lang.Class({
_init: function() {
this._clock = new GnomeDesktop.WallClock();
this._settings = null;
this._clockNotifyId = 0;
this._changedId = 0;
this._locations = [];
@ -98,8 +98,7 @@ const WorldClocksSection = new Lang.Class({
can_focus: true });
this.actor.connect('clicked', Lang.bind(this,
function() {
let app = this._getClockApp();
app.activate();
this._clockAppMon.activateApp();
Main.overview.hide();
Main.panel.closeCalendar();
@ -112,40 +111,25 @@ const WorldClocksSection = new Lang.Class({
this.actor.child = this._grid;
Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._sync));
this._clockAppMon = new Util.AppSettingsMonitor('org.gnome.clocks.desktop',
'org.gnome.clocks');
this._clockAppMon.connect('available-changed',
Lang.bind(this, this._sync));
this._clockAppMon.watchSetting('world-clocks',
Lang.bind(this, this._clocksChanged));
this._sync();
},
_getClockApp: function() {
return Shell.AppSystem.get_default().lookup_app('org.gnome.clocks.desktop');
},
_sync: function() {
this.actor.visible = (this._getClockApp() != null);
if (this.actor.visible) {
if (!this._settings) {
this._settings = new Gio.Settings({ schema_id: 'org.gnome.clocks' });
this._changedId =
this._settings.connect('changed::world-clocks',
Lang.bind(this, this._clocksChanged));
this._clocksChanged();
}
} else {
if (this._settings)
this._settings.disconnect(this._changedId);
this._settings = null;
this._changedId = 0;
}
this.actor.visible = this._clockAppMon.available;
},
_clocksChanged: function() {
_clocksChanged: function(settings) {
this._grid.destroy_all_children();
this._locations = [];
let world = GWeather.Location.get_world();
let clocks = this._settings.get_value('world-clocks').deep_unpack();
let clocks = settings.get_value('world-clocks').deep_unpack();
for (let i = 0; i < clocks.length; i++) {
let l = world.deserialize(clocks[i].location);
this._locations.push({ location: l });
@ -210,6 +194,133 @@ const WorldClocksSection = new Lang.Class({
}
});
const WeatherSection = new Lang.Class({
Name: 'WeatherSection',
_init: function() {
this._weatherClient = new Weather.WeatherClient();
this.actor = new St.Button({ style_class: 'weather-button',
x_fill: true,
can_focus: true });
this.actor.connect('clicked', () => {
this._weatherClient.activateApp();
Main.overview.hide();
Main.panel.closeCalendar();
});
this.actor.connect('notify::mapped', () => {
if (this.actor.mapped)
this._weatherClient.update();
});
let box = new St.BoxLayout({ style_class: 'weather-box',
vertical: true });
this.actor.child = box;
box.add_child(new St.Label({ style_class: 'weather-header',
x_align: Clutter.ActorAlign.START,
text: _("Weather") }));
this._conditionsLabel = new St.Label({ style_class: 'weather-conditions',
x_align: Clutter.ActorAlign.START });
this._conditionsLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._conditionsLabel.clutter_text.line_wrap = true;
box.add_child(this._conditionsLabel);
this._weatherClient.connect('changed', Lang.bind(this, this._sync));
this._sync();
},
_getSummary: function(info) {
let summary = info.get_conditions();
if (summary == '-')
return info.get_sky();
return summary;
},
_sameSummary: function(info1, info2) {
let [ok1, phenom1, qualifier1] = info1.get_value_conditions();
let [ok2, phenom2, qualifier2] = info2.get_value_conditions();
if (ok1 || ok2)
return ok1 == ok2 && phenom1 == phenom2 && qualifier1 == qualifier2;
let [, sky1] = info1.get_value_sky();
let [, sky2] = info2.get_value_sky();
return sky1 == sky2;
},
_getSummaryText: function() {
let info = this._weatherClient.info;
let forecasts = info.get_forecast_list();
if (forecasts.length == 0) // No forecasts, just current conditions
return '%s.'.format(this._getSummary(info));
let current = info;
let summaries = [this._getSummary(info)];
for (let i = 0; i < forecasts.length; i++) {
let [ok, timestamp] = forecasts[i].get_value_update();
if (!_isToday(new Date(timestamp * 1000)))
continue; // Ignore forecasts from other days
if (this._sameSummary(current, forecasts[i]))
continue; // Ignore consecutive runs of equal summaries
current = forecasts[i];
if (summaries.push(this._getSummary(current)) == 3)
break; // Use a maximum of three summaries
}
let fmt;
switch(summaries.length) {
/* Translators: %s is a weather condition like "Clear sky"; see
libgweather for the possible condition strings. If at all
possible, the sentence should match the grammatical case etc. of
the inserted conditions. */
case 1: fmt = _("%s all day."); break;
/* Translators: %s is a weather condition like "Clear sky"; see
libgweather for the possible condition strings. If at all
possible, the sentence should match the grammatical case etc. of
the inserted conditions. */
case 2: fmt = _("%s, then %s later."); break;
/* Translators: %s is a weather condition like "Clear sky"; see
libgweather for the possible condition strings. If at all
possible, the sentence should match the grammatical case etc. of
the inserted conditions. */
case 3: fmt = _("%s, then %s, followed by %s later."); break;
}
return String.prototype.format.apply(fmt, summaries);
},
_getLabelText: function() {
if (this._weatherClient.loading)
return _("Loading…");
let info = this._weatherClient.info;
if (info.is_valid())
return this._getSummaryText() + ' ' +
/* Translators: %s is a temperature with unit, e.g. "23℃" */
_("Feels like %s.").format(info.get_apparent());
if (info.network_error())
return _("Go online for weather information");
return _("Weather information is currently unavailable");
},
_sync: function() {
this.actor.visible = this._weatherClient.available;
if (!this.actor.visible)
return;
this._conditionsLabel.text = this._getLabelText();
}
});
const MessagesIndicator = new Lang.Class({
Name: 'MessagesIndicator',
@ -297,14 +408,38 @@ const FreezableBinLayout = new Lang.Class({
vfunc_get_preferred_width: function(container, forHeight) {
if (!this._frozen || this._savedWidth.some(isNaN))
this._savedWidth = this.parent(container, forHeight);
return this.parent(container, forHeight);
return this._savedWidth;
},
vfunc_get_preferred_height: function(container, forWidth) {
if (!this._frozen || this._savedHeight.some(isNaN))
this._savedHeight = this.parent(container, forWidth);
return this.parent(container, forWidth);
return this._savedHeight;
},
vfunc_allocate: function(container, allocation, flags) {
this.parent(container, allocation, flags);
let [width, height] = allocation.get_size();
this._savedWidth = [width, width];
this._savedHeight = [height, height];
}
});
const CalendarColumnLayout = new Lang.Class({
Name: 'CalendarColumnLayout',
Extends: Clutter.BoxLayout,
_init(actor) {
this.parent({ orientation: Clutter.Orientation.VERTICAL });
this._calActor = actor;
},
vfunc_get_preferred_width: function(container, forHeight) {
if (!this._calActor || this._calActor.get_parent() != container)
return this.parent(container, forHeight);
return this._calActor.get_preferred_width(forHeight);
}
});
@ -364,14 +499,16 @@ const DateMenuButton = new Lang.Class({
hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
// Fill up the second column
vbox = new St.BoxLayout({ style_class: 'datemenu-calendar-column',
vertical: true });
let boxLayout = new CalendarColumnLayout(this._calendar.actor);
vbox = new St.Widget({ style_class: 'datemenu-calendar-column',
layout_manager: boxLayout });
boxLayout.hookup_style(vbox);
hbox.add(vbox);
this._date = new TodayButton(this._calendar);
vbox.add_actor(this._date.actor);
vbox.add(this._calendar.actor);
vbox.add_actor(this._calendar.actor);
this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade',
x_expand: true, x_fill: true,
@ -386,6 +523,8 @@ const DateMenuButton = new Lang.Class({
this._clocksItem = new WorldClocksSection();
displaysBox.add(this._clocksItem.actor, { x_fill: true });
this._weatherItem = new WeatherSection();
displaysBox.add(this._weatherItem.actor, { x_fill: true });
// Done with hbox for calendar and event list

View File

@ -14,6 +14,7 @@ const DRAG_DISTANCE = 80;
const EdgeDragAction = new Lang.Class({
Name: 'EdgeDragAction',
Extends: Clutter.GestureAction,
Signals: { 'activated': {} },
_init : function(side, allowedModes) {
this.parent();
@ -81,4 +82,3 @@ const EdgeDragAction = new Lang.Class({
this.emit('activated');
}
});
Signals.addSignalMethods(EdgeDragAction.prototype);

View File

@ -457,7 +457,6 @@ const EndSessionDialog = new Lang.Class({
_setLabelText(this._descriptionLabel, description);
_setLabelText(this._subjectLabel, subject);
let dialogContent = DialogContent[this._type];
if (dialogContent.iconName) {
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
icon_size: _DIALOG_ICON_SIZE,

View File

@ -1,6 +1,8 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
imports.gi.versions.Clutter = '1.0';
const Config = imports.misc.config;
imports.gi.versions.Clutter = Config.LIBMUTTER_API_VERSION;
imports.gi.versions.Gio = '2.0';
imports.gi.versions.Gdk = '3.0';
imports.gi.versions.GdkPixbuf = '2.0';

View File

@ -252,7 +252,7 @@ const InstallExtensionDialog = new Lang.Class({
return;
}
invocation.return_value(GLib.Variant.new('(s)', 'successful'));
invocation.return_value(GLib.Variant.new('(s)', ['successful']));
}
_httpSession.queue_message(message, Lang.bind(this, function(session, message) {

View File

@ -38,6 +38,7 @@ const connect = Lang.bind(_signals, _signals.connect);
const disconnect = Lang.bind(_signals, _signals.disconnect);
const ENABLED_EXTENSIONS_KEY = 'enabled-extensions';
const DISABLE_USER_EXTENSIONS_KEY = 'disable-user-extensions';
const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validation';
var initted = false;
@ -238,11 +239,16 @@ function initExtension(uuid) {
}
function getEnabledExtensions() {
let extensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
if (!Array.isArray(Main.sessionMode.enabledExtensions))
let extensions;
if (Array.isArray(Main.sessionMode.enabledExtensions))
extensions = Main.sessionMode.enabledExtensions;
else
extensions = [];
if (global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY))
return extensions;
return Main.sessionMode.enabledExtensions.concat(extensions);
return extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY));
}
function onEnabledExtensionsChanged() {
@ -288,6 +294,7 @@ function _onVersionValidationChanged() {
function _loadExtensions() {
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
enabledExtensions = getEnabledExtensions();

View File

@ -19,6 +19,7 @@ const CandidateArea = new Lang.Class({
_init: function() {
this.actor = new St.BoxLayout({ vertical: true,
reactive: true,
visible: false });
this._candidateBoxes = [];
for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) {
@ -39,6 +40,19 @@ const CandidateArea = new Lang.Class({
}));
}
this.actor.connect('scroll-event', Lang.bind(this, function(actor, event) {
let direction = event.get_scroll_direction();
switch(direction) {
case Clutter.ScrollDirection.UP:
this.emit('cursor-up');
break;
case Clutter.ScrollDirection.DOWN:
this.emit('cursor-down');
break;
};
return Clutter.EVENT_PROPAGATE;
}));
this._buttonBox = new St.BoxLayout({ style_class: 'candidate-page-button-box' });
this._previousButton = new St.Button({ style_class: 'candidate-page-button candidate-page-button-previous button' });
@ -144,6 +158,14 @@ const CandidatePopup = new Lang.Class({
this._candidateArea.connect('next-page', Lang.bind(this, function() {
this._panelService.page_down();
}));
this._candidateArea.connect('cursor-up', Lang.bind(this, function() {
this._panelService.cursor_up();
}));
this._candidateArea.connect('cursor-down', Lang.bind(this, function() {
this._panelService.cursor_down();
}));
this._candidateArea.connect('candidate-clicked', Lang.bind(this, function(ca, index, button, state) {
this._panelService.candidate_clicked(index, button, state);
}));

View File

@ -26,6 +26,7 @@ const ModalDialog = imports.ui.modalDialog;
const OsdWindow = imports.ui.osdWindow;
const OsdMonitorLabeler = imports.ui.osdMonitorLabeler;
const Overview = imports.ui.overview;
const PadOsd = imports.ui.padOsd;
const Panel = imports.ui.panel;
const Params = imports.misc.params;
const RunDialog = imports.ui.runDialog;
@ -61,6 +62,7 @@ let screenShield = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let ctrlAltTabManager = null;
let padOsdService = null;
let osdWindowManager = null;
let osdMonitorLabeler = null;
let sessionMode = null;
@ -155,6 +157,7 @@ function _initializeUI() {
// working until it's updated.
uiGroup = layoutManager.uiGroup;
padOsdService = new PadOsd.PadOsdService();
screencastService = new Screencast.ScreencastService();
xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();

View File

@ -318,6 +318,7 @@ const Message = new Lang.Class({
this._iconBin = new St.Bin({ style_class: 'message-icon-bin',
y_expand: true,
y_align: St.Align.START,
visible: false });
hbox.add_actor(this._iconBin);
@ -331,18 +332,18 @@ const Message = new Lang.Class({
let titleBox = new St.BoxLayout();
contentBox.add_actor(titleBox);
this.titleLabel = new St.Label({ style_class: 'message-title',
x_expand: true,
x_align: Clutter.ActorAlign.START });
this.titleLabel = new St.Label({ style_class: 'message-title' });
this.setTitle(title);
titleBox.add_actor(this.titleLabel);
this._secondaryBin = new St.Bin({ style_class: 'message-secondary-bin' });
this._secondaryBin = new St.Bin({ style_class: 'message-secondary-bin',
x_expand: true, y_expand: true,
x_fill: true, y_fill: true });
titleBox.add_actor(this._secondaryBin);
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic',
icon_size: 16 });
this._closeButton = new St.Button({ child: closeIcon, visible: false });
this._closeButton = new St.Button({ child: closeIcon, opacity: 0 });
titleBox.add_actor(this._closeButton);
this._bodyStack = new St.Widget({ x_expand: true });
@ -493,9 +494,8 @@ const Message = new Lang.Class({
},
_sync: function() {
let hovered = this.actor.hover;
this._closeButton.visible = hovered && this.canClose();
this._secondaryBin.visible = !hovered;
let visible = this.actor.hover && this.canClose();
this._closeButton.opacity = visible ? 255 : 0;
},
_onClicked: function() {
@ -520,32 +520,10 @@ Signals.addSignalMethods(Message.prototype);
const MessageListSection = new Lang.Class({
Name: 'MessageListSection',
_init: function(title) {
_init: function() {
this.actor = new St.BoxLayout({ style_class: 'message-list-section',
clip_to_allocation: true,
x_expand: true, vertical: true });
let titleBox = new St.BoxLayout({ style_class: 'message-list-section-title-box' });
this.actor.add_actor(titleBox);
this._title = new St.Button({ style_class: 'message-list-section-title',
label: title,
can_focus: true,
x_expand: true,
x_align: St.Align.START });
titleBox.add_actor(this._title);
this._title.connect('clicked', Lang.bind(this, this._onTitleClicked));
this._title.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic' });
this._closeButton = new St.Button({ style_class: 'message-list-section-close',
child: closeIcon,
accessible_name: _("Clear section"),
can_focus: true });
this._closeButton.set_x_align(Clutter.ActorAlign.END);
titleBox.add_actor(this._closeButton);
this._closeButton.connect('clicked', Lang.bind(this, this.clear));
this._list = new St.BoxLayout({ style_class: 'message-list-section-list',
vertical: true });
@ -563,14 +541,10 @@ const MessageListSection = new Lang.Class({
this._messages = new Map();
this._date = new Date();
this.empty = true;
this.canClear = false;
this._sync();
},
_onTitleClicked: function() {
Main.overview.hide();
Main.panel.closeCalendar();
},
_onKeyFocusIn: function(actor) {
this.emit('key-focus-in', actor);
},
@ -719,7 +693,13 @@ const MessageListSection = new Lang.Class({
if (changed)
this.emit('empty-changed');
this._closeButton.visible = this._canClear();
let canClear = this._canClear();
changed = this.canClear !== canClear;
this.canClear = canClear;
if (changed)
this.emit('can-clear-changed');
this.actor.visible = this.allowed && this._shouldShow();
}
});

View File

@ -368,6 +368,7 @@ const Notification = new Lang.Class({
secondaryGIcon: null,
bannerMarkup: false,
clear: false,
datetime: null,
soundName: null,
soundFile: null });
@ -375,6 +376,11 @@ const Notification = new Lang.Class({
this.bannerBodyText = banner;
this.bannerBodyMarkup = params.bannerMarkup;
if (params.datetime)
this.datetime = params.datetime;
else
this.datetime = GLib.DateTime.new_now_local();
if (params.gicon || params.clear)
this.gicon = params.gicon;
@ -535,7 +541,8 @@ const NotificationBanner = new Lang.Class({
_addSecondaryIcon: function() {
if (this.notification.secondaryGIcon) {
let icon = new St.Icon({ gicon: this.notification.secondaryGIcon });
let icon = new St.Icon({ gicon: this.notification.secondaryGIcon,
x_align: Clutter.ActorAlign.END });
this.setSecondaryActor(icon);
}
},

View File

@ -36,6 +36,8 @@ const MprisPlayerIface = '<node> \
<method name="PlayPause" /> \
<method name="Next" /> \
<method name="Previous" /> \
<property name="CanGoNext" type="b" access="read" /> \
<property name="CanGoPrevious" type="b" access="read" /> \
<property name="CanPlay" type="b" access="read" /> \
<property name="Metadata" type="a{sv}" access="read" /> \
<property name="PlaybackStatus" type="s" access="read" /> \
@ -57,7 +59,7 @@ const MediaMessage = new Lang.Class({
this._icon = new St.Icon({ style_class: 'media-message-cover-icon' });
this.setIcon(this._icon);
this.addMediaControl('media-skip-backward-symbolic',
this._prevButton = this.addMediaControl('media-skip-backward-symbolic',
Lang.bind(this, function() {
this._player.previous();
}));
@ -67,7 +69,7 @@ const MediaMessage = new Lang.Class({
this._player.playPause();
}));
this.addMediaControl('media-skip-forward-symbolic',
this._nextButton = this.addMediaControl('media-skip-forward-symbolic',
Lang.bind(this, function() {
this._player.next();
}));
@ -82,6 +84,10 @@ const MediaMessage = new Lang.Class({
Main.panel.closeCalendar();
},
_updateNavButton: function(button, sensitive) {
button.reactive = sensitive;
},
_update: function() {
this.setTitle(this._player.trackArtists.join(', '));
this.setBody(this._player.trackTitle);
@ -99,6 +105,9 @@ const MediaMessage = new Lang.Class({
let iconName = isPlaying ? 'media-playback-pause-symbolic'
: 'media-playback-start-symbolic';
this._playPauseButton.child.icon_name = iconName;
this._updateNavButton(this._prevButton, this._player.canGoPrevious);
this._updateNavButton(this._nextButton, this._player.canGoNext);
}
});
@ -139,10 +148,18 @@ const MprisPlayer = new Lang.Class({
this._playerProxy.PlayPauseRemote();
},
get canGoNext() {
return this._playerProxy.CanGoNext;
},
next: function() {
this._playerProxy.NextRemote();
},
get canGoPrevious() {
return this._playerProxy.CanGoPrevious;
},
previous: function() {
this._playerProxy.PreviousRemote();
},
@ -214,7 +231,7 @@ const MediaSection = new Lang.Class({
Extends: MessageList.MessageListSection,
_init: function() {
this.parent(_("Media"));
this.parent();
this._players = new Map();

View File

@ -186,7 +186,7 @@ const FdoNotificationDaemon = new Lang.Class({
return source;
}
let source = new FdoNotificationDaemonSource(title, pid, sender, ndata ? ndata.hints['desktop-entry'] : null);
source = new FdoNotificationDaemonSource(title, pid, sender, ndata ? ndata.hints['desktop-entry'] : null);
this._sources.push(source);
source.connect('destroy', Lang.bind(this, function() {
@ -600,7 +600,8 @@ const GtkNotificationDaemonNotification = new Lang.Class({
"priority": priority,
"buttons": buttons,
"default-action": defaultAction,
"default-action-target": defaultActionTarget } = notification;
"default-action-target": defaultActionTarget,
"timestamp": time } = notification;
if (priority) {
let urgency = PRIORITY_URGENCY_MAP[priority.unpack()];
@ -623,7 +624,8 @@ const GtkNotificationDaemonNotification = new Lang.Class({
this._defaultActionTarget = defaultActionTarget;
this.update(title.unpack(), body ? body.unpack() : null,
{ gicon: gicon ? Gio.icon_deserialize(gicon) : null });
{ gicon: gicon ? Gio.icon_deserialize(gicon) : null,
datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
},
_activateAction: function(namespacedActionId, target) {
@ -690,6 +692,7 @@ const GtkNotificationDaemonAppSource = new Lang.Class({
throw new InvalidAppError();
this._notifications = {};
this._notificationPending = false;
this.parent(this._app.get_name());
},
@ -702,27 +705,35 @@ const GtkNotificationDaemonAppSource = new Lang.Class({
return new MessageTray.NotificationApplicationPolicy(this._appId);
},
_createApp: function() {
return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath);
_createApp: function(callback) {
return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath, callback);
},
activateAction: function(actionId, target) {
let app = this._createApp();
app.ActivateActionRemote(actionId, target ? [target] : [], getPlatformData());
this._createApp(function (app, error) {
if (error == null)
app.ActivateActionRemote(actionId, target ? [target] : [], getPlatformData());
else
logError(error, 'Failed to activate application proxy');
});
Main.overview.hide();
Main.panel.closeCalendar();
},
open: function() {
let app = this._createApp();
app.ActivateRemote(getPlatformData());
this._createApp(function (app, error) {
if (error == null)
app.ActivateRemote(getPlatformData());
else
logError(error, 'Failed to open application proxy');
});
Main.overview.hide();
Main.panel.closeCalendar();
},
addNotification: function(notificationId, notificationParams, showBanner) {
this._notificationPending = true;
if (this._notifications[notificationId])
this._notifications[notificationId].destroy();
@ -736,6 +747,14 @@ const GtkNotificationDaemonAppSource = new Lang.Class({
this.notify(notification);
else
this.pushNotification(notification);
this._notificationPending = false;
},
destroy: function(reason) {
if (this._notificationPending)
return;
this.parent(reason);
},
removeNotification: function(notificationId) {
@ -847,6 +866,9 @@ const GtkNotificationDaemon = new Lang.Class({
return;
}
let timestamp = GLib.DateTime.new_now_local().to_unix();
notification['timestamp'] = new GLib.Variant('x', timestamp);
source.addNotification(notificationId, notification, true);
invocation.return_value(null);

View File

@ -107,9 +107,9 @@ const Overview = new Lang.Class({
this._overviewCreated = true;
/* Translators: This is the main view to select
activities. See also note for "Activities" string. */
this._overview = new St.BoxLayout({ name: 'overview',
/* Translators: This is the main view to select
activities. See also note for "Activities" string. */
accessible_name: _("Overview"),
vertical: true });
this._overview.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
@ -378,7 +378,7 @@ const Overview = new Lang.Class({
return null;
let window = windows[0];
let clone = new Clutter.Clone({ source: window.get_texture(),
let clone = new Clutter.Clone({ source: window,
x: window.x, y: window.y });
clone.source.connect('destroy', Lang.bind(this, function() {
clone.destroy();

761
js/ui/padOsd.js Normal file
View File

@ -0,0 +1,761 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const Rsvg = imports.gi.Rsvg;
const GObject = imports.gi.GObject;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GDesktopEnums = imports.gi.GDesktopEnums;
const Atk = imports.gi.Atk;
const Cairo = imports.cairo;
const Signals = imports.signals;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const Layout = imports.ui.layout;
const ACTIVE_COLOR = "#729fcf";
const LTR = 0;
const RTL = 1;
const CW = 0;
const CCW = 1;
const UP = 0;
const DOWN = 1;
const KeybindingEntry = new Lang.Class({
Name: 'KeybindingEntry',
_init: function () {
this.actor = new St.Entry({ hint_text: _("New shortcut…"),
style: 'width: 10em' });
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
},
_onCapturedEvent: function (actor, event) {
if (event.type() != Clutter.EventType.KEY_PRESS)
return Clutter.EVENT_PROPAGATE;
let str = Gtk.accelerator_name_with_keycode(null,
event.get_key_symbol(),
event.get_key_code(),
event.get_state());
this.actor.set_text(str);
this.emit('keybinding-edited', str);
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(KeybindingEntry.prototype);
const ActionComboBox = new Lang.Class({
Name: 'ActionComboBox',
_init: function () {
this.actor = new St.Button({ style_class: 'button' });
this.actor.connect('clicked', Lang.bind(this, this._onButtonClicked));
this.actor.set_toggle_mode(true);
let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
spacing: 6 });
let box = new St.Widget({ layout_manager: boxLayout });
this.actor.set_child(box);
this._label = new St.Label({ style_class: 'combo-box-label' });
box.add_child(this._label)
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
icon_name: 'pan-down-symbolic',
accessible_role: Atk.Role.ARROW,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
box.add_child(arrow);
this._editMenu = new PopupMenu.PopupMenu(this.actor, 0, St.Side.TOP);
this._editMenu.connect('menu-closed', Lang.bind(this, function() { this.actor.set_checked(false); }));
this._editMenu.actor.hide();
Main.uiGroup.add_actor(this._editMenu.actor);
this._actionLabels = new Map();
this._actionLabels.set(GDesktopEnums.PadButtonAction.NONE, _("Application defined"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.HELP, _("Show on-screen help"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.SWITCH_MONITOR, _("Switch monitor"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.KEYBINDING, _("Assign keystroke"));
for (let [action, label] of this._actionLabels.entries()) {
let selectedAction = action;
this._editMenu.addAction(label, Lang.bind(this, function() { this._onActionSelected(selectedAction) }));
}
this.setAction(GDesktopEnums.PadButtonAction.NONE);
},
_onActionSelected: function (action) {
this.setAction(action);
this.popdown();
this.emit('action-selected', action);
},
setAction: function (action) {
this._label.set_text(this._actionLabels.get(action));
},
popup: function () {
this._editMenu.open(true);
},
popdown: function () {
this._editMenu.close(true);
},
_onButtonClicked: function () {
if (this.actor.get_checked())
this.popup();
else
this.popdown();
}
});
Signals.addSignalMethods(ActionComboBox.prototype);
const ActionEditor = new Lang.Class({
Name: 'ActionEditor',
_init: function () {
let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
spacing: 12 });
this.actor = new St.Widget({ layout_manager: boxLayout });
this._actionComboBox = new ActionComboBox();
this._actionComboBox.connect('action-selected', Lang.bind(this, this._onActionSelected));
this.actor.add_actor(this._actionComboBox.actor);
this._keybindingEdit = new KeybindingEntry();
this._keybindingEdit.connect('keybinding-edited', Lang.bind(this, this._onKeybindingEdited));
this.actor.add_actor(this._keybindingEdit.actor);
this._doneButton = new St.Button({ label: _("Done"),
style_class: 'button',
x_expand: false});
this._doneButton.connect('clicked', Lang.bind(this, this._onEditingDone));
this.actor.add_actor(this._doneButton);
},
_updateKeybindingEntryState: function () {
if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) {
this._keybindingEdit.actor.set_text(this._currentKeybinding);
this._keybindingEdit.actor.show();
this._keybindingEdit.actor.grab_key_focus();
} else {
this._keybindingEdit.actor.hide();
}
},
setSettings: function (settings) {
this._buttonSettings = settings;
this._currentAction = this._buttonSettings.get_enum('action');
this._currentKeybinding = this._buttonSettings.get_string('keybinding');
this._actionComboBox.setAction(this._currentAction);
this._updateKeybindingEntryState();
},
close: function() {
this._actionComboBox.popdown();
this.actor.hide();
},
_onKeybindingEdited: function (entry, keybinding) {
this._currentKeybinding = keybinding;
},
_onActionSelected: function (menu, action) {
this._currentAction = action;
this._updateKeybindingEntryState();
},
_storeSettings: function () {
if (!this._buttonSettings)
return;
let keybinding = null;
if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING)
keybinding = this._currentKeybinding;
this._buttonSettings.set_enum('action', this._currentAction);
if (keybinding)
this._buttonSettings.set_string('keybinding', keybinding);
else
this._buttonSettings.reset('keybinding');
},
_onEditingDone: function () {
this._storeSettings();
this.close();
this.emit('done');
}
});
Signals.addSignalMethods(ActionEditor.prototype);
const PadDiagram = new Lang.Class({
Name: 'PadDiagram',
Extends: St.DrawingArea,
Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed',
'left-handed', 'Left handed',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
false),
'image': GObject.ParamSpec.string('image', 'image', 'Image',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
null),
'editor-actor': GObject.ParamSpec.object('editor-actor',
'editor-actor',
'Editor actor',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
Clutter.Actor.$gtype) },
_init: function (params) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
let [success, css, etag] = file.load_contents(null);
this._css = css;
this._labels = [];
this._activeButtons = [];
this.parent(params);
},
get left_handed() {
return this._leftHanded;
},
set left_handed(leftHanded) {
this._leftHanded = leftHanded;
},
get image() {
return this._imagePath;
},
set image(imagePath) {
let originalHandle = Rsvg.Handle.new_from_file(imagePath);
let dimensions = originalHandle.get_dimensions();
this._imageWidth = dimensions.width;
this._imageHeight = dimensions.height;
this._imagePath = imagePath;
this._handle = this._composeStyledDiagram();
},
get editor_actor() {
return this._editorActor;
},
set editor_actor(actor) {
actor.hide();
this._editorActor = actor;
this.add_actor(actor);
},
_wrappingSvgHeader: function () {
return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' +
'<style type="text/css">');
},
_wrappingSvgFooter: function () {
return ('</style>' +
'<xi:include href="' + this._imagePath + '" />' +
'</svg>');
},
_cssString: function () {
let css = this._css;
for (let i = 0; i < this._activeButtons.length; i++) {
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
css += ('.' + ch + ' { ' +
' stroke: ' + ACTIVE_COLOR + ' !important; ' +
' fill: ' + ACTIVE_COLOR + ' !important; ' +
'} ');
}
return css;
},
_composeStyledDiagram: function () {
let svgData = '';
if (!GLib.file_test(this._imagePath, GLib.FileTest.EXISTS))
return null;
svgData += this._wrappingSvgHeader();
svgData += this._cssString();
svgData += this._wrappingSvgFooter();
let handle = new Rsvg.Handle();
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
handle.write(svgData);
handle.close();
return handle;
},
_updateDiagramScale: function () {
if (this._handle == null)
return;
[this._actorWidth, this._actorHeight] = this.get_size();
let dimensions = this._handle.get_dimensions();
let scaleX = this._actorWidth / dimensions.width;
let scaleY = this._actorHeight / dimensions.height;
this._scale = Math.min(scaleX, scaleY);
},
_allocateChild: function (child, x, y, direction) {
let [prefHeight, natHeight] = child.get_preferred_height(-1);
let [prefWidth, natWidth] = child.get_preferred_width(natHeight);
let childBox = new Clutter.ActorBox();
if (direction == LTR) {
childBox.x1 = x;
childBox.x2 = x + natWidth;
} else {
childBox.x1 = x - natWidth;
childBox.x2 = x;
}
childBox.y1 = y - natHeight / 2;
childBox.y2 = y + natHeight / 2;
child.allocate(childBox, 0);
},
vfunc_allocate: function (box, flags) {
this.parent(box, flags);
this._updateDiagramScale();
for (let i = 0; i < this._labels.length; i++) {
let [label, action, idx, dir] = this._labels[i];
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
if (this._editorActor && this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(this._editorActor, x, y, arrangement);
}
},
vfunc_repaint: function () {
if (this._handle == null)
return;
if (this._scale == null)
this._updateDiagramScale();
let [width, height] = this.get_surface_size();
let dimensions = this._handle.get_dimensions();
let cr = this.get_context();
cr.save();
cr.translate(width/2, height/2);
cr.scale(this._scale, this._scale);
if (this._leftHanded)
cr.rotate(Math.PI);
cr.translate(-dimensions.width/2, -dimensions.height/2);
this._handle.render_cairo(cr);
cr.restore();
cr.$dispose();
},
_transformPoint: function (x, y) {
if (this._handle == null || this._scale == null)
return [x, y];
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;;
return [Math.round(x), Math.round(y)];
},
_getItemLabelCoords: function (labelName, leaderName) {
if (this._handle == null)
return [false];
let leaderPos, leaderSize, pos;
let found, direction;
[found, pos] = this._handle.get_position_sub('#' + labelName);
if (!found)
return [false];
[found, leaderPos] = this._handle.get_position_sub('#' + leaderName);
[found, leaderSize] = this._handle.get_dimensions_sub('#' + leaderName);
if (!found)
return [false];
if (pos.x > leaderPos.x + leaderSize.width)
direction = LTR;
else
direction = RTL;
if (this._leftHanded) {
direction = 1 - direction;
pos.x = this._imageWidth - pos.x;
pos.y = this._imageHeight - pos.y;
}
let [x, y] = this._transformPoint(pos.x, pos.y)
return [true, x, y, direction];
},
getButtonLabelCoords: function (button) {
let ch = String.fromCharCode('A'.charCodeAt() + button);
let labelName = 'Label' + ch;
let leaderName = 'Leader' + ch;
return this._getItemLabelCoords(labelName, leaderName);
},
getRingLabelCoords: function (number, dir) {
let numStr = number > 0 ? number.toString() : '';
let dirStr = dir == CW ? 'CW' : 'CCW';
let labelName = 'LabelRing' + numStr + dirStr;
let leaderName = 'LeaderRing' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName);
},
getStripLabelCoords: function (number, dir) {
let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == UP ? 'Up' : 'Down';
let labelName = 'LabelStrip' + numStr + dirStr;
let leaderName = 'LeaderStrip' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName);
},
getLabelCoords: function (action, idx, dir) {
if (action == Meta.PadActionType.BUTTON)
return this.getButtonLabelCoords(idx);
else if (action == Meta.PadActionType.RING)
return this.getRingLabelCoords(idx, dir);
else if (action == Meta.PadActionType.STRIP)
return this.getStripLabelCoords(idx, dir);
return [false];
},
_invalidateSvg: function () {
if (this._handle == null)
return;
this._handle = this._composeStyledDiagram();
this.queue_repaint();
},
activateButton: function (button) {
this._activeButtons.push(button);
this._invalidateSvg();
},
deactivateButton: function (button) {
for (let i = 0; i < this._activeButtons.length; i++) {
if (this._activeButtons[i] == button)
this._activeButtons.splice(i, 1);
}
this._invalidateSvg();
},
addLabel: function (label, type, idx, dir) {
this._labels.push([label, type, idx, dir]);
this.add_actor(label);
},
stopEdition: function (str) {
this._editorActor.hide();
if (this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
if (str != null) {
label.set_text(str);
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show();
this._curEdited = null;
}
},
startEdition: function(action, idx, dir) {
let editedLabel;
this.stopEdition();
for (let i = 0; i < this._labels.length; i++) {
let [label, itemAction, itemIdx, itemDir] = this._labels[i];
if (action == itemAction && idx == itemIdx && dir == itemDir) {
this._curEdited = this._labels[i];
editedLabel = label;
break;
}
}
if (this._curEdited == null)
return;
let [found] = this.getLabelCoords(action, idx, dir);
if (!found)
return;
this._editorActor.show();
editedLabel.hide();
}
});
const PadOsd = new Lang.Class({
Name: 'PadOsd',
_init: function (padDevice, settings, imagePath, editionMode, monitorIndex) {
this.padDevice = padDevice;
this._settings = settings;
this._imagePath = imagePath;
this._editionMode = editionMode;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
let deviceManager = Clutter.DeviceManager.get_default();
this._deviceRemovedId = deviceManager.connect('device-removed', Lang.bind(this, function (manager, device) {
// If the device is being removed, destroy the padOsd.
if (device == this.padDevice)
this.destroy();
}));
this.actor = new St.BoxLayout({ style_class: 'pad-osd-window',
x_expand: true,
y_expand: true,
vertical: true,
reactive: true });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
Main.uiGroup.add_actor(this.actor);
this._monitorIndex = monitorIndex;
let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
this.actor.add_constraint(constraint);
this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;',
x_align: Clutter.ActorAlign.CENTER });
this._titleLabel.clutter_text.set_text(padDevice.get_device_name());
this.actor.add_actor(this._titleLabel);
this._tipLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER });
this.actor.add_actor(this._tipLabel);
this._actionEditor = new ActionEditor();
this._actionEditor.connect('done', Lang.bind(this, this._endButtonActionEdition));
this._padDiagram = new PadDiagram({ image: this._imagePath,
left_handed: settings.get_boolean('left-handed'),
editor_actor: this._actionEditor.actor,
x_expand: true,
y_expand: true });
this.actor.add_actor(this._padDiagram);
// FIXME: Fix num buttons.
let i = 0;
for (i = 0; i < 50; i++) {
let [found] = this._padDiagram.getButtonLabelCoords(i);
if (!found)
break;
this._createLabel(Meta.PadActionType.BUTTON, i);
}
for (i = 0; i < padDevice.get_n_rings(); i++) {
this._createLabel(Meta.PadActionType.RING, i, CW);
this._createLabel(Meta.PadActionType.RING, i, CCW);
}
for (i = 0; i < padDevice.get_n_strips(); i++) {
this._createLabel(Meta.PadActionType.STRIP, i, UP);
this._createLabel(Meta.PadActionType.STRIP, i, DOWN);
}
let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER });
this.actor.add_actor(buttonBox);
this._editButton = new St.Button({ label: _("Edit…"),
style_class: 'button',
x_align: Clutter.ActorAlign.CENTER,
can_focus: true });
this._editButton.connect('clicked', Lang.bind(this, function () { this.setEditionMode(true) }));
buttonBox.add_actor(this._editButton);
this._syncEditionMode();
Main.pushModal(this.actor);
},
_createLabel: function (type, number, dir) {
let str = global.display.get_pad_action_label(this.padDevice, type, number);
let label = new St.Label({ text: str ? str : _("None") });
this._padDiagram.addLabel(label, type, number, dir);
},
_onCapturedEvent : function (actor, event) {
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
event.get_source_device() == this.padDevice) {
this._padDiagram.activateButton(event.get_button());
if (this._editionMode)
this._startButtonActionEdition(event.get_button());
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
event.get_source_device() == this.padDevice) {
this._padDiagram.deactivateButton(event.get_button());
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.KEY_PRESS &&
(!this._editionMode || event.get_key_symbol() == Clutter.Escape)) {
if (this._editingButtonAction != null)
this._endButtonActionEdition();
else
this.destroy();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_syncEditionMode: function () {
this._editButton.set_reactive(!this._editionMode);
this._editButton.save_easing_state();
this._editButton.set_easing_duration(200);
this._editButton.set_opacity(this._editionMode ? 128 : 255);
this._editButton.restore_easing_state();
let title;
if (this._editionMode) {
title = _("Press a button to configure");
this._tipLabel.set_text(_("Press Esc to exit"));
} else {
title = this.padDevice.get_device_name();
this._tipLabel.set_text(_("Press any key to exit"));
}
this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>');
},
_endButtonActionEdition: function () {
this._actionEditor.close();
if (this._editingButtonAction != null) {
let str = global.display.get_pad_action_label(this.padDevice,
Meta.PadActionType.BUTTON,
this._editingButtonAction);
this._padDiagram.stopEdition(str ? str : _("None"))
this._editingButtonAction = null;
}
this._editedButtonSettings = null;
},
_startButtonActionEdition: function (button) {
if (this._editingButtonAction == button)
return;
this._endButtonActionEdition();
this._editingButtonAction = button;
let ch = String.fromCharCode('A'.charCodeAt() + button);
let settingsPath = this._settings.path + "button" + ch + '/';
this._editedButtonSettings = Gio.Settings.new_with_path('org.gnome.desktop.peripherals.tablet.pad-button',
settingsPath);
this._actionEditor.setSettings(this._editedButtonSettings);
this._padDiagram.startEdition(Meta.PadActionType.BUTTON, button);
},
setEditionMode: function (editionMode) {
if (this._editionMode == editionMode)
return;
this._editionMode = editionMode;
this._syncEditionMode();
},
destroy: function () {
this.actor.destroy();
},
_onDestroy: function () {
Main.popModal(this.actor);
this._actionEditor.close();
if (this._deviceRemovedId != 0) {
let deviceManager = Clutter.DeviceManager.get_default();
deviceManager.disconnect(this._deviceRemovedId);
this._deviceRemovedId = 0;
}
if (this._capturedEventId != 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this.actor = null;
this.emit('closed');
}
});
Signals.addSignalMethods(PadOsd.prototype);
const PadOsdIface = '<node> \
<interface name="org.gnome.Shell.Wacom.PadOsd"> \
<method name="Show"> \
<arg name="device_node" direction="in" type="o"/> \
<arg name="edition_mode" direction="in" type="b"/> \
</method> \
</interface> \
</node>';
const PadOsdService = new Lang.Class({
Name: 'PadOsdService',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom');
Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
ShowAsync: function(params, invocation) {
let [deviceNode, editionMode] = params;
let deviceManager = Clutter.DeviceManager.get_default();
let devices = deviceManager.list_devices();
let padDevice = null;
devices.forEach(Lang.bind(this, function(device) {
if (deviceNode == device.get_device_node())
padDevice = device;
}));
if (padDevice == null ||
padDevice.get_device_type() != Clutter.InputDeviceType.PAD_DEVICE) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");
return;
}
global.display.request_pad_osd(padDevice, editionMode);
invocation.return_value(null);
}
});
Signals.addSignalMethods(PadOsdService.prototype);

View File

@ -719,9 +719,11 @@ const AggregateMenu = new Lang.Class({
this._system = new imports.ui.status.system.Indicator();
this._screencast = new imports.ui.status.screencast.Indicator();
this._location = new imports.ui.status.location.Indicator();
this._nightLight = new imports.ui.status.nightLight.Indicator();
this._indicators.add_child(this._screencast.indicators);
this._indicators.add_child(this._location.indicators);
this._indicators.add_child(this._nightLight.indicators);
if (this._network) {
this._indicators.add_child(this._network.indicators);
}
@ -745,6 +747,7 @@ const AggregateMenu = new Lang.Class({
this.menu.addMenuItem(this._location.menu);
this.menu.addMenuItem(this._rfkill.menu);
this.menu.addMenuItem(this._power.menu);
this.menu.addMenuItem(this._nightLight.menu);
this.menu.addMenuItem(this._system.menu);
menuLayout.addSizeChild(this._location.menu.actor);

View File

@ -605,6 +605,24 @@ const PopupMenuBase = new Lang.Class({
menuItem.actor.show();
},
moveMenuItem: function(menuItem, position) {
let items = this._getMenuItems();
let i = 0;
while (i < items.length && position > 0) {
if (items[i] != menuItem)
position--;
i++;
}
if (i < items.length) {
if (items[i] != menuItem)
this.box.set_child_below_sibling(menuItem.actor, items[i].actor);
} else {
this.box.set_child_above_sibling(menuItem.actor, null);
}
},
addMenuItem: function(menuItem, position) {
let before_item = null;
if (position == undefined) {
@ -783,6 +801,16 @@ const PopupMenu = new Lang.Class({
break;
}
let state = event.get_state();
// if user has a modifier down (except capslock)
// then don't handle the key press here
state &= ~Clutter.ModifierType.LOCK_MASK;
state &= Clutter.ModifierType.MODIFIER_MASK;
if (state)
return Clutter.EVENT_PROPAGATE;
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.toggle();

View File

@ -274,7 +274,7 @@ const RunDialog = new Lang.Class({
_restart: function() {
if (Meta.is_wayland_compositor()) {
this._showError('Restart is not available on Wayland');
this._showError(_("Restart is not available on Wayland"));
return;
}
this._shouldFadeOut = false;

View File

@ -850,6 +850,7 @@ const ScreenShield = new Lang.Class({
},
_activateFade: function(lightbox, time) {
Main.uiGroup.set_child_above_sibling(lightbox.actor, null);
lightbox.show(time);
if (this._becameActiveId == 0)

View File

@ -380,7 +380,7 @@ const ShellMountPasswordDialog = new Lang.Class({
this.setInitialKeyFocus(this._passwordEntry);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didn\'t work. Please try again.") });
text: _("Sorry, that didnt work. Please try again.") });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
this._errorMessageLabel.hide();

View File

@ -284,6 +284,7 @@ const AppAuthorizer = new Lang.Class({
this.reqAccuracyLevel = reqAccuracyLevel;
this._permStoreProxy = permStoreProxy;
this._maxAccuracyLevel = maxAccuracyLevel;
this._permissions = {};
this._accuracyLevel = GeoclueAccuracyLevel.NONE;
},

View File

@ -40,6 +40,8 @@ const NMAccessPointSecurity = {
WPA2_ENT: 6
};
const MAX_DEVICE_ITEMS = 4;
// small optimization, to avoid using [] all the time
const NM80211Mode = NetworkManager['80211Mode'];
const NM80211ApFlags = NetworkManager['80211ApFlags'];
@ -297,11 +299,22 @@ const NMConnectionSection = new Lang.Class({
let item = this._connectionItems.get(connection.get_uuid());
if (item)
item.updateForConnection(connection);
this._updateForConnection(item, connection);
else
this._addConnection(connection);
},
_updateForConnection: function(item, connection) {
let pos = this._connections.indexOf(connection);
this._connections.splice(pos, 1);
pos = Util.insertSorted(this._connections, connection, Lang.bind(this, this._connectionSortFunction));
this._labelSection.moveMenuItem(item.labelItem, pos);
this._radioSection.moveMenuItem(item.radioItem, pos);
item.updateForConnection(connection);
},
_addConnection: function(connection) {
let item = this._makeConnectionItem(connection);
if (!item)
@ -1418,7 +1431,7 @@ const NMVPNConnectionItem = new Lang.Class({
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
return _("connecting");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
@ -1541,8 +1554,10 @@ const NMVPNSection = new Lang.Class({
item.setActiveConnection(null);
}
vpnConnections.forEach(Lang.bind(this, function(a) {
let item = this._connectionItems.get(a._connection.get_uuid());
item.setActiveConnection(a);
if (a._connection) {
let item = this._connectionItems.get(a._connection.get_uuid());
item.setActiveConnection(a);
}
}));
},
@ -1562,6 +1577,73 @@ const NMVPNSection = new Lang.Class({
});
Signals.addSignalMethods(NMVPNSection.prototype);
const DeviceCategory = new Lang.Class({
Name: 'DeviceCategory',
Extends: PopupMenu.PopupMenuSection,
_init: function(category) {
this.parent();
this._category = category;
this.devices = [];
this.section = new PopupMenu.PopupMenuSection();
this.section.box.connect('actor-added', Lang.bind(this, this._sync));
this.section.box.connect('actor-removed', Lang.bind(this, this._sync));
this.addMenuItem(this.section);
this._summaryItem = new PopupMenu.PopupSubMenuMenuItem('', true);
this._summaryItem.icon.icon_name = this._getSummaryIcon();
this.addMenuItem(this._summaryItem);
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
'gnome-network-panel.desktop');
this._summaryItem.actor.hide();
},
_sync: function() {
let nDevices = this.section.box.get_children().reduce(
function(prev, child) {
return prev + (child.visible ? 1 : 0);
}, 0);
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
this._summaryItem.actor.visible = shouldSummarize;
this.section.actor.visible = !shouldSummarize;
},
_getSummaryIcon: function() {
switch(this._category) {
case NMConnectionCategory.WIRED:
return 'network-wired-symbolic';
case NMConnectionCategory.WIRELESS:
case NMConnectionCategory.WWAN:
return 'network-wireless-symbolic';
}
return '';
},
_getSummaryLabel: function(nDevices) {
switch(this._category) {
case NMConnectionCategory.WIRED:
return ngettext("%s Wired Connection",
"%s Wired Connections",
nDevices).format(nDevices);
case NMConnectionCategory.WIRELESS:
return ngettext("%s Wi-Fi Connection",
"%s Wi-Fi Connections",
nDevices).format(nDevices);
case NMConnectionCategory.WWAN:
return ngettext("%s Modem Connection",
"%s Modem Connections",
nDevices).format(nDevices);
}
return '';
}
});
const NMApplet = new Lang.Class({
Name: 'NMApplet',
Extends: PanelMenu.SystemIndicator,
@ -1605,15 +1687,6 @@ const NMApplet = new Lang.Class({
this._tryLateInit();
},
_createDeviceCategory: function() {
let category = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
};
this.menu.addMenuItem(category.section);
return category;
},
_tryLateInit: function() {
if (!this._client || !this._settings)
return;
@ -1630,9 +1703,13 @@ const NMApplet = new Lang.Class({
this._nmDevices = [];
this._devices = { };
this._devices.wired = this._createDeviceCategory();
this._devices.wireless = this._createDeviceCategory();
this._devices.wwan = this._createDeviceCategory();
let categories = [NMConnectionCategory.WIRED,
NMConnectionCategory.WIRELESS,
NMConnectionCategory.WWAN];
for (let category of categories) {
this._devices[category] = new DeviceCategory(category);
this.menu.addMenuItem(this._devices[category]);
}
this._vpnSection = new NMVPNSection(this._client);
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
@ -1989,7 +2066,7 @@ const NMApplet = new Lang.Class({
// (but in general we should only prompt a portal if we know there is a portal)
if (GLib.getenv('GNOME_SHELL_CONNECTIVITY_TEST') != null)
isPortal = isPortal || this._client.connectivity < NetworkManager.ConnectivityState.FULL;
if (!isPortal)
if (!isPortal || Main.sessionMode.isGreeter)
return;
let path = this._mainConnection.get_path();
@ -2020,13 +2097,24 @@ const NMApplet = new Lang.Class({
},
_updateIcon: function() {
if (!this._client.networking_enabled || !this._mainConnection) {
if (!this._client.networking_enabled) {
this._primaryIndicator.visible = false;
} else {
let dev = this._mainConnection._primaryDevice;
this._primaryIndicator.visible = (dev != null);
if (dev)
let dev = null;
if (this._mainConnection)
dev = this._mainConnection._primaryDevice;
let state = this._client.get_state();
let connected = state == NetworkManager.State.CONNECTED_GLOBAL;
this._primaryIndicator.visible = (dev != null) || connected;
if (dev) {
this._primaryIndicator.icon_name = dev.getIndicatorIcon();
} else if (connected) {
if (this._client.connectivity == NetworkManager.ConnectivityState.FULL)
this._primaryIndicator.icon_name = 'network-wired-symbolic';
else
this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic';
}
}
this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();

View File

@ -0,0 +1,74 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const BUS_NAME = 'org.gnome.SettingsDaemon.Color';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Color';
const ColorInterface = '<node> \
<interface name="org.gnome.SettingsDaemon.Color"> \
<property name="DisabledUntilTomorrow" type="b" access="readwrite"/> \
<property name="NightLightActive" type="b" access="read"/> \
</interface> \
</node>';
const ColorProxy = Gio.DBusProxy.makeProxyWrapper(ColorInterface);
const Indicator = new Lang.Class({
Name: 'NightLightIndicator',
Extends: PanelMenu.SystemIndicator,
_init: function() {
this.parent();
this._indicator = this._addIndicator();
this._indicator.icon_name = 'night-light-symbolic';
this._proxy = new ColorProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
(proxy, error) => {
if (error) {
log(error.message);
return;
}
this._proxy.connect('g-properties-changed',
Lang.bind(this, this._sync));
this._sync();
});
this._item = new PopupMenu.PopupSubMenuMenuItem("", true);
this._item.icon.icon_name = 'night-light-symbolic';
this._disableItem = this._item.menu.addAction('', () => {
this._proxy.DisabledUntilTomorrow = !this._proxy.DisabledUntilTomorrow;
});
this._item.menu.addAction(_("Turn Off"), () => {
let settings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.plugins.color' });
settings.set_boolean('night-light-enabled', false);
});
this._item.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
this.menu.addMenuItem(this._item);
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
this._sync();
},
_sessionUpdated: function() {
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
},
_sync: function() {
let visible = this._proxy.NightLightActive;
let disabled = this._proxy.DisabledUntilTomorrow;
this._item.label.text = disabled ? _("Night Light Disabled")
: _("Night Light On");
this._disableItem.label.text = disabled ? _("Resume")
: _("Disable Until Tomorrow");
this._item.actor.visible = this._indicator.visible = visible;
}
});

View File

@ -48,8 +48,14 @@ const AltSwitcher = new Lang.Class({
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._flipped = false;
this._clickAction = new Clutter.ClickAction();
this._clickAction.connect('long-press', Lang.bind(this, this._onLongPress));
this.actor = new St.Bin();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('notify::mapped', () => { this._flipped = false; });
},
_sync: function() {
@ -58,14 +64,25 @@ const AltSwitcher = new Lang.Class({
if (this._standard.visible && this._alternate.visible) {
let [x, y, mods] = global.get_pointer();
let altPressed = (mods & Clutter.ModifierType.MOD1_MASK) != 0;
childToShow = altPressed ? this._alternate : this._standard;
if (this._flipped)
childToShow = altPressed ? this._standard : this._alternate;
else
childToShow = altPressed ? this._alternate : this._standard;
} else if (this._standard.visible) {
childToShow = this._standard;
} else if (this._alternate.visible) {
childToShow = this._alternate;
}
if (this.actor.get_child() != childToShow) {
let childShown = this.actor.get_child();
if (childShown != childToShow) {
if (childShown) {
if (childShown.fake_release)
childShown.fake_release();
childShown.remove_action(this._clickAction);
}
childToShow.add_action(this._clickAction);
let hasFocus = this.actor.contains(global.stage.get_key_focus());
this.actor.set_child(childToShow);
if (hasFocus)
@ -96,6 +113,16 @@ const AltSwitcher = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
},
_onLongPress: function(action, actor, state) {
if (state == Clutter.LongPressState.QUERY ||
state == Clutter.LongPressState.CANCEL)
return true;
this._flipped = !this._flipped;
this._sync();
return true;
}
});
const Indicator = new Lang.Class({

View File

@ -23,6 +23,7 @@ const EdgeDragAction = imports.ui.edgeDragAction;
const IconGrid = imports.ui.iconGrid;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const PINCH_GESTURE_THRESHOLD = 0.7;
const ViewPage = {
WINDOWS: 1,
@ -51,9 +52,32 @@ function getTermsForSearchString(searchString) {
return terms;
}
const TouchpadShowOverviewAction = new Lang.Class({
Name: 'TouchpadShowOverviewAction',
_init: function(actor) {
actor.connect('captured-event', Lang.bind(this, this._handleEvent));
},
_handleEvent: function(actor, event) {
if (event.type() != Clutter.EventType.TOUCHPAD_PINCH)
return Clutter.EVENT_PROPAGATE;
if (event.get_touchpad_gesture_finger_count() != 3)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END)
this.emit('activated', event.get_gesture_pinch_scale ());
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(TouchpadShowOverviewAction.prototype);
const ShowOverviewAction = new Lang.Class({
Name: 'ShowOverviewAction',
Extends: Clutter.GestureAction,
Signals: { 'activated': {} },
_init : function() {
this.parent();
@ -112,7 +136,6 @@ const ShowOverviewAction = new Lang.Class({
this.emit('activated', areaDiff);
}
});
Signals.addSignalMethods(ShowOverviewAction.prototype);
const ViewSelector = new Lang.Class({
Name: 'ViewSelector',
@ -230,11 +253,16 @@ const ViewSelector = new Lang.Class({
global.stage.add_action(gesture);
gesture = new ShowOverviewAction();
gesture.connect('activated', Lang.bind(this, function(action, areaDiff) {
if (areaDiff < 0.7)
Main.overview.show();
}));
gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated));
global.stage.add_action(gesture);
gesture = new TouchpadShowOverviewAction(global.stage);
gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated));
},
_pinchGestureActivated: function(action, scale) {
if (scale < PINCH_GESTURE_THRESHOLD)
Main.overview.show();
},
_toggleAppsPage: function() {

View File

@ -17,6 +17,7 @@ const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const PadOsd = imports.ui.padOsd;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
@ -32,6 +33,25 @@ const UNDIM_TIME = 0.250;
const DISPLAY_REVERT_TIMEOUT = 20; // in seconds - keep in sync with mutter
const ONE_SECOND = 1000; // in ms
const GSD_WACOM_BUS_NAME = 'org.gnome.SettingsDaemon.Wacom';
const GSD_WACOM_OBJECT_PATH = '/org/gnome/SettingsDaemon/Wacom';
const GsdWacomIface = '<node name="/org/gnome/SettingsDaemon/Wacom"> \
<interface name="org.gnome.SettingsDaemon.Wacom"> \
<method name="SetGroupModeLED"> \
<arg name="device_path" direction="in" type="s"/> \
<arg name="group" direction="in" type="u"/> \
<arg name="mode" direction="in" type="u"/> \
</method> \
<method name="SetOLEDLabels"> \
<arg name="device_path" direction="in" type="s"/> \
<arg name="labels" direction="in" type="as"/> \
</method> \
</interface> \
</node>';
const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
const DisplayChangeDialog = new Lang.Class({
Name: 'DisplayChangeDialog',
Extends: ModalDialog.ModalDialog,
@ -510,7 +530,7 @@ const TouchpadWorkspaceSwitchAction = new Lang.Class({
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_swipe_finger_count() != 4)
if (event.get_touchpad_gesture_finger_count() != 4)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
@ -534,6 +554,7 @@ Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype);
const WorkspaceSwitchAction = new Lang.Class({
Name: 'WorkspaceSwitchAction',
Extends: Clutter.SwipeAction,
Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] } },
_init : function() {
const MOTION_THRESHOLD = 50;
@ -571,11 +592,11 @@ const WorkspaceSwitchAction = new Lang.Class({
this.emit('activated', dir);
}
});
Signals.addSignalMethods(WorkspaceSwitchAction.prototype);
const AppSwitchAction = new Lang.Class({
Name: 'AppSwitchAction',
Extends: Clutter.GestureAction,
Signals: { 'activated': {} },
_init : function() {
this.parent();
@ -637,7 +658,6 @@ const AppSwitchAction = new Lang.Class({
return true;
}
});
Signals.addSignalMethods(AppSwitchAction.prototype);
const ResizePopup = new Lang.Class({
Name: 'ResizePopup',
@ -655,7 +675,7 @@ const ResizePopup = new Lang.Class({
set: function(rect, displayW, displayH) {
/* Translators: This represents the size of a window. The first number is
* the width of the window and the second is the height. */
let text = _("%d x %d").format(displayW, displayH);
let text = _("%d × %d").format(displayW, displayH);
this._label.set_text(text);
this._widget.set_position(rect.x, rect.y);
@ -705,6 +725,7 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
this._shellwm.connect('unminimize', Lang.bind(this, this._unminimizeWindow));
this._shellwm.connect('size-change', Lang.bind(this, this._sizeChangeWindow));
this._shellwm.connect('size-changed', Lang.bind(this, this._sizeChangedWindow));
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
@ -917,6 +938,35 @@ const WindowManager = new Lang.Class({
Lang.bind(this, this._toggleCalendar));
global.display.connect('show-resize-popup', Lang.bind(this, this._showResizePopup));
global.display.connect('show-pad-osd', Lang.bind(this, this._showPadOsd));
global.display.connect('show-osd', Lang.bind(this, function (display, monitorIndex, iconName, label) {
let icon = Gio.Icon.new_for_string(iconName);
Main.osdWindowManager.show(monitorIndex, icon, label, null);
}));
this._gsdWacomProxy = new GsdWacomProxy(Gio.DBus.session, GSD_WACOM_BUS_NAME,
GSD_WACOM_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
global.display.connect('pad-mode-switch', Lang.bind(this, function (display, pad, group, mode) {
let labels = [];
//FIXME: Fix num buttons
for (let i = 0; i < 50; i++) {
let str = display.get_pad_action_label(pad, Meta.PadActionType.BUTTON, i);
labels.push(str ? str: '');
}
if (this._gsdWacomProxy) {
this._gsdWacomProxy.SetOLEDLabelsRemote(pad.get_device_node(), labels);
this._gsdWacomProxy.SetGroupModeLEDRemote(pad.get_device_node(), group, mode);
}
}));
Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
@ -946,7 +996,13 @@ const WindowManager = new Lang.Class({
gesture = new AppSwitchAction();
gesture.connect('activated', Lang.bind(this, this._switchApp));
global.stage.add_action(gesture);
},
_showPadOsd: function (display, device, settings, imagePath, editionMode, monitorIndex) {
this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex);
this._currentPadOsd.connect('closed', Lang.bind(this, function() { this._currentPadOsd = null }));
return this._currentPadOsd.actor;
},
_actionSwitchWorkspace: function(action, direction) {
@ -1073,6 +1129,9 @@ const WindowManager = new Lang.Class({
if (!this._shouldAnimate())
return false;
if (!actor.get_texture())
return false;
let type = actor.meta_window.get_window_type();
return types.indexOf(type) >= 0;
},
@ -1247,37 +1306,17 @@ const WindowManager = new Lang.Class({
return;
}
if (whichChange == Meta.SizeChange.FULLSCREEN)
this._fullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
else if (whichChange == Meta.SizeChange.UNFULLSCREEN)
this._unfullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
if ((whichChange == Meta.SizeChange.FULLSCREEN ||
whichChange == Meta.SizeChange.UNFULLSCREEN) &&
oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._fullscreenAnimation(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
},
_fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = oldFrameRect.x - monitor.x;
actor.translation_y = oldFrameRect.y - monitor.y;
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect) {
this._resizing.push(actor);
_fullscreenAnimation: function(shellwm, actor, oldFrameRect, change) {
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
// Note that the MetaWindow has up to date sizing information for
// the new geometry already.
let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent });
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
@ -1285,10 +1324,28 @@ const WindowManager = new Lang.Class({
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
actor.__fullscreenClone = actorClone;
let rect = change == Meta.SizeChange.FULLSCREEN ? oldFrameRect : null;
let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height;
if (this._clearFullscreenInfo(actor))
this._shellwm.completed_size_change(actor);
actor.__fullscreenInfo = { clone: actorClone,
oldRect: rect };
},
_sizeChangedWindow: function(shellwm, actor) {
if (!actor.__fullscreenInfo)
return;
if (this._resizing.indexOf(actor) != -1)
return;
let actorClone = actor.__fullscreenInfo.clone;
let targetRect = actor.meta_window.get_frame_rect();
let scaleX = targetRect.width / actorClone.width;
let scaleY = targetRect.height / actorClone.height;
this._resizing.push(actor);
// Now scale and fade out the clone
Tweener.addTween(actorClone,
@ -1301,9 +1358,17 @@ const WindowManager = new Lang.Class({
transition: 'easeOutQuad'
});
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
let oldRect = actor.__fullscreenInfo.oldRect;
if (oldRect) {
actor.translation_x = oldRect.x - monitor.x;
actor.translation_y = oldRect.y - monitor.y;
} else {
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
}
// Now set scale the actor to size it as the clone.
// Note that the caller of this function already set a translation
// on the actor.
actor.scale_x = 1 / scaleX;
actor.scale_y = 1 / scaleY;
@ -1329,6 +1394,15 @@ const WindowManager = new Lang.Class({
shellwm.completed_size_change(actor);
},
_clearFullscreenInfo: function(actor) {
if (actor.__fullscreenInfo) {
actor.__fullscreenInfo.clone.destroy();
delete actor.__fullscreenInfo;
return true;
}
return false;
},
_sizeChangeWindowDone: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) {
Tweener.removeTweens(actor);
@ -1336,23 +1410,13 @@ const WindowManager = new Lang.Class({
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
let actorClone = actor.__fullscreenClone;
if (actorClone) {
actorClone.destroy();
delete actor.__fullscreenClone;
}
this._clearFullscreenInfo(actor);
}
},
_sizeChangeWindowOverwritten: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) {
let actorClone = actor.__fullscreenClone;
if (actorClone) {
actorClone.destroy();
delete actor.__fullscreenClone;
}
}
if (this._removeEffect(this._resizing, actor))
this._clearFullscreenInfo(actor);
},
_hasAttachedDialogs: function(window, ignoreWindow) {

View File

@ -111,7 +111,7 @@ const WindowClone = new Lang.Class({
this.metaWindow._delegate = this;
this._workspace = workspace;
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture() });
this._windowClone = new Clutter.Clone({ source: realWindow });
// We expect this.actor to be used for all interaction rather than
// this._windowClone; as the former is reactive and the latter
// is not, this just works for most cases. However, for DND all

View File

@ -39,6 +39,7 @@ js/ui/mpris.js
js/ui/notificationDaemon.js
js/ui/overviewControls.js
js/ui/overview.js
js/ui/padOsd.js
js/ui/panel.js
js/ui/popupMenu.js
js/ui/runDialog.js
@ -52,6 +53,7 @@ js/ui/status/brightness.js
js/ui/status/keyboard.js
js/ui/status/location.js
js/ui/status/network.js
js/ui/status/nightLight.js
js/ui/status/power.js
js/ui/status/rfkill.js
js/ui/status/system.js

View File

@ -1688,7 +1688,7 @@ msgstr "تقويم إيفُليوشِن"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "إيفُليوشن"
msgstr "evolution"
#. translators:
#. * The number of sound outputs on a particular device

2320
po/be.po

File diff suppressed because it is too large Load Diff

433
po/ca.po
View File

@ -4,14 +4,15 @@
# Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>, 2009.
# Jordi Serratosa <jordis@softcatala.cat>, 2012.
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2013, 2014, 2016.
# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2017
#
msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-09-16 21:22+0200\n"
"PO-Revision-Date: 2016-09-16 21:22+0200\n"
"POT-Creation-Date: 2017-02-16 05:51+0100\n"
"PO-Revision-Date: 2017-02-16 06:34+0100\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n"
@ -19,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 1.8.7.1\n"
"X-Generator: Poedit 1.8.9\n"
#: ../js/extensionPrefs/main.js:117
#, javascript-format
@ -27,28 +28,27 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:"
#: ../js/extensionPrefs/main.js:149
msgid "GNOME Shell Extensions"
msgstr "Extensions del GNOME Shell"
msgid "Shell Extensions"
msgstr "Extensions del Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:483
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
#: ../js/gdm/authPrompt.js:149 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145 ../js/ui/components/polkitAgent.js:179
#: ../js/ui/endSessionDialog.js:482 ../js/ui/extensionDownloader.js:195
#: ../js/ui/shellMountOperation.js:399 ../js/ui/status/network.js:939
msgid "Cancel"
msgstr "Cancel·la"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
#: ../js/gdm/authPrompt.js:448
#: ../js/gdm/authPrompt.js:171 ../js/gdm/authPrompt.js:218
#: ../js/gdm/authPrompt.js:450
msgid "Next"
msgstr "Següent"
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
#: ../js/gdm/authPrompt.js:214 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Desbloqueja"
#: ../js/gdm/authPrompt.js:214
#: ../js/gdm/authPrompt.js:216
msgctxt "button"
msgid "Sign In"
msgstr "Entra"
@ -181,56 +181,67 @@ msgstr "%d de %B, a les %l%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%d de %B de %Y, a les %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "Redirecció per l'autenticació web"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: ../js/portalHelper/main.js:67
msgid "Hotspot Login"
msgstr "Inici de sessió al punt d'accés Wi-Fi"
#: ../js/portalHelper/main.js:113
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
msgstr ""
"La connexió a aquest punt d'accés no és segura. Contrasenyes o altre "
"informació que introduïu en aquesta pàgina pot ser vista per persones properes."
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: ../js/ui/accessDialog.js:62 ../js/ui/status/location.js:426
#: ../js/ui/accessDialog.js:62 ../js/ui/status/location.js:427
msgid "Deny Access"
msgstr "Denega l'accés"
#: ../js/ui/accessDialog.js:63 ../js/ui/status/location.js:429
#: ../js/ui/accessDialog.js:63 ../js/ui/status/location.js:430
msgid "Grant Access"
msgstr "Permetre l'accés"
#: ../js/ui/appDisplay.js:794
#: ../js/ui/appDisplay.js:806
msgid "Frequently used applications will appear here"
msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:927
msgid "Frequent"
msgstr "Freqüent"
#: ../js/ui/appDisplay.js:921
#: ../js/ui/appDisplay.js:934
msgid "All"
msgstr "Totes"
#: ../js/ui/appDisplay.js:1853
#: ../js/ui/appDisplay.js:1892
msgid "New Window"
msgstr "Finestra nova"
#: ../js/ui/appDisplay.js:1881 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1906
msgid "Launch using Dedicated Graphics Card"
msgstr "Inicia usant una tarja gràfica dedicada"
#: ../js/ui/appDisplay.js:1933 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits"
#: ../js/ui/appDisplay.js:1887
#: ../js/ui/appDisplay.js:1939
msgid "Add to Favorites"
msgstr "Afegeix als preferits"
#: ../js/ui/appDisplay.js:1897
#: ../js/ui/appDisplay.js:1949
msgid "Show Details"
msgstr "Mostra els detalls"
#: ../js/ui/appFavorites.js:134
#: ../js/ui/appFavorites.js:138
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "S'ha afegit %s als preferits."
#: ../js/ui/appFavorites.js:168
#: ../js/ui/appFavorites.js:172
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "S'ha suprimit %s dels preferits."
@ -259,11 +270,11 @@ msgstr "Micròfon"
msgid "Change Background…"
msgstr "Canvia el fons de l'escriptori…"
#: ../js/ui/backgroundMenu.js:21
#: ../js/ui/backgroundMenu.js:21 ../js/ui/status/nightLight.js:51
msgid "Display Settings"
msgstr "Paràmetres de la pantalla"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:374
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:401
msgid "Settings"
msgstr "Paràmetres"
@ -379,7 +390,7 @@ msgstr "S'ha connectat un dispositiu extern"
msgid "External drive disconnected"
msgstr "S'ha desconnectat un dispositiu extern"
#: ../js/ui/components/autorunManager.js:355
#: ../js/ui/components/autorunManager.js:356
#, javascript-format
msgid "Open with %s"
msgstr "Obre amb %s"
@ -392,8 +403,8 @@ msgstr "Contrasenya:"
msgid "Type again:"
msgstr "Torneu a escriure-la:"
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:269
#: ../js/ui/status/network.js:352 ../js/ui/status/network.js:919
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:272
#: ../js/ui/status/network.js:366 ../js/ui/status/network.js:942
msgid "Connect"
msgstr "Connecta"
@ -424,22 +435,21 @@ msgid "Service: "
msgstr "Servei:"
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
#: ../js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "La xarxa sense fil requereix autenticació"
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#: ../js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
"Passwords or encryption keys are required to access the wireless network “%s”."
msgstr ""
"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
"d'encriptació."
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
#: ../js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Autenticació 802.1X amb fil"
@ -448,17 +458,17 @@ msgid "Network name: "
msgstr "Nom de la xarxa: "
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
#: ../js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Autenticació DSL"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
#: ../js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Cal que introduïu el codi PIN"
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
#: ../js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil"
@ -467,19 +477,19 @@ msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
#: ../js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Contrasenya de la xarxa de banda ampla mòbil"
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#: ../js/ui/components/networkAgent.js:671
#: ../js/ui/components/networkAgent.js:675
#: ../js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Cal introduir una contrasenya per connectar-vos a «%s»."
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1658
#: ../js/ui/components/networkAgent.js:655 ../js/ui/status/network.js:1747
msgid "Network Manager"
msgstr "Gestor de connexions de xarxa"
@ -500,7 +510,7 @@ msgstr "Autentica"
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:301 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgid "Sorry, that didnt work. Please try again."
msgstr "No ha funcionat. Torneu-ho a provar."
#. Translators: this is the other person changing their old IM name to their new
@ -510,7 +520,7 @@ msgstr "No ha funcionat. Torneu-ho a provar."
msgid "%s is now known as %s"
msgstr "En/na %s ara es diu %s"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Finestres"
@ -632,11 +642,11 @@ msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
"The system will automatically restart and install updates in %d seconds."
msgstr[0] ""
"Es reiniciarà l'ordinador automàticament i s'instal·laran les "
"actualitzacions d'aquí %d segon."
"Es reiniciarà l'ordinador automàticament i s'instal·laran les actualitzacions "
"d'aquí %d segon."
msgstr[1] ""
"Es reiniciarà l'ordinador automàticament i s'instal·laran les "
"actualitzacions d'aquí %d segons."
"Es reiniciarà l'ordinador automàticament i s'instal·laran les actualitzacions "
"d'aquí %d segons."
#: ../js/ui/endSessionDialog.js:127 ../js/ui/endSessionDialog.js:147
msgctxt "button"
@ -667,31 +677,33 @@ msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
msgstr ""
"%s %s s'instal·larà després del reinici. Una actualització de la instal·lació "
"pot trigar força temps. Assegureu-vos que heu fet còpia de seguretat i que "
"l'ordinador està connectat al corrent."
#: ../js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica "
"abans d'instal·lar les actualitzacions."
"S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica abans "
"d'instal·lar les actualitzacions."
#: ../js/ui/endSessionDialog.js:378
msgid "Some applications are busy or have unsaved work."
msgstr ""
"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense "
"desar."
"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense desar."
#: ../js/ui/endSessionDialog.js:385
msgid "Other users are logged in."
msgstr "Altres usuaris tenen la sessió oberta."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:671
#: ../js/ui/endSessionDialog.js:670
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remot)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:674
#: ../js/ui/endSessionDialog.js:673
#, javascript-format
msgid "%s (console)"
msgstr "%s (consola)"
@ -790,6 +802,8 @@ msgstr "Multimèdia"
msgid "Undo"
msgstr "Desfés"
#. Translators: This is the main view to select
#. activities. See also note for "Activities" string.
#: ../js/ui/overview.js:113
msgid "Overview"
msgstr "Vista general"
@ -802,6 +816,50 @@ msgstr "Vista general"
msgid "Type to search…"
msgstr "Teclegeu per cercar…"
#: ../js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Drecera de teclat nova…"
#: ../js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Definit per l'aplicació"
#: ../js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Mostra l'ajuda en pantalla"
#: ../js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Commuta el monitor "
#: ../js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Assigna la pulsació de tecla"
#: ../js/ui/padOsd.js:143
msgid "Done"
msgstr "Fet"
#: ../js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Edita…"
#: ../js/ui/padOsd.js:610 ../js/ui/padOsd.js:665
msgid "None"
msgstr "Cap"
#: ../js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Premeu un botó per a configurar"
#: ../js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Premeu Esc per sortir"
#: ../js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Premeu qualsevol tecla per sortir"
#: ../js/ui/panel.js:358
msgid "Quit"
msgstr "Surt"
@ -817,7 +875,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistema"
#: ../js/ui/panel.js:807
#: ../js/ui/panel.js:810
msgid "Top Bar"
msgstr "Barra superior"
@ -838,6 +896,10 @@ msgstr "Introduïu una ordre"
msgid "Close"
msgstr "Tanca"
#: ../js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "El reinici no està disponible en Wayland"
#: ../js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "S'està reiniciant…"
@ -862,11 +924,11 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificació nova"
msgstr[1] "%d notificacions noves"
#: ../js/ui/screenShield.js:449 ../js/ui/status/system.js:382
#: ../js/ui/screenShield.js:449 ../js/ui/status/system.js:409
msgid "Lock"
msgstr "Bloqueja"
#: ../js/ui/screenShield.js:704
#: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "El GNOME necessita bloquejar la pantalla"
@ -877,11 +939,11 @@ msgstr "El GNOME necessita bloquejar la pantalla"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:825 ../js/ui/screenShield.js:1291
#: ../js/ui/screenShield.js:828 ../js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "No es pot blocar"
#: ../js/ui/screenShield.js:826 ../js/ui/screenShield.js:1292
#: ../js/ui/screenShield.js:829 ../js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Una aplicació està bloquejant el bloqueig"
@ -965,7 +1027,7 @@ msgstr "Text gran"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:56 ../js/ui/status/network.js:624
#: ../js/ui/status/bluetooth.js:56 ../js/ui/status/network.js:638
msgid "Bluetooth Settings"
msgstr "Paràmetres del Bluetooth"
@ -982,17 +1044,17 @@ msgid "Off"
msgstr "Desactivat"
#: ../js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "No s'usa"
msgid "On"
msgstr "Activat"
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1302
msgid "Turn On"
msgstr "Activa"
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
#: ../js/ui/status/rfkill.js:117
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:181
#: ../js/ui/status/network.js:367 ../js/ui/status/network.js:1302
#: ../js/ui/status/network.js:1417 ../js/ui/status/nightLight.js:47
#: ../js/ui/status/rfkill.js:90 ../js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Desactiva"
@ -1029,29 +1091,29 @@ msgid "Enable"
msgstr "Habilita"
#. Translators: %s is an application name
#: ../js/ui/status/location.js:435
#: ../js/ui/status/location.js:436
#, javascript-format
msgid "Give %s access to your location?"
msgstr "Voleu donar a %s accés a la vostra ubicació?"
#: ../js/ui/status/location.js:437
#: ../js/ui/status/location.js:438
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
"des de la configuració de la privacitat."
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu des "
"de la configuració de la privacitat."
#: ../js/ui/status/network.js:101
#: ../js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<desconegut>"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308
#: ../js/ui/status/network.js:465 ../js/ui/status/network.js:1331
#, javascript-format
msgid "%s Off"
msgstr "%s apagat"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:454
#: ../js/ui/status/network.js:468
#, javascript-format
msgid "%s Connected"
msgstr "%s connectat"
@ -1059,171 +1121,209 @@ msgstr "%s connectat"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: ../js/ui/status/network.js:459
#: ../js/ui/status/network.js:473
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s no gestionat"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:462
#: ../js/ui/status/network.js:476
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s s'està desconnectant"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300
#: ../js/ui/status/network.js:483 ../js/ui/status/network.js:1323
#, javascript-format
msgid "%s Connecting"
msgstr "%s s'està connectant"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: ../js/ui/status/network.js:472
#: ../js/ui/status/network.js:486
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s requereix autenticació"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: ../js/ui/status/network.js:480
#: ../js/ui/status/network.js:494
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Manca el microprogramari per %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: ../js/ui/status/network.js:484
#: ../js/ui/status/network.js:498
#, javascript-format
msgid "%s Unavailable"
msgstr "%s no disponible"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:487
#: ../js/ui/status/network.js:501
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s ha fallat la connexió"
#: ../js/ui/status/network.js:503
#: ../js/ui/status/network.js:517
msgid "Wired Settings"
msgstr "Paràmetres de la xarxa amb fils"
#: ../js/ui/status/network.js:545
#: ../js/ui/status/network.js:559
msgid "Mobile Broadband Settings"
msgstr "Configuració de la xarxa de banda ampla mòbil"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#: ../js/ui/status/network.js:602 ../js/ui/status/network.js:1328
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s maquinari inhabilitat"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: ../js/ui/status/network.js:592
#: ../js/ui/status/network.js:606
#, javascript-format
msgid "%s Disabled"
msgstr "%s Inhabilitat"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:646
msgid "Connect to Internet"
msgstr "Connecta a l'Internet"
#: ../js/ui/status/network.js:813
#: ../js/ui/status/network.js:836
msgid "Airplane Mode is On"
msgstr "El mode d'avió és actiu"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:837
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Quan el mode d'avió és actiu es desactiva la xarxa sense fil."
#: ../js/ui/status/network.js:815
#: ../js/ui/status/network.js:838
msgid "Turn Off Airplane Mode"
msgstr "Desactiva el mode d'avió"
#: ../js/ui/status/network.js:824
#: ../js/ui/status/network.js:847
msgid "Wi-Fi is Off"
msgstr "La xarxa sense fil està desactivada"
#: ../js/ui/status/network.js:825
#: ../js/ui/status/network.js:848
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "S'ha d'activar la xarxa sense fil per poder-se connectar a una xarxa."
#: ../js/ui/status/network.js:826
#: ../js/ui/status/network.js:849
msgid "Turn On Wi-Fi"
msgstr "Activa la xarxa sense fil"
#: ../js/ui/status/network.js:851
#: ../js/ui/status/network.js:874
msgid "Wi-Fi Networks"
msgstr "Xarxes sense fil"
#: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:876
msgid "Select a network"
msgstr "Trieu una xarxa"
#: ../js/ui/status/network.js:883
#: ../js/ui/status/network.js:906
msgid "No Networks"
msgstr "Cap xarxa"
#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:115
#: ../js/ui/status/network.js:927 ../js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Utilitza l'interruptor de maquinari per desactivar-la"
#: ../js/ui/status/network.js:1171
#: ../js/ui/status/network.js:1194
msgid "Select Network"
msgstr "Trieu una xarxa"
#: ../js/ui/status/network.js:1177
#: ../js/ui/status/network.js:1200
msgid "Wi-Fi Settings"
msgstr "Paràmetres del sense fil"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:1296
#: ../js/ui/status/network.js:1319
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hostpot %s actiu"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:1311
#: ../js/ui/status/network.js:1334
#, javascript-format
msgid "%s Not Connected"
msgstr "%s no està connectat"
#: ../js/ui/status/network.js:1411
msgid "connecting..."
#: ../js/ui/status/network.js:1434
msgid "connecting"
msgstr "s'està connectant..."
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:1414
#: ../js/ui/status/network.js:1437
msgid "authentication required"
msgstr "cal autenticació"
#: ../js/ui/status/network.js:1416
#: ../js/ui/status/network.js:1439
msgid "connection failed"
msgstr "ha fallat la connexió"
#: ../js/ui/status/network.js:1482 ../js/ui/status/rfkill.js:93
#: ../js/ui/status/network.js:1505 ../js/ui/status/network.js:1600
#: ../js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Paràmetres de xarxa"
#: ../js/ui/status/network.js:1484
#: ../js/ui/status/network.js:1507
msgid "VPN Settings"
msgstr "Paràmetres de la VPN"
#: ../js/ui/status/network.js:1503
#: ../js/ui/status/network.js:1526
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1513
#: ../js/ui/status/network.js:1536
msgid "VPN Off"
msgstr "VPN apagat"
#: ../js/ui/status/network.js:1697
#: ../js/ui/status/network.js:1631
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s connexió amb fil"
msgstr[1] "%s connexions amb fil"
#: ../js/ui/status/network.js:1635
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s connexió Wifi"
msgstr[1] "%s connexions Wifi"
#: ../js/ui/status/network.js:1639
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s connexió mòdem"
msgstr[1] "%s connexions mòdem"
#: ../js/ui/status/network.js:1786
msgid "Connection failed"
msgstr "Ha fallat la connexió"
#: ../js/ui/status/network.js:1698
#: ../js/ui/status/network.js:1787
msgid "Activation of network connection failed"
msgstr "Ha fallat l'activació de la connexió de xarxa"
#: ../js/ui/status/nightLight.js:68
msgid "Night Light Disabled"
msgstr "Llum nocturna inhabilitada"
#: ../js/ui/status/nightLight.js:69
msgid "Night Light On"
msgstr "Llum nocturna habilitada"
#: ../js/ui/status/nightLight.js:70
msgid "Resume"
msgstr "Reprèn"
#: ../js/ui/status/nightLight.js:71
msgid "Disable Until Tomorrow"
msgstr "Inhabilita fins demà"
#: ../js/ui/status/power.js:61
msgid "Power Settings"
msgstr "Paràmetres d'energia"
@ -1262,27 +1362,27 @@ msgstr "%d%%"
msgid "Airplane Mode On"
msgstr "El mode d'avió és actiu"
#: ../js/ui/status/system.js:351
#: ../js/ui/status/system.js:378
msgid "Switch User"
msgstr "Canvia d'usuari"
#: ../js/ui/status/system.js:356
#: ../js/ui/status/system.js:383
msgid "Log Out"
msgstr "Surt"
#: ../js/ui/status/system.js:361
#: ../js/ui/status/system.js:388
msgid "Account Settings"
msgstr "Paràmetres del compte"
#: ../js/ui/status/system.js:378
#: ../js/ui/status/system.js:405
msgid "Orientation Lock"
msgstr "Bloqueja l'orientació"
#: ../js/ui/status/system.js:386
#: ../js/ui/status/system.js:413
msgid "Suspend"
msgstr "Atura temporalment"
#: ../js/ui/status/system.js:389
#: ../js/ui/status/system.js:416
msgid "Power Off"
msgstr "Apaga"
@ -1302,11 +1402,11 @@ msgstr "Entra amb un altre usuari"
msgid "Unlock Window"
msgstr "Desbloqueja la finestra"
#: ../js/ui/viewSelector.js:159
#: ../js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplicacions"
#: ../js/ui/viewSelector.js:163
#: ../js/ui/viewSelector.js:186
msgid "Search"
msgstr "Cerca"
@ -1315,22 +1415,22 @@ msgstr "Cerca"
msgid "“%s” is ready"
msgstr "«%s» ja està a punt"
#: ../js/ui/windowManager.js:63
#: ../js/ui/windowManager.js:83
msgid "Do you want to keep these display settings?"
msgstr "Voleu mantenir aquesta configuració de la pantalla?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: ../js/ui/windowManager.js:82
#: ../js/ui/windowManager.js:102
msgid "Revert Settings"
msgstr "Descarta els canvis"
#: ../js/ui/windowManager.js:85
#: ../js/ui/windowManager.js:105
msgid "Keep Changes"
msgstr "Mantén els canvis"
#: ../js/ui/windowManager.js:103
#: ../js/ui/windowManager.js:123
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1339,10 +1439,10 @@ msgstr[1] "Es descartaran els canvis d'aquí %d segons"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: ../js/ui/windowManager.js:658
#: ../js/ui/windowManager.js:678
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
msgid "%d × %d"
msgstr "%d × %d"
#: ../js/ui/windowMenu.js:34
msgid "Minimize"
@ -1439,7 +1539,7 @@ msgid "Mode used by GDM for login screen"
msgstr "El mode que utilitzarà el GDM per a la pantalla d'entrada"
#: ../src/main.c:393
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgid "Use a specific mode, e.g. gdm for login screen"
msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
#: ../src/main.c:399
@ -1468,6 +1568,15 @@ msgstr "La contrasenya no pot ser buida"
msgid "Authentication dialog was dismissed by the user"
msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Web Authentication Redirect"
#~ msgstr "Redirecció per l'autenticació web"
#~ msgid "%d x %d"
#~ msgstr "%d x %d"
#~ msgid "Not In Use"
#~ msgstr "No s'usa"
#~ msgid "System"
#~ msgstr "Sistema"
@ -1500,8 +1609,8 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Enable internal tools useful for developers and testers from Alt-F2"
#~ msgstr ""
#~ "Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per "
#~ "als desenvolupadors i provadors"
#~ "Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per als "
#~ "desenvolupadors i provadors"
#~ msgid ""
#~ "Allows access to internal debugging and monitoring tools using the Alt-F2 "
@ -1556,8 +1665,7 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Index of the currently selected view in the application picker."
#~ msgstr ""
#~ "Índex de la vista seleccionada actualment en el seleccionador "
#~ "d'aplicacions."
#~ "Índex de la vista seleccionada actualment en el seleccionador d'aplicacions."
#~ msgid "History for command (Alt-F2) dialog"
#~ msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2"
@ -1572,8 +1680,8 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ "This key overrides the automatic hiding of the 'Log out' menu item in "
#~ "single-user, single-session situations."
#~ msgstr ""
#~ "Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú "
#~ "«Surt» quan només hi ha un usuari i un sol tipus de sessió."
#~ "Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú «Surt» "
#~ "quan només hi ha un usuari i un sol tipus de sessió."
#~ msgid ""
#~ "Whether to remember password for mounting encrypted or remote filesystems"
@ -1588,10 +1696,10 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ "state of the checkbox."
#~ msgstr ""
#~ "El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu "
#~ "encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya "
#~ "per utilitzar-lo en el futur, es mostrarà la casella de verificació "
#~ "«Recorda la contrasenya». Aquesta clau estableix el valor per defecte "
#~ "d'aquesta casella de verificació."
#~ "encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya per "
#~ "utilitzar-lo en el futur, es mostrarà la casella de verificació «Recorda la "
#~ "contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella "
#~ "de verificació."
#~ msgid ""
#~ "Whether the default Bluetooth adapter had set up devices associated to it"
@ -1602,13 +1710,13 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid ""
#~ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
#~ "powered, or if there were devices set up associated with the default "
#~ "adapter. This will be reset if the default adapter is ever seen not to "
#~ "have devices associated to it."
#~ "adapter. This will be reset if the default adapter is ever seen not to have "
#~ "devices associated to it."
#~ msgstr ""
#~ "El Shell només mostrà una entrada de menú Bluetooth si un adaptador "
#~ "Bluetooh està engegat, o si hi ha dispositius configurats associats a "
#~ "l'adaptador predeterminat. Això es reiniciarà si l'adaptador "
#~ "predeterminat té dispositius associats."
#~ "l'adaptador predeterminat. Això es reiniciarà si l'adaptador predeterminat "
#~ "té dispositius associats."
#~ msgid "Show the week date in the calendar"
#~ msgstr "Mostra el número de la setmana al calendari"
@ -1629,8 +1737,8 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ "Keybinding to open the \"Show Applications\" view of the Activities "
#~ "Overview."
#~ msgstr ""
#~ "Vinculació per obrir la vista «Mostra les aplicacions» de les activitats "
#~ "de la vista general."
#~ "Vinculació per obrir la vista «Mostra les aplicacions» de les activitats de "
#~ "la vista general."
#~ msgid "Keybinding to open the overview"
#~ msgstr "Vinculació per obrir la vista general"
@ -1672,9 +1780,9 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ "If true, only applications that have windows on the current workspace are "
#~ "shown in the switcher. Otherwise, all applications are included."
#~ msgstr ""
#~ "Si és «true» (cert), només les aplicacions que tinguin finestres en "
#~ "l'espai de treball actual es mostren en el canviador. En cas contrari es "
#~ "mostren totes les aplicacions."
#~ "Si és «true» (cert), només les aplicacions que tinguin finestres en l'espai "
#~ "de treball actual es mostren en el canviador. En cas contrari es mostren "
#~ "totes les aplicacions."
#~ msgid "The application icon mode."
#~ msgstr "El mode d'icona de les aplicacions."
@ -1685,13 +1793,13 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ "only' (shows only the application icon) or 'both'."
#~ msgstr ""
#~ "Configureu com es mostren les finestres en l'intercanviador. Els valors "
#~ "possibles són: «thumbnail-only» (mostra una miniatura de la finestra), "
#~ "«app-icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses: "
#~ "mostra la miniatura de la finestra i la icona de l'aplicació)."
#~ "possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-"
#~ "icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses: mostra "
#~ "la miniatura de la finestra i la icona de l'aplicació)."
#~ msgid ""
#~ "If true, only windows from the current workspace are shown in the "
#~ "switcher. Otherwise, all windows are included."
#~ "If true, only windows from the current workspace are shown in the switcher. "
#~ "Otherwise, all windows are included."
#~ msgstr ""
#~ "Si és «true» (cert), només les finestres de l'espai de treball actual es "
#~ "mostren en el canviador. En cas contrari, es mostren totes les finestres."
@ -1718,11 +1826,8 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Delay focus changes in mouse mode until the pointer stops moving"
#~ msgstr ""
#~ "Retarda el canvi del focus, quan s'està en mode ratolí, fins que el "
#~ "punter no estigui quiet"
#~ msgid "Network Login"
#~ msgstr "Inici de sessió de la xarxa"
#~ "Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter "
#~ "no estigui quiet"
#~ msgid "Use as Internet connection"
#~ msgstr "Utilitza com a connexió a Internet"
@ -1753,9 +1858,6 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Airplane Mode"
#~ msgstr "Mode d'avió"
#~ msgid "On"
#~ msgstr "Activat"
#~ msgid "Show the message tray"
#~ msgstr "Mostra la safata de missatges"
@ -1894,9 +1996,6 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "Status is set to offline"
#~ msgstr "S'ha establert l'estat a fora de línia"
#~ msgid "Encryption is not available"
#~ msgstr "L'encriptació no està disponible"
#~ msgid "Certificate is invalid"
#~ msgstr "El certificat no és vàlid"

265
po/cs.po
View File

@ -5,15 +5,15 @@
# Andre Klapper <ak-47@gmx.net>, 2009.
# Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011, 2012, 2014, 2015.
# Adam Matoušek <adamatousek@gmail.com>, 2012, 2013.
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2015, 2016.
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2015, 2016, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-10-21 17:31+0000\n"
"PO-Revision-Date: 2016-10-28 12:42+0200\n"
"POT-Creation-Date: 2017-02-13 09:27+0000\n"
"PO-Revision-Date: 2017-02-13 23:25+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@ -325,8 +325,8 @@ msgstr "Rozšíření GNOME Shell"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:928
msgid "Cancel"
msgstr "Zrušit"
@ -472,11 +472,18 @@ msgstr "%e. %B %l%M%p"
msgid "%B %d %Y, %l%M %p"
msgstr "%e. %B %Y, %l%M%p"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
#: js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "Přesměrováno na ověření přes web"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
msgid "Hotspot Login"
msgstr "Přihlášení k přístupovému bodu"
#: js/portalHelper/main.js:113
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
msgstr ""
"Vaše připojení k tomuto přístupovému bodu není bezpečné. Hesla a další "
"informace, které zadáte na této stránce mohou vidět ostatní lidé v okolí."
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
@ -520,12 +527,12 @@ msgstr "Přidat mezi oblíbené"
msgid "Show Details"
msgstr "Zobrazit podrobnosti"
#: js/ui/appFavorites.js:134
#: js/ui/appFavorites.js:137
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s byl přidán mezi oblíbené."
#: js/ui/appFavorites.js:168
#: js/ui/appFavorites.js:171
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených."
@ -687,8 +694,8 @@ msgstr "Heslo:"
msgid "Type again:"
msgstr "Napište znovu:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:355 js/ui/status/network.js:931
msgid "Connect"
msgstr "Připojit"
@ -716,11 +723,11 @@ msgstr "Heslo soukromého klíče: "
msgid "Service: "
msgstr "Služba: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "K bezdrátové síti je vyžadováno ověření"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -729,7 +736,7 @@ msgstr ""
"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací "
"klíče."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Ověření připojení po drátu 802.1X"
@ -737,15 +744,15 @@ msgstr "Ověření připojení po drátu 802.1X"
msgid "Network name: "
msgstr "Název sítě: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Ověření DSL"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Požadován kód PIN"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
@ -753,17 +760,17 @@ msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Heslo k mobilní širokopásmové síti"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Pro připojení k „%s“ je vyžadováno heslo."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1670
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1736
msgid "Network Manager"
msgstr "Network Manager"
@ -794,7 +801,7 @@ msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Okna"
@ -978,13 +985,13 @@ msgid "Other users are logged in."
msgstr "Jsou přihlášeni jiní uživatelé."
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:671
#: js/ui/endSessionDialog.js:670
#, javascript-format
msgid "%s (remote)"
msgstr "%s (vzdálený)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:674
#: js/ui/endSessionDialog.js:673
#, javascript-format
msgid "%s (console)"
msgstr "%s (konzola)"
@ -1083,6 +1090,8 @@ msgstr "Multimédia"
msgid "Undo"
msgstr "Zpět"
#. Translators: This is the main view to select
#. activities. See also note for "Activities" string.
#: js/ui/overview.js:113
msgid "Overview"
msgstr "Přehled"
@ -1095,6 +1104,50 @@ msgstr "Přehled"
msgid "Type to search…"
msgstr "vyhledávejte psaním…"
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Nová klávesová zkratka…"
#: js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Definováno aplikací"
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Zobrazit nápovědu na obrazovce"
#: js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Přepnout monitor"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Přířadit klávesu"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Hotovo"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Upravit…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Źádná"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Zmáčkněte tlačítko pro nastavení"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Zmáčknutím Esc ukončíte"
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Zmáčknutím klávesy ukončíte"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "Ukončit"
@ -1131,6 +1184,10 @@ msgstr "Zadejte příkaz:"
msgid "Close"
msgstr "Zavřít"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Restart není na Waylandu k dispozici"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Restartuje se…"
@ -1161,7 +1218,7 @@ msgstr[2] "%d nových upozornění"
msgid "Lock"
msgstr "Uzamknout"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "GNOME potřebuje uzamknout obrazovku"
@ -1172,11 +1229,11 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací"
@ -1260,7 +1317,7 @@ msgstr "Styl velkého textu"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
msgid "Bluetooth Settings"
msgstr "Nastavení Bluetooth"
@ -1281,13 +1338,13 @@ msgstr "Vypnuto"
msgid "On"
msgstr "Zapnuto"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1291
msgid "Turn On"
msgstr "Zapnout"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:356 js/ui/status/network.js:1291
#: js/ui/status/network.js:1406 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Vypnout"
@ -1336,18 +1393,18 @@ msgstr ""
"Přístup ke službám pro určování polohy lze kdykoliv změnit v nastavení "
"soukromí."
#: js/ui/status/network.js:102
#: js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<neznámé>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#: js/ui/status/network.js:454 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s je vypnuto"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:455
#: js/ui/status/network.js:457
#, javascript-format
msgid "%s Connected"
msgstr "%s je připojeno"
@ -1355,168 +1412,193 @@ msgstr "%s je připojeno"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:460
#: js/ui/status/network.js:462
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s není spravováno"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:463
#: js/ui/status/network.js:465
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s se odpojuje"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#: js/ui/status/network.js:472 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "%s se připojuje"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:473
#: js/ui/status/network.js:475
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s požaduje ověření"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:481
#: js/ui/status/network.js:483
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Schází firmware pro %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:485
#: js/ui/status/network.js:487
#, javascript-format
msgid "%s Unavailable"
msgstr "%s je nedostupné"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:488
#: js/ui/status/network.js:490
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s selhalo připojení"
#: js/ui/status/network.js:504
#: js/ui/status/network.js:506
msgid "Wired Settings"
msgstr "Nastavení připojení po drátu"
#: js/ui/status/network.js:546
#: js/ui/status/network.js:548
msgid "Mobile Broadband Settings"
msgstr "Nastavení mobilní širokopásmové sítě"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#: js/ui/status/network.js:591 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s je hardwarově zakázáno"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:593
#: js/ui/status/network.js:595
#, javascript-format
msgid "%s Disabled"
msgstr "%s je zakázáno"
#: js/ui/status/network.js:633
#: js/ui/status/network.js:635
msgid "Connect to Internet"
msgstr "Připojit k Internetu"
#: js/ui/status/network.js:823
#: js/ui/status/network.js:825
msgid "Airplane Mode is On"
msgstr "Režim „letadlo“ je zapnutý"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:826
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Když je zapnutý režim „letadlo“, je WiFi zakázána."
#: js/ui/status/network.js:825
#: js/ui/status/network.js:827
msgid "Turn Off Airplane Mode"
msgstr "Vypnout režim „letadlo“"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:836
msgid "Wi-Fi is Off"
msgstr "WiFi je vypnutá"
#: js/ui/status/network.js:835
#: js/ui/status/network.js:837
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Abyste se připojili k síti, je zapotřebí zapnout WiFi."
#: js/ui/status/network.js:836
#: js/ui/status/network.js:838
msgid "Turn On Wi-Fi"
msgstr "Zapnout WiFi"
#: js/ui/status/network.js:861
#: js/ui/status/network.js:863
msgid "Wi-Fi Networks"
msgstr "Sítě WiFi"
#: js/ui/status/network.js:863
#: js/ui/status/network.js:865
msgid "Select a network"
msgstr "Vyberte síť"
#: js/ui/status/network.js:893
#: js/ui/status/network.js:895
msgid "No Networks"
msgstr "Žádné sítě"
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:916 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "K vypnutí použijte fyzický vypínač"
#: js/ui/status/network.js:1181
#: js/ui/status/network.js:1183
msgid "Select Network"
msgstr "Vybrat síť"
#: js/ui/status/network.js:1187
#: js/ui/status/network.js:1189
msgid "Wi-Fi Settings"
msgstr "Nastavení WiFi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1306
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s je aktivní přístupový bod"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1321
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s není připojeno"
#: js/ui/status/network.js:1421
#: js/ui/status/network.js:1423
msgid "connecting..."
msgstr "připojuje se…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1424
#: js/ui/status/network.js:1426
msgid "authentication required"
msgstr "je požadováno ověření"
#: js/ui/status/network.js:1426
#: js/ui/status/network.js:1428
msgid "connection failed"
msgstr "připojení selhalo"
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1494 js/ui/status/network.js:1589
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Nastavení sítě"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1496
msgid "VPN Settings"
msgstr "Nastavení VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1515
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1523
#: js/ui/status/network.js:1525
msgid "VPN Off"
msgstr "VPN je vypnuta"
#: js/ui/status/network.js:1709
#: js/ui/status/network.js:1620
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s drátové připojení"
msgstr[1] "%s drátová připojení"
msgstr[2] "%s drátových připojení"
#: js/ui/status/network.js:1624
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s bezdrátové připojení"
msgstr[1] "%s bezdrátová připojení"
msgstr[2] "%s bezdrátových připojení"
#: js/ui/status/network.js:1628
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s modemové připojení"
msgstr[1] "%s modemová připojení"
msgstr[2] "%s modemových připojení"
#: js/ui/status/network.js:1775
msgid "Connection failed"
msgstr "Připojení selhalo"
#: js/ui/status/network.js:1710
#: js/ui/status/network.js:1776
msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala"
@ -1598,11 +1680,11 @@ msgstr "Přihlásit se jako jiný uživatel"
msgid "Unlock Window"
msgstr "Odemykací okno"
#: js/ui/viewSelector.js:159
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplikace"
#: js/ui/viewSelector.js:163
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Hledat"
@ -1611,22 +1693,22 @@ msgstr "Hledat"
msgid "“%s” is ready"
msgstr "Připraveno „%s“"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:83
msgid "Do you want to keep these display settings?"
msgstr "Chcete zachovat nastavení displeje?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:102
msgid "Revert Settings"
msgstr "Obnovit původní"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:105
msgid "Keep Changes"
msgstr "Zachovat"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:123
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1636,7 +1718,7 @@ msgstr[2] "Nastavení se obnoví na původní za %d sekund"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:678
#, javascript-format
msgid "%d x %d"
msgstr "%d×%d"
@ -1738,19 +1820,19 @@ msgstr[2] "%u vstupů"
msgid "System Sounds"
msgstr "Systémové zvuky"
#: src/main.c:380
#: src/main.c:381
msgid "Print version"
msgstr "Vypsat verzi"
#: src/main.c:386
#: src/main.c:387
msgid "Mode used by GDM for login screen"
msgstr "Režim použitý GDM pro přihlašovací obrazovku"
#: src/main.c:392
#: src/main.c:393
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“."
#: src/main.c:398
#: src/main.c:399
msgid "List possible modes"
msgstr "Vypsat možné režimy"
@ -1775,18 +1857,3 @@ msgstr "Heslo nemůže být prázdné."
#: src/shell-polkit-authentication-agent.c:353
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogové okno ověření bylo uživatelem zrušeno"
#~ msgid "Not In Use"
#~ msgstr "Nepoužívá se"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Zobrazovat v kalendáři čísla týdnů"
#~ msgid "If true, display the ISO week date in the calendar."
#~ msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO."
#~ msgid "Use as Internet connection"
#~ msgstr "Použít jako připojení k Internetu"
#~ msgid "%s is requesting access to your location."
#~ msgstr "Aplikace %s žádá o přístup k informacím o vaší poloze."

505
po/da.po

File diff suppressed because it is too large Load Diff

305
po/de.po
View File

@ -22,16 +22,40 @@ 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: 2016-08-20 08:27+0000\n"
"PO-Revision-Date: 2016-08-21 11:38+0200\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"POT-Creation-Date: 2016-11-25 22:24+0000\n"
"PO-Revision-Date: 2016-11-26 11:56+0100\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.8\n"
"X-Generator: Poedit 1.8.11\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
msgstr "System"
#: data/50-gnome-shell-system.xml:9
msgid "Show the notification list"
msgstr "Benachrichtigungsliste anzeigen"
#: data/50-gnome-shell-system.xml:12
msgid "Focus the active notification"
msgstr "Auf aktive Benachrichtigungen ausrichten"
#: data/50-gnome-shell-system.xml:15
msgid "Show the overview"
msgstr "Die Übersicht anzeigen"
#: data/50-gnome-shell-system.xml:18
msgid "Show all applications"
msgstr "Alle Anwendungen anzeigen"
#: data/50-gnome-shell-system.xml:21
msgid "Open the application menu"
msgstr "Das Anwendungsmenü öffnen"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
msgid "GNOME Shell Extension Preferences"
@ -319,23 +343,23 @@ msgstr "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
msgid "GNOME Shell Extensions"
msgstr "GNOME-Shell-Erweiterungen"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:928
msgid "Cancel"
msgstr "Abbrechen"
#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448
#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450
msgid "Next"
msgstr "Weiter"
#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403
#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:403
#: js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Entsperren"
#: js/gdm/authPrompt.js:214
#: js/gdm/authPrompt.js:216
msgctxt "button"
msgid "Sign In"
msgstr "Anmelden"
@ -353,7 +377,7 @@ msgstr "Nicht aufgeführt?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(z.B. Benutzer oder %s)"
@ -361,12 +385,12 @@ msgstr "(z.B. Benutzer oder %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Benutzername:"
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Anmeldefenster"
@ -471,7 +495,7 @@ msgstr "%e. %B %Y, %H:%M"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
#: js/portalHelper/main.js:85
#: js/portalHelper/main.js:87
msgid "Web Authentication Redirect"
msgstr "Umleitung zu einer Internet-Anmeldung"
@ -485,31 +509,35 @@ msgstr "Zugriff verhindern"
msgid "Grant Access"
msgstr "Zugriff gewähren"
#: js/ui/appDisplay.js:794
#: js/ui/appDisplay.js:806
msgid "Frequently used applications will appear here"
msgstr "Häufig genutzte Anwendungen erscheinen hier"
#: js/ui/appDisplay.js:914
#: js/ui/appDisplay.js:926
msgid "Frequent"
msgstr "Häufig"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:933
msgid "All"
msgstr "Alle"
#: js/ui/appDisplay.js:1853
#: js/ui/appDisplay.js:1891
msgid "New Window"
msgstr "Neues Fenster"
#: js/ui/appDisplay.js:1881 js/ui/dash.js:289
#: js/ui/appDisplay.js:1905
msgid "Launch using Dedicated Graphics Card"
msgstr "Mit dedizierter Grafikkarte starten"
#: js/ui/appDisplay.js:1932 js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: js/ui/appDisplay.js:1887
#: js/ui/appDisplay.js:1938
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: js/ui/appDisplay.js:1897
#: js/ui/appDisplay.js:1948
msgid "Show Details"
msgstr "Details anzeigen"
@ -667,7 +695,7 @@ msgstr "Externes Laufwerk verbunden"
msgid "External drive disconnected"
msgstr "Externes Laufwerk getrennt"
#: js/ui/components/autorunManager.js:355
#: js/ui/components/autorunManager.js:356
#, javascript-format
msgid "Open with %s"
msgstr "Öffnen mit %s"
@ -680,8 +708,8 @@ msgstr "Passwort:"
msgid "Type again:"
msgstr "Erneut eingeben:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:355 js/ui/status/network.js:931
msgid "Connect"
msgstr "Verbinden"
@ -709,11 +737,11 @@ msgstr "Passwort für geheimen Schlüssel:"
msgid "Service: "
msgstr "Dienst:"
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "Anmeldung für Drahtlosnetzwerk wird benötigt"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -722,7 +750,7 @@ msgstr ""
"Passwörter oder Schlüssel sind erforderlich, um auf das Drahtlosnetzwerk "
"»%s« zuzugreifen."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Kabelgebundene 802.1X-Anmeldung"
@ -730,15 +758,15 @@ msgstr "Kabelgebundene 802.1X-Anmeldung"
msgid "Network name: "
msgstr "Netzwerkname:"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "DSL-Anmeldung"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "PIN-Code ist erforderlich"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Für das mobile Breitbandgerät wird ein PIN-Code benötigt."
@ -746,17 +774,17 @@ msgstr "Für das mobile Breitbandgerät wird ein PIN-Code benötigt."
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Passwort der mobilen Breitbandverbindung"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1734
msgid "Network Manager"
msgstr "Netzwerk-Verwaltung"
@ -783,12 +811,12 @@ msgstr ""
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s heißt jetzt %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Fenster"
@ -1081,6 +1109,50 @@ msgstr "Übersicht"
msgid "Type to search…"
msgstr "Suchbegriff eingeben …"
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Neue Tastenkombination …"
#: js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Anwendung festgelegt"
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Bildschirmhilfe anzeigen"
#: js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Bildschirm wechseln"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Tastenkombination zuweisen"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Erledigt"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Bearbeiten …"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Keine"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Klicken Sie auf einen Knopf zum Einrichten"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Drücken Sie Esc zum Abbrechen."
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Drücken Sie eine beliebige Taste zum Beenden"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "Beenden"
@ -1117,6 +1189,10 @@ msgstr "Bitte geben Sie einen Befehl ein"
msgid "Close"
msgstr "Schließen"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Neu Starten ist unter Wayland nicht verfügbar"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Neustart …"
@ -1148,7 +1224,7 @@ msgstr[1] "%d neue Benachrichtigungen"
msgid "Lock"
msgstr "Sperren"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "GNOME muss den Bildschirm sperren"
@ -1159,11 +1235,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert"
@ -1247,7 +1323,7 @@ msgstr "Große Schrift"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
msgid "Bluetooth Settings"
msgstr "Bluetooth-Einstellungen"
@ -1264,16 +1340,16 @@ msgid "Off"
msgstr "Aus"
#: js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "Nicht in Verwendung"
msgid "On"
msgstr "An"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1291
msgid "Turn On"
msgstr "Einschalten"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:356 js/ui/status/network.js:1291
#: js/ui/status/network.js:1406 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Ausschalten"
@ -1322,18 +1398,18 @@ msgstr ""
"Standortzugriff kann in den Einstellungen zur Privatsphäre jederzeit "
"geändert werden."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<Unbekannt>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:454 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s ausgeschaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:457
#, javascript-format
msgid "%s Connected"
msgstr "%s verbunden"
@ -1341,93 +1417,93 @@ msgstr "%s verbunden"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:462
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s nicht verwaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:465
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s wird getrennt"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:472 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "%s wird verbunden"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:475
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s erfordert eine Anmeldung"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:483
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Firmware fehlt für %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:484
#: js/ui/status/network.js:487
#, javascript-format
msgid "%s Unavailable"
msgstr "%s nicht verfügbar"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:490
#, javascript-format
msgid "%s Connection Failed"
msgstr "Verbindung von %s gescheitert"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:506
msgid "Wired Settings"
msgstr "LAN-Einstellungen"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:548
msgid "Mobile Broadband Settings"
msgstr "Einstellungen der mobilen Breitbandverbindung"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:591 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s-Hardware ausgeschaltet"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:595
#, javascript-format
msgid "%s Disabled"
msgstr "%s ausgeschaltet"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:635
msgid "Connect to Internet"
msgstr "Mit dem Internet verbinden"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:825
msgid "Airplane Mode is On"
msgstr "Flugmodus ist eingeschaltet"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:826
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr ""
"Drahtlosnetzwerk ist ausgeschaltet, wenn sich Ihr Gerät im Flugmodus "
"befindet."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:827
msgid "Turn Off Airplane Mode"
msgstr "Flugmodus ausschalten"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:836
msgid "Wi-Fi is Off"
msgstr "Drahtlosnetzwerk ist ausgeschaltet"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:837
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr ""
"Drahtlosnetzwerk muss eingeschaltet werden, um eine Netzwerkverbindung "
@ -1436,80 +1512,102 @@ msgstr ""
# Wi-Fi einschalten
# oder
# Schalten sie Wi-Fi ein
#: js/ui/status/network.js:826
#: js/ui/status/network.js:838
msgid "Turn On Wi-Fi"
msgstr "Drahtlosnetzwerk einschalten"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:863
msgid "Wi-Fi Networks"
msgstr "Drahtlosnetzwerke"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:865
msgid "Select a network"
msgstr "Wählen Sie ein Netzwerk"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:895
msgid "No Networks"
msgstr "Keine Netzwerke"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:916 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Benutzen Sie zum Ausschalten den Gehäuseschalter"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1183
msgid "Select Network"
msgstr "Wählen Sie ein Netzwerk aus"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1189
msgid "Wi-Fi Settings"
msgstr "Drahtlosnetzwerk-Einstellungen"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s eingeschaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nicht verbunden"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1423
msgid "connecting..."
msgstr "Verbindungsaufbau …"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1426
msgid "authentication required"
msgstr "Anmeldung erforderlich"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1428
msgid "connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1494 js/ui/status/network.js:1587
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Netzwerkeinstellungen"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1496
msgid "VPN Settings"
msgstr "VPN-Einstellungen"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1515
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1525
msgid "VPN Off"
msgstr "VPN ausgeschaltet"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1618
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kabelverbindung"
msgstr[1] "%s Kabelverbindungen"
#: js/ui/status/network.js:1622
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Funknetzwerkverbindung"
msgstr[1] "%s Funknetzwerkverbindungen"
#: js/ui/status/network.js:1626
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem-Verbindung"
msgstr[1] "%s Modem-Verbindungen"
#: js/ui/status/network.js:1773
msgid "Connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1774
msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
@ -1591,11 +1689,11 @@ msgstr "Als anderer Benutzer anmelden"
msgid "Unlock Window"
msgstr "Fenster entsperren"
#: js/ui/viewSelector.js:159
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Anwendungen"
#: js/ui/viewSelector.js:163
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Suchen"
@ -1604,22 +1702,22 @@ msgstr "Suchen"
msgid "“%s” is ready"
msgstr "»%s« ist bereit"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:64
msgid "Do you want to keep these display settings?"
msgstr "Wollen Sie diese Anzeigeeinstellungen beibehalten?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:83
msgid "Revert Settings"
msgstr "Zurücksetzen"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "Beibehalten"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:104
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1629,7 +1727,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:659
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1729,20 +1827,20 @@ msgstr[1] "%u Eingänge"
msgid "System Sounds"
msgstr "Systemklänge"
#: src/main.c:381
#: src/main.c:380
msgid "Print version"
msgstr "Version ausgeben"
#: src/main.c:387
#: src/main.c:386
msgid "Mode used by GDM for login screen"
msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
#: src/main.c:393
#: src/main.c:392
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Einen spezifischen Modus nutzen, wie z.B. »gdm« für den Anmeldebildschirm"
#: src/main.c:399
#: src/main.c:398
msgid "List possible modes"
msgstr "Die möglichen Modi auflisten"
@ -1768,23 +1866,8 @@ msgstr "Es muss ein Passwort angegeben werden"
msgid "Authentication dialog was dismissed by the user"
msgstr "Der Dialog zur Anmeldung wurde vom Benutzer geschlossen"
#~ msgid "System"
#~ msgstr "System"
#~ msgid "Show the notification list"
#~ msgstr "Benachrichtigungsliste anzeigen"
#~ msgid "Focus the active notification"
#~ msgstr "Auf aktive Benachrichtigungen ausrichten"
#~ msgid "Show the overview"
#~ msgstr "Die Übersicht anzeigen"
#~ msgid "Show all applications"
#~ msgstr "Alle Anwendungen anzeigen"
#~ msgid "Open the application menu"
#~ msgstr "Das Anwendungsmenü öffnen"
#~ msgid "Not In Use"
#~ msgstr "Nicht in Verwendung"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Kalenderwoche im Kalender anzeigen"

533
po/es.po

File diff suppressed because it is too large Load Diff

529
po/eu.po

File diff suppressed because it is too large Load Diff

View File

@ -1674,7 +1674,7 @@ msgstr "تقویم اوولوشن"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "اوولوشن"
msgstr "evolution"
#. translators:
#. * The number of sound outputs on a particular device

529
po/fi.po

File diff suppressed because it is too large Load Diff

130
po/fr.po
View File

@ -4,7 +4,6 @@
#
# Mathieu Bridon <bochecha@fedoraproject.org>, 2009.
# Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>, 2010.
# Claude Paroz <claude@2xlibre.net>, 2010-2011.
# Bruno Brouard <annoa.b@gmail.com>, 2011-2012.
# Cyril Arnaud <cyril dot arnaud at gmail dot com>, 2011.
# Luc Guillemin <luc.guillemin@gmail.com>, 2011.
@ -14,21 +13,24 @@
# Mathieu Stumpf <psychoslave@culture-libre.org>, 2013.
# Alain Lojewski <allomervan@gmail.com>, 2014.
# Erwan Georget <egeorget@opmbx.org>, 2016.
# Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016.
# Charles Monzat <superboa@hotmail.fr>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-09-13 09:48+0000\n"
"PO-Revision-Date: 2016-09-13 12:19+0200\n"
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
"POT-Creation-Date: 2016-11-17 23:00+0000\n"
"PO-Revision-Date: 2017-01-22 11:01+0100\n"
"Last-Translator: Charles Monzat <superboa@hotmail.fr>\n"
"Language-Team: français <gnomefr@traduc.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 1.8.11\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -354,7 +356,7 @@ msgstr "Extensions GNOME Shell"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
msgid "Cancel"
msgstr "Annuler"
@ -726,8 +728,8 @@ msgstr "Mot de passe :"
msgid "Type again:"
msgstr "Saisissez à nouveau :"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
msgid "Connect"
msgstr "Se connecter"
@ -755,11 +757,11 @@ msgstr "Mot de passe de la clé privée : "
msgid "Service: "
msgstr "Service : "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "L'authentification est requise par le réseau sans fil"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -768,7 +770,7 @@ msgstr ""
"Il faut un mot de passe ou une clé de chiffrement pour accéder au réseau "
"sans fil « %s »"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Authentification filaire 802.1X"
@ -776,15 +778,15 @@ msgstr "Authentification filaire 802.1X"
msgid "Network name: "
msgstr "Nom du réseau : "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Authentification DSL"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Code PIN requis"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Un code PIN est nécessaire pour les connexions mobiles"
@ -792,17 +794,17 @@ msgstr "Un code PIN est nécessaire pour les connexions mobiles"
msgid "PIN: "
msgstr "PIN : "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Mot de passe de la connexion mobile"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Un mot de passe est requis pour se connecter à « %s »."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1670
msgid "Network Manager"
msgstr "Gestionnaire de réseau"
@ -1172,6 +1174,10 @@ msgstr "Saisissez une commande"
msgid "Close"
msgstr "Fermer"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Le redémarrage n'est pas disponible sur Wayland"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Redémarrage en cours…"
@ -1211,11 +1217,11 @@ msgstr "GNOME a besoin de verrouiller l'écran"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1292
msgid "Unable to lock"
msgstr "Impossible de verrouiller"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1293
msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application"
@ -1299,7 +1305,7 @@ msgstr "Grand texte"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
msgid "Bluetooth Settings"
msgstr "Paramètres Bluetooth"
@ -1319,13 +1325,13 @@ msgstr "Éteint"
msgid "Not In Use"
msgstr "Pas en cours d'utilisation"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
msgid "Turn On"
msgstr "Activer"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Éteindre"
@ -1374,18 +1380,18 @@ msgstr ""
"Les règles d'accès à la localisation peuvent à tout moment être modifiées "
"dans les paramètres de confidentialité."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:102
msgid "<unknown>"
msgstr "<inconnu>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#, javascript-format
msgid "%s Off"
msgstr "%s éteint"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:455
#, javascript-format
msgid "%s Connected"
msgstr "%s connecté"
@ -1393,168 +1399,168 @@ msgstr "%s connecté"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:460
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s non géré"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:463
#, javascript-format
msgid "%s Disconnecting"
msgstr "Déconnexion de %s en cours"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#, javascript-format
msgid "%s Connecting"
msgstr "Connexion de %s en cours"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:473
#, javascript-format
msgid "%s Requires Authentication"
msgstr "Authentification nécessaire pour %s"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:481
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Micrologiciel manquant pour %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:484
#: js/ui/status/network.js:485
#, javascript-format
msgid "%s Unavailable"
msgstr "%s non disponible"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:488
#, javascript-format
msgid "%s Connection Failed"
msgstr "Échec de connexion à %s"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:504
msgid "Wired Settings"
msgstr "Paramètres filaire"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:546
msgid "Mobile Broadband Settings"
msgstr "Paramètres connexion mobile"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Équipement %s désactivé"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:593
#, javascript-format
msgid "%s Disabled"
msgstr "%s désactivé"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:633
msgid "Connect to Internet"
msgstr "Se connecter à Internet"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:823
msgid "Airplane Mode is On"
msgstr "Le mode avion est activé"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:824
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Le Wi-Fi est désactivé quand le mode avion est activé."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:825
msgid "Turn Off Airplane Mode"
msgstr "Désactiver le mode avion"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:834
msgid "Wi-Fi is Off"
msgstr "Le Wi-fi est désactivé"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:835
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Le Wi-Fi a besoin d'être activé pour se connecter à un réseau."
#: js/ui/status/network.js:826
#: js/ui/status/network.js:836
msgid "Turn On Wi-Fi"
msgstr "Activer le Wi-Fi"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:861
msgid "Wi-Fi Networks"
msgstr "Réseaux Wi-Fi"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:863
msgid "Select a network"
msgstr "Choisir un réseau"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:893
msgid "No Networks"
msgstr "Aucun réseau disponible"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Utiliser l'interrupteur matériel pour éteindre"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "Sélectionner un réseau"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "Paramètres Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1306
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s actif"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1321
#, javascript-format
msgid "%s Not Connected"
msgstr "%s non connecté"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1421
msgid "connecting..."
msgstr "connexion..."
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1424
msgid "authentication required"
msgstr "authentification nécessaire"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1426
msgid "connection failed"
msgstr "échec de connexion"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Paramètres du réseau"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1494
msgid "VPN Settings"
msgstr "Paramètres VPN"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1513
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1523
msgid "VPN Off"
msgstr "VPN désactivé"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1709
msgid "Connection failed"
msgstr "Échec de connexion"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1710
msgid "Activation of network connection failed"
msgstr "L'activation de la connexion réseau a échoué"

512
po/fur.po

File diff suppressed because it is too large Load Diff

1331
po/gl.po

File diff suppressed because it is too large Load Diff

View File

@ -313,7 +313,7 @@ msgstr "Mrežna prijava"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "mreža-radnagrupa"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#, javascript-format

513
po/hu.po

File diff suppressed because it is too large Load Diff

491
po/id.po

File diff suppressed because it is too large Load Diff

469
po/it.po

File diff suppressed because it is too large Load Diff

686
po/kk.po

File diff suppressed because it is too large Load Diff

538
po/lt.po

File diff suppressed because it is too large Load Diff

957
po/nb.po

File diff suppressed because it is too large Load Diff

329
po/pa.po
View File

@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-sh"
"ell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-08-19 21:36+0000\n"
"PO-Revision-Date: 2016-09-05 07:28-0600\n"
"POT-Creation-Date: 2016-11-23 20:38+0000\n"
"PO-Revision-Date: 2016-12-05 18:27-0600\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi <punjabi-users@list.sf.net>\n"
"Language: pa\n"
@ -18,6 +18,30 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 2.0\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
msgstr "ਸਿਸਟਮ"
#: data/50-gnome-shell-system.xml:9
msgid "Show the notification list"
msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੂਚੀ ਵੇਖਾਓ"
#: data/50-gnome-shell-system.xml:12
msgid "Focus the active notification"
msgstr "ਸਰਗਰਮ ਸੂਚਨਾ ਉੱਤੇ ਫੋਕਸ"
#: data/50-gnome-shell-system.xml:15
msgid "Show the overview"
msgstr "ਸੰਖੇਪ ਵੇਖਾਓ"
#: data/50-gnome-shell-system.xml:18
msgid "Show all applications"
msgstr "ਸਭ ਐਪਲੀਕੇਸ਼ਨ ਵੇਖੋ"
#: data/50-gnome-shell-system.xml:21
msgid "Open the application menu"
msgstr "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ ਖੋਲ੍ਹੋ"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
msgid "GNOME Shell Extension Preferences"
msgstr "ਗਨੋਮ ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨ ਪਸੰਦ"
@ -143,7 +167,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:77
msgid ""
"Whether the default Bluetooth adapter had set up devices associated to it"
msgstr ""
msgstr "ਕੀ ਡਿਫਾਲਟ ਬਲਿਊਟੁੱਥ ਅਡੈਪਟਰ ਇਸ ਨਾਲ ਸਬੰਧਿਤ ਡਿਵਾਈਸਾਂ ਲਈ ਸੈੱਟ ਅੱਪ ਕੀਤਾ ਹੈ"
#: data/org.gnome.shell.gschema.xml.in:78
msgid ""
@ -295,23 +319,23 @@ msgstr "%s ਲਈ ਪਸੰਦ ਡਾਈਲਾਗ ਨੂੰ ਲੋਡ ਕਰਨ
msgid "GNOME Shell Extensions"
msgstr "ਗਨੋਮ ਸ਼ੈਲ ਇਕਸਟੈਸ਼ਨ"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:928
msgid "Cancel"
msgstr "ਰੱਦ ਕਰੋ"
#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448
#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450
msgid "Next"
msgstr "ਅੱਗੇ"
#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403
#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:403
#: js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "ਅਣ-ਲਾਕ"
#: js/gdm/authPrompt.js:214
#: js/gdm/authPrompt.js:216
msgctxt "button"
msgid "Sign In"
msgstr "ਸਾਇਨ ਇਨ"
@ -329,7 +353,7 @@ msgstr "ਲਿਸਟ ਵਿੱਚ ਨਹੀਂ ਹੈ?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(ਜਿਵੇਂ ਕਿ ਯੂਜ਼ਰ ਜਾਂ %s)"
@ -337,12 +361,12 @@ msgstr "(ਜਿਵੇਂ ਕਿ ਯੂਜ਼ਰ ਜਾਂ %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "ਯੂਜ਼ਰ ਨਾਂ: "
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "ਲਾਗਇਨ ਵਿੰਡੋ"
@ -446,7 +470,7 @@ msgstr "%d %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
#: js/portalHelper/main.js:85
#: js/portalHelper/main.js:87
msgid "Web Authentication Redirect"
msgstr "ਵੈੱਬ ਪਰਮਾਣਕਿਤਾ ਰੀ-ਡਾਇਰੈਕਟ"
@ -460,31 +484,35 @@ msgstr "ਪਹੁੰਚ ਉੱਤ ਪਾਬੰਦੀ"
msgid "Grant Access"
msgstr "ਪਹੁੰਚ ਲਈ ਮਨਜ਼ੂਰੀ"
#: js/ui/appDisplay.js:794
#: js/ui/appDisplay.js:806
msgid "Frequently used applications will appear here"
msgstr "ਆਮ ਵਰਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੀਆਂ"
#: js/ui/appDisplay.js:914
#: js/ui/appDisplay.js:926
msgid "Frequent"
msgstr "ਅਕਸਰ"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:933
msgid "All"
msgstr "ਸਭ"
#: js/ui/appDisplay.js:1853
#: js/ui/appDisplay.js:1891
msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: js/ui/appDisplay.js:1881 js/ui/dash.js:289
#: js/ui/appDisplay.js:1905
msgid "Launch using Dedicated Graphics Card"
msgstr "ਵੱਖਰੇ ਗਰਾਫ਼ਿਕਸ ਕਾਰਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਚਲਾਓ"
#: js/ui/appDisplay.js:1932 js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: js/ui/appDisplay.js:1887
#: js/ui/appDisplay.js:1938
msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
#: js/ui/appDisplay.js:1897
#: js/ui/appDisplay.js:1948
msgid "Show Details"
msgstr "ਵੇਰਵਾ ਵੇਖੋ"
@ -642,7 +670,7 @@ msgstr "ਬਾਹਰੀ ਡਰਾਇਵ ਕੁਨੈਕਟ ਹੋਈ"
msgid "External drive disconnected"
msgstr "ਬਾਹਰੀ ਡਰਾਇਵ ਡਿਸ-ਕੁਨੈਕਟ ਹੈ"
#: js/ui/components/autorunManager.js:355
#: js/ui/components/autorunManager.js:356
#, javascript-format
msgid "Open with %s"
msgstr "%s ਨਾਲ ਖੋਲ੍ਹੋ"
@ -655,8 +683,8 @@ msgstr "ਪਾਸਵਰਡ:"
msgid "Type again:"
msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:355 js/ui/status/network.js:931
msgid "Connect"
msgstr "ਕੁਨੈਕਟ ਕਰੋ"
@ -684,18 +712,18 @@ msgstr "ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਪਾਸਵਰਡ: "
msgid "Service: "
msgstr "ਸਰਵਿਸ: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "ਬੇਤਾਰ ਨੈੱਟਵਰਕ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "ਬੇਤਾਰ ਨੈੱਟਵਰਕ “%s” ਵਰਤਣ ਲਈ ਪਾਸਵਰਡ ਜਾਂ ਇੰਕ੍ਰਿਪਸ਼ਨ ਕੁੰਜੀਆਂ ਦੀ ਲੋੜ ਹੈ।"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "ਤਾਰ 802.1X ਪਰਮਾਣਕਿਤਾ"
@ -703,15 +731,15 @@ msgstr "ਤਾਰ 802.1X ਪਰਮਾਣਕਿਤਾ"
msgid "Network name: "
msgstr "ਨੈੱਟਵਰਕ ਨਾਂ: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "DSL ਪਰਮਾਣਕਿਤਾ"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "PIN ਕੋਡ ਲੋੜੀਦਾ ਹੈ"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਜੰਤਰ ਲਈ PIN ਕੋਡ ਚਾਹੀਦਾ ਹੈ"
@ -719,17 +747,17 @@ msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਜੰਤਰ ਲਈ PIN ਕ
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਨੈੱਟਵਰਕ ਪਾਸਵਰਡ"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "“%s” ਨਾਲ ਕੁਨੈਕਟ ਹੋਣ ਲਈ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ। "
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1734
msgid "Network Manager"
msgstr "ਨੈੱਟਵਰਕ ਮੈਨੇਜਰ"
@ -755,12 +783,12 @@ msgstr "ਅਫਸੋਸ, ਉਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ। ਫੇਰ
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s ਨੂੰ ਹੁਣ %s ਵਜੋਂ ਜਾਣਿਆ ਜਾਵੇਗਾ"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "ਵਿੰਡੋ"
@ -902,8 +930,6 @@ msgid "Power off after updates are installed"
msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਦੇ ਬਾਅਦ ਬੰਦ ਕਰੋ"
#: js/ui/endSessionDialog.js:137
#| msgctxt "title"
#| msgid "Restart & Install Updates"
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ ਤੇ ਅੱਪਗਰੇਡ ਇੰਸਟਾਲ ਕਰੋ"
@ -917,6 +943,9 @@ msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
msgstr ""
"ਮੁੜ-ਚਾਲੂ ਹੋਣ ਦੇ ਬਾਅਦ %s %s ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ। ਅੱਪਗਰੇਡ ਇੰਸਟਾਲੇਸ਼ਨ ਨੂੰ ਲੰਮਾ"
" ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ: "
"ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਬੈਕਅੱਪ ਲੈ ਲਿਆ ਹੈ ਅਤੇ ਕੰਪਿਊਟਰ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੈ।"
#: js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
@ -1048,6 +1077,54 @@ msgstr "ਸੰਖੇਪ"
msgid "Type to search…"
msgstr "…ਲੱਭਣ ਲਈ ਲਿਖੋ"
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "...ਨਵਾਂ ਸ਼ਾਰਟਕੱਟ"
#: js/ui/padOsd.js:86
#| msgid "Applications"
msgid "Application defined"
msgstr "ਨਿਰਧਾਰਿਤ ਐਪਲੀਕੇਸ਼ਨ"
#: js/ui/padOsd.js:87
#| msgid "Show the onscreen keyboard"
msgid "Show on-screen help"
msgstr "ਆਨ-ਸਕਰੀਨ ਮਦਦ ਵੇਖਾਓ"
#: js/ui/padOsd.js:88
#, fuzzy
#| msgid "Switch User"
msgid "Switch monitor"
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "ਕੀ-ਸਟਰੋਕ ਦਿਓ"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "ਮੁਕੰਮਲ"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "ਸੋਧ…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "ਕੋਈ ਨਹੀਂ"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "ਸੰਰਚਨਾ ਲਈ ਬਟਨ ਨੂੰ ਦੱਬੋ"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "ਬਾਹਰ ਜਾਣ ਲਈ ਕੋਈ ਵੀ Esc ਦੱਬੋ"
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "ਬਾਹਰ ਜਾਣ ਲਈ ਕੋਈ ਵੀ ਸਵਿੱਚ ਦੱਬੋ"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "ਬਾਹਰ"
@ -1084,6 +1161,11 @@ msgstr "ਕਮਾਂਡ ਦਿਓ"
msgid "Close"
msgstr "ਬੰਦ ਕਰੋ"
#: js/ui/runDialog.js:277
#| msgid "Encryption is not available"
msgid "Restart is not available on Wayland"
msgstr "ਵੇਅਲੈਂਡ ਉੱਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ ਉਪਲਬਧ ਨਹੀਂ"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "...ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
@ -1112,7 +1194,7 @@ msgstr[1] "%d ਨਵੀਆਂ ਸੂਚਨਾਵਾਂ"
msgid "Lock"
msgstr "ਲਾਕ"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "ਗਨੋਮ ਨੂੰ ਸਕਰੀਨ ਲਾਕ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
@ -1123,11 +1205,11 @@ msgstr "ਗਨੋਮ ਨੂੰ ਸਕਰੀਨ ਲਾਕ ਕਰਨ ਦੀ ਲੋ
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "ਅਣਲਾਕ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "ਲਾਕ ਨੂੰ ਐਪਲੀਕੇਸ਼ਨ ਵਲੋਂ ਪਾਬੰਦੀ ਲਗਾਈ"
@ -1211,7 +1293,7 @@ msgstr "ਵੱਡੇ ਅੱਖਰ"
msgid "Bluetooth"
msgstr "ਬਲਿਊਟੁੱਥ"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
msgid "Bluetooth Settings"
msgstr "ਬਲਿਊਟੁੱਥ ਸੈਟਿੰਗ"
@ -1228,16 +1310,16 @@ msgid "Off"
msgstr "ਬੰਦ"
#: js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "ਵਰਤੋਂ ਵਿੱਚ ਨਹੀਂ"
msgid "On"
msgstr "ਚਾਲੂ"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1291
msgid "Turn On"
msgstr "ਚਾਲੂ ਕਰੋ"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:356 js/ui/status/network.js:1291
#: js/ui/status/network.js:1406 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "ਬੰਦ ਕਰੋ"
@ -1283,19 +1365,20 @@ msgstr "ਕੀ ਆਪਣੇ ਟਿਕਾਣੇ ਲਈ %s ਨੂੰ ਪਹੁੰ
#: js/ui/status/location.js:437
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"ਟਿਕਾਣਾ ਪਹੁੰਚ ਨੂੰ ਪਰਦੇਦਾਰੀ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਵੀ ਸਮੇਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।"
#: js/ui/status/network.js:101
#: js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<ਅਣਜਾਣ>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:454 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s ਬੰਦ ਹੈ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:457
#, javascript-format
msgid "%s Connected"
msgstr "%s ਕਨੈਕਟ ਹੈ"
@ -1303,169 +1386,193 @@ msgstr "%s ਕਨੈਕਟ ਹੈ"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:462
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s ਬਿਨ-ਪਰਬੰਧ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:465
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s ਡਿਸ-ਕੁਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:472 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "%s ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:475
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:483
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "%s ਲਈ ਫਿਰਮਵੇਅਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:484
#: js/ui/status/network.js:487
#, javascript-format
msgid "%s Unavailable"
msgstr "%s ਨਾ-ਮੌਜੂਦ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:490
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:506
msgid "Wired Settings"
msgstr "ਤਾਰ ਸੈਟਿੰਗ"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:548
msgid "Mobile Broadband Settings"
msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਸੈਟਿੰਗ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:591 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s ਹਾਰਡਵੇਅਰ ਬੰਦ ਹੈ"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:595
#, javascript-format
msgid "%s Disabled"
msgstr "%s ਬੰਦ ਹੈ"
#: js/ui/status/network.js:632
#| msgid "Connection error"
#: js/ui/status/network.js:635
msgid "Connect to Internet"
msgstr "ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:825
msgid "Airplane Mode is On"
msgstr "ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੈ"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:826
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "ਜਦੋਂ ਏਅਰ-ਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੁੰਦਾ ਹੈ ਤਾਂ ਵਾਈ-ਫਾਈ ਬੰਦ ਹੁੰਦਾ ਹੈ"
#: js/ui/status/network.js:815
#: js/ui/status/network.js:827
msgid "Turn Off Airplane Mode"
msgstr "ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਕਰੋ"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:836
msgid "Wi-Fi is Off"
msgstr "ਵਾਈ-ਫਾਈ ਬੰਦ ਹੈ"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:837
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "ਨੈੱਟਵਰਕ ਨਾਲ ਕੁਨੈਕਟ ਕਰਨ ਲਈ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
#: js/ui/status/network.js:826
#: js/ui/status/network.js:838
msgid "Turn On Wi-Fi"
msgstr "ਵਾਈ-ਫਾਈ ਚਾਲੂ"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:863
msgid "Wi-Fi Networks"
msgstr "ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:865
msgid "Select a network"
msgstr "ਨੈੱਟਵਰਕ ਚੁਣੋ"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:895
msgid "No Networks"
msgstr "ਕੋਈ ਨੈੱਟਵਰਕ ਨਹੀਂ"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:916 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "ਬੰਦ ਕਰਨ ਲਈ ਹਾਰਡਵੇਅਰ ਸਵਿੱਚ ਵਰਤੋਂ"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1183
msgid "Select Network"
msgstr "ਨੈੱਟਵਰਕ ਚੁਣੋ"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1189
msgid "Wi-Fi Settings"
msgstr "ਵਾਈ-ਫਾਈ ਸੈਟਿੰਗ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s ਹਾਟਸਪਾਟ ਸਰਗਰਮ"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s ਕੁਨੈਕਟ ਨਹੀਂ ਹੈ"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1423
msgid "connecting..."
msgstr "...ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1426
msgid "authentication required"
msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1428
msgid "connection failed"
msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1494 js/ui/status/network.js:1587
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗ"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1496
msgid "VPN Settings"
msgstr "VPN ਸੈਟਿੰਗ"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1515
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1525
msgid "VPN Off"
msgstr "VPN ਬੰਦ ਹੈ"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1618
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s ਤਾਰ ਵਾਲਾ ਕਨੈਕਸ਼ਨ"
msgstr[1] "%s ਤਾਰ ਵਾਲੇ ਕਨੈਕਸ਼ਨ"
#: js/ui/status/network.js:1622
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Wi-Fi ਕਨੈਕਸ਼ਨ"
msgstr[1] "%s Wi-Fi ਕਨੈਕਸ਼ਨ"
#: js/ui/status/network.js:1626
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s ਮਾਡਲ ਕਨੈਕਸ਼ਨ"
msgstr[1] "%s ਮਾਡਲ ਕਨੈਕਸ਼ਨ"
#: js/ui/status/network.js:1773
msgid "Connection failed"
msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1774
msgid "Activation of network connection failed"
msgstr "ਨੈੱਟਵਰਕ ਕੁਨੈਕਸ਼ਨ ਦੀ ਐਕਟੀਵੇਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ"
@ -1547,11 +1654,11 @@ msgstr "ਹੋਰ ਯੂਜ਼ਰ ਵਜੋਂ ਲਾਗਇਨ"
msgid "Unlock Window"
msgstr "ਵਿੰਡੋ ਅਣਲਾਕ"
#: js/ui/viewSelector.js:159
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: js/ui/viewSelector.js:163
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "ਖੋਜ"
@ -1560,22 +1667,22 @@ msgstr "ਖੋਜ"
msgid "“%s” is ready"
msgstr "“%s” ਤਿਆਰ ਹੈ"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:64
msgid "Do you want to keep these display settings?"
msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਡਿਸਪਲੇਅ ਸੈਟਿੰਗ ਲਾਗੂ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:83
msgid "Revert Settings"
msgstr "ਸੈਟਿੰਗ ਵਾਪਿਸ ਲਵੋ"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "ਬਦਲਾਅ ਲਾਗੂ ਰੱਖੋ"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:104
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1584,7 +1691,7 @@ msgstr[1] "ਸੈਟਿੰਗ ਬਦਲਾਅ ਨੂੰ %d ਸਕਿੰਟਾਂ
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:659
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1660,7 +1767,7 @@ msgstr "ਈਵੇਲੂਸ਼ਨ ਕੈਲੰਡਰ"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "ਈਵੇਲੂਸ਼ਨ"
msgstr "evolution"
#. translators:
#. * The number of sound outputs on a particular device
@ -1684,19 +1791,19 @@ msgstr[1] "%u ਇੰਪੁੱਟ"
msgid "System Sounds"
msgstr "ਸਿਸਟਮ ਸਾਊਂਡ"
#: src/main.c:381
#: src/main.c:380
msgid "Print version"
msgstr "ਵਰਜਨ ਛਾਪੋ"
#: src/main.c:387
#: src/main.c:386
msgid "Mode used by GDM for login screen"
msgstr "ਲਾਗਇਨ ਸਕਰੀਨ ਲਈ GDM ਵਲੋਂ ਵਰਤਿਆ ਮੋਡ"
#: src/main.c:393
#: src/main.c:392
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "ਲਾਗਇਨ ਸਕਰੀਨ ਉੱਤੇ ਖਾਸ ਮੋਡ ਜਿਵੇਂ ਕਿ \"gdm\" ਵਰਤੋਂ"
#: src/main.c:399
#: src/main.c:398
msgid "List possible modes"
msgstr "ਸੰਭਵ ਮੋਡ ਵੇਖਾਓ"
@ -1722,23 +1829,8 @@ msgstr "ਪਾਸਵਰਡ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ"
msgid "Authentication dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋਂ ਰੱਦ ਕੀਤਾ"
#~ msgid "System"
#~ msgstr "ਸਿਸਟਮ"
#~ msgid "Show the notification list"
#~ msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੂਚੀ ਵੇਖਾਓ"
#~ msgid "Focus the active notification"
#~ msgstr "ਸਰਗਰਮ ਸੂਚਨਾ ਉੱਤੇ ਫੋਕਸ"
#~ msgid "Show the overview"
#~ msgstr "ਸੰਖੇਪ ਵੇਖਾਓ"
#~ msgid "Show all applications"
#~ msgstr "ਸਭ ਐਪਲੀਕੇਸ਼ਨ ਵੇਖੋ"
#~ msgid "Open the application menu"
#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ ਖੋਲ੍ਹੋ"
#~ msgid "Not In Use"
#~ msgstr "ਵਰਤੋਂ ਵਿੱਚ ਨਹੀਂ"
#~ msgid "Show the week date in the calendar"
#~ msgstr "ਕੈਲੰਡਰ ਵਿੱਚ ਹਫ਼ਤਾ ਮਿਤੀ ਵੇਖੋ"
@ -1772,9 +1864,6 @@ msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋ
#~ msgid "Airplane Mode"
#~ msgstr "ਏਅਰਪਲੇਨ ਮੋਡ"
#~ msgid "On"
#~ msgstr "ਚਾਲੂ"
#~ msgid "Show the message tray"
#~ msgstr "ਸੁਨੇਹਾ ਟਰੇ ਵੇਖਾਓ"
@ -1913,9 +2002,6 @@ msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋ
#~ msgid "Status is set to offline"
#~ msgstr "ਹਾਲਤ ਆਫਲਾਈਨ ਸੈੱਟ ਕੀਤੀ ਗਈ ਹੈ"
#~ msgid "Encryption is not available"
#~ msgstr "ਇੰਕ੍ਰਿਪਸ਼ਨ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ"
#~ msgid "Certificate is invalid"
#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਗਲਤ ਹੈ"
@ -2572,9 +2658,6 @@ msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋ
#~ msgid "If true, display onscreen keyboard."
#~ msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਆਨਸਕਰੀਨ ਕੀਬੋਰਡ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
#~ msgid "Show the onscreen keyboard"
#~ msgstr "ਆਨਸਕਰੀਨ ਕੀਬੋਰਡ ਵੇਖਾਓ"
#~ msgid "Connectivity lost"
#~ msgstr "ਕੁਨੈਕਸ਼ਨ ਟੁੱਟ ਗਿਆ"

480
po/pl.po

File diff suppressed because it is too large Load Diff

View File

@ -301,7 +301,7 @@ msgstr "Sessão na rede"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "Grupo de Trabalho na Rede"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#, javascript-format
@ -1685,7 +1685,7 @@ msgstr "Calendário do Evolution"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "Evolution"
msgstr "evolution"
#. translators:
#. * The number of sound outputs on a particular device

File diff suppressed because it is too large Load Diff

167
po/ru.po
View File

@ -19,16 +19,16 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-09-07 09:41+0000\n"
"PO-Revision-Date: 2016-09-11 20:49+0300\n"
"POT-Creation-Date: 2016-11-23 20:37+0000\n"
"PO-Revision-Date: 2016-11-24 00:07+0300\n"
"Last-Translator: Stas Solovey <whats_up@tut.by>\n"
"Language-Team: Russian <gnome-cyr@gnome.org>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Gtranslator 2.91.7\n"
#: data/50-gnome-shell-system.xml:6
@ -336,7 +336,7 @@ msgstr "Расширения GNOME Shell"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
msgid "Cancel"
msgstr "Отмена"
@ -367,7 +367,7 @@ msgstr "Нет в списке?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(например, пользователь или %s)"
@ -375,12 +375,12 @@ msgstr "(например, пользователь или %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Имя пользователя: "
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Окно входа в систему"
@ -438,7 +438,7 @@ msgstr "%A, %H%M"
#: js/misc/util.js:209
#, no-c-format
msgid "%B %d, %H%M"
msgstr "%d %b., %H%M"
msgstr "%e %b., %H%M"
# fix даты
#. Translators: this is the month name, day number, year
@ -447,7 +447,7 @@ msgstr "%d %b., %H%M"
#: js/misc/util.js:215
#, no-c-format
msgid "%B %d %Y, %H%M"
msgstr "%d %b. %Y, %H%M"
msgstr "%e %b. %Y, %H%M"
# по всей видимости разрабы коммент перепутали c "Translators: Time in 12h format"
#. Translators: Time in 12h format
@ -476,7 +476,7 @@ msgstr "%A, %l%M %p"
#: js/misc/util.js:238
#, no-c-format
msgid "%B %d, %l%M %p"
msgstr "%d %b., %l%M %p"
msgstr "%e %b., %l%M %p"
# fix даты
#. Translators: this is the month name, day number, year
@ -485,7 +485,7 @@ msgstr "%d %b., %l%M %p"
#: js/misc/util.js:244
#, no-c-format
msgid "%B %d %Y, %l%M %p"
msgstr "%d %b. %Y, %l%M %p"
msgstr "%e %b. %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
@ -655,17 +655,16 @@ msgstr "Весь день"
msgid "Events"
msgstr "События"
# fix для даты в календаре и на экране блокировки, за разъяснением обращаться к Stas Solovey <whats_up@tut.by>
#: js/ui/calendar.js:845
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d %b."
msgstr "%A, %e %b."
# fix для даты в календаре и на экране блокировки
#: js/ui/calendar.js:849
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %b. %Y"
msgstr "%A, %e %b. %Y"
#: js/ui/calendar.js:931
msgid "Notifications"
@ -700,8 +699,8 @@ msgstr "Пароль:"
msgid "Type again:"
msgstr "Введите ещё раз:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
msgid "Connect"
msgstr "Соединиться"
@ -729,11 +728,11 @@ msgstr "Пароль личного ключа: "
msgid "Service: "
msgstr "Служба: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "Беспроводная сеть требует подтверждения подлинности"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -741,7 +740,7 @@ msgid ""
msgstr ""
"Для доступа к беспроводной сети «%s» требуется пароль или ключ шифрования."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Аутентификация Wired 802.1X"
@ -749,15 +748,15 @@ msgstr "Аутентификация Wired 802.1X"
msgid "Network name: "
msgstr "Название сети: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Аутентификация DSL"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Требуется PIN-код"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Для широкополосного мобильного устройства требуется PIN-код"
@ -765,17 +764,17 @@ msgstr "Для широкополосного мобильного устрой
msgid "PIN: "
msgstr "PIN-код: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Пароль для мобильной широкополосной сети"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Для подключения к «%s» требуется пароль."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1670
msgid "Network Manager"
msgstr "Диспетчер сети"
@ -801,7 +800,7 @@ msgstr "Не удалось подтвердить подлинность. По
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "Контакт %s теперь известен как %s"
@ -958,8 +957,6 @@ msgid "Power off after updates are installed"
msgstr "Выключить после установки обновлений"
#: js/ui/endSessionDialog.js:137
#| msgctxt "title"
#| msgid "Restart & Install Updates"
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Перезапуск и установка обновлений"
@ -1145,6 +1142,10 @@ msgstr "Введите команду"
msgid "Close"
msgstr "Закрыть"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Перезапуск не доступен при использовании Wayland"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Перезапуск…"
@ -1187,11 +1188,11 @@ msgstr "GNOME необходимо заблокировать экран"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1292
msgid "Unable to lock"
msgstr "Не удалось заблокировать"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1293
msgid "Lock was blocked by an application"
msgstr "Блокировке помешало приложение"
@ -1275,7 +1276,7 @@ msgstr "Крупный текст"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
msgid "Bluetooth Settings"
msgstr "Настроить Bluetooth"
@ -1296,13 +1297,13 @@ msgstr "Выключено"
msgid "Not In Use"
msgstr "Не используется"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
msgid "Turn On"
msgstr "Включить"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Выключить"
@ -1351,18 +1352,18 @@ msgstr ""
"Параметры доступа к данным местоположения можно изменить в любое время в "
"настройках конфиденциальности."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:102
msgid "<unknown>"
msgstr "<неизвестно>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#, javascript-format
msgid "%s Off"
msgstr "Выключено %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:455
#, javascript-format
msgid "%s Connected"
msgstr "Подключено %s"
@ -1370,168 +1371,168 @@ msgstr "Подключено %s"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:460
#, javascript-format
msgid "%s Unmanaged"
msgstr "Не управляется %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:463
#, javascript-format
msgid "%s Disconnecting"
msgstr "Отключение %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#, javascript-format
msgid "%s Connecting"
msgstr "Подключение %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:473
#, javascript-format
msgid "%s Requires Authentication"
msgstr "Требуется аутентификация для %s"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:481
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Отсутствует прошивка для %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:484
#: js/ui/status/network.js:485
#, javascript-format
msgid "%s Unavailable"
msgstr "Недоступно %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:488
#, javascript-format
msgid "%s Connection Failed"
msgstr "Сбой подключения %s"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:504
msgid "Wired Settings"
msgstr "Параметры проводных соединений"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:546
msgid "Mobile Broadband Settings"
msgstr "Параметры широкополосной мобильной связи"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Оборудование выключено %s"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:593
#, javascript-format
msgid "%s Disabled"
msgstr "Выключено %s"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:633
msgid "Connect to Internet"
msgstr "Подключиться к Интернету"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:823
msgid "Airplane Mode is On"
msgstr "Включён режим авиаперелёта"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:824
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Когда включён режим авиаперелёта, адаптер Wi-Fi выключен."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:825
msgid "Turn Off Airplane Mode"
msgstr "Выключить режим авиаперелёта"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:834
msgid "Wi-Fi is Off"
msgstr "Wi-Fi выключен"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:835
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Для подключения к сети, адаптер Wi-Fi должен быть включён."
#: js/ui/status/network.js:826
#: js/ui/status/network.js:836
msgid "Turn On Wi-Fi"
msgstr "Включить Wi-Fi"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:861
msgid "Wi-Fi Networks"
msgstr "Сети Wi-Fi"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:863
msgid "Select a network"
msgstr "Выберите сеть"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:893
msgid "No Networks"
msgstr "Сети отсутствуют"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Используйте механический переключатель, чтобы выключить"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "Выбрать сеть"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "Параметры Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1306
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Точка доступа %s включена"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1321
#, javascript-format
msgid "%s Not Connected"
msgstr "Не подключено %s"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1421
msgid "connecting..."
msgstr "подключение…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1424
msgid "authentication required"
msgstr "требуется подтверждение подлинности"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1426
msgid "connection failed"
msgstr "сбой подключения"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Настроить сеть"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1494
msgid "VPN Settings"
msgstr "Параметры VPN"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1513
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1523
msgid "VPN Off"
msgstr "Соединение VPN выключено"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1709
msgid "Connection failed"
msgstr "Сбой подключения"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1710
msgid "Activation of network connection failed"
msgstr "Не удалось активировать сетевое подключение"
@ -1799,6 +1800,19 @@ msgstr "Пароль не может быть пустым"
msgid "Authentication dialog was dismissed by the user"
msgstr "Аутентификация отклонена пользователем"
#, fuzzy
#~| msgid "Applications"
#~ msgid "Application defined"
#~ msgstr "Приложения"
#, fuzzy
#~| msgid "Switch User"
#~ msgid "Switch monitor"
#~ msgstr "Сменить пользователя"
#~ msgid "On"
#~ msgstr "Включено"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Показывать в календаре нумерацию недель"
@ -1833,6 +1847,3 @@ msgstr "Аутентификация отклонена пользователе
#~ msgid "Airplane Mode"
#~ msgstr "Режим авиаперелёта"
#~ msgid "On"
#~ msgstr "Включено"

456
po/sk.po

File diff suppressed because it is too large Load Diff

496
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

216
po/tr.po
View File

@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-10-21 17:31+0000\n"
"PO-Revision-Date: 2016-10-23 22:58+0300\n"
"POT-Creation-Date: 2016-11-23 22:21+0000\n"
"PO-Revision-Date: 2016-11-24 12:48+0300\n"
"Last-Translator: Muhammet Kara <muhammetk@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n"
@ -337,7 +337,7 @@ msgstr "GNOME Kabuğu Uzantıları"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:928
msgid "Cancel"
msgstr "İptal"
@ -485,7 +485,7 @@ msgstr "%d %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page
#: js/portalHelper/main.js:85
#: js/portalHelper/main.js:87
msgid "Web Authentication Redirect"
msgstr "Web Kimlik Doğrulama Yönlendirmesi"
@ -698,8 +698,8 @@ msgstr "Parola:"
msgid "Type again:"
msgstr "Terkar yazın:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:355 js/ui/status/network.js:931
msgid "Connect"
msgstr "Bağlan"
@ -727,11 +727,11 @@ msgstr "Özel anahtar parolası: "
msgid "Service: "
msgstr "Hizmet: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "Kablosuz ağ için kimlik doğrulama gerekiyor"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -740,7 +740,7 @@ msgstr ""
"“%s” kablosuz ağına erişmek için parolalar veya şifreleme anahtarları "
"gerekiyor."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Kablolu 802.1X kimlik doğrulaması"
@ -748,15 +748,15 @@ msgstr "Kablolu 802.1X kimlik doğrulaması"
msgid "Network name: "
msgstr "Ağ adı: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "DSL kimlik doğrulama"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "PIN kodu gerekli"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Mobil geniş bant aygıtı için PIN kodu gerekli"
@ -764,17 +764,17 @@ msgstr "Mobil geniş bant aygıtı için PIN kodu gerekli"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Mobil geniş bant ağ parolası"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "“%s”e bağlanmak için parola gerekli."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1670
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1734
msgid "Network Manager"
msgstr "Ağ Yöneticisi"
@ -805,7 +805,7 @@ msgstr "Üzgünüm ama işe yaramadı. Lütfen tekrar deneyin."
msgid "%s is now known as %s"
msgstr "%s, şimdi %s olarak biliniyor"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Pencereler"
@ -1090,6 +1090,52 @@ msgstr "Genel Görünüm"
msgid "Type to search…"
msgstr "Aramak için buraya yazın..."
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Yeni kısayol…"
#: js/ui/padOsd.js:86
#| msgid "Applications"
msgid "Application defined"
msgstr "Uygulama tanımlı"
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Ekranda yardımı göster"
#: js/ui/padOsd.js:88
#| msgid "Switch User"
msgid "Switch monitor"
msgstr "Monitör değiştir"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Tuş vuruşu ata"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Bitti"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Düzenle…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Yok"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Yapılandırmak için bir düğmeye basın"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Çıkmak için Esc'ye basın"
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Çıkmak için herhangi bir tuşa basın"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "Kapat"
@ -1126,6 +1172,11 @@ msgstr "Komut Girin"
msgid "Close"
msgstr "Kapat"
#: js/ui/runDialog.js:277
#| msgid "Encryption is not available"
msgid "Restart is not available on Wayland"
msgstr "Wayland'da yeniden başlatma kullanılabilir değil"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Yeniden başlatılıyor..."
@ -1152,7 +1203,7 @@ msgstr[0] "%d yeni bildirim"
msgid "Lock"
msgstr "Kilitle"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "GNOME'un ekranı kilitlemesi gerekiyor"
@ -1163,11 +1214,11 @@ msgstr "GNOME'un ekranı kilitlemesi gerekiyor"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Kilitlenemedi"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Kilitleme bir uygulama tarafından engellendi"
@ -1251,7 +1302,7 @@ msgstr "Büyük Yazı"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
msgid "Bluetooth Settings"
msgstr "Bluetooth Ayarları"
@ -1270,13 +1321,13 @@ msgstr "Kapalı"
msgid "On"
msgstr "Açık"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1291
msgid "Turn On"
msgstr "Aç"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:356 js/ui/status/network.js:1291
#: js/ui/status/network.js:1406 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Kapat"
@ -1323,18 +1374,18 @@ msgstr "%s uygulaması konumunuza erişebilsin mi?"
msgid "Location access can be changed at any time from the privacy settings."
msgstr "Konum erişimi, gizlilik ayarlarından her zaman değiştirilebilir."
#: js/ui/status/network.js:102
#: js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<bilinmeyen>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#: js/ui/status/network.js:454 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s Kapalı"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:455
#: js/ui/status/network.js:457
#, javascript-format
msgid "%s Connected"
msgstr "%s Bağlandı"
@ -1342,168 +1393,190 @@ msgstr "%s Bağlandı"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:460
#: js/ui/status/network.js:462
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s Yönetilmiyor"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:463
#: js/ui/status/network.js:465
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s Bağlantısı Kesiliyor"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#: js/ui/status/network.js:472 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "%s Bağlanıyor"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:473
#: js/ui/status/network.js:475
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s Kimlik Doğrulaması Gerektiriyor"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:481
#: js/ui/status/network.js:483
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "%s İçin Ürün Bilgisi Eksik"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:485
#: js/ui/status/network.js:487
#, javascript-format
msgid "%s Unavailable"
msgstr "%s Kullanılamaz"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:488
#: js/ui/status/network.js:490
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s Bağlantısı Başarısız Oldu"
#: js/ui/status/network.js:504
#: js/ui/status/network.js:506
msgid "Wired Settings"
msgstr "Kablolu Ağ Ayarları"
#: js/ui/status/network.js:546
#: js/ui/status/network.js:548
msgid "Mobile Broadband Settings"
msgstr "Mobil Geniş Bant Ayarları"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#: js/ui/status/network.js:591 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s Donanımı Devre Dışı"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:593
#: js/ui/status/network.js:595
#, javascript-format
msgid "%s Disabled"
msgstr "%s Devre Dışı"
#: js/ui/status/network.js:633
#: js/ui/status/network.js:635
msgid "Connect to Internet"
msgstr "İnternet'e Bağlan"
#: js/ui/status/network.js:823
#: js/ui/status/network.js:825
msgid "Airplane Mode is On"
msgstr "Uçak Kipi Açık"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:826
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Uçak kipi açıldığında kablosuz ağ devre dışı kalır."
#: js/ui/status/network.js:825
#: js/ui/status/network.js:827
msgid "Turn Off Airplane Mode"
msgstr "Uçak Kipini Kapat"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:836
msgid "Wi-Fi is Off"
msgstr "Kablosuz Ağ Kapalı"
#: js/ui/status/network.js:835
#: js/ui/status/network.js:837
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Bir ağa bağlanmak için kablosuz ağın açık olması gerekir."
#: js/ui/status/network.js:836
#: js/ui/status/network.js:838
msgid "Turn On Wi-Fi"
msgstr "Kablosuz Ağı Aç"
#: js/ui/status/network.js:861
#: js/ui/status/network.js:863
msgid "Wi-Fi Networks"
msgstr "Kablosuz Ağlar"
#: js/ui/status/network.js:863
#: js/ui/status/network.js:865
msgid "Select a network"
msgstr "Bir ağ seçin"
#: js/ui/status/network.js:893
#: js/ui/status/network.js:895
msgid "No Networks"
msgstr "Ağ Yok"
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:916 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Kapatmak için donanım anahtarını kullanın."
#: js/ui/status/network.js:1181
#: js/ui/status/network.js:1183
msgid "Select Network"
msgstr "Ağ Seç"
#: js/ui/status/network.js:1187
#: js/ui/status/network.js:1189
msgid "Wi-Fi Settings"
msgstr "Kablosuz Ağ Ayarları"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1306
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s Etkin Noktası Aktif"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1321
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s Bağlı Değil"
#: js/ui/status/network.js:1421
#: js/ui/status/network.js:1423
msgid "connecting..."
msgstr "bağlanıyor..."
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1424
#: js/ui/status/network.js:1426
msgid "authentication required"
msgstr "kimlik doğrulaması gerekli"
#: js/ui/status/network.js:1426
#: js/ui/status/network.js:1428
msgid "connection failed"
msgstr "bağlantı başarısız"
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1494 js/ui/status/network.js:1587
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Ağ Ayarları"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1496
msgid "VPN Settings"
msgstr "VPN Ayarları"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1515
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1523
#: js/ui/status/network.js:1525
msgid "VPN Off"
msgstr "VPN Kapalı"
#: js/ui/status/network.js:1709
#: js/ui/status/network.js:1618
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kablolu Bağlantı"
#: js/ui/status/network.js:1622
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Kablosuz Ağ Bağlantısı"
#: js/ui/status/network.js:1626
#, javascript-format
#| msgid "%s Connecting"
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem Bağlantısı"
#: js/ui/status/network.js:1773
msgid "Connection failed"
msgstr "Bağlantı başarısız oldu"
#: js/ui/status/network.js:1710
#: js/ui/status/network.js:1774
msgid "Activation of network connection failed"
msgstr "Ağ bağlantısının etkinleştirilmesi başarısız oldu"
@ -1585,11 +1658,11 @@ msgstr "Başka kullanıcı olarak oturum aç"
msgid "Unlock Window"
msgstr "Kilit Açma Penceresi"
#: js/ui/viewSelector.js:159
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Uygulamalar"
#: js/ui/viewSelector.js:163
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Ara"
@ -1598,22 +1671,22 @@ msgstr "Ara"
msgid "“%s” is ready"
msgstr "“%s” hazır"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:64
msgid "Do you want to keep these display settings?"
msgstr "Bu görüntü ayarlarını saklamak istiyor musunuz?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:83
msgid "Revert Settings"
msgstr "Ayarları Eski Haline Getir"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "Değişiklikleri Sakla"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:104
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1621,7 +1694,7 @@ msgstr[0] "Ayarlardaki değişiklikler %d saniye içinde eski haline döndürül
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:659
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1869,9 +1942,6 @@ msgstr "Kimlik doğrulama penceresi kullanıcı tarafından kapatıldı"
#~ msgid "Status is set to offline"
#~ msgstr "Durum çevrimdıına ayarlı"
#~ msgid "Encryption is not available"
#~ msgstr "Şifreleme kullanılabilir değil"
#~ msgid "Certificate is invalid"
#~ msgstr "Sertifika geçersiz"

1310
po/uk.po

File diff suppressed because it is too large Load Diff

View File

@ -22,16 +22,16 @@ 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: 2016-10-11 08:09+0000\n"
"PO-Revision-Date: 2016-10-18 17:33+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"POT-Creation-Date: 2016-12-27 18:15+0000\n"
"PO-Revision-Date: 2016-12-09 21:44+0800\n"
"Last-Translator: Mandy Wang <wangmychn@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.8.9\n"
"X-Generator: Poedit 1.8.7.1\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -131,7 +131,7 @@ msgstr "应用程序选择器中当前已选取视图的索引。"
#: data/org.gnome.shell.gschema.xml.in:50
msgid "History for command (Alt-F2) dialog"
msgstr "命令对话框(Alt-F2)的历史记录"
msgstr "命令对话框 (Alt-F2) 的历史记录"
# http://live.gnome.org/GnomeShell/LookingGlass
#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass
@ -182,28 +182,28 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:93
msgid "Keybinding to open the application menu"
msgstr "用于打开应用程序菜单的按键组合"
msgstr "用于打开应用程序菜单的快捷键"
#: data/org.gnome.shell.gschema.xml.in:94
msgid "Keybinding to open the application menu."
msgstr "用于打开应用程序菜单的按键组合。"
msgstr "用于打开应用程序菜单的快捷键。"
#: data/org.gnome.shell.gschema.xml.in:100
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "用于打开“显示应用程序”视图的按键组合"
msgstr "用于打开“显示应用程序”视图的快捷键 "
#: data/org.gnome.shell.gschema.xml.in:101
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "用于在活动视图中打开“显示应用程序”视图的按键组合。"
msgstr "用于在活动视图中打开“显示应用程序”视图的快捷键。 "
#: data/org.gnome.shell.gschema.xml.in:108
msgid "Keybinding to open the overview"
msgstr "用于打开概览的按键组合"
msgstr "用于打开概览的快捷键 "
#: data/org.gnome.shell.gschema.xml.in:109
msgid "Keybinding to open the Activities Overview."
msgstr "用于打开活动概览的按键组合。"
msgstr "用于打开活动概览的快捷键。 "
#: data/org.gnome.shell.gschema.xml.in:115
msgid "Keybinding to toggle the visibility of the notification list"
@ -224,7 +224,7 @@ msgstr "用于移动焦点到活动通知的快捷键。"
#: data/org.gnome.shell.gschema.xml.in:129
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr "暂停和恢复所有执行中动画的组合键,用于调试"
msgstr "暂停和恢复所有执行中动画的快捷键,用于调试 "
#: data/org.gnome.shell.gschema.xml.in:138
msgid "Which keyboard to use"
@ -314,7 +314,7 @@ msgstr "配置 GNOME Shell 扩展"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
msgid "Cancel"
msgstr "取消"
@ -504,12 +504,12 @@ msgstr "添加到收藏夹"
msgid "Show Details"
msgstr "显示细节"
#: js/ui/appFavorites.js:134
#: js/ui/appFavorites.js:135
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s 已经添加到了您的收藏夹。"
#: js/ui/appFavorites.js:168
#: js/ui/appFavorites.js:169
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s 已经从您的收藏夹移除。"
@ -671,8 +671,8 @@ msgstr "密码:"
msgid "Type again:"
msgstr "再输一次:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
msgid "Connect"
msgstr "连接"
@ -700,18 +700,18 @@ msgstr "私人密钥密码:"
msgid "Service: "
msgstr "服务:"
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "无线网络要求身份认证"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "访问无线网络“%s”需要密码或密钥。"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "有线 802.1X 认证"
@ -719,15 +719,15 @@ msgstr "有线 802.1X 认证"
msgid "Network name: "
msgstr "网络名称:"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "DSL 认证"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "需要 PIN 码"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "移动宽带设备需要 PIN 码"
@ -735,17 +735,17 @@ msgstr "移动宽带设备需要 PIN 码"
msgid "PIN: "
msgstr "PIN"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "移动宽带网络密码"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "连接到“%s”需要密码。"
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1660
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1672
msgid "Network Manager"
msgstr "网络管理器"
@ -1093,6 +1093,10 @@ msgstr "输入一个命令"
msgid "Close"
msgstr "关闭"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Wayland 下重启不可用"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "正在重新启动..."
@ -1130,11 +1134,11 @@ msgstr "GNOME 需要锁定屏幕"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1292
msgid "Unable to lock"
msgstr "无法锁定"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1293
msgid "Lock was blocked by an application"
msgstr "一个应用程序阻止了锁定"
@ -1218,7 +1222,7 @@ msgstr "大号文本"
msgid "Bluetooth"
msgstr "蓝牙"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
msgid "Bluetooth Settings"
msgstr "蓝牙设置"
@ -1237,13 +1241,13 @@ msgstr "关"
msgid "Not In Use"
msgstr "未在使用"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
msgid "Turn On"
msgstr "开启"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "关闭"
@ -1290,18 +1294,18 @@ msgstr "允许 %s 访问您的位置信息?"
msgid "Location access can be changed at any time from the privacy settings."
msgstr "位置访问权限可以随时在隐私设置里更改。"
#: js/ui/status/network.js:101
#: js/ui/status/network.js:102
msgid "<unknown>"
msgstr "<未知>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#, javascript-format
msgid "%s Off"
msgstr "%s 已关闭"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:455
#, javascript-format
msgid "%s Connected"
msgstr "%s 已连接"
@ -1309,168 +1313,168 @@ msgstr "%s 已连接"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:460
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s 未托管"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:463
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s 正在断开"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#, javascript-format
msgid "%s Connecting"
msgstr "%s 正在连接"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:473
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s 需要认证"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:481
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "%s 的固件缺失"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:484
#: js/ui/status/network.js:485
#, javascript-format
msgid "%s Unavailable"
msgstr "%s 不可用"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:488
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s 连接失败"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:504
msgid "Wired Settings"
msgstr "有线设置"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:546
msgid "Mobile Broadband Settings"
msgstr "移动宽带设置"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s 硬件开关关闭"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:593
#, javascript-format
msgid "%s Disabled"
msgstr "%s 已禁用"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:633
msgid "Connect to Internet"
msgstr "连接到互联网"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:823
msgid "Airplane Mode is On"
msgstr "已开启飞行模式"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:824
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "启用飞行模式时 Wi-Fi 会关闭"
#: js/ui/status/network.js:815
#: js/ui/status/network.js:825
msgid "Turn Off Airplane Mode"
msgstr "关闭飞行模式"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:834
msgid "Wi-Fi is Off"
msgstr "Wi-Fi 关闭"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:835
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "连接网络需要开启 Wi-Fi"
#: js/ui/status/network.js:826
#: js/ui/status/network.js:836
msgid "Turn On Wi-Fi"
msgstr "开启 Wi-Fi"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:861
msgid "Wi-Fi Networks"
msgstr "Wi-Fi 网络"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:863
msgid "Select a network"
msgstr "选择网络"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:893
msgid "No Networks"
msgstr "无网络"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "使用硬件开关关闭"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "选择网络"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "Wi-Fi 设置"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1306
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s 热点已激活"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1321
#, javascript-format
msgid "%s Not Connected"
msgstr "%s 无连接"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1421
msgid "connecting..."
msgstr "正在连接..."
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1424
msgid "authentication required"
msgstr "需要认证"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1426
msgid "connection failed"
msgstr "连接失败"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "网络设置"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1494
msgid "VPN Settings"
msgstr "VPN 设置"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1513
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1523
msgid "VPN Off"
msgstr "VPN 已关闭"
#: js/ui/status/network.js:1699
#: js/ui/status/network.js:1711
msgid "Connection failed"
msgstr "连接失败"
#: js/ui/status/network.js:1700
#: js/ui/status/network.js:1712
msgid "Activation of network connection failed"
msgstr "启用网络连接失败"

File diff suppressed because it is too large Load Diff

View File

@ -335,7 +335,7 @@ INTROSPECTION_GIRS += ShellMenu-0.1.gir
CLEANFILES += ShellMenu-0.1.gir
Shell-0.1.gir: gnome-shell St-1.0.gir ShellMenu-0.1.gir
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4
Shell_0_1_gir_INCLUDES = Clutter-$(LIBMUTTER_API_VERSION) ClutterX11-$(LIBMUTTER_API_VERSION) Meta-$(LIBMUTTER_API_VERSION) TelepathyGLib-0.12 Soup-2.4
if HAVE_NETWORKMANAGER
Shell_0_1_gir_INCLUDES += NetworkManager-1.0 NMClient-1.0
endif
@ -350,7 +350,7 @@ INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_INCLUDES = Clutter-$(LIBMUTTER_API_VERSION) Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION
St_1_0_gir_LIBS = libst-1.0.la
St_1_0_gir_FILES = $(filter-out %-private.h $(st_non_gir_sources), $(addprefix $(srcdir)/,$(st_source_h))) \

View File

@ -30,6 +30,7 @@ main (int argc, char *argv[])
{
g_message("Failed to defined ARGV: %s", error->message);
g_error_free (error);
g_object_unref (context);
return 1;
}
@ -43,9 +44,11 @@ main (int argc, char *argv[])
{
g_message ("Execution of main.js threw exception: %s", error->message);
g_error_free (error);
g_object_unref (context);
return status;
}
g_object_unref (context);
return 0;
}

View File

@ -42,6 +42,8 @@ static void gnome_shell_plugin_minimize (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_unminimize (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_size_changed (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_size_change (MetaPlugin *plugin,
MetaWindowActor *actor,
MetaSizeChange which_change,
@ -127,6 +129,7 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
plugin_class->map = gnome_shell_plugin_map;
plugin_class->minimize = gnome_shell_plugin_minimize;
plugin_class->unminimize = gnome_shell_plugin_unminimize;
plugin_class->size_changed = gnome_shell_plugin_size_changed;
plugin_class->size_change = gnome_shell_plugin_size_change;
plugin_class->destroy = gnome_shell_plugin_destroy;
@ -236,6 +239,7 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
* If there was a generic "hook into bug-buddy for non-C crashes"
* infrastructure, here would be the place to put it.
*/
g_object_unref (gjs_context);
exit (1);
}
}
@ -272,6 +276,13 @@ gnome_shell_plugin_unminimize (MetaPlugin *plugin,
}
static void
gnome_shell_plugin_size_changed (MetaPlugin *plugin,
MetaWindowActor *actor)
{
_shell_wm_size_changed (get_shell_wm (), actor);
}
static void
gnome_shell_plugin_size_change (MetaPlugin *plugin,
MetaWindowActor *actor,

View File

@ -30,6 +30,7 @@ main (int argc, char *argv[])
{
g_message("Failed to define ARGV: %s", error->message);
g_error_free (error);
g_object_unref (context);
return 1;
}
@ -44,9 +45,11 @@ main (int argc, char *argv[])
{
g_message ("Execution of main.js threw exception: %s", error->message);
g_error_free (error);
g_object_unref (context);
return status;
}
g_object_unref (context);
return 0;
}

View File

@ -360,6 +360,7 @@ list_modes (const char *option_name,
if (!gjs_context_eval (context, script, -1, "<main>", &status, NULL))
g_message ("Retrieving list of available modes failed.");
g_object_unref (context);
exit (status);
}
@ -389,7 +390,7 @@ GOptionEntry gnome_shell_options[] = {
{
"mode", 0, 0, G_OPTION_ARG_STRING,
&session_mode,
N_("Use a specific mode, e.g. \"gdm\" for login screen"),
N_("Use a specific mode, e.g. “gdm” for login screen"),
"MODE"
},
{
@ -469,12 +470,9 @@ main (int argc, char **argv)
ecode = meta_run ();
if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
{
g_printerr ("Doing final cleanup...\n");
g_object_unref (shell_global_get ());
}
g_debug ("Doing final cleanup");
_shell_global_destroy_gjs_context (shell_global_get ());
g_object_unref (shell_global_get ());
g_object_unref (sender);
return ecode;

View File

@ -127,6 +127,7 @@ main(int argc, char **argv)
gjs_context_gc (js_context);
gjs_context_gc (js_context);
g_object_unref (js_context);
g_free (script);
exit (code);
}

View File

@ -112,19 +112,40 @@ scan_startup_wm_class_to_id (ShellAppSystem *self)
static gboolean
app_is_stale (ShellApp *app)
{
GDesktopAppInfo *info;
gboolean is_stale;
GDesktopAppInfo *info, *old;
GAppInfo *old_info, *new_info;
gboolean is_unchanged;
if (shell_app_is_window_backed (app))
return FALSE;
info = g_desktop_app_info_new (shell_app_get_id (app));
is_stale = (info == NULL);
if (!info)
return TRUE;
if (info)
g_object_unref (info);
old = shell_app_get_app_info (app);
old_info = G_APP_INFO (old);
new_info = G_APP_INFO (info);
return is_stale;
is_unchanged =
g_app_info_should_show (old_info) == g_app_info_should_show (new_info) &&
strcmp (g_desktop_app_info_get_filename (old),
g_desktop_app_info_get_filename (info)) == 0 &&
g_strcmp0 (g_app_info_get_executable (old_info),
g_app_info_get_executable (new_info)) == 0 &&
g_strcmp0 (g_app_info_get_commandline (old_info),
g_app_info_get_commandline (new_info)) == 0 &&
strcmp (g_app_info_get_name (old_info),
g_app_info_get_name (new_info)) == 0 &&
g_strcmp0 (g_app_info_get_description (old_info),
g_app_info_get_description (new_info)) == 0 &&
strcmp (g_app_info_get_display_name (old_info),
g_app_info_get_display_name (new_info)) == 0 &&
g_icon_equal (g_app_info_get_icon (old_info),
g_app_info_get_icon (new_info));
g_object_unref (info);
return !is_unchanged;
}
static gboolean

View File

@ -11,6 +11,8 @@ void _shell_global_init (const char *first_property_name,
void _shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin);
void _shell_global_destroy_gjs_context (ShellGlobal *global);
GjsContext *_shell_global_get_gjs_context (ShellGlobal *global);
gboolean _shell_global_check_xdnd_event (ShellGlobal *global,

View File

@ -338,7 +338,7 @@ shell_global_finalize (GObject *object)
{
ShellGlobal *global = SHELL_GLOBAL (object);
g_object_unref (global->js_context);
g_clear_object (&global->js_context);
g_object_unref (global->settings);
the_object = NULL;
@ -566,6 +566,20 @@ shell_global_get (void)
return the_object;
}
/**
* _shell_global_destroy_gjs_context: (skip)
* @self: global object
*
* Destroys the GjsContext held by ShellGlobal, in order to break reference
* counting cycles. (The GjsContext holds a reference to ShellGlobal because
* it's available as window.global inside JS.)
*/
void
_shell_global_destroy_gjs_context (ShellGlobal *self)
{
g_clear_object (&self->js_context);
}
static guint32
get_current_time_maybe_roundtrip (ShellGlobal *global)
{
@ -1244,7 +1258,7 @@ shell_global_reexec_self (ShellGlobal *global)
GPtrArray *arr;
gsize len;
#if defined __linux__
#if defined __linux__ || defined __sun
char *buf;
char *buf_p;
char *buf_end;

View File

@ -66,7 +66,7 @@ shell_gtk_embed_window_created_cb (MetaDisplay *display,
Window xwindow = meta_window_get_xwindow (window);
GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (priv->window));
if (xwindow == gdk_x11_window_get_xid (gdk_window))
if (gdk_window && xwindow == gdk_x11_window_get_xid (gdk_window))
{
ClutterActor *window_actor =
CLUTTER_ACTOR (meta_window_get_compositor_private (window));

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