Compare commits

...

312 Commits

Author SHA1 Message Date
3d5312e8d2 Bump version to 3.5.3
Update NEWS
Require Mutter 3.5.3
2012-06-26 00:03:48 +02:00
bc91b7dcae remoteSearch: Parse 'DesktopId' field in key file
We strongly expect applications to use the same values for the
'Title'/'Icon' fields in their search provider .ini file as the
'Name'/'Icon' fields in their .desktop file. Rather than requiring
applications to duplicate those fields, allow them to specify a
'DesktopId' field instead to point to the corresponding .desktop
file, which makes it possible to ship search provider files without
translatable strings (which is nice given that merging translations
into search provider files lacks a standard rule).

https://bugzilla.gnome.org/show_bug.cgi?id=678816
2012-06-25 22:57:31 +02:00
4d77eb94ff remoteSearch: Use GIcon instead of icon name
Currently we pass an icon name for the 'icon' parameter of the
RemoteSearchProvider constructor. In hindsight, using a GIcon
instead will give us a bit more flexibility, so change it.

https://bugzilla.gnome.org/show_bug.cgi?id=678816
2012-06-25 22:57:31 +02:00
1b8d03f945 St: reference the StTheme from StThemeNode
This is a partial revert of 7eaf231e56,
which caused segfaults. For some reason, StThemeNodes seem to survive
style changes.
2012-06-25 14:12:07 +02:00
de2dcfeb99 Update Punjabi Translation 2012-06-25 06:56:00 +05:30
c7196a519f tests: Run each test in a function
As the global object of a context is rooted, if we want the GC to act
on these objects we need to take them out of the globals.

https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:48 -04:00
0d82ce5210 tests: Don't use the default stage
https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:48 -04:00
3ce9ad05b3 run-js-test: GC twice after running a test
When running with Valgrind, this helps us ensure that we're managing
memory correctly. We need to GC twice as finalizing an object in the
sweep can unroot objects which were already marked. Technically, it
could be that we'll need to GC more than twice, but GCing twice should
hopefully last us for now.

https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:48 -04:00
ab75faac74 test-theme: Clean up after ourselves
https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:48 -04:00
9e25e13218 test-theme: Fix
St requires GTK+ to be initted.

https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:48 -04:00
69e1503c6d st-widget: Free the inline style
https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:47 -04:00
7eaf231e56 st-theme-node: Don't hold a ref to the theme context or the theme
This would just be a circular reference, which we need to avoid.

https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:47 -04:00
a347a72091 st-widget: Fix st_widget_set_theme
https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:47 -04:00
560daec913 st-widget: Chain up in the dispose handler for accessibility objects
https://bugzilla.gnome.org/show_bug.cgi?id=678737
2012-06-24 19:20:47 -04:00
d9e968d863 Updated Galician translations 2012-06-24 23:34:42 +02:00
556d5d181e st-widget: fix GList leak
clutter_actor_get_children returns a newly allocated GList and it was
not freed.

However, as there's no reason to copy the children list, switch to
iterator api.

https://bugzilla.gnome.org/show_bug.cgi?id=678406
2012-06-24 00:24:42 -04:00
4e4092f9e8 pokit-agent: fix memory leak
https://bugzilla.gnome.org/show_bug.cgi?id=678406
2012-06-24 00:24:42 -04:00
fd62aba71c Updated Greek translation 2012-06-23 01:30:41 +03:00
ef0aa65774 clock: Switch to using GnomeWallClock, delete clock GSettings controls
This avoids us having to poll once a second, among other things.  For
more information, see the linked bug chain.

See https://bugzilla.gnome.org/show_bug.cgi?id=657958 for the new
clock keys.

https://bugzilla.gnome.org/show_bug.cgi?id=657074
2012-06-22 18:10:46 -04:00
6b5f9a647a mount-operation: implement org.Gtk.MountOperationHandler
Use the ShellMountOperation dialogs we have to implement a DBus API
allowing other processes to display them.
Since GtkMountOperation now tries to call into our DBus implementation,
every application that uses a GtkMountOperation will gain integration
with our shell dialogs (but will still handle the actual communication
with GVfs).

https://bugzilla.gnome.org/show_bug.cgi?id=678516
2012-06-22 15:55:56 -04:00
01c07fbea1 userMenu: Rename 'Hidden' to 'Invisible'
Apparently only the Telepathy API calls this status 'Hidden',
Empathy and most network use 'Invisible' (also see
https://bugzilla.gnome.org/show_bug.cgi?id=603472).

https://bugzilla.gnome.org/show_bug.cgi?id=658955
2012-06-22 14:00:32 +02:00
81929c2a92 Updated Greek translation 2012-06-22 13:43:03 +03:00
d9ff8e3122 Updated Slovenian translation 2012-06-22 09:36:52 +02:00
0c4692ae58 appDisplay: Fix recursive directory NoDisplay testing
We were accidentally testing NoDisplay on the wrong directory.

https://bugzilla.gnome.org/show_bug.cgi?id=658176
2012-06-21 16:03:48 -04:00
df56ff4f09 app-system: Don't show items with NoDisplay parents in the search
Additionally, require gnome-menus 3.5.3, as we're using new API
introduced there.

https://bugzilla.gnome.org/show_bug.cgi?id=658176
2012-06-21 16:03:48 -04:00
96cdc9c4eb app-system: Use g_slist_free_full
https://bugzilla.gnome.org/show_bug.cgi?id=658176
2012-06-21 16:03:48 -04:00
3b4ad5cd7d app-system: Clean up imports
https://bugzilla.gnome.org/show_bug.cgi?id=658176
2012-06-21 16:03:48 -04:00
317c6b77f3 Util: update trySpawn to new gjs GError mapping
Error rewriting code used an old version of the gjs GError support,
and set a readonly .message property.

https://bugzilla.gnome.org/show_bug.cgi?id=678502
2012-06-21 18:28:26 +02:00
e5f5a2adaa Updated Spanish translation 2012-06-21 12:30:52 +02:00
594c3174ab mount-operation: fix indentation for some callbacks
Nothing to see here, move along.

https://bugzilla.gnome.org/show_bug.cgi?id=674962
2012-06-20 22:21:23 -04:00
5b7e4bb4a7 mount-operation: don't use global.get_current_time()
If we don't specify it, it will be picked up by default.

https://bugzilla.gnome.org/show_bug.cgi?id=674962
2012-06-20 22:21:23 -04:00
f7c0f826d4 autorun: use GError.matches() to fix some FIXMEs
Discard FAILED_HANDLED errors, now that we can detect them from JS.

https://bugzilla.gnome.org/show_bug.cgi?id=674962
2012-06-20 22:21:23 -04:00
66af7de6d6 automount: re-use the same dialog when passphrase doesn't match
Wait until the completion of the mount operation before dismissing the
passphrase dialog, so in case it fails, we can re-use the same dialog
with an error message (like e.g. PolicyKit auth dialogs) instead of
showing a brand new one.

https://bugzilla.gnome.org/show_bug.cgi?id=674962
2012-06-20 22:21:23 -04:00
d1815a36d0 mount-operation: turn the passphrase prompt into a dialog
Instead of a notification. This also adds space for a checkbox allowing
to remember the passphrase.

https://bugzilla.gnome.org/show_bug.cgi?id=674962
2012-06-20 22:21:23 -04:00
61de3de909 NetworkMenu: prefer wifi/3g over vpn in the panel
Wifi and mobile broadband have signal indicators and are thus
more useful than vpn icons in the panel. Therefore, in the case
we have both wifi/3g and VPN we prefer the former as the "primary
icon" and add a lock next to it.
Behavior when VPN is added to wired or other connections is still
preserved: the wired icon is replaced by vpn.

https://bugzilla.gnome.org/show_bug.cgi?id=672591
2012-06-20 17:23:53 -04:00
36888a34d6 NetworkMenu: sort wifi networks by strength
Sorting by strength is what the other OSes do by default, and it
provides a better UX (by offering your hotspot and router before
the one from your neighbor).

https://bugzilla.gnome.org/show_bug.cgi?id=658946
2012-06-20 23:05:57 +02:00
646435ee3e automount: don't allow autorun for things we mount at startup
We don't want to potentially flood the user with notifications about
mounts when starting up the system.

https://bugzilla.gnome.org/show_bug.cgi?id=660595
2012-06-20 10:15:37 -04:00
cbb8d5b0dc autorun: only obey allowAutorun flag for transient notifications
Only apply the allowAutorun flag for transient notifications, not for
mounts that end up in the resident notification well.

Also, stop looking at volume.can_automount() here, since we already
checked that previously in the mounter, and allowAutorun is enough.

https://bugzilla.gnome.org/show_bug.cgi?id=660595
2012-06-20 10:15:29 -04:00
ebee01b355 autorun: simplify code
Split autorun conditions into separate logic blocks instead of a single
huge if.

https://bugzilla.gnome.org/show_bug.cgi?id=660595
2012-06-20 10:15:22 -04:00
0e3795b2f3 autorun: change logic for ignoring volumes
Previously, a volume was being ignored from autorun if one of these two
conditions were met:
- its mount root file had a native scheme and was mounted in a
  non-hidden location
- it had a volume that could have been automounted, and had a flag set
  by the shell to allow autorun

In order to effectively ignore volumes that we don't mount ourselves
from our notification system, we have to meet both conditions at the
same time instead.

https://bugzilla.gnome.org/show_bug.cgi?id=660595
2012-06-20 10:15:16 -04:00
de73128d47 mount-operation: close the password entry on operation abort
If the device disappears in the middle of a mount operation, make sure
to dismiss the password prompt automatically.

https://bugzilla.gnome.org/show_bug.cgi?id=673787
2012-06-20 10:14:07 -04:00
281b0a3e63 mount-operation: fix exceptions when showing password entry
This is a fallout from some changes in MessageTray.Source, which now
requires either defining the iconName/iconType properties on it, or
implementing createNotificationIcon, and we're not doing any of those.
Fix it by storing the gicon of the source object and using a helper
method to create the icon actor on demand, to avoid any case when the
same actor might be added twice to different containers.

https://bugzilla.gnome.org/show_bug.cgi?id=678428
2012-06-20 10:07:50 -04:00
c414f9ac9d build: Fix the case of building without folks 2012-06-19 23:09:40 +02:00
77242cfec0 build: Make folks optional
The dependency chain spirals out from folks->zeitgeist->xapian...and
I'm really not interested in pulling in all of that into the core
shell.

There is work on splitting out contact search into gnome-contacts; I'd
add a bug link but Bugzilla is down.
2012-06-19 16:34:23 -04:00
8ebbba6eb8 Disable unredirection when a modal operation is active
When the shell takes control of the screen (for example to show
a modal dialog or to lock the screen), it must reestablish itself
on top of the stack, and in particular restore any unredirected
window so that it is composited below the Shell UI.

Reviewed-By: drago01 in IRC.
2012-06-19 19:56:06 +02:00
0804cefbee workspace: Minor cleanup
_hideAllOverlays() has only been used in a single place for quite
some time now, so move its code into the caller and save a loop.

https://bugzilla.gnome.org/show_bug.cgi?id=678416
2012-06-19 18:24:52 +02:00
2404d2935d workspace: Remove unused method
This one hasn't been used for quite a while now ...

https://bugzilla.gnome.org/show_bug.cgi?id=678416
2012-06-19 18:24:51 +02:00
e6f5e21b5d Enable the Screen Reader menu item
https://bugzilla.gnome.org/show_bug.cgi?id=663256
2012-06-19 12:21:05 -04:00
c303c6b5c1 shell-app: Update app menu if necessary
Currently we assume that GTK_UNIQUE_BUS_NAME is shared between all
windows of an application. This assumption does not hold true for
applications that specify G_APPLICATION_NON_UNIQUE, so make sure
to update the menu as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=676238
2012-06-19 17:57:34 +02:00
f58e8f2a35 Depend on gjs 1.33.2
Shell uses the 'format' module which has been introduced in gjs 1.33.2.

https://bugzilla.gnome.org/show_bug.cgi?id=678396
2012-06-19 14:17:59 +02:00
ededba0c6d telepathyClient: ignore invalidated channels
There is a race if a channel is invalidated during its preparation: the
'invalidated' signal is already emitted so the Shell will never notice.
We fix this by simply checking if the channel is already invalidated when
receiving it from telepathy-glib.

In the approving case, we reject the full ChannelDispatchOperation as we only
support approving one channel at the time.

https://bugzilla.gnome.org/show_bug.cgi?id=677457
2012-06-18 09:56:12 +02:00
e112fa92fe telepathyClient: decline dispatch op when approving unsupported channel type
It shouldn't happen in theory but best to be safe than sorry.

https://bugzilla.gnome.org/show_bug.cgi?id=677457
2012-06-18 09:56:12 +02:00
7524210d1f st-texture-cache: fix GtkIconInfo leak
https://bugzilla.gnome.org/show_bug.cgi?id=678079
2012-06-15 01:05:08 -04:00
201dc05416 ShellContactSystem: fix GSList of utf8 leak
https://bugzilla.gnome.org/show_bug.cgi?id=678079
2012-06-15 01:05:08 -04:00
2b34978993 ShellContactSystem: fix GSList leak
https://bugzilla.gnome.org/show_bug.cgi?id=678079
2012-06-15 01:05:08 -04:00
447246da74 shell-util: fix GFile leak
https://bugzilla.gnome.org/show_bug.cgi?id=678079
2012-06-15 01:05:08 -04:00
1cf2bb6646 ShellContactSystem: fix GeeMapIterator leak
https://bugzilla.gnome.org/show_bug.cgi?id=678079
2012-06-15 01:05:08 -04:00
de1eafb564 Always enable a11y
https://bugzilla.gnome.org/show_bug.cgi?id=678095
2012-06-14 18:24:57 +01:00
22f0099a5d main: NO_GAIL envvar is a noop
It's not used by GTK+ versions we require

https://bugzilla.gnome.org/show_bug.cgi?id=678096
2012-06-14 18:24:57 +01:00
300eb87016 Updated Arabic translation 2012-06-13 20:40:27 +02:00
aa38b16368 l10n: Updated Italian translation 2012-06-13 19:37:39 +02:00
266bfdf739 Updated POTFILES.in 2012-06-12 23:53:31 +02:00
19ef6b0421 shellDBus: Add a method to reload extensions
A common request from extension developers has been to reload their
extensions without restarting the Shell.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:09 -04:00
75570b7995 extensionSystem: Add a method to unload an extension
https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:09 -04:00
3290bfae68 extensionSystem: Remove the two-step initialize
Initially, extensions were loaded after they shell had fully created
the session and all objects, but this didn't allow extensions easy
ways to monkey patch prototypes, as most functions had already been
bound. Remove the historical vestigal function, and just merge the
two together.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:09 -04:00
0805d7a35f extensionSystem: Make the init function optional
A large amount of extensions have something like this in them:

    function init() {}

Since we have encouraged extension authors to try and not make any
changes in init, it feels weird and strange to have to create an
initialization function that does nothing. From now on, don't require
it.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:09 -04:00
11278a0814 extensionSystem: Load/unload stylesheets on enable/disable
I'm not entirely sure why this wasn't caught earlier.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
86de6f5861 extensionUtils: Create and load the extension object when scanning
This reduces some duplicate code when loading extensions.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
498b023989 extensionUtils: Use signals rather than callbacks for finding extensions
This allows us to move to a file-monitor based approach in the future.

Since we need signals, we convert the current set of functions to an
object we attach signals too, leading to the new ExtensionFinder object.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
5265884af9 extensionUtils: Remove userExtensionsDir
Make this less stateful

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
cdbe0bbf38 extensionUtils: Remove version check for js-version
This is seldomly used, and isn't checked in SweetTooth. Just remove
this inconsistency here rather than adding infrastructure to manage
and check it elsewhere.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
feef35a8ca extensionUtils: Don't write to the filesystem on start
Create the potentially empty directory when we need to, not when we
don't.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
3ff51da529 extensionSystem: Split off the extension downloader into a separate file
This keeps all UI out of the extension system, leaving it strictly for
loading and unloading extensions.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-12 17:16:08 -04:00
496e9f7b16 st: Trigger theme updates on resolution changes
Commit de8a66d4ce removed our own DPI handling for the one found
it Clutter, but broke resolution updates at runtime (for instance
when setting the "Large Text" option in Universal Access).

https://bugzilla.gnome.org/show_bug.cgi?id=677975
2012-06-12 22:40:59 +02:00
0b30dc29a5 Updated Lithuanian translation 2012-06-12 12:19:33 +03:00
15b4d29e70 Updated Norwegian bokmål translation 2012-06-11 22:04:54 +02:00
9eee4b7687 Fix name for the schemas file 2012-06-11 22:04:51 +02:00
196f6c241a appDisplay: Don't show apps in NoDisplay categories in the All view
We explicitly include NoDisplay applications in the ShellAppSystem because
we want app tracking for them, but we explicitly filter NoDisplay applications
out when showing them to the user because we don't want to show them to the
user. We also based our "All" apps view on a flattened list of apps. While
we did check for NoDisplay on the app item itself, we didn't check against
its parents. Refactor the app display view to not use a separate flat list
of applications, but instead a concatenation of all the applications in all
the loaded categories.

https://bugzilla.gnome.org/show_bug.cgi?id=658176
2012-06-11 13:55:59 -04:00
c9296191a8 js: Remove unnecessary versions of clutter_actor_get_children
clutter_actor_get_children requires making a temporary GSList from
a linked list structure, and then creating a JS Array from that GSList.
For simple cases like the number of children, use clutter_actor_get_n_children.

https://bugzilla.gnome.org/show_bug.cgi?id=677426
2012-06-11 13:10:25 -04:00
c7b4022283 extensionSystem: Initialize the HTTP session after parse time
We really shouldn't be creating GObjects while we're still parsing other
files for performance and clarity reasons.

https://bugzilla.gnome.org/show_bug.cgi?id=677586
2012-06-11 13:07:40 -04:00
a7ecc4cdd6 Revert "extensionSystem: Initialize the HTTP session after parse time"
This reverts commit df5298d59c.
2012-06-11 13:06:14 -04:00
df5298d59c extensionSystem: Initialize the HTTP session after parse time
We really shouldn't be creating GObjects while we're still parsing other
files for performance and clarity reasons.
2012-06-11 13:04:56 -04:00
b79d17332e data: Actually substitute @GETTEXT_PACKAGE@ in schema files
https://bugzilla.gnome.org/show_bug.cgi?id=677497
2012-06-11 13:00:33 -04:00
675572a41a Updated Greek translation 2012-06-11 18:31:33 +03:00
0078fe9349 Updated Russian translation 2012-06-11 10:38:29 +04:00
dc004f6eb7 modalDialog: show dialogs on monitor with the mouse pointer
Show the dialog on the monitor containing the pointer, rather than
the monitor with active focused window. This brings it inline with
the behaviour seen when launching applications.

Remove the focusMonitor/focusIndex from LayoutManager. These
properties were only used by the modal dialogs. Remove them since
they are not being used elsewhere.

https://bugzilla.gnome.org/show_bug.cgi?id=642591
2012-06-08 23:05:56 -04:00
07f1a05ab4 Updated Slovenian translation 2012-06-08 21:29:52 +02:00
54292a99af calendar-server: Remove left-over include
GConf-free at last! GConf-free at last!
2012-06-08 19:08:28 +02:00
f5933c8cb8 messageTray: Don't show non urgent notifications while in fullscreen
Don't show non urgent notifications when the primary monitor
is in fullscreen (user watching a movie, having a presentation,
playing a game ...).

Once the user leaves fullscreen show the messagetray so that the user don't
miss any notification (same as in "back from idle").

https://bugzilla.gnome.org/show_bug.cgi?id=677590
2012-06-07 20:36:58 +02:00
6700f86145 LayoutManager: Add primary-fullscreen-changed signal
Add a signal to the LayoutManager which gets emitted once the primary monitor
enters or leaves the fullscreen state.

https://bugzilla.gnome.org/show_bug.cgi?id=677590
2012-06-07 20:36:48 +02:00
b31d22488e calendar: Adapt to Evolution-Data-Server API changes.
Adapt the calendar-server to some major API changes in E-D-S 3.5.3.

More details about the breakage:
http://mbarnes.livejournal.com/4631.html

https://bugzilla.gnome.org/show_bug.cgi?id=677402
2012-06-07 12:50:46 -04:00
6382eeb8fd network: Remove old API
The underscored properties were removed a while ago.

https://bugzilla.gnome.org/show_bug.cgi?id=677515
2012-06-05 18:10:25 -04:00
b07345a55c main: Adapt to new plugin API 2012-06-05 16:33:14 -04:00
06febdce22 Bump version to 3.5.2
Update NEWS
Require Mutter 3.5.2
2012-06-05 22:08:07 +02:00
c31d9d5e3d a11y: do not expose a label text if 'hidden' style class is used
https://bugzilla.gnome.org/show_bug.cgi?id=675341
2012-06-05 18:12:41 +02:00
cda8a545f1 css: add a 'hidden' style class
Used for elements that are not supposed to be shown.

https://bugzilla.gnome.org/show_bug.cgi?id=675341
2012-06-05 18:12:41 +02:00
f850e92524 popupMenu: do not overflow the currentItems
Do not overflow currentItems array. If the Menu section is filled
via model items-changed callback the position in the model passed to
the RemoteMenu _modelChanged can be a to be added asynchronously
action-added. Thus the item does not yet exists in the currentItems.

https://bugzilla.gnome.org/show_bug.cgi?id=676447
2012-06-05 16:28:40 +02:00
cc9d53e038 popupMenu: bypass changeSignal callback if action is already handled
https://bugzilla.gnome.org/show_bug.cgi?id=676447
2012-06-05 16:28:40 +02:00
7b048fc092 endSessionDialog: Factor out _updateDescription from _updateContent
_startTimer adds a tweener to implement the description countdown, which
updates the entire content on each iteration, including the icon. This
causes a significant impact on performance, especially when accessibility
is enabled, as it causes a flood of AtkObject:state-change:showing events.
As the countdown only affects the description, factor out _updateDescription
and use it in _startTimer, and only do a full update of all contents when
necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=674210
2012-06-05 15:57:18 +02:00
4ba4a501fd Updated Spanish translation 2012-06-03 17:57:30 +02:00
2b2cce6896 Updated Galician translations 2012-06-03 15:02:43 +02:00
c1f51a7bf3 searchDisplay: Use the rowLimit we pass to the IconGrid
When displaying children, we need to make sure that we use the rowLimit
property that we pass to iconGrid, rather than assuming that it's
always MAX_SEARCH_RESULTS_ROWS in case some subclass (in an extension maybe)
wants to do something different.

https://bugzilla.gnome.org/show_bug.cgi?id=675527
2012-06-03 01:32:29 -04:00
465556f0d8 Updated Galician translations 2012-06-03 02:39:58 +02:00
db7ac5208a Patch for bug https://bugzilla.gnome.org/show_bug.cgi?id=673630 2012-06-02 15:45:55 +03:00
cfcd1bc014 Updated Hebrew translation. 2012-06-02 12:45:45 +03:00
e63f7e8779 userMenu: Indicate progress on status changes
Depending on the number of accounts, the type or simply the network,
there may be a noticable lag between setting the status and the actual
status change.
Use the new user-status-pending icon to indicate progress.

https://bugzilla.gnome.org/show_bug.cgi?id=659067
2012-06-01 19:53:44 -04:00
7911154bad NetworkMenu: show notifications for failed VPN connections
Refactor NMDeviceVPN to be more like the other NMDevices, including
having a valid getSectionTitle() and emitting signals when the
underlying connection changes state.
Use the existing notification infrastructure to hook these signals
to actual notifications (including some code consolidation).

https://bugzilla.gnome.org/show_bug.cgi?id=676330
2012-06-01 22:39:43 +02:00
ec0730f3e5 status/keyboard: Port to the new input sources settings
https://bugzilla.gnome.org/show_bug.cgi?id=641531
2012-06-01 22:18:59 +02:00
76005f5adf workspacesDisplay: Connect to 'notify::n-workspaces' early
Currently we only connect to the 'notify::n-workspaces' signal the
first time the overview is shown, which means we will miss any
changes to the workspace layout in the meanwhile.
In particular, the decision of whether the workspace switcher should be
shown is taken before the dynamic workspace handling takes over, and is
thus based entirely on the value of the num-workspaces user preference
rather than the actual number of workspaces.
Just connect the signal in _init() (with the nice side-effect to make it
explicit that the signal handler won't ever be disconnected).

https://bugzilla.gnome.org/show_bug.cgi?id=673198
2012-06-01 17:34:48 +02:00
94493cde35 a11y: setting the proper role/label_actor for SearchResult.content
role/label_actor should be used for the actor that will receive
the focus. In some cases it was also (wrongly) set on the
container, so using an AT like Orca, it exposed both.

https://bugzilla.gnome.org/show_bug.cgi?id=672242
2012-06-01 16:10:07 +02:00
a1f68720e5 telepathyClient: Remove C-based TelepathyLogger wrapper
gjs has matured enough to the point where we don't need this

https://bugzilla.gnome.org/show_bug.cgi?id=676850
2012-06-01 08:59:59 -04:00
022376dd56 Added contexts to various Unknown strings
Fixes bug https://bugzilla.gnome.org/show_bug.cgi?id=659968
2012-06-01 14:44:40 +02:00
934e5aacab notificationDaemon.js: convert the hints dict at the beginning of the function
It's used right away to discard some Empathy notifications.

This regression has been introduced during the 3.4 cycle when 'hints' has been
turned to a GVariant.

https://bugzilla.gnome.org/show_bug.cgi?id=675370
2012-06-01 09:40:32 +02:00
35b142f23f NetworkMenu: fix updating connection lists
Ensure that the UI is updated when a connection changes name or id,
even if it was already known by a device.
Also, use less private properties on NMConnection objects, as they
can become stale and cause problems.

https://bugzilla.gnome.org/show_bug.cgi?id=677097
2012-05-31 20:50:02 +02:00
41c3795a7b Add an initial-setup mode
Use the newly introduced kiosk mode functionality, and define an
'initial-setup' mode that is suitable for
https://live.gnome.org/GnomeOS/Design/Whiteboards/InitialSetup

https://bugzilla.gnome.org/show_bug.cgi?id=676697
2012-05-31 09:52:14 -04:00
95d7099133 [l10n] Update Japanese translation 2012-05-31 18:12:53 +09:00
33dc9abb9b Updated Norwegian bokmål translation 2012-05-30 14:19:28 +02:00
5e4edac14d browser-plugin: Fix Opera support
Opera now tries to call NP_SetWindow without trying to check
if it's a NULL pointer or not.

https://bugzilla.gnome.org/show_bug.cgi?id=672192
2012-05-29 18:57:05 -04:00
cb5ae92986 sessionMode: Add 'input-method' to status icons in user mode
We now drop all status icons that are not explicitly enabled, which
breaks the ibus icon. Add it to the list of allowed icons until we
merge it with the keyboard one.

https://bugzilla.gnome.org/show_bug.cgi?id=677058
2012-05-29 22:06:03 +02:00
ebbd295ebe panel: Refuse to add (legacy) status icons not part of the session mode
If a session mode does not use certain status items, we don't want their
fallback implementation to show up either, so filter them out.

https://bugzilla.gnome.org/show_bug.cgi?id=677058
2012-05-29 22:06:03 +02:00
65d23fb9a3 extensionUtils: Support subdirectories in getCurrentExtension
Some extensions may have complex layouts with multiple subdirectories.
Currently, getCurrentExtension doesn't support this, as it uses a regex
and assume's that the last path's component's parent is all that's needed.
Fix this.

https://bugzilla.gnome.org/show_bug.cgi?id=677001
2012-05-29 14:36:16 -04:00
ad6d986172 browser-plugin: Fix enable/disable
This code was broken at the last minute, and an accidentally stale plugin
copy kept it untested.

https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-29 14:36:16 -04:00
985641cc2e Updated Slovenian translation 2012-05-29 09:08:02 +02:00
de0a714081 Updated Lithuanian translation 2012-05-26 23:12:17 +03:00
3f942302d1 extensionSystem: Show an icon in the install dialog
https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
96396163cf extensionSystem: Replace Shell.write_soup_message_to_stream with GBytes usage
https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
0c736c4561 extensionSystem: Use Gio.File.new_tmp
https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
33ad9d1035 extensionSystem: Clean up
https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
d57658d059 extensionSystem: Remove custom CA file handling
libsoup (well, glib-networking) now handles this automatically

https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
031206cf1f extensionSystem: Remove now-unused version_tag, clean up other code as well
https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
12c7cc278d shellDBus: Remove now unused DisableExtension/EnableExtension
These methods were initially introduced when I was planning on having
an explicit DisableExtension/EnableExtension, instead of hooking up
a gsettings notify. This behavior was changed at the last minute, but
the methods were kept to avoid having to change the browser-plugin.

Consumers of this API should just set the GSettings key directly
instead now.

https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
9d3750b9b8 browser-plugin: Set the 'enabled-extensions' GSettings key directly
This way, we won't have to shuttle over DBus if we want to set an extension's
status outside of a GNOME Shell session.

https://bugzilla.gnome.org/show_bug.cgi?id=676837
2012-05-25 18:25:51 -04:00
ba4b9f229e telepathyClient: fix isChat
As part of commit 9e1a2cf the parent _init was moved before the isChat
was set to true. As the parent set it to false isChat is never true
since this commit.

https://bugzilla.gnome.org/show_bug.cgi?id=676806
2012-05-25 13:14:43 -04:00
850fe98cbb Updated Hebrew translation. 2012-05-25 10:39:30 +03:00
8a9e3e0df2 Switch string formatting to the one inside gjs
https://bugzilla.gnome.org/show_bug.cgi?id=675479
2012-05-24 15:38:44 -04:00
a277569d31 Revert "main: Make sure that --mode parameter is valid"
This reverts commit a7a46bbe1c.

Conflicts:

	js/ui/sessionMode.js
2012-05-24 19:34:06 +02:00
7ed9516884 Updated Spanish translation 2012-05-23 14:19:24 +02:00
ecff2fa2b7 main: Add a --list-modes command line option
Add a command line option to list available modes, i.e. possible
arguments for the --mode switch.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:29 +02:00
e49b94658c Remove SessionType type
SessionType has now completely been replaced by the finer-grained
session-mode, so remove the remaining type definition.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
e4f1572a3a sessionMode: Add statusArea property
Add a sessionMode.statusArea property, which specifies both the order
and shell implementation of the status area items for the mode.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
b5b13322d8 sessionMode: Add extraStylesheet property
Add a sessionMode.extraStylesheet property, which may be used for
mode-specific style information.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
c25e7f3c41 sessionMode: Add createSession() hook
Add a sessionMode.createSession() hook, which is executed during
startup to setup mode-specific stuff.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
f6a2c92bfa main: Remove _initUserSession()
In Shell.SessionType.USER mode, two separate setup functions were
used during startup. With the new feature-based checks, the second
one is now almost empty, so move its remaining code into the first
function and remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
ed17418101 sessionMode: Add hasWorkspaces property
Add a sessionMode.hasWorkspaces property, which determines whether
the concept of workspaces should be exposed in the interface or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
5264f39209 sessionMode: Add hasRunDialog property
Add a sessionMode.hasRunDialog property, which determines whether
the keyboard shortcut to access the run dialog should be active
or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
de69c719fb sessionMode: Add allowKeybindingsWhenModal property
Add a sessionMode.allowKeybindingsWhenModal property, which determines
whether keybindings should still be handled while a modal dialog is
up or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
ab3173487d sessionMode: Add allowExtensions property
Add a sessionMode.allowExtensions property, which determines whether
installed and enabled extensions should be loaded or ignored.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
a3fcb8c284 sessionMode: Add allowSettings property
Add a sessionMode.allowSettings property, which determines whether
menus in the top bar should allow access to System Settings or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
ba92cfa064 sessionMode: Add showCalendarEvents property
Add a sessionMode.showCalendarEvents property, which determines
whether the calendar menu should contain an events section or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
6bee51ed33 sessionMode: Add hasAppMenu property
Add a sessionMode.hasAppMenu property, which determines whether
the top bar should contain a menu for the active application or
not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
122bca49ea sessionMode: Add hasOverview property
Add a sessionMode.hasOverview property, which determines whether
the mode should give access to the overview or not.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
19318a1eeb global: Remove session_type property
ShellGlobal:session-type is now unsed, remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:28 +02:00
a7a46bbe1c main: Make sure that --mode parameter is valid
Instead of falling back to a set of default values or crashing the
window manager when an invalid mode is specified, check the value
of the ShellGlobal:session-mode property before taking over as WM
and make a clean exit if it cannot be resolved to an existent mode.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:27 +02:00
3d26224180 Delegate mode information to a dedicated object
Rather than accessing global.session_type / global.session_mode
all over the place, delegate mode information to a dedicated
sessionMode object. While not very useful for now, we will replace
checks for a particular mode with checks for particular properties
that sessionMode defines based on global.session_mode.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:27 +02:00
940ddb104c global: Add session-mode property
Add a session-mode property on ShellGlobal which corresponds to the
new --mode switch. Make the existing ShellGlobal:session-type property
readonly and base it on ShellGlobal:session-mode to avoid conflicts.

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:27 +02:00
5617f91281 main: Add generic --mode switch
We are going to need "special" modes other than GDM, for instance
for the initial setup[0]. Rather than adding one command line switch
per mode (and logic to deal with multiple switches being given at
the same time), add a generic --mode switch to specify the mode as
string.

[0] https://live.gnome.org/GnomeOS/Design/Whiteboards/InitialSetup

https://bugzilla.gnome.org/show_bug.cgi?id=676156
2012-05-22 19:42:27 +02:00
a9a863aab4 Updated Spanish translation 2012-05-22 10:46:27 +02:00
ca26347dea userMenu: Offer "Switch Session" item on multi-session systems
Since commit 518282e169, we hide both "Switch User" and "Log out"
on single-user systems. However, if there is more than one session
available, users may still want to get back to the login manager
to change sessions.
Add both "Log out" and "Switch Session" items in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=675802
2012-05-22 07:36:36 +02:00
41a14e808e Updated Spanish translation 2012-05-21 13:57:39 +02:00
6452501275 Updated Galician translations 2012-05-20 18:14:15 +02:00
b61ada72cc shell-app: Raise windows in reverse order to preserve the stacking
ShellApp keeps track of windows sorted by most recently used first
which means that when raising windows we need to start from the end of
the list to finish with the correct stacking order.

This patch just makes the code agree with the comment which was
already there.

https://bugzilla.gnome.org/show_bug.cgi?id=676371
2012-05-19 17:32:12 +02:00
ace42d845c Updated Korean translation 2012-05-19 22:58:08 +09:00
850b6f28e5 main: Add prototype for _shell_link_to_shell_js()
It's pointless to have a prototype for a dummy function, but at
least on F17, gcc's -Werror includes -Wmissing-prototypes ...

https://bugzilla.gnome.org/show_bug.cgi?id=676347
2012-05-19 02:41:07 +02:00
3c81e9f0e7 Prevent the link to libgnome-shell-js.so from being removed
Add a dummy call to shell_js_add_extension_importer() to ensure that the
link to libgnome-shell-js.so is not removed when using -Wl,--as-needed,
which is the default on many distros.

https://bugzilla.gnome.org/show_bug.cgi?id=670477
2012-05-18 18:30:51 -04:00
e20ea19f34 Link the gnome-shell binary to libgnome-shell-js.so
Depending on the exact linker options and versions, rpath's written
into the binary may, or may not, be honored by dlopen(). Work around
this by simply linking the gnome-shell binary to gnome-shell-js, since
then dlopen() doesn't need to search paths.

https://bugzilla.gnome.org/show_bug.cgi?id=670477
2012-05-18 18:29:02 -04:00
ce041a3190 js: Don't use global.log*
These are "deprecated", and are just references to the gjs logging functoins

https://bugzilla.gnome.org/show_bug.cgi?id=675790
2012-05-18 14:09:00 -04:00
3a01aaf7fb extensionSystem: Don't spam stdout with "Loaded extension"
https://bugzilla.gnome.org/show_bug.cgi?id=675790
2012-05-18 14:09:00 -04:00
ec4a2aae95 notificationDaemon: Fix copy-paste typo
Since this line was introduced in 7458d3e, "Approve file transfer channels",
it's quite obvious that the line was meant to filter out transfer channel
notifications.

https://bugzilla.gnome.org/show_bug.cgi?id=676175
2012-05-18 14:08:12 -04:00
de8a66d4ce st: Remove our own font DPI resolution implementation
Clutter has had clutter_backend_get_resolution for a little while.

https://bugzilla.gnome.org/show_bug.cgi?id=672807
2012-05-18 13:57:12 -04:00
dc3d3acb3b global: Remove XSettings font handling code
Clutter now has its own XSettings implementation, ClutterSettings, which
handles this automatically now.

https://bugzilla.gnome.org/show_bug.cgi?id=672807
2012-05-18 13:57:12 -04:00
48d6eb168f bluetooth: Enforce a PIN length of 6 digits
Bluetooth PINs are required to have 6 digits, so enforce that
condition by making the PIN request notification's confirm
button insensitive unless the entered PIN has the correct length.

https://bugzilla.gnome.org/show_bug.cgi?id=651251
2012-05-18 17:41:19 +02:00
6190d6c962 messageTray: Allow to make notification buttons insensitive
The availability of a notification action may depend on conditions,
so add a method to control the sensitivity of buttons which have
been added with addButton().

https://bugzilla.gnome.org/show_bug.cgi?id=651251
2012-05-18 17:39:50 +02:00
76616dc98c bluetooth: zero-pad PIN
Bluetooth PINs always consist of 6 digits, so make sure to add
leading zeros as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=651251
2012-05-18 17:39:50 +02:00
82c2f5221d panel: Check for appMenu button's reactivity before opening
When the appMenu is not available, for instance when no windows are
open (on the current workspace), we make its actor unreactive to
"hide" it from keynav. However the menu can still be triggered
erroneously when using the corresponding keyboard shortcut, so
add a check for the actor's reactivity there as well.

https://bugzilla.gnome.org/show_bug.cgi?id=676316
2012-05-18 17:38:06 +02:00
a3bbb7be14 [l10n] Updated Indonesian translation 2012-05-17 22:19:18 +07:00
9e1a2cfeac Start using MessageTray.Source directly instead of having to subclass it
For most subclasses, this is a direct swap -- a lot of the time, the
constructor was a blank class that override createNotificationIcon,
and called _setSummaryIcon in _init.

https://bugzilla.gnome.org/show_bug.cgi?id=661236
2012-05-17 08:32:22 -04:00
c6fabe504a messageTray: Make Source usable without subclassing
Rather than ask most users of Source to subclass it to simply set their icon,
just allow them to create a new instance and add it without any complex magic.

https://bugzilla.gnome.org/show_bug.cgi?id=661236
2012-05-17 08:32:22 -04:00
61a17d7fab Magnifier: Add brightness and contrast functionality
Added clutter effects class that does lightness inversion.
Modified the magnifier to use this inversion effect.

https://bugzilla.gnome.org/show_bug.cgi?id=639851
2012-05-16 18:59:33 -04:00
865cfa5211 Magnifier: Add brightness and contrast functionality
Modified the magnifier to use the CluttterBrightnessContrastEffect
for changing overall brightness and/or contrast of a ZoomRegion.

https://bugzilla.gnome.org/show_bug.cgi?id=639851
2012-05-16 18:59:32 -04:00
e2b857adae Updated Japanese translation. 2012-05-15 00:53:03 +09:00
f3924ccd91 l10n: Updated Italian translation 2012-05-12 20:09:29 +02:00
86e3e59530 Updated Galician translations 2012-05-11 11:31:43 +02:00
02e4726ba6 util: Don't double-fork when spawning from Alt-F2
This breaks polkit.

See http://bugzilla.redhat.com//show_bug.cgi?id=819275

https://bugzilla.gnome.org/show_bug.cgi?id=675789
2012-05-10 15:05:05 -04:00
66e470e073 Updated Spanish translation 2012-05-10 18:06:54 +02:00
afaa5c24d6 userMenu: Update to latest mockups
Technically those are minor changes, but people will love us anyway:

  - change the default of the <alt>ernative to "Power Off"
  - remove "Online Accounts" item
  - regroup the remaining items
  - remove ellipses from labels

https://bugzilla.gnome.org/show_bug.cgi?id=675802
2012-05-10 15:54:37 +02:00
518282e169 userMenu: Hide "Log out" item on single user machines
Ignoring remote logins, the "Log out" action is meaningless for
single user setups. Do not show it in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=675802
2012-05-10 15:54:37 +02:00
d955adbbad userMenu: More show()/hide() refactoring
Here's one show()/hide() sequence left out in commit 723a1c843 ...
2012-05-10 15:54:37 +02:00
83d3225e57 userMenu: Fix 'Lock' lockdown setting
Oops, embarrassing typo ...

https://bugzilla.gnome.org/show_bug.cgi?id=675802
2012-05-10 15:23:13 +02:00
6fa45975bf Updated Marathi Translations 2012-05-10 10:02:04 +05:30
e6087efb40 NetworkAgent: disallow multiple requests for the same connection/setting
It doesn't make sense to have multiple requests for the same
connection/setting combination at the same time, since we would be
asking the user twice for the same password. Instead, report cancellation
to NetworkManager if this happens.
Note that does make sense to have multiple requests in sequence though
(they could have different flags), but this is not affected.

https://bugzilla.gnome.org/show_bug.cgi?id=674961
2012-05-07 22:06:26 +02:00
4ce2f80a2f searchDisplay: Remove the sync search completed code path
Now that all searches are async we can remove the code path for the
SearchSystem::search-completed signal which is no longer useful.

This patch ends up fixing the status text not being updated for when
there are no results.

https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 21:45:45 +02:00
0862d1c804 searchDisplay: Remove a couple of no longer used variables
https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 21:45:42 +02:00
333e380340 search: Remove the ability to add synchronous search providers
As shown in the previous commits, synchronous search is easily implemented
by the asynchronous search API. The only reason we still have a
synchronous search API is of historical reasons. Well, we're not a museum,
and git log can keep our fossils safe if need be....

https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 15:29:46 -03:00
58f77a19ed search: Port all search providers over to the async API
https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 15:29:32 -03:00
f2d883dab2 placeDisplay: Create our own PlacesManager
Since we don't have a section showing off the available places somewhere,
we don't need a global PlacesManager.

https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 15:29:20 -03:00
7ba8c7c2b5 search: Remove unused MUTLIPLE_* match types
https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 15:21:24 -03:00
0bf6c93faa search: Allow synchronous searches to be defined with the async API
To allow this to happen, we need to make sure that we don't overwrite the
previousResults when calling the async method. Note that this is a bug of
some sort, we were already using this synchronous style when a remote
search failed.

https://bugzilla.gnome.org/show_bug.cgi?id=675328
2012-05-07 15:21:24 -03:00
b9f0158278 placeDisplay: use new bookmark file location
GTK+ 3.5 is placing the bookmarks file in
$XDG_CONFIG_HOME/gtk-3.0/bookmarks. Adapt to that change.

https://bugzilla.gnome.org/show_bug.cgi?id=675443
2012-05-07 08:21:59 -04:00
25ee41f344 theme: use a smaller border-radius for top bar
- plays better with window decorations and maximized windows
- https://bugzilla.gnome.org/show_bug.cgi?id=672430
2012-05-07 10:36:28 +02:00
5436634829 a11y: Using the proper label_actor for date menu on top panel
On the code two labels are created. One is used on the date menu
itself, and the other for the menu icon at the top panel. The wrong
label was used as the label_actor for the top panel menu icon.

https://bugzilla.gnome.org/show_bug.cgi?id=675307
2012-05-03 20:47:11 +02:00
915524e1ab main: Close the recorder instead of pausing it
Pausing means that we will continue to use the same output file when
the keybinding is activated again. While useful to record a single
video in chunks, it doesn't seem to be how most users understand the
keybinding. Closing the recorder will close the file and create a new
one the next time the keybinding is pressed.

https://bugzilla.gnome.org/show_bug.cgi?id=675128
2012-05-03 09:27:53 +02:00
d579cd1605 test-recorder: Create the recorder only after the stage is realized
The recorder needs the stage's XID so it can only be created after the
stage is realized.

https://bugzilla.gnome.org/show_bug.cgi?id=675301
2012-05-03 09:27:53 +02:00
cb5941ec55 test-recorder: Explicitly make the clutter API coordinates doubles
That's what clutter expects and it would crash otherwise.

https://bugzilla.gnome.org/show_bug.cgi?id=675301
2012-05-03 09:27:53 +02:00
a5ac183d86 network: Fix an accidental copy-paste error
Logic swap accidentally introduced in commit 723a1c843.

https://bugzilla.gnome.org/show_bug.cgi?id=672272
2012-05-02 16:31:29 -04:00
a36de92bb9 gactionmuxer: Fix list_actions
The code there before was just completely wrong

https://bugzilla.gnome.org/show_bug.cgi?id=673177
2012-05-02 16:26:07 -04:00
01f9d551f1 messageTray: Fix scroll bugginess in summary items
Two nested scroll views were fighing with each other. The reason isn't
particularly important and has to do with some silliness involving
StAdjustment. The visible effect was that scrolling up and down when
in a summary item view would appear to be glitchy, and sometimes not
work at all.

To fix, make sure that the scroll view we don't care about is disabled
when in a summary mode.

https://bugzilla.gnome.org/show_bug.cgi?id=661615
2012-05-02 16:04:46 -04:00
399df66b18 messageTray: notification should be a style class name, not a global name
There have been multiple notifications ever since we had a notification stack
per source, so the idea of one notification being on screen at a time has long
been dead.

https://bugzilla.gnome.org/show_bug.cgi?id=661615
2012-05-02 16:04:05 -04:00
723a1c843a Refactor show()/hide() sequences
We seem to have a lot of code that does something along the lines of:

    if (condition)
        actor.show();
    else
        actor.hide();

ClutterActor already has such a thing for exactly this purpose: the 'visible'
property. Use it instead of the mess above.

https://bugzilla.gnome.org/show_bug.cgi?id=672272
2012-05-02 12:43:58 -04:00
e333263fd6 gdm: don't fail if fprintd unavailable
fingerprint support is optional so we shouldn't try to start
fprintd upfront and croak if it fails.

https://bugzilla.gnome.org/show_bug.cgi?id=675006
2012-05-02 11:44:29 -04:00
507df9eea1 gnome-shell-plugin: Remove useless dispose/finalize handlers
https://bugzilla.gnome.org/show_bug.cgi?id=672807
2012-05-02 10:20:22 -04:00
a9a3687ea0 st-bin: Remove unnecessary foreach implementation
https://bugzilla.gnome.org/show_bug.cgi?id=672807
2012-05-02 10:20:22 -04:00
f05c649c61 Updated Greek translation 2012-05-02 13:53:42 +03:00
a2dfba1842 l10n: Updated Italian translation 2012-04-30 15:34:24 +02:00
c199da4dfa Updated Norwegian bokmål translation 2012-04-30 11:13:44 +02:00
ee9033e12f gitignore: Update to ignore calendar schemas 2012-04-29 19:20:04 -04:00
54788d750e searchDisplay: Reset the keyboard focus after displaying async results
We hide the content around displaying new search results to prevent
flickering, unfortunately, one side effect of hiding an actor is
losing key focus if it currently is on the that actor or any
child. This could happen in the case of async results showing up after
the user had moved focus to the search results.

This patch works around that issue by saving the key focus and
resetting it back after displaying the new async results.

https://bugzilla.gnome.org/show_bug.cgi?id=675078
2012-04-30 01:10:08 +02:00
78e894c6f2 lookingGlass: Remove the "Errors" tab
We already have one too many logging systems. Remove the errors tab
and make global.log/global.logError point to window.log/window.logError
instead.

https://bugzilla.gnome.org/show_bug.cgi?id=675104
2012-04-29 17:12:07 -04:00
32107ba8b5 environment: Allow window.log to take multiple arguments
https://bugzilla.gnome.org/show_bug.cgi?id=675104
2012-04-29 17:12:05 -04:00
6122f65e7a NetworkMenu: use network-offline while loading
network-error is partially red and thus can be distracting at
login. Use network-offline instead.

https://bugzilla.gnome.org/show_bug.cgi?id=674426
2012-04-29 18:40:03 +02:00
43fd29f9bf Revert "popupMenu: Fix RemoteMenu items with boolean state action"
This reverts commit 7293ddb22c.
2012-04-29 10:38:52 +02:00
54c624b356 Updated Brazilian Portuguese translation 2012-04-28 10:46:58 -03:00
8c33adfd29 dash: Destroy tooltip label when item is removed 2012-04-27 15:50:48 -04:00
2e8881b77c notificationDaemon: Match app based on WM_CLASS
Most tray applets won't have an associated window in the same PID. We
need to fall back to the WM_CLASS in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=673761
2012-04-27 15:49:18 -04:00
64aa729edd jhbuild wrapper: Clean up environment variable logic
Lots of things here were unused. First, we don't need to calculate
the js_dir when not running from the source tree, which makes the
branch mostly empty, meaning we can merge the two branches.
2012-04-27 15:48:53 -04:00
ccf95b738d jhbuild wrapper: Re-set typelib path to the src dir
This allows us running uninstalled. While we're at it, though, remove
JHBUILD_TYPELIBDIR. jhbuild shell should add its own stuff to GI_TYPELIB_PATH,
and we don't want to half reimplement jhbuild. The wrapper script should be
solely for the case of running from the source directory, and not care about
jhbuild at all.
2012-04-27 15:48:53 -04:00
b2847fedd3 jhbuild wrapper: Don't crash if we can't start the shell
If start_shell throws an exception for whatever reason, the finally
handler will run before shell has been set, leading to a "referencing
an undefined local variable" error.
2012-04-27 15:48:53 -04:00
8befcb9bba shell-network-agent: don't crash if a request isn't found
If a request isn't found in shell_network_agent_set_password() or
shell_network_agent_respond(), then g_return_if_fail() rather than
crashing. OTOH, if a request is not found in
shell_network_agent_cancel_get_secrets(), then just ignore it
silently, since that could legitimately happen.

https://bugzilla.gnome.org/show_bug.cgi?id=674961
2012-04-27 15:47:53 -04:00
988fc52303 Updated Galician translations 2012-04-27 17:07:47 +02:00
7293ddb22c popupMenu: Fix RemoteMenu items with boolean state action
Stateful actions are expected to pass their state when activated,
but we currently only do this for actions with a string state.

https://bugzilla.gnome.org/show_bug.cgi?id=674932
2012-04-27 12:30:16 +02:00
f23c118e81 Updated Hebrew translation. 2012-04-26 15:30:48 +03:00
f68b3be35a data: Add Evolution calendar settings gschema to EXTRA_DIST
3d95e7bb11 forgot to add this
gschema file to dist
2012-04-26 08:40:01 +02:00
3d95e7bb11 Mirror Evolution calendar settings into our own schema
Right now, we are hard-depending on the presence of Evolution by
using its settings schemas. This is likely to be unpopular, and
also causes instability if someone happens not to have Evolution
installed, so install a schema that has the same data path as
the Evolution schema, but a different name and install that
for the keys we need.

To avoid a string-freeze break, we rely on the translations in
Evolution - if Evolution isn't installed, the key descriptions
will be untranslated in dconf-editor.

https://bugzilla.gnome.org/show_bug.cgi?id=674424
2012-04-25 14:39:02 -04:00
337c484f01 Updated Korean translation 2012-04-26 01:08:27 +09:00
5d98e2bf04 st-theme-node-drawing: Don't use GL types
This swaps a use of GLfloat for a regular float. Cogl might stop
including a GL header in its public headers soon so this would fix a
compilation error.

https://bugzilla.gnome.org/show_bug.cgi?id=672711
2012-04-25 15:47:04 +01:00
6f300d0cc6 Updated Spanish translation 2012-04-25 12:17:17 +02:00
3422e1dca7 popupMenu: make sure to break the grab when the slider is not visible
Otherwise the grab will persist for example after closing the PopupMenu
with Escape.

https://bugzilla.gnome.org/show_bug.cgi?id=672713
2012-04-24 22:37:19 +02:00
963c6ae567 workspace: Use the position hints when available also for the window overlay
Otherwise when dropping a window in the current workspace the overlay will
appear from the top left corner.

https://bugzilla.gnome.org/show_bug.cgi?id=674323
2012-04-24 22:37:19 +02:00
6304169926 workspace: hide the overlay for a zoomed window when exiting the overivew
Otherwise it remains visible until the overview animation is completed.

https://bugzilla.gnome.org/show_bug.cgi?id=674323
2012-04-24 22:37:19 +02:00
221afde55e jhbuild wrapper: clean up imports
Final commit in the series, remove imports that were only used
by moved or deleted functionality.
2012-04-24 21:20:49 +02:00
0ae87270ad jhbuild wrapper: don't try to "restore GNOME"
If run under jhbuild, gnome-shell is in PATH, so trying to restore
is just running it again, likely failing in the same way (with the
additional problem of detaching the shell from the terminal). Also,
this is using deprecated GConf keys, and deprecated pygobject
bindings.
2012-04-24 21:20:49 +02:00
9d33baec70 jhbuild wrapper: don't set unneeded environment variables
The jhbuild wrapper is expected to be run through jhbuild run, or
in the uninstalled case inside a jhbuild shell, so there should
be no need to set XDG_DATA_DIRS and friends.
2012-04-24 21:20:49 +02:00
0f37b22cdb jhbuild wrapper: don't muck with session activated services
dconf-daemon is available since 2.32, so there is no need to
start it manually (and in fact, it should not be running normally).
Similarly, notify-osd and notification-daemon should not be
dbus activated, but rather autostarted by gnome-session, and
therefore not running in a gnome-shell session.
2012-04-24 21:20:49 +02:00
47afd87e84 jhbuild wrapper: move performance measurement to a separate tool
Introduce a new gnome-shell-perf-tool, which can be used instead
of the old gnome-shell-jhbuild wrapper to gather data about gnome-shell
performance and submit to shell-perf.gnome.org. This runs the
shell with no extra setup beyond the WM_CLASS filter, so it can
be used for a jhbuild setup or for an installed shell.
2012-04-24 21:20:49 +02:00
700c06023e st: Clean up scroll event code
Currently the scroll event code only handles scroll events if the
adjustment's value is within the "lower" and "upper" limits. The
likely intent was to pass events to a parent scroll view when
reaching the bounds (uh, nested scroll views!), but apparently
we never made use of this, as the upper bound is actually wrong
(an adjustment's maximum value is upper - page_size, not upper).
Just handle all scroll events unconditionally and rely on the
bound checks in StAdjustment.

https://bugzilla.gnome.org/show_bug.cgi?id=672413
2012-04-24 20:45:01 +02:00
4fea5b5ca3 main: Move 'toggle-recording' binding into the shell
The keybinding to toggle the screen recorder was implemented as a
signal on MetaScreen, as keybindings could only be defined in mutter
core. As this is no longer the case, we can move the binding into the
shell where it belongs.

https://bugzilla.gnome.org/show_bug.cgi?id=674377
2012-04-24 17:37:44 +02:00
521bddc1cc [l10n] Update Japanese translation
Fix a typo
2012-04-21 22:42:20 +09:00
bdfff20ec2 Bump version to 3.4.1
Updated NEWS
2012-04-17 13:20:16 -04:00
bdd05aba3b NEWS: fix language codes 2012-04-17 13:20:06 -04:00
89c2538ff1 Require Mutter 3.4.1
We now require Mutter 3.4.1 for the API change to
meta_display_add_keybinding(). (This is a run-time requirement, not
a build-time requirement, since the usage is from Javascript.)
2012-04-17 13:20:06 -04:00
7680819108 gnome-shell-calendar-server: add missing gtk.h include
6099a5dbc3 introduced this dependency
but didn't add it which lead to build failure with
-Werror=implicit-function-declaration
2012-04-17 08:15:06 +02:00
d79e8b84c9 telepathyClient: call this.updated() when a new message is added to a notification
When receiving another message or responding in a new expanded chat
notification that has no prior chat history, the notification moved down
below the edge of the screen instead of expanding up, making part of it
invisible. Avoid this by making sure the notification's position is updated.

https://bugzilla.gnome.org/show_bug.cgi?id=661944
2012-04-16 23:29:07 -04:00
731317230a windowManager: Adapt to mutter API change
https://bugzilla.gnome.org/show_bug.cgi?id=673014
2012-04-16 20:33:31 -04:00
5046938913 gnome-shell-calendar-server: deal with Evolution's move to GSettings
Evolution now stores its selected calendars and tasks in GSettings, not
in GConf. If we don't look at the new location, then we'll not pick up
newly added and enabled calendars, making the calendar effectively not
work for new installs.

https://bugzilla.gnome.org/show_bug.cgi?id=673610
2012-04-16 12:41:48 -04:00
0e8fd45559 gnome-shell-calender-server: fix debug prints
Several debug prints not normally compiled were referencing enumeration
values that have since been renamed.

https://bugzilla.gnome.org/show_bug.cgi?id=673610
2012-04-16 12:41:48 -04:00
6099a5dbc3 gnome-shell-calendar-server: Initialize GTK+
If evolution-data-server needs to prompt for a password, it will try
to pop up a GTK+ dialog. When GTK+ is not initialized, the result is
a crash. So, initialize GTK+ and run a main loop.

See https://bugzilla.redhat.com/show_bug.cgi?id=809681

The result is ugly since we have a Gnome-shell-calendar-server fallback
application, but I don't think it's worth installing a desktop file
and having a string break, since this is pretty uncommon (only for
manually added calendars without the password stored in gnome-keyring),
and apparently this is being rewritten for 3.5 to have the dialogs come
the e-d-s daemon rather than from the individual application.

https://bugzilla.gnome.org/show_bug.cgi?id=673608
2012-04-16 12:41:48 -04:00
2daa98a694 Update Czech translation 2012-04-16 15:34:20 +02:00
5d2c6496fa update Simplified Chinese (zh_CN) translation 2012-04-16 14:53:09 +08:00
817dbbe73f [l10n] Updated German translation 2012-04-15 17:57:21 +02:00
29c89c82f8 Updated Arabic translation 2012-04-14 19:54:56 +02:00
0b714bd479 Updated Latvian translation. 2012-04-13 22:39:52 +03:00
8c94a5afb9 main: don't use a BindConstraint for uiGroup
A BindConstraint on the size of uiGroup forces full redraws of the scene.
Instead, implement and use get_preferred_width and get_preferred_height.

https://bugzilla.gnome.org/show_bug.cgi?id=670636
2012-04-13 15:18:06 +02:00
aeb117c9d1 Updated British English translation 2012-04-13 13:21:03 +01:00
a2d4f133b7 a11y: Set a name for the keyboard status icon
https://bugzilla.gnome.org/show_bug.cgi?id=672719
2012-04-13 13:31:44 +02:00
b833aff3c8 baseIcon: Always recreate icon texture on style changes
Commit 26580f8f reintroduced an optimization on style changes to avoid
creating icons unconditionally. As this breaks icon theme changes (for
instance when toggling "High Contrast" in the universal access menu),
remove it again.

https://bugzilla.gnome.org/show_bug.cgi?id=672941
2012-04-13 11:12:24 +02:00
6601e4ddba Updated French translation 2012-04-11 14:00:30 +02:00
815da2d0ec Updated Norwegian bokmål translation 2012-04-11 12:50:37 +02:00
ddd35b3653 [l10n]Updated Catalan (Valencian) translation 2012-04-10 23:27:52 +02:00
8a32894c83 [l10n] Fixes on Catalan translation 2012-04-10 23:27:49 +02:00
49d8e6da40 format: move shell_format_int_alternative_output() to ShellJS
gnome-shell-extension-prefs uses format(), but can't pull in Shell
(which is a dependency for the module), since that in turn would pull in
Meta. Fix this by moving the introspected int format function to ShellJS
instead.

https://bugzilla.gnome.org/show_bug.cgi?id=673106
2012-04-10 12:52:33 -04:00
8089f24c81 Updated Hebrew translation. 2012-04-09 22:48:34 +03:00
b6aab53d10 NetworkMenu: fix crash when NetworkManger restarts
nm_active_connection_get_devices() has a (questionable) special case
for the no devices case (which happens if the DBus object is
destroyed because NM went down): it returns null instead of an empty
array. Handle that instead of crashing.

https://bugzilla.gnome.org/show_bug.cgi?id=673043
2012-04-09 20:33:50 +02:00
55a4517cd1 Fix documentation warnings
gobject-introspection now emits many more warnings for malformed
comments, and they fail the build.

https://bugzilla.gnome.org/show_bug.cgi?id=673656
2012-04-09 19:57:51 +02:00
b095319a16 extensionSystem: Make it a non-fatal error to re-load an extension
https://bugzilla.gnome.org/show_bug.cgi?id=673613
2012-04-09 14:02:31 -03:00
5ea5806730 extensionUtils: Load user extensions before system extensions
https://bugzilla.gnome.org/show_bug.cgi?id=673613
2012-04-09 14:02:31 -03:00
bfbf812148 gdm: Skip locked users
Don't show locked (disabled) users in the user list. Those are either
"system" users with a shell or users disabled in the control-center.

https://bugzilla.gnome.org/show_bug.cgi?id=673784
2012-04-09 19:01:20 +02:00
168e9eeac1 searchDisplay: Update the selection for async searches without results
This ensures that the initial selection is always set correctly. We
were missing the empty async search results case.

https://bugzilla.gnome.org/show_bug.cgi?id=673233
2012-04-06 14:09:40 +02:00
dd79c1a79a Updated Telugu Transltion 2012-04-06 09:11:54 +05:30
fe3402589b Updated Belarusian translation. 2012-04-05 15:36:46 +03:00
74dcaff21c Updated Lithuanian translation 2012-04-05 15:15:35 +03:00
0a7968a2e5 st-theme-context: Punt icon theme changes to an idle
Icon theme change signals aren't noticed immediately, they're usually
noticed when trying to load an icon. Since icon theme changes cause a
style change, and most icon widgets try to re-load their texture during
a style change, this means that we get a stack like this:

  st_texture_cache_load_icon
  gtk_icon_theme_lookup_icon
  gtk_icon_theme_changed
  st_widget_style_changed
  st_texture_cache_load_icon

Rather than making every place that uses StTextureCache re-entrant,
punt the notifying of icon theme changes to an idle handler instead.

https://bugzilla.gnome.org/show_bug.cgi?id=673512
2012-04-04 16:26:00 -04:00
00091a2acb st-theme-context: Make icon theme changes a bit more efficient
There's no need to destroy and recreate the root node for an icon theme
change. Just emit the CHANGED signal.

https://bugzilla.gnome.org/show_bug.cgi?id=673512
2012-04-04 16:26:00 -04:00
c5aa834b6a Updated Hungarian translation 2012-04-04 15:46:01 +02:00
b1bde46694 Updated French translation 2012-04-03 20:34:41 +02:00
49e4fa494e Updated Kannada Translation 2012-04-03 17:45:34 +05:30
4622c52b71 Updated Kannada Translation 2012-04-03 17:33:38 +05:30
e9ac5dd5f4 Updated Gujarati Translations 2012-04-03 11:25:14 +05:30
7570c43d11 Updated Kannada Translation 2012-04-02 18:29:42 +05:30
4332e7ec49 Updated Kannada Translation 2012-04-02 18:09:37 +05:30
9f26f1e225 Updated Telugu Translation 2012-04-02 16:38:36 +05:30
0c0319c415 Updated Marathi Translations 2012-04-02 11:46:21 +05:30
c16dbd7607 [l10n] Updated Catalan translation 2012-04-02 00:09:04 +02:00
7b1f10a5fe Updated Spanish translation 2012-04-01 19:37:22 +02:00
dce74749b7 Updated Bulgarian translation 2012-04-01 17:45:03 +03:00
1ba88b8c42 Fixed Russian translation 2012-04-01 14:01:39 +04:00
9c50b57d46 Fixed Russian translation 2012-04-01 14:00:14 +04:00
900bd3ee97 Updated Swedish translation 2012-04-01 09:07:33 +02:00
b4affe00a7 Updated Serbian translation 2012-03-31 11:03:43 +02:00
ca49c84bc1 Updated Polish translation 2012-03-31 04:10:41 +02:00
2cddf60226 Updated Galician translations 2012-03-31 00:08:44 +02:00
d9c3951f02 Updated Slovenian translation 2012-03-30 22:15:52 +02:00
aa5997d975 Updated Persian Translations 2012-03-31 02:13:34 +04:30
c51acf7c2a panel: Add keyboard shortcut to open app menu
With the application menu now being more than a stub, it has
become a much more interesting target, so add a keyboard shortcut
to open it directly.
This should also ease some of the pain for focus-follows-mouse users.

https://bugzilla.gnome.org/show_bug.cgi?id=672909
2012-03-30 19:58:43 +02:00
348044bc8a lookingGlass: Sort introspected property names
https://bugzilla.gnome.org/show_bug.cgi?id=673187
2012-03-30 11:57:45 -04:00
7dbdf2aa07 workspaceThumbnail: set correct cursor when hovering the drop placeholder
Namely, use the the 'copy' cursor for app launchers and the 'move'
cursor for windows.

https://bugzilla.gnome.org/show_bug.cgi?id=672641
2012-03-30 17:44:39 +02:00
c933731ead doap: Add myself as maintainer 2012-03-30 14:39:02 +02:00
e7da715994 svg: Make the OFF toggle widgets be the same width as the ON ones
Since the toggle switches have a 65px size in the CSS file, the
background image size should match it or it will be scaled and look
fuzzy.

https://bugzilla.gnome.org/show_bug.cgi?id=672592
2012-03-30 13:36:23 +02:00
6d82aefad4 format: support %Id conversion characters in format.js
This is needed for languages which translate numbers with an
alternative representation, such as Persian.

https://bugzilla.gnome.org/show_bug.cgi?id=673106
2012-03-29 17:30:02 -04:00
8a11ab7d96 Updated Norwegian bokmål translation 2012-03-29 09:52:55 +02:00
f465086405 Updated Swedish translation 2012-03-29 08:14:20 +02:00
70313a8b79 Updated Hungarian translation 2012-03-29 03:13:16 +02:00
71679c38be [l10n]Updated Catalan (Valencian) translation 2012-03-27 22:34:41 +02:00
addd943074 Typo 2012-03-27 21:32:11 +02:00
175 changed files with 14484 additions and 11469 deletions

3
.gitignore vendored
View File

@ -23,6 +23,8 @@ data/gnome-shell-extension-prefs.desktop.in
data/gschemas.compiled data/gschemas.compiled
data/org.gnome.shell.gschema.xml data/org.gnome.shell.gschema.xml
data/org.gnome.shell.gschema.valid data/org.gnome.shell.gschema.valid
data/org.gnome.shell.evolution.calendar.gschema.xml
data/org.gnome.shell.evolution.calendar.gschema.valid
docs/reference/*/*.args docs/reference/*/*.args
docs/reference/*/*.bak docs/reference/*/*.bak
docs/reference/*/*.hierarchy docs/reference/*/*.hierarchy
@ -68,6 +70,7 @@ src/gnome-shell-extension-prefs
src/gnome-shell-hotplug-sniffer src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild src/gnome-shell-jhbuild
src/gnome-shell-perf-helper src/gnome-shell-perf-helper
src/gnome-shell-perf-tool
src/gnome-shell-real src/gnome-shell-real
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
src/run-js-test src/run-js-test

166
NEWS
View File

@ -1,3 +1,157 @@
3.5.3
=====
* calendar: Adapt to Evolution-Data-Server API changes [Matthew; #677402]
* messageTray: Don't show non urgent notifications while in fullscreen
[Adel; #677590]
* modalDialog: show dialogs on monitor with the mouse pointer [Tim; #642591]
* extensionSystem: Prepare for extension updating system [Jasper; #677586]
* appDisplay: Don't show apps in NoDisplay categories in the All view
[Jasper; #658176]
* st: Trigger theme updates on resolution changes [Florian; #677975]
* Always enable a11y [Bastien; #678095]
* telepathyClient: ignore invalidated channels [Guillaume; #677457]
* shell-app: Update app menu if necessary [Florian; #676238]
* Enable the Screen Reader menu item [Matthias; #663256]
* Disable unredirection when a modal operation is active [Giovanni]
* Make folks optional [Colin]
* Improve mount-operation support [Cosimo]
- Fix exception when showing password entry [#678428]
- Close the password entry on operation abort [#673787]
- autorun: Don't allow autorun for things we mount on startup [#660595]
- Turn passphrase prompt into a dialog [#674962]
- Implement org.Gtk.MountOperationHandler [#678516]
* Network menu improvements
- Sort Wifi networks by strength [Giovanni; #658946]
- Prefer wifi/3g over VPN in the panel [Cosimo; #672591]
* clock: Switch to using GnomeWallClock [Colin; #657074]
* remoteSearch: Allow to reference .desktop file for Title/Icon
[Florian; #678816]
* Fix memory leaks [Jasper, Pavel; #678079, #678406, #678737]
* Misc fixes [Florian, Giovanni, Guillaume, Jasper, Kjartan, Piotr, Rui;
#658955, #677497, #678396, #678502]
* Misc cleanups [Bastien, Florian, Jasper; #677426, #677515, #678096, #678416]
Contributors:
Matthew Barnes, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen,
Guillaume Desmottes, Piotr Drąg, Adel Gadllah, Tim L, Kjartan Maraas,
Rui Matos, Florian Müllner, Bastien Nocera, Jasper St. Pierre, Colin Walters
Translations:
Matej Urbančič [sl], Yuri Kozlov [ru], Tom Tryfonidis [el],
Kjartan Maraas [nb], Žygimantas Beručka [lt], Luca Ferretti [it],
Khaled Hosny [ar], Daniel Mustieles [es], Fran Diéguez [gl], A S Alam [pa]
3.5.2
=====
* main: Move 'toggle-recording' binding into the shell [Florian; #674377]
* popupMenu: make sure to break the grab when the slider is not visible
[Stefano; #672713]
* st-theme-node-drawing: Don't use GL types [Neil; #672711]
* Mirror Evolution calendar settings into our own schema [Owen; #674424]
* shell-network-agent: don't crash if a request isn't found [Dan; #674961]
* notificationDaemon: Match app based on WM_CLASS [Jasper; #673761]
* NetworkMenu: use network-offline while loading [Giovanni; #674426]
* lookingGlass: Remove the Errors tab [Jasper; #675104]
* searchDisplay: Reset keyboard focus after displaying async results
[Rui; #675078]
* gdm: don't fail if fprintd is unavailable [Ray; #675006]
* messageTray: Fix scrolling up [Jasper; #661615]
* main: Close the recorder instead of pausing it [Rui; #675128]
* Accessibility [Alejandro]
- Use the proper label_actor for date menu on top panel [#675307]
- Set the proper role/label_actor for SearchResult.content [#672242]
- do not expose a label text if 'hidden' style class is used [#675341]
* Magnifier: Add brightness and contrast functionality [Joseph; #639851]
* theme: use a smaller border-radius for top bar [Jakub; #672430]
* placeDisplay: use new bookmark file location [Matthias; #675443]
* port all synchronous search providers to the async API [Jasper, Rui; #675328]
* NetworkAgent: disallow multiple requests for the same connection/setting
[Giovanni; #674961]
* userMenu: Update to latest mockups [Florian; #675802]
* util: Don't double-fork when spawning from Alt-F2 [Colin; #675789]
* messageTray: Make Source usable without subclassing [Jasper; #661236]
* panel: Check for appMenu button's reactivity before opening [Florian; #676316]
* Fix formatting of bluetooth passkey [Florian; #651251]
* notificationDaemon: Filter out file-transfer notifications [Jasper; #676175]
* Don't use global.log() [Jasper; #675790]
* Fix broken extension loading in some distributions [Owen, Alexandre; #670477]
* shell-app: Raise windows in reverse order to preserve the stacking
[Rui; #676371]
* Generalize gdm-mode [Florian; #676156]
* Switch string formatting to the one inside gjs [Jasper; #675479]
* extensionUtils: Support subdirectories in getCurrentExtension
[Jasper; #677001]
* panel: Refuse to add (legacy) status icons not part of the session mode
[Florian; #677058]
* Add an initial-setup mode [Matthias; #676697]
* status/keyboard: Port to the new input sources settings [Rui; #641531]
* NetworkMenu: show notifications for failed VPN connections [Giovanni; #676330]
* userMenu: Indicate progress on status changes [Florian; #659067]
* recorder: Honor "disable-save-to-disk" lockdown key [Rūdolfs; #673630]
* searchDisplay: Use the rowLimit we pass to the IconGrid [Christian; #675527]
* endSessionDialog: Factor out _updateDescription from _updateContent
[Alejandro; #674210]
* Fix empathy's appMenu freezing the shell [Alban; #676447]
* Code cleanups [Florian, Giovanni, Jasper; #672807, #672413, #676837, #676850,
#672272]
* Misc bug fixes [Alban, Florian, Giovanni, Guillaume, Jasper, Piotr, Rico,
Ron, Rui, Stefano; #659968, #672192, #673177, #673198, #674323, #675301,
#675370, #676347, #676806, #677097]
Contributors:
Alban Browaeys, Giovanni Campagna, Matthias Clasen, Guillaume Desmottes,
Piotr Drąg, Stefano Facchini, Rui Matos, Rūdolfs Mazurs, Florian Müllner,
Alejandro Piñeiro, Neil Roberts, Alexandre Rostovtsev, Joseph Scheuhammer,
Jakub Steiner, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz,
Colin Walters, Dan Winship, Ron Yorston
Translations:
OKANO Takayoshi [ja], Daniel Mustieles [es], Changwoo Ryu [ko],
Yaron Shahrabani [he], Fran Diéguez [gl], Jonh Wendell [pt_BR],
Kjartan Maraas [nb], Luca Ferretti [it], Tom Tryfonidis [el],
Sandeep Sheshrao Shedmake [mr], Takanori MATSUURA [ja], Dirgita [id],
Mantas Kriaučiūnas [lt], Matej Urbančič [sl], Jiro Matsuzawa [ja]
3.4.1
=====
* Fix crash that occurred when an icon theme change caused unexpected
reentrancy in the icon loading code [Jasper; #673512]
* Don't show system and other disabled users in the GDM user list
[Adel; #673784]
* Make gnome-shell-calendar-server initialize GTK+ so it can display
password prompts if needed [#673608; Owen, Rico]
* Adapt to Mutter API change for keybinding addition [Florian; #673014]
* Fix crash when an extension was installed as both a user extension
and a system extension [#673613; Jasper]
* Fix bug where chat entry could end up partially offscreen [Joost, 661944]
* Fix problem where icons weren't updating when theme was changed
[#672941; Florian]
* Look for Evolution calendar settings in GSettings, not GConf [#673610; Owen]
* Add <super>F10 for the application menu [#672909; Florian]
* Fix %Id format characters to work in translations [#673106; Cosimo]
(were already used in fa translation)
* Fix error when NetworkManager restarts [#673043; Giovanni]
* Improve efficiency of overview redraws by working around Clutter issue
[Stefano; #670636]
* Misc bug fixes [Florian, Giovanni, Jasper, Rui, Stefano;
#672592, #672641, #672719, #673187, #673233, #673656]
Contributors:
Giovanni Campagna, Cosimo Cecchi, Stefano Facchini, Adel Gadllah, Rui Matos,
Florian Müllner, Jasper St. Pierre, Owen Taylor, Rico Tzschichholz,
Joost Verdoorn
Translations:
Khaled Hosny [ar], Ihar Hrachyshka [be], Alexander Shopov [bg], Gil Forcada,
Jordi Serratosa [ca], Petr Kovar [cs], Bruce Cowan [en_GB],
Carles Ferrando [ca@valencia], Wolfgang Stöggl [de], Daniel Mustieles [es],
Arash Mousavi [fa], Bruno Brouard [fr], Fran Diéguez [gl],
Sweta Kothari [gu], Yaron Shahrabani [he], Gabor Kelemen [hu],
Shankar Prasad [kn], Žygimantas Beručka [lt], Rudolfs Mazurs [lv],
Sandeep Sheshrao Shedmake [mr], Kjartan Maraas [nb], Piotr Drąg [pl],
Yuri Myasoedov [ru], Daniel Nylander [se], Matej Urbančič [sl],
Miroslav Nikolić [sr], Sasi Bhushan, Praveen Illa [te], Yinghua Wang [zh_CN]
3.4.0 3.4.0
===== =====
* Don't crash when taking screenshots [Jasper; #672775] * Don't crash when taking screenshots [Jasper; #672775]
@ -8,10 +162,10 @@ Contributors:
Translations: Translations:
Khaled Hosny, Abderrahim Kitouni [ar], Ihar Hrachyshka [be], Khaled Hosny, Abderrahim Kitouni [ar], Ihar Hrachyshka [be],
Alexander Shopov [bg], Marek Černocký [cz], Jiri Grönroos, Timo Jyrinki [fi], Alexander Shopov [bg], Marek Černocký [cs], Jiri Grönroos, Timo Jyrinki [fi],
Bruno Brouard [fr], Fran Diéguez [gl], Yaron Shahrabani [he], Bruno Brouard [fr], Fran Diéguez [gl], Yaron Shahrabani [he],
Gabor Kelemen [hu], Jiro Matsuzawa [ja], Kenneth Nielsen [dk], Gabor Kelemen [hu], Jiro Matsuzawa [ja], Kenneth Nielsen [dk],
Mattias Põldaru [et], Changwoo Ryu [kr], Rudolfs Mazurs [lv], Mattias Põldaru [et], Changwoo Ryu [ko], Rudolfs Mazurs [lv],
Jonh Wendell [pt_BR], Yuri Myasoedov[ru], Daniel Korostil [uk], Jonh Wendell [pt_BR], Yuri Myasoedov[ru], Daniel Korostil [uk],
Nguyễn Thái Ngọc Duy [vi], Chao-Hsiung Liao [zh_HK, zh_TW] Nguyễn Thái Ngọc Duy [vi], Chao-Hsiung Liao [zh_HK, zh_TW]
@ -80,7 +234,7 @@ Contributors:
Translations: Translations:
Nilamdyuti Goswami [as], Ihar Hrachyshka, Kasia Bondarava [be], Nilamdyuti Goswami [as], Ihar Hrachyshka, Kasia Bondarava [be],
Alexander Shopov, Ivaylo Valkov [bg], Gil Forcada [ca], Marek Černocký [cz], Alexander Shopov, Ivaylo Valkov [bg], Gil Forcada [ca], Marek Černocký [cs],
Mario Blättermann [de], Kris Thomsen [dk], Bruce Cowan [en_GB], Mario Blättermann [de], Kris Thomsen [dk], Bruce Cowan [en_GB],
Kristjan Schmidt [eo], Daniel Mustieles [es], Mattias Põldaru [et], Kristjan Schmidt [eo], Daniel Mustieles [es], Mattias Põldaru [et],
Inaki Larranaga Murgoitio [eu], Arash Mousavi [fa], Timo Jyrinki [fi], Inaki Larranaga Murgoitio [eu], Arash Mousavi [fa], Timo Jyrinki [fi],
@ -129,7 +283,7 @@ Contributors:
Will Thompson, Stef Walter Will Thompson, Stef Walter
Translations: Translations:
Ihar Hrachyshka [be], Marek Černocký, Adam Matoušek [cz], Ihar Hrachyshka [be], Marek Černocký, Adam Matoušek [cs],
Kenneth Nielsen [dk], Daniel Mustieles [es], Mattias Põldaru [et], Kenneth Nielsen [dk], Daniel Mustieles [es], Mattias Põldaru [et],
Fran Diéguez [gl], Yaron Shahrabani [he], Luca Ferretti [it], Fran Diéguez [gl], Yaron Shahrabani [he], Luca Ferretti [it],
Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Kjartan Maraas [nb], Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Kjartan Maraas [nb],
@ -260,7 +414,7 @@ Contributors:
Marina Zhurakhinskaya Marina Zhurakhinskaya
Translations: Translations:
Petr Kovar [cz], Kris Thomsen [dk], Daniel Mustieles [es], Petr Kovar [cs], Kris Thomsen [dk], Daniel Mustieles [es],
Ville-Pekka Vainio [fi], Yaron Shahrabani [he], Luca Ferretti [it], Ville-Pekka Vainio [fi], Yaron Shahrabani [he], Luca Ferretti [it],
Hideki Yamane [ja], Žygimantas Beručka [lt], Jovan Naumovski [mk], Hideki Yamane [ja], Žygimantas Beručka [lt], Jovan Naumovski [mk],
Kjartan Maraas [nb], "Andreas N" [nn], Lucian Adrian Grijincu [ro], Kjartan Maraas [nb], "Andreas N" [nn], Lucian Adrian Grijincu [ro],
@ -423,7 +577,7 @@ Contributors:
Translations: Translations:
Friedel Wolff [af], Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Friedel Wolff [af], Nilamdyuti Goswami [as], Ihar Hrachyshka [be],
Ivaylo Valkov [bg], Gil Forcada [ca], Carles Ferrando [ca@valencia], Ivaylo Valkov [bg], Gil Forcada [ca], Carles Ferrando [ca@valencia],
Petr Kovar [cz], Mario Blättermann [de], Kris Thomsen [dk], Petr Kovar [cs], Mario Blättermann [de], Kris Thomsen [dk],
Tiffany Antopolski, Kristjan Schmidt [eo], Daniel Mustieles [es], Tiffany Antopolski, Kristjan Schmidt [eo], Daniel Mustieles [es],
Inaki Larranaga Murgoitio [eu], Tommi Vainikainen [fi], Bruno Brouard [fr], Inaki Larranaga Murgoitio [eu], Tommi Vainikainen [fi], Bruno Brouard [fr],
Fran Dieguez [gl], Yaron Shahrabani [he], Gabor Kelemen [hu], Fran Dieguez [gl], Yaron Shahrabani [he], Gabor Kelemen [hu],

View File

@ -41,7 +41,7 @@
"It can be used only by extensions.gnome.org" "It can be used only by extensions.gnome.org"
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type"; #define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
#define PLUGIN_API_VERSION 3 #define PLUGIN_API_VERSION 4
typedef struct { typedef struct {
GDBusProxy *proxy; GDBusProxy *proxy;
@ -163,6 +163,7 @@ NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
plugin->newp = NPP_New; plugin->newp = NPP_New;
plugin->destroy = NPP_Destroy; plugin->destroy = NPP_Destroy;
plugin->getvalue = NPP_GetValue; plugin->getvalue = NPP_GetValue;
plugin->setwindow = NPP_SetWindow;
return NPERR_NO_ERROR; return NPERR_NO_ERROR;
} }
@ -267,6 +268,7 @@ typedef struct {
NPObject parent; NPObject parent;
NPP instance; NPP instance;
GDBusProxy *proxy; GDBusProxy *proxy;
GSettings *settings;
NPObject *listener; NPObject *listener;
NPObject *restart_listener; NPObject *restart_listener;
gint signal_id; gint signal_id;
@ -323,6 +325,9 @@ on_shell_appeared (GDBusConnection *connection,
} }
} }
#define SHELL_SCHEMA "org.gnome.shell"
#define ENABLED_EXTENSIONS_KEY "enabled-extensions"
static NPObject * static NPObject *
plugin_object_allocate (NPP instance, plugin_object_allocate (NPP instance,
NPClass *klass) NPClass *klass)
@ -332,6 +337,7 @@ plugin_object_allocate (NPP instance,
obj->instance = instance; obj->instance = instance;
obj->proxy = g_object_ref (data->proxy); obj->proxy = g_object_ref (data->proxy);
obj->settings = g_settings_new (SHELL_SCHEMA);
obj->signal_id = g_signal_connect (obj->proxy, "g-signal", obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
G_CALLBACK (on_shell_signal), obj); G_CALLBACK (on_shell_signal), obj);
@ -492,7 +498,61 @@ plugin_enable_extension (PluginObject *obj,
NPString uuid, NPString uuid,
gboolean enabled) gboolean enabled)
{ {
gboolean ret;
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length); gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
gsize length;
gchar **uuids;
const gchar **new_uuids;
if (!uuid_is_valid (uuid_str))
{
g_free (uuid_str);
return FALSE;
}
uuids = g_settings_get_strv (obj->settings, ENABLED_EXTENSIONS_KEY);
length = g_strv_length (uuids);
if (enabled)
{
new_uuids = g_new (const gchar *, length + 2); /* New key, NULL */
memcpy (new_uuids, uuids, length * sizeof (*new_uuids));
new_uuids[length] = uuid_str;
new_uuids[length + 1] = NULL;
}
else
{
gsize i = 0, j = 0;
new_uuids = g_new (const gchar *, length);
for (i = 0; i < length; i ++)
{
if (g_str_equal (uuids[i], uuid_str))
continue;
new_uuids[j] = uuids[i];
j++;
}
new_uuids[j] = NULL;
}
ret = g_settings_set_strv (obj->settings,
ENABLED_EXTENSIONS_KEY,
new_uuids);
g_strfreev (uuids);
g_free (new_uuids);
g_free (uuid_str);
return ret;
}
static gboolean
plugin_install_extension (PluginObject *obj,
NPString uuid)
{
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
if (!uuid_is_valid (uuid_str)) if (!uuid_is_valid (uuid_str))
{ {
g_free (uuid_str); g_free (uuid_str);
@ -500,7 +560,7 @@ plugin_enable_extension (PluginObject *obj,
} }
g_dbus_proxy_call (obj->proxy, g_dbus_proxy_call (obj->proxy,
(enabled ? "EnableExtension" : "DisableExtension"), "InstallRemoteExtension",
g_variant_new ("(s)", uuid_str), g_variant_new ("(s)", uuid_str),
G_DBUS_CALL_FLAGS_NONE, G_DBUS_CALL_FLAGS_NONE,
-1, /* timeout */ -1, /* timeout */
@ -513,40 +573,6 @@ plugin_enable_extension (PluginObject *obj,
return TRUE; return TRUE;
} }
static gboolean
plugin_install_extension (PluginObject *obj,
NPString uuid,
NPString version_tag)
{
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
gchar *version_tag_str;
if (!uuid_is_valid (uuid_str))
{
g_free (uuid_str);
return FALSE;
}
version_tag_str = g_strndup (version_tag.UTF8Characters,
version_tag.UTF8Length);
g_dbus_proxy_call (obj->proxy,
"InstallRemoteExtension",
g_variant_new ("(ss)",
uuid_str,
version_tag_str),
G_DBUS_CALL_FLAGS_NONE,
-1, /* timeout */
NULL, /* cancellable */
NULL, /* callback */
NULL /* user_data */);
g_free (uuid_str);
g_free (version_tag_str);
return TRUE;
}
static gboolean static gboolean
plugin_uninstall_extension (PluginObject *obj, plugin_uninstall_extension (PluginObject *obj,
NPString uuid, NPString uuid,
@ -771,11 +797,9 @@ plugin_object_invoke (NPObject *npobj,
else if (name == install_extension_id) else if (name == install_extension_id)
{ {
if (!NPVARIANT_IS_STRING(args[0])) return FALSE; if (!NPVARIANT_IS_STRING(args[0])) return FALSE;
if (!NPVARIANT_IS_STRING(args[1])) return FALSE;
return plugin_install_extension (obj, return plugin_install_extension (obj,
NPVARIANT_TO_STRING(args[0]), NPVARIANT_TO_STRING(args[0]));
NPVARIANT_TO_STRING(args[1]));
} }
else if (name == uninstall_extension_id) else if (name == uninstall_extension_id)
{ {
@ -946,3 +970,12 @@ NPP_GetValue(NPP instance,
return NPERR_NO_ERROR; return NPERR_NO_ERROR;
} }
/* Opera tries to call NPP_SetWindow without checking the
* NULL pointer beforehand. */
NPError
NPP_SetWindow(NPP instance,
NPWindow *window)
{
return NPERR_NO_ERROR;
}

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.4.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.5.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@ -62,28 +62,47 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.9.16 CLUTTER_MIN_VERSION=1.9.16
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.29.18 GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.3.92 MUTTER_MIN_VERSION=3.5.3
FOLKS_MIN_VERSION=0.5.2 FOLKS_MIN_VERSION=0.5.2
GTK_MIN_VERSION=3.3.9 GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.31.6 GIO_MIN_VERSION=2.31.6
LIBECAL_MIN_VERSION=2.32.0 LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=1.2.0 LIBEDATASERVER_MIN_VERSION=3.5.3
LIBEDATASERVERUI_MIN_VERSION=2.91.6 LIBEDATASERVERUI_MIN_VERSION=3.5.3
TELEPATHY_GLIB_MIN_VERSION=0.17.5 TELEPATHY_GLIB_MIN_VERSION=0.17.5
TELEPATHY_LOGGER_MIN_VERSION=0.2.4 TELEPATHY_LOGGER_MIN_VERSION=0.2.4
POLKIT_MIN_VERSION=0.100 POLKIT_MIN_VERSION=0.100
STARTUP_NOTIFICATION_MIN_VERSION=0.11 STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90 GCR_MIN_VERSION=3.3.90
GNOME_DESKTOP_REQUIRED_VERSION=3.5.1
GNOME_MENUS_REQUIRED_VERSION=3.5.3
AC_ARG_WITH(folks,
AS_HELP_STRING([--with-folks],
[Enable folks support]),
[with_folks=$withval], [with_folks=yes])
if test x${with_folks} = xyes; then
FOLKS_REQUIREMENT="folks >= $FOLKS_MIN_VERSION"
AC_DEFINE([HAVE_FOLKS], [1], [folks support])
AC_SUBST([HAVE_FOLKS],[1])
else
FOLKS_REQUIREMENT=
AC_SUBST([HAVE_FOLKS],[0])
fi
AM_CONDITIONAL(BUILD_WITH_FOLKS, test x${with_folks} = xyes)
# Collect more than 20 libraries for a prize! # Collect more than 20 libraries for a prize!
PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
libxml-2.0 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION gtk+-3.0 >= $GTK_MIN_VERSION
folks >= $FOLKS_MIN_VERSION atk-bridge-2.0
$FOLKS_REQUIREMENT
libmutter >= $MUTTER_MIN_VERSION libmutter >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu-3.0 $recorder_modules libgnome-menu-3.0 >= $GNOME_MENUS_REQUIRED_VERSION
$recorder_modules
gdk-x11-3.0 libsoup-2.4 gdk-x11-3.0 libsoup-2.4
gl gl
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
@ -95,7 +114,8 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util gnome-keyring-1 libnm-glib libnm-util gnome-keyring-1
gcr-3 >= $GCR_MIN_VERSION) gcr-3 >= $GCR_MIN_VERSION
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -103,13 +123,7 @@ PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2) PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0`
AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to])
AC_SUBST([GJS_VERSION], ["$GJS_VERSION"])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION]) GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
JHBUILD_TYPELIBDIR="$INTROSPECTION_TYPELIBDIR"
AC_SUBST(JHBUILD_TYPELIBDIR)
saved_CFLAGS=$CFLAGS saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS saved_LIBS=$LIBS
@ -123,7 +137,7 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 0.1.7) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.1)
AC_MSG_CHECKING([for bluetooth support]) AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0], PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
@ -239,31 +253,6 @@ AC_ARG_ENABLE(jhbuild-wrapper-script,
AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no) AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no)
AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes) AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes)
AC_MSG_CHECKING([location of system Certificate Authority list])
AC_ARG_WITH(ca-certificates,
[AC_HELP_STRING([--with-ca-certificates=@<:@path@:>@],
[path to system Certificate Authority list])])
if test "$with_ca_certificates" = "no"; then
AC_MSG_RESULT([disabled])
else
if test -z "$with_ca_certificates"; then
for f in /etc/pki/tls/certs/ca-bundle.crt \
/etc/ssl/certs/ca-certificates.crt; do
if test -f "$f"; then
with_ca_certificates="$f"
fi
done
if test -z "$with_ca_certificates"; then
AC_MSG_ERROR([could not find. Use --with-ca-certificates=path to set, or --without-ca-certificates to disable])
fi
fi
AC_MSG_RESULT($with_ca_certificates)
AC_DEFINE_UNQUOTED(SHELL_SYSTEM_CA_FILE, ["$with_ca_certificates"], [The system TLS CA list])
fi
AC_SUBST(SHELL_SYSTEM_CA_FILE,["$with_ca_certificates"])
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}" BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to]) AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])

View File

@ -56,6 +56,11 @@ dist_theme_DATA = \
gsettings_SCHEMAS = org.gnome.shell.gschema.xml gsettings_SCHEMAS = org.gnome.shell.gschema.xml
@INTLTOOL_XML_NOMERGE_RULE@ @INTLTOOL_XML_NOMERGE_RULE@
%.gschema.xml.in: %.gschema.xml.in.in Makefile
$(AM_V_GEN) sed -e 's|@GETTEXT_PACKAGE[@]|$(GETTEXT_PACKAGE)|g' \
$< > $@ || rm $@
@GSETTINGS_RULES@ @GSETTINGS_RULES@
# We need to compile schemas at make time # We need to compile schemas at make time
@ -80,12 +85,13 @@ EXTRA_DIST = \
$(menu_DATA) \ $(menu_DATA) \
$(shaders_DATA) \ $(shaders_DATA) \
$(convert_DATA) \ $(convert_DATA) \
org.gnome.shell.gschema.xml.in org.gnome.shell.gschema.xml.in.in
CLEANFILES = \ CLEANFILES = \
gnome-shell.desktop.in \ gnome-shell.desktop.in \
gnome-shell-extension-prefs.in \ gnome-shell-extension-prefs.in \
$(desktop_DATA) \ $(desktop_DATA) \
$(gsettings_SCHEMAS) \ $(gsettings_SCHEMAS) \
gschemas.compiled gschemas.compiled \
org.gnome.shell.gschema.valid \
org.gnome.shell.gschema.xml.in

View File

@ -61,9 +61,9 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
<_summary>Internally used to store the last session presence status for the user. The <_summary>Internally used to store the last session presence status for the user. The
value here is from the GsmPresenceStatus enumeration.</_summary> value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
<child name="clock" schema="org.gnome.shell.clock"/>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/> <child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
<child name="keyboard" schema="org.gnome.shell.keyboard"/> <child name="keyboard" schema="org.gnome.shell.keyboard"/>
</schema> </schema>
@ -78,6 +78,24 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
</schema> </schema>
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="open-application-menu" type="as">
<default>["&lt;Super&gt;F10"]</default>
<_summary>Keybinding to open the application menu</_summary>
<_description>
Keybinding to open the application menu.
</_description>
</key>
<key name="toggle-recording" type="as">
<default><![CDATA[['<Control><Shift><Alt>r']]]></default>
<_summary>Keybinding to toggle the screen recorder</_summary>
<_description>
Keybinding to start/stop the builtin screen recorder.
</_description>
</key>
</schema>
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/" <schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="keyboard-type" type="s"> <key name="keyboard-type" type="s">
@ -89,24 +107,6 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
</schema> </schema>
<schema id="org.gnome.shell.clock" path="/org/gnome/shell/clock/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="show-seconds" type="b">
<default>false</default>
<_summary>Show time with seconds</_summary>
<_description>
If true, display seconds in time.
</_description>
</key>
<key name="show-date" type="b">
<default>false</default>
<_summary>Show date in clock</_summary>
<_description>
If true, display date in the clock, in addition to time.
</_description>
</key>
</schema>
<schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/" <schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="framerate" type="i"> <key name="framerate" type="i">

View File

@ -328,6 +328,11 @@ StScrollBar StButton#vhandle:hover
background-gradient-end: rgba(255, 255, 255, 0.2); background-gradient-end: rgba(255, 255, 255, 0.2);
} }
.notification-icon-button:insensitive,
.notification-button:insensitive {
color: #9f9f9f;
}
/* Panel */ /* Panel */
#panel { #panel {
@ -357,7 +362,7 @@ StScrollBar StButton#vhandle:hover
} }
.panel-corner { .panel-corner {
-panel-corner-radius: 10px; -panel-corner-radius: 6px;
-panel-corner-background-color: black; -panel-corner-background-color: black;
-panel-corner-border-width: 2px; -panel-corner-border-width: 2px;
-panel-corner-border-color: transparent; -panel-corner-border-color: transparent;
@ -409,7 +414,7 @@ StScrollBar StButton#vhandle:hover
.panel-button:active, .panel-button:active,
.panel-button:overview, .panel-button:overview,
.panel-button:focus { .panel-button:focus {
border-image: url("panel-button-border.svg") 10 10 0 2; border-image: url("panel-button-border.svg") 6 10 0 2;
background-image: url("panel-button-highlight-wide.svg"); background-image: url("panel-button-highlight-wide.svg");
color: white; color: white;
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
@ -431,6 +436,10 @@ StScrollBar StButton#vhandle:hover
-boxpointer-gap: 4px -boxpointer-gap: 4px
} }
#networkMenu {
spacing: 4px;
}
/* User Menu */ /* User Menu */
#panelUserMenu { #panelUserMenu {
@ -1203,7 +1212,8 @@ StScrollBar StButton#vhandle:hover
height: 36px; height: 36px;
} }
#notification { .notification {
font-size: 11pt;
border-radius: 10px 10px 0px 0px; border-radius: 10px 10px 0px 0px;
background: rgba(0,0,0,0.8); background: rgba(0,0,0,0.8);
padding: 8px 8px 4px 8px; padding: 8px 8px 4px 8px;
@ -1212,7 +1222,7 @@ StScrollBar StButton#vhandle:hover
width: 34em; width: 34em;
} }
#notification.multi-line-notification { .notification.multi-line-notification {
padding-bottom: 8px; padding-bottom: 8px;
} }
@ -1234,7 +1244,7 @@ StScrollBar StButton#vhandle:hover
color: white; color: white;
} }
.summary-boxpointer #notification { .summary-boxpointer .notification {
border-radius: 9px; border-radius: 9px;
background: rgba(0,0,0,0) !important; background: rgba(0,0,0,0) !important;
padding-bottom: 12px; padding-bottom: 12px;
@ -1251,10 +1261,6 @@ StScrollBar StButton#vhandle:hover
padding-bottom: 6px; padding-bottom: 6px;
} }
#summary-notification-stack-scrollview > .top-shadow, #summary-notification-stack-scrollview > .bottom-shadow {
height: 1em;
}
#summary-notification-stack-scrollview:ltr { #summary-notification-stack-scrollview:ltr {
padding-right: 8px; padding-right: 8px;
} }
@ -1263,28 +1269,24 @@ StScrollBar StButton#vhandle:hover
padding-left: 8px; padding-left: 8px;
} }
#notification-scrollview { .notification-scrollview {
max-height: 10em; max-height: 10em;
-st-vfade-offset: 24px; -st-vfade-offset: 24px;
} }
#notification-scrollview > .top-shadow, #notification-scrollview > .bottom-shadow { .notification-scrollview:ltr > StScrollBar {
height: 1em;
}
#notification-scrollview:ltr > StScrollBar {
padding-left: 6px; padding-left: 6px;
} }
#notification-scrollview:rtl > StScrollBar { .notification-scrollview:rtl > StScrollBar {
padding-right: 6px; padding-right: 6px;
} }
#notification-body { .notification-body {
spacing: 5px; spacing: 5px;
} }
#notification-actions { .notification-actions {
spacing: 10px; spacing: 10px;
} }
@ -1411,7 +1413,7 @@ StScrollBar StButton#vhandle:hover
font-style: italic; font-style: italic;
} }
#notification StEntry { .notification StEntry {
padding: 4px; padding: 4px;
border-radius: 4px; border-radius: 4px;
color: #a8a8a8; color: #a8a8a8;
@ -1427,7 +1429,7 @@ StScrollBar StButton#vhandle:hover
caret-size: 1px; caret-size: 1px;
} }
#notification StEntry:focus { .notification StEntry:focus {
border: 1px solid #8b8b8b; border: 1px solid #8b8b8b;
color: #333333; color: #333333;
background-gradient-direction: vertical; background-gradient-direction: vertical;
@ -1950,10 +1952,12 @@ StScrollBar StButton#vhandle:hover
padding-bottom: 8px; padding-bottom: 8px;
} }
/* intentionally left transparent to avoid dialog changing size */ .hidden {
color: rgba(0,0,0,0);
}
.prompt-dialog-null-label { .prompt-dialog-null-label {
font-size: 10pt; font-size: 10pt;
color: rgba(0,0,0,0);
padding-bottom: 8px; padding-bottom: 8px;
} }

View File

@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="21" width="17"
height="10" height="10"
id="svg2" id="svg2"
version="1.1" version="1.1"
@ -66,9 +66,9 @@
<rect <rect
style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none" style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3796" id="rect3796"
width="3" width="7"
height="2" height="2"
x="9" x="5"
y="8" /> y="8" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64" width="65"
height="22" height="22"
id="svg3273" id="svg3273"
version="1.1" version="1.1"

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64" width="65"
height="22" height="22"
id="svg3012" id="svg3012"
version="1.1" version="1.1"

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -66,4 +66,11 @@ its dependencies to build from tarballs.</description>
<gnome:userid>marinaz</gnome:userid> <gnome:userid>marinaz</gnome:userid>
</foaf:Person> </foaf:Person>
</maintainer> </maintainer>
<maintainer>
<foaf:Person>
<foaf:name>Florian Müllner</foaf:name>
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
<gnome:userid>fmuellner</gnome:userid>
</foaf:Person>
</maintainer>
</Project> </Project>

View File

@ -6,9 +6,8 @@ misc/config.js: misc/config.js.in Makefile
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \ [ -d $(@D) ] || $(mkdir_p) $(@D) ; \
sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \ sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \
-e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \ -e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \
-e "s|[@]GJS_VERSION@|$(GJS_VERSION)|g" \ -e "s|[@]HAVE_FOLKS@|$(HAVE_FOLKS)|g" \
-e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \ -e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \
-e "s|[@]SHELL_SYSTEM_CA_FILE@|$(SHELL_SYSTEM_CA_FILE)|g" \
-e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \ -e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \
-e "s|[@]datadir@|$(datadir)|g" \ -e "s|[@]datadir@|$(datadir)|g" \
-e "s|[@]libexecdir@|$(libexecdir)|g" \ -e "s|[@]libexecdir@|$(libexecdir)|g" \
@ -28,7 +27,6 @@ nobase_dist_js_DATA = \
misc/config.js \ misc/config.js \
misc/extensionUtils.js \ misc/extensionUtils.js \
misc/fileUtils.js \ misc/fileUtils.js \
misc/format.js \
misc/gnomeSession.js \ misc/gnomeSession.js \
misc/history.js \ misc/history.js \
misc/jsParse.js \ misc/jsParse.js \
@ -53,6 +51,7 @@ nobase_dist_js_DATA = \
ui/endSessionDialog.js \ ui/endSessionDialog.js \
ui/environment.js \ ui/environment.js \
ui/extensionSystem.js \ ui/extensionSystem.js \
ui/extensionDownloader.js \
ui/flashspot.js \ ui/flashspot.js \
ui/iconGrid.js \ ui/iconGrid.js \
ui/keyboard.js \ ui/keyboard.js \
@ -67,6 +66,7 @@ nobase_dist_js_DATA = \
ui/messageTray.js \ ui/messageTray.js \
ui/modalDialog.js \ ui/modalDialog.js \
ui/networkAgent.js \ ui/networkAgent.js \
ui/sessionMode.js \
ui/shellEntry.js \ ui/shellEntry.js \
ui/shellMountOperation.js \ ui/shellMountOperation.js \
ui/notificationDaemon.js \ ui/notificationDaemon.js \

View File

@ -6,11 +6,11 @@ const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Format = imports.format;
const _ = Gettext.gettext; const _ = Gettext.gettext;
const Config = imports.misc.config; const Config = imports.misc.config;
const Format = imports.misc.format;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
@ -202,24 +202,18 @@ const Application = new Lang.Class({
}, },
_scanExtensions: function() { _scanExtensions: function() {
ExtensionUtils.scanExtensions(Lang.bind(this, function(uuid, dir, type) { let finder = new ExtensionUtils.ExtensionFinder();
if (ExtensionUtils.extensions[uuid] !== undefined) finder.connect('extension-found', Lang.bind(this, this._extensionFound));
return; finder.scanExtensions();
let extension;
try {
extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch(e) {
global.logError('' + e);
return;
}
let iter = this._model.append();
this._model.set(iter, [0, 1], [uuid, extension.metadata.name]);
this._extensionIters[uuid] = iter;
}));
}, },
_extensionFound: function(signals, extension) {
let iter = this._model.append();
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
this._extensionIters[uuid] = iter;
},
_onActivate: function() { _onActivate: function() {
this._window.present(); this._window.present();
}, },
@ -257,7 +251,7 @@ function initEnvironment() {
}, },
logError: function(s) { logError: function(s) {
global.log('ERROR: ' + s); log('ERROR: ' + s);
}, },
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell']) userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
@ -268,7 +262,6 @@ function initEnvironment() {
function main(argv) { function main(argv) {
initEnvironment(); initEnvironment();
ExtensionUtils.init();
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR); Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
Gettext.textdomain(Config.GETTEXT_PACKAGE); Gettext.textdomain(Config.GETTEXT_PACKAGE);

View File

@ -11,10 +11,17 @@ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
</method> </method>
</interface>; </interface>;
const FprintManagerProxy = Gio.DBusProxy.makeProxyWrapper(FprintManagerIface); const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);
function FprintManager() { function FprintManager() {
return new FprintManagerProxy(Gio.DBus.system, var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
'net.reactivated.Fprint', g_interface_name: FprintManagerInfo.name,
'/net/reactivated/Fprint/Manager'); g_interface_info: FprintManagerInfo,
}; g_name: 'net.reactivated.Fprint',
g_object_path: '/net/reactivated/Fprint/Manager',
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
self.init(null);
return self;
}

View File

@ -488,6 +488,9 @@ const UserList = new Lang.Class({
if (user.is_system_account()) if (user.is_system_account())
return; return;
if (user.locked)
return;
let userName = user.get_user_name(); let userName = user.get_user_name();
if (!userName) if (!userName)

View File

@ -60,10 +60,8 @@ const PowerMenuButton = new Lang.Class({
}, },
_updateVisibility: function() { _updateVisibility: function() {
if (!this._haveSuspend && !this._haveShutdown && !this._haveRestart) let shouldBeVisible = (this._haveSuspend || this._haveShutdown || this._haveRestart);
this.actor.hide(); this.actor.visible = shouldBeVisible;
else
this.actor.show();
}, },
_updateHaveShutdown: function() { _updateHaveShutdown: function() {
@ -76,11 +74,7 @@ const PowerMenuButton = new Lang.Class({
else else
this._haveShutdown = false; this._haveShutdown = false;
if (this._haveShutdown) this._powerOffItem.actor.visible = this._haveShutdown;
this._powerOffItem.actor.show();
else
this._powerOffItem.actor.hide();
this._updateVisibility(); this._updateVisibility();
})); }));
} else { } else {
@ -91,12 +85,7 @@ const PowerMenuButton = new Lang.Class({
else else
this._haveShutdown = false; this._haveShutdown = false;
if (this._haveShutdown) { this._powerOffItem.actor.visible = this._haveShutdown;
this._powerOffItem.actor.show();
} else {
this._powerOffItem.actor.hide();
}
this._updateVisibility(); this._updateVisibility();
})); }));
} }
@ -112,11 +101,7 @@ const PowerMenuButton = new Lang.Class({
else else
this._haveRestart = false; this._haveRestart = false;
if (this._haveRestart) this._restartItem.actor.visible = this._haveRestart;
this._restartItem.actor.show();
else
this._restartItem.actor.hide();
this._updateVisibility(); this._updateVisibility();
})); }));
} else { } else {
@ -127,12 +112,7 @@ const PowerMenuButton = new Lang.Class({
else else
this._haveRestart = false; this._haveRestart = false;
if (this._haveRestart) { this._restartItem.actor.visible = this._haveRestart;
this._restartItem.actor.show();
} else {
this._restartItem.actor.hide();
}
this._updateVisibility(); this._updateVisibility();
})); }));
} }
@ -140,12 +120,7 @@ const PowerMenuButton = new Lang.Class({
_updateHaveSuspend: function() { _updateHaveSuspend: function() {
this._haveSuspend = this._upClient.get_can_suspend(); this._haveSuspend = this._upClient.get_can_suspend();
this._suspendItem.actor.visible = this._haveSuspend;
if (this._haveSuspend)
this._suspendItem.actor.show();
else
this._suspendItem.actor.hide();
this._updateVisibility(); this._updateVisibility();
}, },

View File

@ -4,12 +4,10 @@
const PACKAGE_NAME = '@PACKAGE_NAME@'; const PACKAGE_NAME = '@PACKAGE_NAME@';
/* The version of this package */ /* The version of this package */
const PACKAGE_VERSION = '@PACKAGE_VERSION@'; const PACKAGE_VERSION = '@PACKAGE_VERSION@';
/* The version of GJS we're linking to */
const GJS_VERSION = '@GJS_VERSION@';
/* 1 if gnome-bluetooth is available, 0 otherwise */ /* 1 if gnome-bluetooth is available, 0 otherwise */
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@; const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
/* The system TLS CA list */ /* 1 if folks is available, 0 otherwise */
const SHELL_SYSTEM_CA_FILE = '@SHELL_SYSTEM_CA_FILE@'; const HAVE_FOLKS = @HAVE_FOLKS@;
/* gettext package */ /* gettext package */
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@'; const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
/* locale dir */ /* locale dir */

View File

@ -3,6 +3,9 @@
// Common utils for the extension system and the extension // Common utils for the extension system and the extension
// preferences tool // preferences tool
const Lang = imports.lang;
const Signals = imports.signals;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const ShellJS = imports.gi.ShellJS; const ShellJS = imports.gi.ShellJS;
@ -14,9 +17,6 @@ const ExtensionType = {
PER_USER: 2 PER_USER: 2
}; };
// GFile for user extensions
var userExtensionsDir = null;
// Maps uuid -> metadata object // Maps uuid -> metadata object
const extensions = {}; const extensions = {};
@ -40,13 +40,18 @@ function getCurrentExtension() {
throw new Error('Could not find current extension'); throw new Error('Could not find current extension');
let path = match[1]; let path = match[1];
let uuid = GLib.path_get_basename(GLib.path_get_dirname(path)); let file = Gio.File.new_for_path(path);
let extension = extensions[uuid]; // Walk up the directory tree, looking for an extesion with
if (extension === undefined) // the same UUID as a directory name.
throw new Error('Could not find current extension'); while (file != null) {
let extension = extensions[file.get_basename()];
if (extension !== undefined)
return extension;
file = file.get_parent();
}
return extension; throw new Error('Could not find current extension');
} }
/** /**
@ -83,9 +88,6 @@ function isOutOfDate(extension) {
if (!versionCheck(extension.metadata['shell-version'], Config.PACKAGE_VERSION)) if (!versionCheck(extension.metadata['shell-version'], Config.PACKAGE_VERSION))
return true; return true;
if (extension.metadata['js-version'] && !versionCheck(extension.metadata['js-version'], Config.GJS_VERSION))
return true;
return false; return false;
} }
@ -120,7 +122,7 @@ function createExtensionObject(uuid, dir, type) {
// Encourage people to add this // Encourage people to add this
if (!meta.url) { if (!meta.url) {
global.log('Warning: Missing "url" property in metadata.json'); log('Warning: Missing "url" property in %s/metadata.json'.format(uuid));
} }
if (uuid != meta.uuid) { if (uuid != meta.uuid) {
@ -150,45 +152,48 @@ function installImporter(extension) {
_extension = null; _extension = null;
} }
function init() { const ExtensionFinder = new Lang.Class({
let userExtensionsPath = GLib.build_filenamev([global.userdatadir, 'extensions']); Name: 'ExtensionFinder',
userExtensionsDir = Gio.file_new_for_path(userExtensionsPath);
try {
if (!userExtensionsDir.query_exists(null))
userExtensionsDir.make_directory_with_parents(null);
} catch (e) {
global.logError('' + e);
}
}
function scanExtensionsInDirectory(callback, dir, type) { _scanExtensionsInDirectory: function(dir, type) {
let fileEnum; let fileEnum;
let file, info; let file, info;
try { try {
fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null); fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
} catch(e) { } catch(e) {
global.logError('' + e); logError(e, 'Could not enumerate extensions directory');
return; return;
} }
while ((info = fileEnum.next_file(null)) != null) { while ((info = fileEnum.next_file(null)) != null) {
let fileType = info.get_file_type(); let fileType = info.get_file_type();
if (fileType != Gio.FileType.DIRECTORY) if (fileType != Gio.FileType.DIRECTORY)
continue; continue;
let uuid = info.get_name(); let uuid = info.get_name();
let extensionDir = dir.get_child(uuid); let extensionDir = dir.get_child(uuid);
callback(uuid, extensionDir, type);
}
fileEnum.close(null);
}
function scanExtensions(callback) { let existing = extensions[uuid];
let systemDataDirs = GLib.get_system_data_dirs(); if (existing) {
for (let i = 0; i < systemDataDirs.length; i++) { log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, extensionDir.get_path()));
let dirPath = GLib.build_filenamev([systemDataDirs[i], 'gnome-shell', 'extensions']); continue;
let dir = Gio.file_new_for_path(dirPath); }
if (dir.query_exists(null)) let extension = createExtensionObject(uuid, extensionDir, type);
scanExtensionsInDirectory(callback, dir, ExtensionType.SYSTEM); this.emit('extension-found', extension);
}
fileEnum.close(null);
},
scanExtensions: function() {
let userExtensionsDir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions']));
this._scanExtensionsInDirectory(userExtensionsDir, ExtensionType.PER_USER);
let systemDataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < systemDataDirs.length; i++) {
let dirPath = GLib.build_filenamev([systemDataDirs[i], 'gnome-shell', 'extensions']);
let dir = Gio.file_new_for_path(dirPath);
if (dir.query_exists(null))
this._scanExtensionsInDirectory(dir, ExtensionType.SYSTEM);
}
} }
scanExtensionsInDirectory(callback, userExtensionsDir, ExtensionType.PER_USER); });
} Signals.addSignalMethods(ExtensionFinder.prototype);

View File

@ -1,60 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/*
* This function is intended to extend the String object and provide
* an String.format API for string formatting.
* It has to be set up using String.prototype.format = Format.format;
* Usage:
* "somestring %s %d".format('hello', 5);
* It supports %s, %d, %x and %f, for %f it also support precisions like
* "%.2f".format(1.526). All specifiers can be prefixed with a minimum
* field width, e.g. "%5s".format("foo"). Unless the width is prefixed
* with '0', the formatted string will be padded with spaces.
*/
function format() {
let str = this;
let i = 0;
let args = arguments;
return str.replace(/%([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, widthGroup, precisionGroup, genericGroup) {
if (precisionGroup != '' && genericGroup != 'f')
throw new Error("Precision can only be specified for 'f'");
let fillChar = (widthGroup[0] == '0') ? '0' : ' ';
let width = parseInt(widthGroup, 10) || 0;
function fillWidth(s, c, w) {
let fill = '';
for (let i = 0; i < w; i++)
fill += c;
return fill.substr(s.length) + s;
}
let s = '';
switch (genericGroup) {
case '%':
return '%';
break;
case 's':
s = args[i++].toString();
break;
case 'd':
s = parseInt(args[i++]).toString();
break;
case 'x':
s = parseInt(args[i++]).toString(16);
break;
case 'f':
if (precisionGroup == '')
s = parseFloat(args[i++]).toString();
else
s = parseFloat(args[i++]).toFixed(parseInt(precisionGroup));
break;
default:
throw new Error('Unsupported conversion character %' + genericGroup);
}
return fillWidth(s, fillChar, width);
});
}

View File

@ -83,24 +83,33 @@ function spawnCommandLine(command_line) {
// this will throw an error. // this will throw an error.
function trySpawn(argv) function trySpawn(argv)
{ {
var success, pid;
try { try {
GLib.spawn_async(null, argv, null, [success, pid] = GLib.spawn_async(null, argv, null,
GLib.SpawnFlags.SEARCH_PATH, GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
null, null); null, null);
} catch (err) { } catch (err) {
if (err.code == GLib.SpawnError.G_SPAWN_ERROR_NOENT) { /* Rewrite the error in case of ENOENT */
err.message = _("Command not found"); if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {
} else { throw new GLib.SpawnError({ code: GLib.SpawnError.NOENT,
message: _("Command not found") });
} else if (err instanceof GLib.Error) {
// The exception from gjs contains an error string like: // The exception from gjs contains an error string like:
// Error invoking GLib.spawn_command_line_async: Failed to // Error invoking GLib.spawn_command_line_async: Failed to
// execute child process "foo" (No such file or directory) // execute child process "foo" (No such file or directory)
// We are only interested in the part in the parentheses. (And // We are only interested in the part in the parentheses. (And
// we can't pattern match the text, since it gets localized.) // we can't pattern match the text, since it gets localized.)
err.message = err.message.replace(/.*\((.+)\)/, '$1'); let message = err.message.replace(/.*\((.+)\)/, '$1');
throw new (err.constructor)({ code: err.code,
message: message });
} else {
throw err;
} }
throw err;
} }
// Dummy child watch; we don't want to double-fork internally
// because then we lose the parent-child relationship, which
// can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {}, null);
} }
// trySpawnCommandLine: // trySpawnCommandLine:

View File

@ -22,6 +22,7 @@ const Search = imports.ui.search;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Workspace = imports.ui.workspace; const Workspace = imports.ui.workspace;
const Params = imports.misc.params; const Params = imports.misc.params;
const Util = imports.misc.util;
const MAX_APPLICATION_WORK_MILLIS = 75; const MAX_APPLICATION_WORK_MILLIS = 75;
const MENU_POPUP_TIMEOUT = 600; const MENU_POPUP_TIMEOUT = 600;
@ -36,6 +37,7 @@ const AlphabeticalView = new Lang.Class({
this._pendingAppLaterId = 0; this._pendingAppLaterId = 0;
this._appIcons = {}; // desktop file id this._appIcons = {}; // desktop file id
this._allApps = [];
let box = new St.BoxLayout({ vertical: true }); let box = new St.BoxLayout({ vertical: true });
box.add(this._grid.actor, { y_align: St.Align.START, expand: true }); box.add(this._grid.actor, { y_align: St.Align.START, expand: true });
@ -60,16 +62,22 @@ const AlphabeticalView = new Lang.Class({
})); }));
}, },
_removeAll: function() { removeAll: function() {
this._grid.removeAll(); this._grid.removeAll();
this._appIcons = {}; this._appIcons = {};
this._allApps = [];
}, },
_addApp: function(app) { addApp: function(app) {
var id = app.get_id(); var id = app.get_id();
let appIcon = new AppWellIcon(app); if (this._appIcons[id] !== undefined)
return;
this._grid.addItem(appIcon.actor); let appIcon = new AppWellIcon(app);
let pos = Util.insertSorted(this._allApps, app, function(a, b) {
return a.compare_by_name(b);
});
this._grid.addItem(appIcon.actor, pos);
appIcon.actor.connect('key-focus-in', Lang.bind(this, this._ensureIconVisible)); appIcon.actor.connect('key-focus-in', Lang.bind(this, this._ensureIconVisible));
this._appIcons[id] = appIcon; this._appIcons[id] = appIcon;
@ -120,14 +128,6 @@ const AlphabeticalView = new Lang.Class({
icon.actor.visible = true; icon.actor.visible = true;
} }
} }
},
setAppList: function(apps) {
this._removeAll();
for (var i = 0; i < apps.length; i++) {
var app = apps[i];
this._addApp(app);
}
} }
}); });
@ -147,7 +147,6 @@ const ViewByCategories = new Lang.Class({
// (used only before the actor is mapped the first time) // (used only before the actor is mapped the first time)
this._currentCategory = -2; this._currentCategory = -2;
this._categories = []; this._categories = [];
this._apps = null;
this._categoryBox = new St.BoxLayout({ vertical: true, this._categoryBox = new St.BoxLayout({ vertical: true,
reactive: true, reactive: true,
@ -204,16 +203,19 @@ const ViewByCategories = new Lang.Class({
if (nextType == GMenu.TreeItemType.ENTRY) { if (nextType == GMenu.TreeItemType.ENTRY) {
var entry = iter.get_entry(); var entry = iter.get_entry();
var app = this._appSystem.lookup_app_by_tree_entry(entry); var app = this._appSystem.lookup_app_by_tree_entry(entry);
if (!entry.get_app_info().get_nodisplay()) if (!entry.get_app_info().get_nodisplay()) {
this._view.addApp(app);
appList.push(app); appList.push(app);
}
} else if (nextType == GMenu.TreeItemType.DIRECTORY) { } else if (nextType == GMenu.TreeItemType.DIRECTORY) {
if (!dir.get_is_nodisplay()) var itemDir = iter.get_directory();
this._loadCategory(iter.get_directory(), appList); if (!itemDir.get_is_nodisplay())
this._loadCategory(itemDir, appList);
} }
} }
}, },
_addCategory: function(name, index, dir, allApps) { _addCategory: function(name, index, dir) {
let button = new St.Button({ label: GLib.markup_escape_text (name, -1), let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
style_class: 'app-filter', style_class: 'app-filter',
x_align: St.Align.START, x_align: St.Align.START,
@ -225,7 +227,6 @@ const ViewByCategories = new Lang.Class({
var apps; var apps;
if (dir == null) { if (dir == null) {
apps = allApps;
this._allCategoryButton = button; this._allCategoryButton = button;
} else { } else {
apps = []; apps = [];
@ -239,6 +240,7 @@ const ViewByCategories = new Lang.Class({
}, },
_removeAll: function() { _removeAll: function() {
this._view.removeAll();
this._categories = []; this._categories = [];
this._categoryBox.destroy_all_children(); this._categoryBox.destroy_all_children();
}, },
@ -246,13 +248,8 @@ const ViewByCategories = new Lang.Class({
refresh: function() { refresh: function() {
this._removeAll(); this._removeAll();
var allApps = Shell.AppSystem.get_default().get_all();
allApps.sort(function(a, b) {
return a.compare_by_name(b);
});
/* Translators: Filter to display all applications */ /* Translators: Filter to display all applications */
this._addCategory(_("All"), -1, null, allApps); this._addCategory(_("All"), -1, null);
var tree = this._appSystem.get_tree(); var tree = this._appSystem.get_tree();
var root = tree.get_root_directory(); var root = tree.get_root_directory();
@ -270,7 +267,6 @@ const ViewByCategories = new Lang.Class({
} }
} }
this._view.setAppList(allApps);
this._selectCategory(-1); this._selectCategory(-1);
if (this._focusDummy) { if (this._focusDummy) {
@ -312,11 +308,10 @@ const AppSearchProvider = new Lang.Class({
_init: function() { _init: function() {
this.parent(_("APPLICATIONS")); this.parent(_("APPLICATIONS"));
this._appSys = Shell.AppSystem.get_default(); this._appSys = Shell.AppSystem.get_default();
}, },
getResultMetas: function(apps) { getResultMetas: function(apps, callback) {
let metas = []; let metas = [];
for (let i = 0; i < apps.length; i++) { for (let i = 0; i < apps.length; i++) {
let app = apps[i]; let app = apps[i];
@ -327,15 +322,15 @@ const AppSearchProvider = new Lang.Class({
} }
}); });
} }
return metas; callback(metas);
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
return this._appSys.initial_search(terms); this.searchSystem.pushResults(this, this._appSys.initial_search(terms));
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
return this._appSys.subsearch(previousResults, terms); this.searchSystem.pushResults(this, this._appSys.subsearch(previousResults, terms));
}, },
activateResult: function(app, params) { activateResult: function(app, params) {
@ -378,7 +373,7 @@ const SettingsSearchProvider = new Lang.Class({
this._gnomecc = this._appSys.lookup_app('gnome-control-center.desktop'); this._gnomecc = this._appSys.lookup_app('gnome-control-center.desktop');
}, },
getResultMetas: function(prefs) { getResultMetas: function(prefs, callback) {
let metas = []; let metas = [];
for (let i = 0; i < prefs.length; i++) { for (let i = 0; i < prefs.length; i++) {
let pref = prefs[i]; let pref = prefs[i];
@ -389,15 +384,15 @@ const SettingsSearchProvider = new Lang.Class({
} }
}); });
} }
return metas; callback(metas);
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
return this._appSys.search_settings(terms); this.searchSystem.pushResults(this, this._appSys.search_settings(terms));
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
return this._appSys.search_settings(terms); this.searchSystem.pushResults(this, this._appSys.search_settings(terms));
}, },
activateResult: function(pref, params) { activateResult: function(pref, params) {

View File

@ -123,7 +123,8 @@ const AutomountManager = new Lang.Class({
let volumes = this._volumeMonitor.get_volumes(); let volumes = this._volumeMonitor.get_volumes();
volumes.forEach(Lang.bind(this, function(volume) { volumes.forEach(Lang.bind(this, function(volume) {
this._checkAndMountVolume(volume, { checkSession: false, this._checkAndMountVolume(volume, { checkSession: false,
useMountOp: false }); useMountOp: false,
allowAutorun: false });
})); }));
return false; return false;
@ -201,7 +202,8 @@ const AutomountManager = new Lang.Class({
_checkAndMountVolume: function(volume, params) { _checkAndMountVolume: function(volume, params) {
params = Params.parse(params, { checkSession: true, params = Params.parse(params, { checkSession: true,
useMountOp: true }); useMountOp: true,
allowAutorun: true });
if (params.checkSession) { if (params.checkSession) {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
@ -236,15 +238,20 @@ const AutomountManager = new Lang.Class({
if (params.useMountOp) { if (params.useMountOp) {
let operation = new ShellMountOperation.ShellMountOperation(volume); let operation = new ShellMountOperation.ShellMountOperation(volume);
this._mountVolume(volume, operation.mountOp); this._mountVolume(volume, operation, params.allowAutorun);
} else { } else {
this._mountVolume(volume, null); this._mountVolume(volume, null, params.allowAutorun);
} }
}, },
_mountVolume: function(volume, operation) { _mountVolume: function(volume, operation, allowAutorun) {
this._allowAutorun(volume); if (allowAutorun)
volume.mount(0, operation, null, this._allowAutorun(volume);
let mountOp = operation ? operation.mountOp : null;
volume._operation = operation;
volume.mount(0, mountOp, null,
Lang.bind(this, this._onVolumeMounted)); Lang.bind(this, this._onVolumeMounted));
}, },
@ -253,15 +260,19 @@ const AutomountManager = new Lang.Class({
try { try {
volume.mount_finish(res); volume.mount_finish(res);
this._closeOperation(volume);
} catch (e) { } catch (e) {
let string = e.toString(); // FIXME: we will always get G_IO_ERROR_FAILED from the gvfs udisks
// backend in this case, see
// FIXME: needs proper error code handling instead of this // https://bugs.freedesktop.org/show_bug.cgi?id=51271
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480 if (e.message.indexOf('No key available with this passphrase') != -1) {
if (string.indexOf('No key available with this passphrase') != -1)
this._reaskPassword(volume); this._reaskPassword(volume);
else } else {
log('Unable to mount volume ' + volume.get_name() + ': ' + string); if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
this._closeOperation(volume);
}
} }
}, },
@ -273,8 +284,16 @@ const AutomountManager = new Lang.Class({
}, },
_reaskPassword: function(volume) { _reaskPassword: function(volume) {
let operation = new ShellMountOperation.ShellMountOperation(volume, { reaskPassword: true }); let existingDialog = volume._operation ? volume._operation.borrowDialog() : null;
this._mountVolume(volume, operation.mountOp); let operation =
new ShellMountOperation.ShellMountOperation(volume,
{ existingDialog: existingDialog });
this._mountVolume(volume, operation);
},
_closeOperation: function(volume) {
if (volume._operation)
volume._operation.close();
}, },
_allowAutorun: function(volume) { _allowAutorun: function(volume) {

View File

@ -23,12 +23,14 @@ const AutorunSetting = {
}; };
// misc utils // misc utils
function ignoreAutorunForMount(mount) { function shouldAutorunMount(mount, forTransient) {
let root = mount.get_root(); let root = mount.get_root();
let volume = mount.get_volume(); let volume = mount.get_volume();
if ((root.is_native() && !isMountRootHidden(root)) || if (!volume || (!volume.allowAutorun && forTransient))
(volume && volume.allowAutorun && volume.should_automount())) return false;
if (!root.is_native() || isMountRootHidden(root))
return false; return false;
return true; return true;
@ -224,11 +226,9 @@ const AutorunManager = new Lang.Class({
try { try {
mount.unmount_with_operation_finish(res); mount.unmount_with_operation_finish(res);
} catch (e) { } catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
// but we can't access the error code from JS. log('Unable to eject the mount ' + mount.get_name()
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480 + ': ' + e.toString());
log('Unable to eject the mount ' + mount.get_name()
+ ': ' + e.toString());
} }
}, },
@ -236,11 +236,9 @@ const AutorunManager = new Lang.Class({
try { try {
source.eject_with_operation_finish(res); source.eject_with_operation_finish(res);
} catch (e) { } catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
// but we can't access the error code from JS. log('Unable to eject the drive ' + source.get_name()
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480 + ': ' + e.toString());
log('Unable to eject the drive ' + source.get_name()
+ ': ' + e.toString());
} }
}, },
@ -248,11 +246,9 @@ const AutorunManager = new Lang.Class({
try { try {
drive.stop_finish(res); drive.stop_finish(res);
} catch (e) { } catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
// but we can't access the error code from JS. log('Unable to stop the drive ' + drive.get_name()
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480 + ': ' + e.toString());
log('Unable to stop the drive ' + drive.get_name()
+ ': ' + e.toString());
} }
}, },
}); });
@ -262,16 +258,15 @@ const AutorunResidentSource = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function() { _init: function() {
this.parent(_("Removable Devices")); this.parent(_("Removable Devices"), 'media-removable', St.IconType.FULLCOLOR);
this._mounts = []; this._mounts = [];
this._notification = new AutorunResidentNotification(this); this._notification = new AutorunResidentNotification(this);
this._setSummaryIcon(this.createNotificationIcon());
}, },
addMount: function(mount, apps) { addMount: function(mount, apps) {
if (ignoreAutorunForMount(mount)) if (!shouldAutorunMount(mount, false))
return; return;
let filtered = this._mounts.filter(function (element) { let filtered = this._mounts.filter(function (element) {
@ -310,12 +305,6 @@ const AutorunResidentSource = new Lang.Class({
Main.messageTray.add(this); Main.messageTray.add(this);
this.pushNotification(this._notification); this.pushNotification(this._notification);
} }
},
createNotificationIcon: function() {
return new St.Icon ({ icon_name: 'media-removable',
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
} }
}); });
@ -455,7 +444,7 @@ const AutorunTransientDispatcher = new Lang.Class({
return; return;
// if the mount doesn't want to be autorun, return // if the mount doesn't want to be autorun, return
if (ignoreAutorunForMount(mount)) if (!shouldAutorunMount(mount, true))
return; return;
let setting = this._getAutorunSettingForType(contentTypes[0]); let setting = this._getAutorunSettingForType(contentTypes[0]);
@ -500,11 +489,11 @@ const AutorunTransientSource = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(mount, apps) { _init: function(mount, apps) {
this.parent(mount.get_name());
this.mount = mount; this.mount = mount;
this.apps = apps; this.apps = apps;
this.parent(mount.get_name());
this._notification = new AutorunTransientNotification(this); this._notification = new AutorunTransientNotification(this);
this._setSummaryIcon(this.createNotificationIcon()); this._setSummaryIcon(this.createNotificationIcon());

View File

@ -448,7 +448,7 @@ const Calendar = new Lang.Class({
} }
// All the children after this are days, and get removed when we update the calendar // All the children after this are days, and get removed when we update the calendar
this._firstDayIndex = this.actor.get_children().length; this._firstDayIndex = this.actor.get_n_children();
}, },
_onStyleChange: function(actor, event) { _onStyleChange: function(actor, event) {

View File

@ -63,7 +63,7 @@ const Contact = new Lang.Class({
this.individual.full_name || this.individual.full_name ||
this.individual.nickname || this.individual.nickname ||
email || email ||
_("Unknown"); C_("contact", "Unknown");
let aliasLabel = new St.Label({ text: aliasText, let aliasLabel = new St.Label({ text: aliasText,
style_class: 'contact-details-alias' }); style_class: 'contact-details-alias' });
details.add(aliasLabel, { x_fill: true, details.add(aliasLabel, { x_fill: true,
@ -154,7 +154,7 @@ const ContactSearchProvider = new Lang.Class({
this._contactSys = Shell.ContactSystem.get_default(); this._contactSys = Shell.ContactSystem.get_default();
}, },
getResultMetas: function(ids) { getResultMetas: function(ids, callback) {
let metas = []; let metas = [];
for (let i = 0; i < ids.length; i++) { for (let i = 0; i < ids.length; i++) {
let contact = new Contact(ids[i]); let contact = new Contact(ids[i]);
@ -165,15 +165,15 @@ const ContactSearchProvider = new Lang.Class({
} }
}); });
} }
return metas; callback(metas);
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
return this._contactSys.initial_search(terms); this.searchSystem.pushResults(this, this._contactSys.initial_search(terms));
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
return this._contactSys.subsearch(previousResults, terms); this.searchSystem.pushResults(this, this._contactSys.subsearch(previousResults, terms));
}, },
createResultActor: function(resultMeta, terms) { createResultActor: function(resultMeta, terms) {

View File

@ -168,7 +168,17 @@ const DashItemContainer = new Lang.Class({
}); });
}, },
destroy: function() {
if (this.label)
this.label.destroy();
this.actor.destroy();
},
animateOutAndDestroy: function() { animateOutAndDestroy: function() {
if (this.label)
this.label.destroy();
if (this.child == null) { if (this.child == null) {
this.actor.destroy(); this.actor.destroy();
return; return;
@ -691,7 +701,7 @@ const Dash = new Lang.Class({
if (Main.overview.visible) if (Main.overview.visible)
item.animateOutAndDestroy(); item.animateOutAndDestroy();
else else
item.actor.destroy(); item.destroy();
} }
this._adjustIconSize(); this._adjustIconSize();

View File

@ -2,6 +2,7 @@
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Cairo = imports.cairo; const Cairo = imports.cairo;
@ -16,14 +17,6 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Calendar = imports.ui.calendar; const Calendar = imports.ui.calendar;
const UPowerGlib = imports.gi.UPowerGlib;
// in org.gnome.desktop.interface
const CLOCK_FORMAT_KEY = 'clock-format';
// in org.gnome.shell.clock
const CLOCK_SHOW_DATE_KEY = 'show-date';
const CLOCK_SHOW_SECONDS_KEY = 'show-seconds';
function _onVertSepRepaint (area) function _onVertSepRepaint (area)
{ {
@ -45,9 +38,7 @@ const DateMenuButton = new Lang.Class({
Name: 'DateMenuButton', Name: 'DateMenuButton',
Extends: PanelMenu.Button, Extends: PanelMenu.Button,
_init: function(params) { _init: function() {
params = Params.parse(params, { showEvents: true });
let item; let item;
let hbox; let hbox;
let vbox; let vbox;
@ -62,8 +53,8 @@ const DateMenuButton = new Lang.Class({
// role ATK_ROLE_MENU like other elements of the panel. // role ATK_ROLE_MENU like other elements of the panel.
this.actor.accessible_role = Atk.Role.LABEL; this.actor.accessible_role = Atk.Role.LABEL;
this._clock = new St.Label(); this._clockDisplay = new St.Label();
this.actor.add_actor(this._clock); this.actor.add_actor(this._clockDisplay);
hbox = new St.BoxLayout({name: 'calendarArea' }); hbox = new St.BoxLayout({name: 'calendarArea' });
this.menu.addActor(hbox); this.menu.addActor(hbox);
@ -75,11 +66,11 @@ const DateMenuButton = new Lang.Class({
// Date // Date
this._date = new St.Label(); this._date = new St.Label();
this.actor.label_actor = this._date; this.actor.label_actor = this._clockDisplay;
this._date.style_class = 'datemenu-date-label'; this._date.style_class = 'datemenu-date-label';
vbox.add(this._date); vbox.add(this._date);
if (params.showEvents) { if (Main.sessionMode.showCalendarEvents) {
this._eventSource = new Calendar.DBusEventSource(); this._eventSource = new Calendar.DBusEventSource();
this._eventList = new Calendar.EventsList(this._eventSource); this._eventList = new Calendar.EventsList(this._eventSource);
} else { } else {
@ -110,7 +101,7 @@ const DateMenuButton = new Lang.Class({
item.actor.reparent(vbox); item.actor.reparent(vbox);
} }
if (params.showEvents) { if (Main.sessionMode.showCalendarEvents) {
// Add vertical separator // Add vertical separator
item = new St.DrawingArea({ style_class: 'calendar-vertical-separator', item = new St.DrawingArea({ style_class: 'calendar-vertical-separator',
@ -157,68 +148,13 @@ const DateMenuButton = new Lang.Class({
// Done with hbox for calendar and event list // Done with hbox for calendar and event list
// Track changes to clock settings this._clock = new GnomeDesktop.WallClock();
this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' }); this._clock.connect('notify::clock', Lang.bind(this, this._updateClockAndDate));
this._clockSettings = new Gio.Settings({ schema: 'org.gnome.shell.clock' });
this._desktopSettings.connect('changed', Lang.bind(this, this._updateClockAndDate));
this._clockSettings.connect('changed', Lang.bind(this, this._updateClockAndDate));
// https://bugzilla.gnome.org/show_bug.cgi?id=655129
this._upClient = new UPowerGlib.Client();
this._upClient.connect('notify-resume', Lang.bind(this, this._updateClockAndDate));
// Start the clock
this._updateClockAndDate(); this._updateClockAndDate();
}, },
_updateClockAndDate: function() { _updateClockAndDate: function() {
let format = this._desktopSettings.get_string(CLOCK_FORMAT_KEY); this._clockDisplay.set_text(this._clock.clock);
let showDate = this._clockSettings.get_boolean(CLOCK_SHOW_DATE_KEY);
let showSeconds = this._clockSettings.get_boolean(CLOCK_SHOW_SECONDS_KEY);
let clockFormat;
let dateFormat;
switch (format) {
case '24h':
if (showDate)
/* Translators: This is the time format with date used
in 24-hour mode. */
clockFormat = showSeconds ? _("%a %b %e, %R:%S")
: _("%a %b %e, %R");
else
/* Translators: This is the time format without date used
in 24-hour mode. */
clockFormat = showSeconds ? _("%a %R:%S")
: _("%a %R");
break;
case '12h':
default:
if (showDate)
/* Translators: This is a time format with date used
for AM/PM. */
clockFormat = showSeconds ? _("%a %b %e, %l:%M:%S %p")
: _("%a %b %e, %l:%M %p");
else
/* Translators: This is a time format without date used
for AM/PM. */
clockFormat = showSeconds ? _("%a %l:%M:%S %p")
: _("%a %l:%M %p");
break;
}
let displayDate = new Date();
this._clock.set_text(displayDate.toLocaleFormat(clockFormat));
/* Translators: This is the date format to use when the calendar popup is
* shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
*/
dateFormat = _("%A %B %e, %Y");
this._date.set_text(displayDate.toLocaleFormat(dateFormat));
Mainloop.timeout_add_seconds(1, Lang.bind(this, this._updateClockAndDate));
return false;
}, },
_onOpenCalendarActivate: function() { _onOpenCalendarActivate: function() {

View File

@ -31,7 +31,6 @@ const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
@ -288,13 +287,13 @@ const EndSessionDialog = new Lang.Class({
this._applicationList.connect('actor-added', this._applicationList.connect('actor-added',
Lang.bind(this, function() { Lang.bind(this, function() {
if (this._applicationList.get_children().length == 1) if (this._applicationList.get_n_children() == 1)
scrollView.show(); scrollView.show();
})); }));
this._applicationList.connect('actor-removed', this._applicationList.connect('actor-removed',
Lang.bind(this, function() { Lang.bind(this, function() {
if (this._applicationList.get_children().length == 0) if (this._applicationList.get_n_children() == 0)
scrollView.hide(); scrollView.hide();
})); }));
@ -342,7 +341,7 @@ const EndSessionDialog = new Lang.Class({
} }
}, },
_updateContent: function() { _updateDescription: function() {
if (this.state != ModalDialog.State.OPENING && if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED) this.state != ModalDialog.State.OPENED)
return; return;
@ -352,17 +351,6 @@ const EndSessionDialog = new Lang.Class({
let subject = dialogContent.subject; let subject = dialogContent.subject;
let description; let description;
if (this._user.is_loaded && !dialogContent.iconName) {
let iconFile = this._user.get_icon_file();
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
else
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
} else if (dialogContent.iconName) {
this._setIconFromName(dialogContent.iconName,
dialogContent.iconStyleClass);
}
if (this._inhibitors.length > 0) { if (this._inhibitors.length > 0) {
this._stopTimer(); this._stopTimer();
description = dialogContent.inhibitedDescription; description = dialogContent.inhibitedDescription;
@ -395,6 +383,27 @@ const EndSessionDialog = new Lang.Class({
_setLabelText(this._descriptionLabel, description); _setLabelText(this._descriptionLabel, description);
}, },
_updateContent: function() {
if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED)
return;
let dialogContent = DialogContent[this._type];
if (this._user.is_loaded && !dialogContent.iconName) {
let iconFile = this._user.get_icon_file();
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
else
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
} else if (dialogContent.iconName) {
this._setIconFromName(dialogContent.iconName,
dialogContent.iconStyleClass);
}
this._updateDescription();
},
_updateButtons: function() { _updateButtons: function() {
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
let buttons = [{ action: Lang.bind(this, this.cancel), let buttons = [{ action: Lang.bind(this, this.cancel),
@ -441,7 +450,7 @@ const EndSessionDialog = new Lang.Class({
{ _secondsLeft: 0, { _secondsLeft: 0,
time: this._secondsLeft, time: this._secondsLeft,
transition: 'linear', transition: 'linear',
onUpdate: Lang.bind(this, this._updateContent), onUpdate: Lang.bind(this, this._updateDescription),
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1]; let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1];

View File

@ -39,11 +39,19 @@ function _patchContainerClass(containerClass) {
}; };
} }
function _makeLoggingFunc(func) {
return function() {
return func([].join.call(arguments, ', '));
};
}
function init() { function init() {
// Add some bindings to the global JS namespace; (gjs keeps the web // Add some bindings to the global JS namespace; (gjs keeps the web
// browser convention of having that namespace be called 'window'.) // browser convention of having that namespace be called 'window'.)
window.global = Shell.Global.get(); window.global = Shell.Global.get();
window.log = _makeLoggingFunc(window.log);
window._ = Gettext.gettext; window._ = Gettext.gettext;
window.C_ = Gettext.pgettext; window.C_ = Gettext.pgettext;
window.ngettext = Gettext.ngettext; window.ngettext = Gettext.ngettext;
@ -82,7 +90,7 @@ function init() {
} }
// OK, now things are initialized enough that we can import shell JS // OK, now things are initialized enough that we can import shell JS
const Format = imports.misc.format; const Format = imports.format;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
Tweener.init(); Tweener.init();

View File

@ -0,0 +1,170 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Soup = imports.gi.Soup;
const St = imports.gi.St;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
const ExtensionSystem = imports.ui.extensionSystem;
const FileUtils = imports.misc.fileUtils;
const ModalDialog = imports.ui.modalDialog;
const _signals = ExtensionSystem._signals;
const REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
let _httpSession;
function installExtensionFromUUID(uuid) {
let params = { uuid: uuid,
shell_version: Config.PACKAGE_VERSION };
let message = Soup.form_request_new_from_hash('GET', REPOSITORY_URL_INFO, params);
_httpSession.queue_message(message,
function(session, message) {
let info = JSON.parse(message.response_body.data);
let dialog = new InstallExtensionDialog(uuid, info);
dialog.open(global.get_current_time());
});
}
function uninstallExtensionFromUUID(uuid) {
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
// Don't try to uninstall system extensions
if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
return false;
if (!ExtensionSystem.unloadExtension(uuid))
return false;
FileUtils.recursivelyDeleteDir(extension.dir);
return true;
}
function gotExtensionZipFile(session, message, uuid) {
if (message.status_code != Soup.KnownStatusCode.OK) {
logExtensionError(uuid, 'downloading extension: ' + message.status_code);
return;
}
let dir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions', uuid]));
try {
if (!dir.query_exists(null))
dir.make_directory_with_parents(null);
} catch (e) {
logExtensionError('Could not create extension directory');
}
let [file, stream] = Gio.File.new_tmp('XXXXXX.shell-extension.zip');
let contents = message.response_body.flatten().as_bytes();
stream.output_stream.write_bytes(contents, null);
stream.close(null);
let [success, pid] = GLib.spawn_async(null,
['unzip', '-uod', dir.get_path(), '--', file.get_path()],
null,
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
null);
if (!success) {
logExtensionError(uuid, 'extract: could not extract');
return;
}
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function(pid, status) {
GLib.spawn_close_pid(pid);
// Add extension to 'enabled-extensions' for the user, always...
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
if (enabledExtensions.indexOf(uuid) == -1) {
enabledExtensions.push(uuid);
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
}
ExtensionSystem.loadExtension(dir, ExtensionUtils.ExtensionType.PER_USER, true);
});
}
const InstallExtensionDialog = new Lang.Class({
Name: 'InstallExtensionDialog',
Extends: ModalDialog.ModalDialog,
_init: function(uuid, info) {
this.parent({ styleClass: 'extension-dialog' });
this._uuid = uuid;
this._info = info;
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this._onCancelButtonPressed),
key: Clutter.Escape
},
{ label: _("Install"),
action: Lang.bind(this, this._onInstallButtonPressed)
}]);
let message = _("Download and install '%s' from extensions.gnome.org?").format(info.name);
let box = new St.BoxLayout();
this.contentLayout.add(box);
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) })
let icon = new St.Icon({ gicon: gicon });
box.add(icon);
let label = new St.Label({ text: message });
box.add(label);
},
_onCancelButtonPressed: function(button, event) {
this.close(global.get_current_time());
// Even though the extension is already "uninstalled", send through
// a state-changed signal for any users who want to know if the install
// went through correctly -- using proper async DBus would block more
// traditional clients like the plugin
let meta = { uuid: this._uuid,
state: ExtensionSystem.ExtensionState.UNINSTALLED,
error: '' };
_signals.emit('extension-state-changed', meta);
},
_onInstallButtonPressed: function(button, event) {
let state = { uuid: this._uuid,
state: ExtensionSystem.ExtensionState.DOWNLOADING,
error: '' };
_signals.emit('extension-state-changed', state);
let params = { shell_version: Config.PACKAGE_VERSION };
let url = REPOSITORY_URL_DOWNLOAD.format(this._uuid);
let message = Soup.form_request_new_from_hash('GET', url, params);
_httpSession.queue_message(message,
Lang.bind(this, function(session, message) {
gotExtensionZipFile(session, message, this._uuid);
}));
this.close(global.get_current_time());
}
});
function init() {
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
// See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context.
// _httpSession.add_feature(new Soup.ProxyResolverDefault());
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
}

View File

@ -3,19 +3,11 @@
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Soup = imports.gi.Soup;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils;
const ModalDialog = imports.ui.modalDialog;
const API_VERSION = 1;
const ExtensionState = { const ExtensionState = {
ENABLED: 1, ENABLED: 1,
@ -30,29 +22,6 @@ const ExtensionState = {
UNINSTALLED: 99 UNINSTALLED: 99
}; };
const REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
const _httpSession = new Soup.SessionAsync();
// The unfortunate state of gjs, gobject-introspection and libsoup
// means that I have to do a hack to add a feature.
// See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context.
if (Soup.Session.prototype.add_feature != null)
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
function _getCertFile() {
let localCert = GLib.build_filenamev([global.userdatadir, 'extensions.gnome.org.crt']);
if (GLib.file_test(localCert, GLib.FileTest.EXISTS))
return localCert;
else
return Config.SHELL_SYSTEM_CA_FILE;
}
_httpSession.ssl_ca_file = _getCertFile();
// Arrays of uuids // Arrays of uuids
var enabledExtensions; var enabledExtensions;
// Contains the order that extensions were enabled in. // Contains the order that extensions were enabled in.
@ -69,90 +38,6 @@ const disconnect = Lang.bind(_signals, _signals.disconnect);
const ENABLED_EXTENSIONS_KEY = 'enabled-extensions'; const ENABLED_EXTENSIONS_KEY = 'enabled-extensions';
function installExtensionFromUUID(uuid, version_tag) {
let params = { uuid: uuid,
version_tag: version_tag,
shell_version: Config.PACKAGE_VERSION,
api_version: API_VERSION.toString() };
let message = Soup.form_request_new_from_hash('GET', REPOSITORY_URL_INFO, params);
_httpSession.queue_message(message,
function(session, message) {
let info = JSON.parse(message.response_body.data);
let dialog = new InstallExtensionDialog(uuid, version_tag, info.name);
dialog.open(global.get_current_time());
});
}
function uninstallExtensionFromUUID(uuid) {
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
// Try to disable it -- if it's ERROR'd, we can't guarantee that,
// but it will be removed on next reboot, and hopefully nothing
// broke too much.
disableExtension(uuid);
// Don't try to uninstall system extensions
if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
return false;
extension.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', extension);
delete ExtensionUtils.extensions[uuid];
FileUtils.recursivelyDeleteDir(Gio.file_new_for_path(extension.path));
return true;
}
function gotExtensionZipFile(session, message, uuid) {
if (message.status_code != Soup.KnownStatusCode.OK) {
logExtensionError(uuid, 'downloading extension: ' + message.status_code);
return;
}
// FIXME: use a GFile mkstemp-type method once one exists
let fd, tmpzip;
try {
[fd, tmpzip] = GLib.file_open_tmp('XXXXXX.shell-extension.zip');
} catch (e) {
logExtensionError(uuid, 'tempfile: ' + e.toString());
return;
}
let stream = new Gio.UnixOutputStream({ fd: fd });
let dir = ExtensionUtils.userExtensionsDir.get_child(uuid);
Shell.write_soup_message_to_stream(stream, message);
stream.close(null);
let [success, pid] = GLib.spawn_async(null,
['unzip', '-uod', dir.get_path(), '--', tmpzip],
null,
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
null);
if (!success) {
logExtensionError(uuid, 'extract: could not extract');
return;
}
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function(pid, status) {
GLib.spawn_close_pid(pid);
// Add extension to 'enabled-extensions' for the user, always...
let enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
if (enabledExtensions.indexOf(uuid) == -1) {
enabledExtensions.push(uuid);
global.settings.set_strv(ENABLED_EXTENSIONS_KEY, enabledExtensions);
}
loadExtension(dir, ExtensionUtils.ExtensionType.PER_USER, true);
});
}
function disableExtension(uuid) { function disableExtension(uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
if (!extension) if (!extension)
@ -182,6 +67,11 @@ function disableExtension(uuid) {
} }
} }
if (extension.stylesheet) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.unload_stylesheet(extension.stylesheet.get_path());
}
try { try {
extension.stateObj.disable(); extension.stateObj.disable();
} catch(e) { } catch(e) {
@ -224,6 +114,17 @@ function enableExtension(uuid) {
return; return;
} }
let stylesheetFile = extension.dir.get_child('stylesheet.css');
if (stylesheetFile.query_exists(null)) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
try {
theme.load_stylesheet(stylesheetFile.get_path());
extension.stylesheet = stylesheetFile;
} catch (e) {
logExtensionError(uuid, 'Stylesheet parse error: ' + e);
}
}
extension.state = ExtensionState.ENABLED; extension.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', extension); _signals.emit('extension-state-changed', extension);
} }
@ -237,47 +138,50 @@ function logExtensionError(uuid, message, state) {
extension.errors = []; extension.errors = [];
extension.errors.push(message); extension.errors.push(message);
global.logError('Extension "%s" had error: %s'.format(uuid, message)); log('Extension "%s" had error: %s'.format(uuid, message));
state = state || ExtensionState.ERROR; state = state || ExtensionState.ERROR;
_signals.emit('extension-state-changed', { uuid: uuid, _signals.emit('extension-state-changed', { uuid: uuid,
error: message, error: message,
state: state }); state: state });
} }
function loadExtension(dir, type, enabled) { function loadExtension(extension) {
let uuid = dir.get_basename();
let extension;
if (ExtensionUtils.extensions[uuid] != undefined) {
throw new Error('extension already loaded');
}
try {
extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch(e) {
logExtensionError(uuid, e.message);
return;
}
// Default to error, we set success as the last step // Default to error, we set success as the last step
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (ExtensionUtils.isOutOfDate(extension)) { if (ExtensionUtils.isOutOfDate(extension)) {
logExtensionError(uuid, 'extension is not compatible with current GNOME Shell and/or GJS version', ExtensionState.OUT_OF_DATE); logExtensionError(extension.uuid, 'extension is not compatible with current GNOME Shell and/or GJS version', ExtensionState.OUT_OF_DATE);
extension.state = ExtensionState.OUT_OF_DATE; extension.state = ExtensionState.OUT_OF_DATE;
return; return;
} }
let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
if (enabled) { if (enabled) {
initExtension(uuid); initExtension(extension.uuid);
if (extension.state == ExtensionState.DISABLED) if (extension.state == ExtensionState.DISABLED)
enableExtension(uuid); enableExtension(extension.uuid);
} else { } else {
extension.state = ExtensionState.INITIALIZED; extension.state = ExtensionState.INITIALIZED;
} }
_signals.emit('extension-state-changed', extension); _signals.emit('extension-state-changed', extension);
global.log('Loaded extension ' + uuid); }
function unloadExtension(uuid) {
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
// Try to disable it -- if it's ERROR'd, we can't guarantee that,
// but it will be removed on next reboot, and hopefully nothing
// broke too much.
disableExtension(uuid);
extension.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', extension);
delete ExtensionUtils.extensions[uuid];
return true;
} }
function initExtension(uuid) { function initExtension(uuid) {
@ -292,18 +196,6 @@ function initExtension(uuid) {
logExtensionError(uuid, 'Missing extension.js'); logExtensionError(uuid, 'Missing extension.js');
return; return;
} }
let stylesheetPath = null;
let themeContext = St.ThemeContext.get_for_stage(global.stage);
let theme = themeContext.get_theme();
let stylesheetFile = dir.get_child('stylesheet.css');
if (stylesheetFile.query_exists(null)) {
try {
theme.load_stylesheet(stylesheetFile.get_path());
} catch (e) {
logExtensionError(uuid, 'Stylesheet parse error: ' + e);
return;
}
}
let extensionModule; let extensionModule;
let extensionState = null; let extensionState = null;
@ -311,24 +203,17 @@ function initExtension(uuid) {
ExtensionUtils.installImporter(extension); ExtensionUtils.installImporter(extension);
extensionModule = extension.imports.extension; extensionModule = extension.imports.extension;
} catch (e) { } catch (e) {
if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath);
logExtensionError(uuid, '' + e); logExtensionError(uuid, '' + e);
return; return;
} }
if (!extensionModule.init) { if (extensionModule.init) {
logExtensionError(uuid, 'missing \'init\' function'); try {
return; extensionState = extensionModule.init(extension);
} } catch (e) {
logExtensionError(uuid, 'Failed to evaluate init function:' + e);
try { return;
extensionState = extensionModule.init(extension); }
} catch (e) {
if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath);
logExtensionError(uuid, 'Failed to evaluate init function:' + e);
return;
} }
if (!extensionState) if (!extensionState)
@ -371,81 +256,13 @@ function onEnabledExtensionsChanged() {
enabledExtensions = newEnabledExtensions; enabledExtensions = newEnabledExtensions;
} }
function init() { function loadExtensions() {
ExtensionUtils.init();
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged); global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY); enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
}
function loadExtensions() { let finder = new ExtensionUtils.ExtensionFinder();
ExtensionUtils.scanExtensions(function(uuid, dir, type) { finder.connect('extension-found', function(signals, extension) {
let enabled = enabledExtensions.indexOf(uuid) != -1; loadExtension(extension);
loadExtension(dir, type, enabled);
}); });
finder.scanExtensions();
} }
const InstallExtensionDialog = new Lang.Class({
Name: 'InstallExtensionDialog',
Extends: ModalDialog.ModalDialog,
_init: function(uuid, version_tag, name) {
this.parent({ styleClass: 'extension-dialog' });
this._uuid = uuid;
this._version_tag = version_tag;
this._name = name;
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this._onCancelButtonPressed),
key: Clutter.Escape
},
{ label: _("Install"),
action: Lang.bind(this, this._onInstallButtonPressed)
}]);
let message = _("Download and install '%s' from extensions.gnome.org?").format(name);
this._descriptionLabel = new St.Label({ text: message });
this.contentLayout.add(this._descriptionLabel,
{ y_fill: true,
y_align: St.Align.START });
},
_onCancelButtonPressed: function(button, event) {
this.close(global.get_current_time());
// Even though the extension is already "uninstalled", send through
// a state-changed signal for any users who want to know if the install
// went through correctly -- using proper async DBus would block more
// traditional clients like the plugin
let meta = { uuid: this._uuid,
state: ExtensionState.UNINSTALLED,
error: '' };
_signals.emit('extension-state-changed', meta);
},
_onInstallButtonPressed: function(button, event) {
let state = { uuid: this._uuid,
state: ExtensionState.DOWNLOADING,
error: '' };
_signals.emit('extension-state-changed', state);
let params = { version_tag: this._version_tag,
shell_version: Config.PACKAGE_VERSION,
api_version: API_VERSION.toString() };
let url = REPOSITORY_URL_DOWNLOAD.format(this._uuid);
let message = Soup.form_request_new_from_hash('GET', url, params);
_httpSession.queue_message(message,
Lang.bind(this, function(session, message) {
gotExtensionZipFile(session, message, this._uuid);
}));
this.close(global.get_current_time());
}
});

View File

@ -146,11 +146,6 @@ const BaseIcon = new Lang.Class({
size = found ? len : ICON_SIZE; size = found ? len : ICON_SIZE;
} }
// don't create icons unnecessarily
if (size == this.iconSize &&
this._iconBin.child)
return;
this._createIconTexture(size); this._createIconTexture(size);
} }
}); });
@ -287,6 +282,10 @@ const IconGrid = new Lang.Class({
return this._computeLayout(rowWidth)[0]; return this._computeLayout(rowWidth)[0];
}, },
getRowLimit: function() {
return this._rowLimit;
},
_computeLayout: function (forWidth) { _computeLayout: function (forWidth) {
let nColumns = 0; let nColumns = 0;
let usedWidth = 0; let usedWidth = 0;
@ -310,21 +309,22 @@ const IconGrid = new Lang.Class({
this._grid.queue_relayout(); this._grid.queue_relayout();
}, },
removeAll: function () { removeAll: function() {
this._grid.get_children().forEach(Lang.bind(this, function (child) { this._grid.destroy_all_children();
child.destroy();
}));
}, },
addItem: function(actor) { addItem: function(actor, index) {
this._grid.add_actor(actor); if (index !== undefined)
this._grid.insert_child_at_index(actor, index);
else
this._grid.add_actor(actor);
}, },
getItemAtIndex: function(index) { getItemAtIndex: function(index) {
return this._grid.get_children()[index]; return this._grid.get_child_at_index(index);
}, },
visibleItemsCount: function() { visibleItemsCount: function() {
return this._grid.get_children().length - this._grid.get_n_skip_paint(); return this._grid.get_n_children() - this._grid.get_n_skip_paint();
} }
}); });

View File

@ -541,16 +541,8 @@ const KeyboardSource = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(keyboard) { _init: function(keyboard) {
this.parent(_("Keyboard"));
this._keyboard = keyboard; this._keyboard = keyboard;
this.parent(_("Keyboard"), 'input-keyboard', St.IconType.SYMBOLIC);
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'input-keyboard',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
}, },
handleSummaryClick: function() { handleSummaryClick: function() {

View File

@ -53,6 +53,10 @@ const LayoutManager = new Lang.Class({
global.screen.connect('monitors-changed', global.screen.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged)); Lang.bind(this, this._monitorsChanged));
this._monitorsChanged(); this._monitorsChanged();
this._chrome.connect('primary-fullscreen-changed', Lang.bind(this, function(chrome, state) {
this.emit('primary-fullscreen-changed', state);
}));
}, },
// This is called by Main after everything else is constructed; // This is called by Main after everything else is constructed;
@ -224,26 +228,9 @@ const LayoutManager = new Lang.Class({
return false; return false;
}, },
get focusIndex() { get currentMonitor() {
let focusWindow = global.display.focus_window; let index = global.screen.get_current_monitor();
return Main.layoutManager.monitors[index];
if (focusWindow) {
let wrect = focusWindow.get_outer_rect();
for (let i = 0; i < this.monitors.length; i++) {
let monitor = this.monitors[i];
if (monitor.x <= wrect.x && monitor.y <= wrect.y &&
monitor.x + monitor.width > wrect.x &&
monitor.y + monitor.height > wrect.y)
return i;
}
}
return this.primaryIndex;
},
get focusMonitor() {
return this.monitors[this.focusIndex];
}, },
_startupAnimation: function() { _startupAnimation: function() {
@ -852,6 +839,8 @@ const Chrome = new Lang.Class({
for (let i = 0; i < this._monitors.length; i++) for (let i = 0; i < this._monitors.length; i++)
wasInFullscreen[i] = this._monitors[i].inFullscreen; wasInFullscreen[i] = this._monitors[i].inFullscreen;
let primaryWasInFullscreen = this._primaryMonitor.inFullscreen;
this._updateFullscreen(); this._updateFullscreen();
let changed = false; let changed = false;
@ -861,10 +850,15 @@ const Chrome = new Lang.Class({
break; break;
} }
} }
if (changed) { if (changed) {
this._updateVisibility(); this._updateVisibility();
this._queueUpdateRegions(); this._queueUpdateRegions();
} }
if (primaryWasInFullscreen != this._primaryMonitor.inFullscreen) {
this.emit('primary-fullscreen-changed', this._primaryMonitor.inFullscreen);
}
}, },
updateRegions: function() { updateRegions: function() {
@ -979,3 +973,5 @@ const Chrome = new Lang.Class({
return false; return false;
} }
}); });
Signals.addSignalMethods(Chrome.prototype);

View File

@ -38,7 +38,7 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
'const stage = global.stage; ' + 'const stage = global.stage; ' +
'const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; ' + 'const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; ' +
/* Special lookingGlass functions */ /* Special lookingGlass functions */
'const it = Main.lookingGlass.getIt(); ' + 'const it = Main.lookingGlass.getIt(); ' +
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); '; 'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
const HISTORY_KEY = 'looking-glass-history'; const HISTORY_KEY = 'looking-glass-history';
@ -320,7 +320,7 @@ const WindowList = new Lang.Class({
}, },
_updateWindowList: function() { _updateWindowList: function() {
this.actor.get_children().forEach(function (actor) { actor.destroy(); }); this.actor.destroy_all_children();
let windows = global.get_window_actors(); let windows = global.get_window_actors();
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
@ -378,7 +378,7 @@ const ObjInspector = new Lang.Class({
this._previousObj = null; this._previousObj = null;
this._obj = obj; this._obj = obj;
this._container.get_children().forEach(function (child) { child.destroy(); }); this._container.destroy_all_children();
let hbox = new St.BoxLayout({ style_class: 'lg-obj-inspector-title' }); let hbox = new St.BoxLayout({ style_class: 'lg-obj-inspector-title' });
this._container.add_actor(hbox); this._container.add_actor(hbox);
@ -400,7 +400,14 @@ const ObjInspector = new Lang.Class({
button.connect('clicked', Lang.bind(this, this.close)); button.connect('clicked', Lang.bind(this, this.close));
hbox.add(button); hbox.add(button);
if (typeof(obj) == typeof({})) { if (typeof(obj) == typeof({})) {
let properties = [];
for (let propName in obj) { for (let propName in obj) {
properties.push(propName);
}
properties.sort();
for (let i = 0; i < properties.length; i++) {
let propName = properties[i];
let valueStr; let valueStr;
let link; let link;
try { try {
@ -627,45 +634,6 @@ const Inspector = new Lang.Class({
Signals.addSignalMethods(Inspector.prototype); Signals.addSignalMethods(Inspector.prototype);
const ErrorLog = new Lang.Class({
Name: 'ErrorLog',
_init: function() {
this.actor = new St.BoxLayout();
this.text = new St.Label();
this.actor.add(this.text);
// We need to override StLabel's default ellipsization when
// using line_wrap; otherwise ClutterText's layout is going
// to constrain both the width and height, which prevents
// scrolling.
this.text.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.text.clutter_text.line_wrap = true;
this.actor.connect('notify::mapped', Lang.bind(this, this._renderText));
},
_formatTime: function(d){
function pad(n) { return n < 10 ? '0' + n : n; }
return d.getUTCFullYear()+'-'
+ pad(d.getUTCMonth()+1)+'-'
+ pad(d.getUTCDate())+'T'
+ pad(d.getUTCHours())+':'
+ pad(d.getUTCMinutes())+':'
+ pad(d.getUTCSeconds())+'Z';
},
_renderText: function() {
if (!this.actor.mapped)
return;
let text = this.text.text;
let stack = Main._getAndClearErrorStack();
for (let i = 0; i < stack.length; i++) {
let logItem = stack[i];
text += logItem.category + ' t=' + this._formatTime(new Date(logItem.timestamp)) + ' ' + logItem.message + '\n';
}
this.text.text = text;
}
});
const Memory = new Lang.Class({ const Memory = new Lang.Class({
Name: 'Memory', Name: 'Memory',
@ -940,9 +908,6 @@ const LookingGlass = new Lang.Class({
})); }));
notebook.appendPage('Windows', this._windowList.actor); notebook.appendPage('Windows', this._windowList.actor);
this._errorLog = new ErrorLog();
notebook.appendPage('Errors', this._errorLog.actor);
this._memory = new Memory(); this._memory = new Memory();
notebook.appendPage('Memory', this._memory.actor); notebook.appendPage('Memory', this._memory.actor);

View File

@ -16,6 +16,7 @@ const Params = imports.misc.params;
const MOUSE_POLL_FREQUENCY = 50; const MOUSE_POLL_FREQUENCY = 50;
const CROSSHAIRS_CLIP_SIZE = [100, 100]; const CROSSHAIRS_CLIP_SIZE = [100, 100];
const NO_CHANGE = 0.0;
// Settings // Settings
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
@ -24,6 +25,13 @@ const SHOW_KEY = 'screen-magnifier-enabled';
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier'; const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
const SCREEN_POSITION_KEY = 'screen-position'; const SCREEN_POSITION_KEY = 'screen-position';
const MAG_FACTOR_KEY = 'mag-factor'; const MAG_FACTOR_KEY = 'mag-factor';
const INVERT_LIGHTNESS_KEY = 'invert-lightness';
const BRIGHT_RED_KEY = 'brightness-red';
const BRIGHT_GREEN_KEY = 'brightness-green';
const BRIGHT_BLUE_KEY = 'brightness-blue';
const CONTRAST_RED_KEY = 'contrast-red';
const CONTRAST_GREEN_KEY = 'contrast-green';
const CONTRAST_BLUE_KEY = 'contrast-blue';
const LENS_MODE_KEY = 'lens-mode'; const LENS_MODE_KEY = 'lens-mode';
const CLAMP_MODE_KEY = 'scroll-at-edges'; const CLAMP_MODE_KEY = 'scroll-at-edges';
const MOUSE_TRACKING_KEY = 'mouse-tracking'; const MOUSE_TRACKING_KEY = 'mouse-tracking';
@ -443,6 +451,21 @@ const Magnifier = new Lang.Class({
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY); aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
if (aPref) if (aPref)
zoomRegion.setMouseTrackingMode(aPref); zoomRegion.setMouseTrackingMode(aPref);
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
if (aPref)
zoomRegion.setInvertLightness(aPref);
let bc = {};
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
zoomRegion.setBrightness(bc);
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
zoomRegion.setContrast(bc);
} }
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
@ -465,6 +488,23 @@ const Magnifier = new Lang.Class({
this._settings.connect('changed::' + MOUSE_TRACKING_KEY, this._settings.connect('changed::' + MOUSE_TRACKING_KEY,
Lang.bind(this, this._updateMouseTrackingMode)); Lang.bind(this, this._updateMouseTrackingMode));
this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
Lang.bind(this, this._updateInvertLightness));
this._settings.connect('changed::' + BRIGHT_RED_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + BRIGHT_GREEN_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + BRIGHT_BLUE_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + CONTRAST_RED_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + CONTRAST_GREEN_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + CONTRAST_BLUE_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY, this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY,
Lang.bind(this, function() { Lang.bind(this, function() {
this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY)); this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY));
@ -540,7 +580,38 @@ const Magnifier = new Lang.Class({
this._settings.get_enum(MOUSE_TRACKING_KEY) this._settings.get_enum(MOUSE_TRACKING_KEY)
); );
} }
} },
_updateInvertLightness: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
this._zoomRegions[0].setInvertLightness(
this._settings.get_boolean(INVERT_LIGHTNESS_KEY)
);
}
},
_updateBrightness: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
let brightness = {};
brightness.r = this._settings.get_double(BRIGHT_RED_KEY);
brightness.g = this._settings.get_double(BRIGHT_GREEN_KEY);
brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY);
this._zoomRegions[0].setBrightness(brightness);
}
},
_updateContrast: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
let contrast = {};
contrast.r = this._settings.get_double(CONTRAST_RED_KEY);
contrast.g = this._settings.get_double(CONTRAST_GREEN_KEY);
contrast.b = this._settings.get_double(CONTRAST_BLUE_KEY);
this._zoomRegions[0].setContrast(contrast);
}
},
}); });
Signals.addSignalMethods(Magnifier.prototype); Signals.addSignalMethods(Magnifier.prototype);
@ -554,6 +625,9 @@ const ZoomRegion = new Lang.Class({
this._clampScrollingAtEdges = false; this._clampScrollingAtEdges = false;
this._lensMode = false; this._lensMode = false;
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
this._invertLightness = false;
this._brightness = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
this._contrast = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
this._magView = null; this._magView = null;
this._background = null; this._background = null;
@ -879,6 +953,86 @@ const ZoomRegion = new Lang.Class({
} }
}, },
/**
* setInvertLightness:
* Set whether to invert the lightness of the magnified view.
* @flag Boolean to either invert brightness (true), or not (false).
*/
setInvertLightness: function(flag) {
this._invertLightness = flag;
if (this._magShaderEffects)
this._magShaderEffects.setInvertLightness(this._invertLightness);
},
/**
* getInvertLightness:
* Retrieve whether the lightness is inverted.
* @return Boolean indicating inversion (true), or not (false).
*/
getInvertLightness: function() {
return this._invertLightness;
},
/**
* setBrightness:
* Alter the brightness of the magnified view.
* @brightness Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness, respectively.
*/
setBrightness: function(brightness) {
this._brightness.r = brightness.r;
this._brightness.g = brightness.g;
this._brightness.b = brightness.b;
if (this._magShaderEffects)
this._magShaderEffects.setBrightness(this._brightness);
},
/**
* getBrightness:
* Retrive the current brightness of the Zoom Region.
* @return Object containing the brightness change for the red, green,
* and blue channels.
*/
getBrightness: function() {
let brightness = {};
brightness.r = this._brightness.r;
brightness.g = this._brightness.g;
brightness.b = this._brightness.b;
return brightness;
},
/**
* setContrast:
* Alter the contrast of the magnified view.
* @contrast Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
setContrast: function(contrast) {
this._contrast.r = contrast.r;
this._contrast.g = contrast.g;
this._contrast.b = contrast.b;
if (this._magShaderEffects)
this._magShaderEffects.setContrast(this._contrast);
},
/**
* getContrast:
* Retreive the contrast of the magnified view.
* @return Object containing the contrast for the red, green,
* and blue channels.
*/
getContrast: function() {
let contrast = {};
contrast.r = this._contrast.r;
contrast.g = this._contrast.g;
contrast.b = this._contrast.b;
return contrast;
},
//// Private methods //// //// Private methods ////
_createActors: function() { _createActors: function() {
@ -917,6 +1071,12 @@ const ZoomRegion = new Lang.Class({
this._crossHairsActor = this._crossHairs.addToZoomRegion(this, this._mouseActor); this._crossHairsActor = this._crossHairs.addToZoomRegion(this, this._mouseActor);
else else
this._crossHairsActor = null; this._crossHairsActor = null;
// Contrast and brightness effects.
this._magShaderEffects = new MagShaderEffects(this._uiGroupClone);
this._magShaderEffects.setInvertLightness(this._invertLightness);
this._magShaderEffects.setBrightness(this._brightness);
this._magShaderEffects.setContrast(this._contrast);
}, },
_destroyActors: function() { _destroyActors: function() {
@ -925,6 +1085,8 @@ const ZoomRegion = new Lang.Class({
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.removeFromParent(this._crossHairsActor); this._crossHairs.removeFromParent(this._crossHairsActor);
this._magShaderEffects.destroyEffects();
this._magShaderEffects = null;
this._magView.destroy(); this._magView.destroy();
this._magView = null; this._magView = null;
this._background = null; this._background = null;
@ -1228,10 +1390,7 @@ const Crosshairs = new Lang.Class({
crosshairsActor = new Clutter.Clone({ source: this._actor }); crosshairsActor = new Clutter.Clone({ source: this._actor });
this._clones.push(crosshairsActor); this._clones.push(crosshairsActor);
} }
if (this._actor.visible) crosshairsActor.visible = this._actor.visible;
crosshairsActor.show();
else
crosshairsActor.hide();
container.add_actor(crosshairsActor); container.add_actor(crosshairsActor);
container.raise_child(magnifiedMouse, crosshairsActor); container.raise_child(magnifiedMouse, crosshairsActor);
@ -1436,3 +1595,133 @@ const Crosshairs = new Lang.Class({
this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom); this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom);
} }
}); });
const MagShaderEffects = new Lang.Class({
Name: 'MagShaderEffects',
_init: function(uiGroupClone) {
this._inverse = new Shell.InvertLightnessEffect();
this._brightnessContrast = new Clutter.BrightnessContrastEffect();
this._inverse.set_enabled(false);
this._brightnessContrast.set_enabled(false);
this._magView = uiGroupClone;
this._magView.add_effect(this._inverse);
this._magView.add_effect(this._brightnessContrast);
},
/**
* destroyEffects:
* Remove contrast and brightness effects from the magnified view, and
* lose the reference to the actor they were applied to. Don't use this
* object after calling this.
*/
destroyEffects: function() {
this._magView.clear_effects();
this._brightnessContrast = null;
this._inverse = null;
this._magView = null;
},
/**
* setInvertLightness:
* Enable/disable invert lightness effect.
* @invertFlag: Enabled flag.
*/
setInvertLightness: function(invertFlag) {
this._inverse.set_enabled(invertFlag);
},
/**
* getInvertLightness:
* Report whether the inversion effect is enabled.
* @return: Boolean.
*/
getInvertLightness: function() {
return this._inverse.get_enabled();
},
/**
* setBrightness:
* Set the brightness of the magnified view.
* @brightness: Object containing the brightness for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness,
* respectively.
*/
setBrightness: function(brightness) {
let bRed = brightness.r;
let bGreen = brightness.g;
let bBlue = brightness.b;
this._brightnessContrast.set_brightness_full(bRed, bGreen, bBlue);
// Enable the effect if the brightness OR contrast change are such that
// it modifies the brightness and/or contrast.
let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast();
this._brightnessContrast.set_enabled(
(bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE ||
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE)
);
},
/**
* getBrightness:
* Retrieve current brightness of the magnified view.
* @return: Object containing the brightness for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness, respectively.
*/
getBrightness: function() {
let result = {};
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
result.r = bRed;
result.g = bGreen;
result.b = bBlue;
return result;
},
/**
* Set the contrast of the magnified view.
* @contrast: Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
setContrast: function(contrast) {
let cRed = contrast.r;
let cGreen = contrast.g;
let cBlue = contrast.b;
this._brightnessContrast.set_contrast_full(cRed, cGreen, cBlue);
// Enable the effect if the contrast OR brightness change are such that
// it modifies the brightness and/or contrast.
// should be able to use Clutter.color_equal(), but that complains of
// a null first argument.
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
this._brightnessContrast.set_enabled(
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
);
},
/**
* Retrieve current contrast of the magnified view.
* @return: Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
getContrast: function() {
let resutl = {};
let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast();
result.r = cRed;
result.g = cGreen;
result.b = cBlue;
return result;
}
});

View File

@ -18,6 +18,7 @@ const PolkitAuthenticationAgent = imports.ui.polkitAuthenticationAgent;
const KeyringPrompt = imports.ui.keyringPrompt; const KeyringPrompt = imports.ui.keyringPrompt;
const Environment = imports.ui.environment; const Environment = imports.ui.environment;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionDownloader = imports.ui.extensionDownloader;
const Keyboard = imports.ui.keyboard; const Keyboard = imports.ui.keyboard;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
@ -30,7 +31,9 @@ const NetworkAgent = imports.ui.networkAgent;
const NotificationDaemon = imports.ui.notificationDaemon; const NotificationDaemon = imports.ui.notificationDaemon;
const WindowAttentionHandler = imports.ui.windowAttentionHandler; const WindowAttentionHandler = imports.ui.windowAttentionHandler;
const Scripting = imports.ui.scripting; const Scripting = imports.ui.scripting;
const SessionMode = imports.ui.sessionMode;
const ShellDBus = imports.ui.shellDBus; const ShellDBus = imports.ui.shellDBus;
const ShellMountOperation = imports.ui.shellMountOperation;
const TelepathyClient = imports.ui.telepathyClient; const TelepathyClient = imports.ui.telepathyClient;
const WindowManager = imports.ui.windowManager; const WindowManager = imports.ui.windowManager;
const Magnifier = imports.ui.magnifier; const Magnifier = imports.ui.magnifier;
@ -46,7 +49,6 @@ let automountManager = null;
let autorunManager = null; let autorunManager = null;
let panel = null; let panel = null;
let hotCorners = []; let hotCorners = [];
let placesManager = null;
let overview = null; let overview = null;
let runDialog = null; let runDialog = null;
let lookingGlass = null; let lookingGlass = null;
@ -57,7 +59,9 @@ let windowAttentionHandler = null;
let telepathyClient = null; let telepathyClient = null;
let ctrlAltTabManager = null; let ctrlAltTabManager = null;
let recorder = null; let recorder = null;
let sessionMode = null;
let shellDBusService = null; let shellDBusService = null;
let shellMountOpDBusService = null;
let modalCount = 0; let modalCount = 0;
let modalActorFocusStack = []; let modalActorFocusStack = [];
let uiGroup = null; let uiGroup = null;
@ -67,28 +71,27 @@ let statusIconDispatcher = null;
let keyboard = null; let keyboard = null;
let layoutManager = null; let layoutManager = null;
let networkAgent = null; let networkAgent = null;
let _errorLogStack = [];
let _startDate; let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
let _gdmCssStylesheet = null;
let _overridesSettings = null; let _overridesSettings = null;
let background = null; let background = null;
function _createUserSession() { function createUserSession() {
// Load the calendar server. Note that we are careful about // Load the calendar server. Note that we are careful about
// not loading any events until the user presses the clock // not loading any events until the user presses the clock
global.launch_calendar_server(); global.launch_calendar_server();
placesManager = new PlaceDisplay.PlacesManager();
telepathyClient = new TelepathyClient.Client(); telepathyClient = new TelepathyClient.Client();
automountManager = new AutomountManager.AutomountManager(); automountManager = new AutomountManager.AutomountManager();
autorunManager = new AutorunManager.AutorunManager(); autorunManager = new AutorunManager.AutorunManager();
networkAgent = new NetworkAgent.NetworkAgent(); networkAgent = new NetworkAgent.NetworkAgent();
_initRecorder();
} }
function _createGDMSession() { function createGDMSession() {
// We do this this here instead of at the top to prevent GDM // We do this this here instead of at the top to prevent GDM
// related code from getting loaded in normal user sessions // related code from getting loaded in normal user sessions
const LoginDialog = imports.gdm.loginDialog; const LoginDialog = imports.gdm.loginDialog;
@ -99,18 +102,26 @@ function _createGDMSession() {
}); });
} }
function createInitialSetupSession() {
networkAgent = new NetworkAgent.NetworkAgent();
}
function _initRecorder() { function _initRecorder() {
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' }); let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
let desktopLockdownSettings = new Gio.Settings({ schema: 'org.gnome.desktop.lockdown' });
let bindingSettings = new Gio.Settings({ schema: 'org.gnome.shell.keybindings' });
global.screen.connect('toggle-recording', function() { global.display.add_keybinding('toggle-recording',
bindingSettings,
Meta.KeyBindingFlags.NONE, function() {
if (recorder == null) { if (recorder == null) {
recorder = new Shell.Recorder({ stage: global.stage }); recorder = new Shell.Recorder({ stage: global.stage });
} }
if (recorder.is_recording()) { if (recorder.is_recording()) {
recorder.pause(); recorder.close();
Meta.enable_unredirect_for_screen(global.screen); Meta.enable_unredirect_for_screen(global.screen);
} else { } else if (!desktopLockdownSettings.get_boolean('disable-save-to-disk')) {
// read the parameters from GSettings always in case they have changed // read the parameters from GSettings always in case they have changed
recorder.set_framerate(recorderSettings.get_int('framerate')); recorder.set_framerate(recorderSettings.get_int('framerate'));
/* Translators: this is a filename used for screencast recording */ /* Translators: this is a filename used for screencast recording */
@ -129,39 +140,19 @@ function _initRecorder() {
}); });
} }
function _initUserSession() {
_initRecorder();
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, false, -1, 1);
ExtensionSystem.init();
ExtensionSystem.loadExtensions();
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
getRunDialog().open();
});
Meta.keybindings_set_custom_handler('panel-main-menu', function () {
overview.toggle();
});
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
}
function start() { function start() {
// Monkey patch utility functions into the global proxy; // These are here so we don't break compatibility.
// This is easier and faster than indirecting down into global global.logError = window.log;
// if we want to call back up into JS. global.log = window.log;
global.logError = _logError;
global.log = _logDebug;
// Chain up async errors reported from C // Chain up async errors reported from C
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); }); global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
Gio.DesktopAppInfo.set_desktop_env('GNOME'); Gio.DesktopAppInfo.set_desktop_env('GNOME');
sessionMode = new SessionMode.SessionMode();
shellDBusService = new ShellDBus.GnomeShell(); shellDBusService = new ShellDBus.GnomeShell();
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will // Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem // also initialize ShellAppSystem first. ShellAppSystem
@ -183,7 +174,6 @@ function start() {
global.stage.no_clear_hint = true; global.stage.no_clear_hint = true;
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css'; _defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
_gdmCssStylesheet = global.datadir + '/theme/gdm.css';
loadTheme(); loadTheme();
// Set up stage hierarchy to group all UI actors under one container. // Set up stage hierarchy to group all UI actors under one container.
@ -194,9 +184,16 @@ function start() {
for (let i = 0; i < children.length; i++) for (let i = 0; i < children.length; i++)
children[i].allocate_preferred_size(flags); children[i].allocate_preferred_size(flags);
}); });
let constraint = new Clutter.BindConstraint({ source: global.stage, uiGroup.connect('get-preferred-width',
coordinate: Clutter.BindCoordinate.SIZE }); function(actor, forHeight, alloc) {
uiGroup.add_constraint(constraint); let width = global.stage.width;
[alloc.min_size, alloc.natural_size] = [width, width];
});
uiGroup.connect('get-preferred-height',
function(actor, forWidth, alloc) {
let height = global.stage.height;
[alloc.min_size, alloc.natural_size] = [height, height];
});
global.window_group.reparent(uiGroup); global.window_group.reparent(uiGroup);
global.overlay_group.reparent(uiGroup); global.overlay_group.reparent(uiGroup);
global.stage.add_actor(uiGroup); global.stage.add_actor(uiGroup);
@ -204,8 +201,7 @@ function start() {
layoutManager = new Layout.LayoutManager(); layoutManager = new Layout.LayoutManager();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager(); ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
// This overview object is just a stub for non-user sessions overview = new Overview.Overview();
overview = new Overview.Overview({ isDummy: global.session_type != Shell.SessionType.USER });
magnifier = new Magnifier.Magnifier(); magnifier = new Magnifier.Magnifier();
statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher(); statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher();
panel = new Panel.Panel(); panel = new Panel.Panel();
@ -215,10 +211,7 @@ function start() {
notificationDaemon = new NotificationDaemon.NotificationDaemon(); notificationDaemon = new NotificationDaemon.NotificationDaemon();
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler(); windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
if (global.session_type == Shell.SessionType.USER) sessionMode.createSession();
_createUserSession();
else if (global.session_type == Shell.SessionType.GDM)
_createGDMSession();
panel.startStatusArea(); panel.startStatusArea();
@ -226,8 +219,30 @@ function start() {
keyboard.init(); keyboard.init();
overview.init(); overview.init();
if (global.session_type == Shell.SessionType.USER) if (sessionMode.hasWorkspaces)
_initUserSession(); global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1);
if (sessionMode.allowExtensions) {
ExtensionDownloader.init();
ExtensionSystem.loadExtensions();
}
if (sessionMode.hasRunDialog) {
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
getRunDialog().open();
});
}
if (sessionMode.hasOverview) {
Meta.keybindings_set_custom_handler('panel-main-menu', function () {
overview.toggle();
});
global.display.connect('overlay-key',
Lang.bind(overview, overview.toggle));
}
statusIconDispatcher.start(messageTray.actor); statusIconDispatcher.start(messageTray.actor);
// Provide the bus object for gnome-session to // Provide the bus object for gnome-session to
@ -244,7 +259,6 @@ function start() {
global.stage.connect('captured-event', _globalKeyPressHandler); global.stage.connect('captured-event', _globalKeyPressHandler);
_log('info', 'loaded at ' + _startDate);
log('GNOME Shell started at ' + _startDate); log('GNOME Shell started at ' + _startDate);
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
@ -487,8 +501,8 @@ function loadTheme() {
let theme = new St.Theme ({ application_stylesheet: cssStylesheet }); let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
if (global.session_type == Shell.SessionType.GDM) if (sessionMode.extraStylesheet)
theme.load_stylesheet(_gdmCssStylesheet); theme.load_stylesheet(sessionMode.extraStylesheet);
if (previousTheme) { if (previousTheme) {
let customStylesheets = previousTheme.get_custom_stylesheets(); let customStylesheets = previousTheme.get_custom_stylesheets();
@ -530,59 +544,6 @@ function notifyError(msg, details) {
notify(msg, details); notify(msg, details);
} }
/**
* _log:
* @category: string message type ('info', 'error')
* @msg: A message string
* ...: Any further arguments are converted into JSON notation,
* and appended to the log message, separated by spaces.
*
* Log a message into the LookingGlass error
* stream. This is primarily intended for use by the
* extension system as well as debugging.
*/
function _log(category, msg) {
let text = msg;
if (arguments.length > 2) {
text += ': ';
for (let i = 2; i < arguments.length; i++) {
text += JSON.stringify(arguments[i]);
if (i < arguments.length - 1)
text += ' ';
}
}
_errorLogStack.push({timestamp: new Date().getTime(),
category: category,
message: text });
}
function _logError(msg) {
return _log('error', msg);
}
function _logDebug(msg) {
return _log('debug', msg);
}
// Used by the error display in lookingGlass.js
function _getAndClearErrorStack() {
let errors = _errorLogStack;
_errorLogStack = [];
return errors;
}
function logStackTrace(msg) {
try {
throw new Error();
} catch (e) {
// e.stack must have at least two lines, with the first being
// logStackTrace() (which we strip off), and the second being
// our caller.
let trace = e.stack.substr(e.stack.indexOf('\n') + 1);
log(msg ? (msg + '\n' + trace) : trace);
}
}
function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) { function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) {
return win.get_workspace() == workspaceIndex || return win.get_workspace() == workspaceIndex ||
(win.get_meta_window() && win.get_meta_window().is_on_all_workspaces()); (win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
@ -605,6 +566,11 @@ function _globalKeyPressHandler(actor, event) {
if (event.type() != Clutter.EventType.KEY_PRESS) if (event.type() != Clutter.EventType.KEY_PRESS)
return false; return false;
if (!sessionMode.allowKeybindingsWhenModal) {
if (modalCount > (overview.visible ? 1 : 0))
return false;
}
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
let keyCode = event.get_key_code(); let keyCode = event.get_key_code();
let ignoredModifiers = global.display.get_ignored_modifier_mask(); let ignoredModifiers = global.display.get_ignored_modifier_mask();
@ -613,11 +579,6 @@ function _globalKeyPressHandler(actor, event) {
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType // This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
let action = global.display.get_keybinding_action(keyCode, modifierState); let action = global.display.get_keybinding_action(keyCode, modifierState);
// Other bindings are only available to the user session when the overview is up and
// no modal dialog is present.
if (global.session_type == Shell.SessionType.USER && (!overview.visible || modalCount > 1))
return false;
// This isn't a Meta.KeyBindingAction yet // This isn't a Meta.KeyBindingAction yet
if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) { if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) {
overview.hide(); overview.hide();
@ -630,28 +591,39 @@ function _globalKeyPressHandler(actor, event) {
return true; return true;
} }
// None of the other bindings are relevant outside of the user's session
if (global.session_type != Shell.SessionType.USER)
return false;
switch (action) { switch (action) {
// left/right would effectively act as synonyms for up/down if we enabled them; // left/right would effectively act as synonyms for up/down if we enabled them;
// but that could be considered confusing; we also disable them in the main view. // but that could be considered confusing; we also disable them in the main view.
// //
// case Meta.KeyBindingAction.WORKSPACE_LEFT: // case Meta.KeyBindingAction.WORKSPACE_LEFT:
// if (!sessionMode.hasWorkspaces)
// return false;
//
// wm.actionMoveWorkspaceLeft(); // wm.actionMoveWorkspaceLeft();
// return true; // return true;
// case Meta.KeyBindingAction.WORKSPACE_RIGHT: // case Meta.KeyBindingAction.WORKSPACE_RIGHT:
// if (!sessionMode.hasWorkspaces)
// return false;
//
// wm.actionMoveWorkspaceRight(); // wm.actionMoveWorkspaceRight();
// return true; // return true;
case Meta.KeyBindingAction.WORKSPACE_UP: case Meta.KeyBindingAction.WORKSPACE_UP:
if (!sessionMode.hasWorkspaces)
return false;
wm.actionMoveWorkspaceUp(); wm.actionMoveWorkspaceUp();
return true; return true;
case Meta.KeyBindingAction.WORKSPACE_DOWN: case Meta.KeyBindingAction.WORKSPACE_DOWN:
if (!sessionMode.hasWorkspaces)
return false;
wm.actionMoveWorkspaceDown(); wm.actionMoveWorkspaceDown();
return true; return true;
case Meta.KeyBindingAction.PANEL_RUN_DIALOG: case Meta.KeyBindingAction.PANEL_RUN_DIALOG:
case Meta.KeyBindingAction.COMMAND_2: case Meta.KeyBindingAction.COMMAND_2:
if (!sessionMode.hasRunDialog)
return false;
getRunDialog().open(); getRunDialog().open();
return true; return true;
case Meta.KeyBindingAction.PANEL_MAIN_MENU: case Meta.KeyBindingAction.PANEL_MAIN_MENU:
@ -702,6 +674,7 @@ function pushModal(actor, timestamp, options) {
log('pushModal: invocation of begin_modal failed'); log('pushModal: invocation of begin_modal failed');
return false; return false;
} }
Meta.disable_unredirect_for_screen(global.screen);
} }
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN); global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
@ -782,6 +755,7 @@ function popModal(actor, timestamp) {
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL); global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
Meta.enable_unredirect_for_screen(global.screen);
} }
function createLookingGlass() { function createLookingGlass() {
@ -924,7 +898,8 @@ function initializeDeferredWork(actor, callback, props) {
function queueDeferredWork(workId) { function queueDeferredWork(workId) {
let data = _deferredWorkData[workId]; let data = _deferredWorkData[workId];
if (!data) { if (!data) {
global.logError('invalid work id ', workId); let message = 'Invalid work id %d'.format(workId);
logError(new Error(message), message);
return; return;
} }
if (_deferredWorkQueue.indexOf(workId) < 0) if (_deferredWorkQueue.indexOf(workId) < 0)

View File

@ -441,7 +441,7 @@ const Notification = new Lang.Class({
this.actor.connect('clicked', Lang.bind(this, this._onClicked)); this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._table = new St.Table({ name: 'notification', this._table = new St.Table({ style_class: 'notification',
reactive: true }); reactive: true });
this._table.connect('style-changed', Lang.bind(this, this._styleChanged)); this._table.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.set_child(this._table); this.actor.set_child(this._table);
@ -577,7 +577,7 @@ const Notification = new Lang.Class({
if (params.body) if (params.body)
this.addBody(params.body, params.bodyMarkup); this.addBody(params.body, params.bodyMarkup);
this._updated(); this.updated();
}, },
setIconVisible: function(visible) { setIconVisible: function(visible) {
@ -586,19 +586,21 @@ const Notification = new Lang.Class({
enableScrolling: function(enableScrolling) { enableScrolling: function(enableScrolling) {
this._scrollPolicy = enableScrolling ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER; this._scrollPolicy = enableScrolling ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER;
if (this._scrollArea) if (this._scrollArea) {
this._scrollArea.vscrollbar_policy = this._scrollPolicy; this._scrollArea.vscrollbar_policy = this._scrollPolicy;
this._scrollArea.enable_mouse_scrolling = enableScrolling;
}
}, },
_createScrollArea: function() { _createScrollArea: function() {
this._table.add_style_class_name('multi-line-notification'); this._table.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview', this._scrollArea = new St.ScrollView({ style_class: 'notification-scrollview',
vscrollbar_policy: this._scrollPolicy, vscrollbar_policy: this._scrollPolicy,
hscrollbar_policy: Gtk.PolicyType.NEVER }); hscrollbar_policy: Gtk.PolicyType.NEVER });
this._table.add(this._scrollArea, { row: 1, this._table.add(this._scrollArea, { row: 1,
col: 2 }); col: 2 });
this._updateLastColumnSettings(); this._updateLastColumnSettings();
this._contentArea = new St.BoxLayout({ name: 'notification-body', this._contentArea = new St.BoxLayout({ style_class: 'notification-body',
vertical: true }); vertical: true });
this._scrollArea.add_actor(this._contentArea); this._scrollArea.add_actor(this._contentArea);
// If we know the notification will be expandable, we need to add // If we know the notification will be expandable, we need to add
@ -616,7 +618,7 @@ const Notification = new Lang.Class({
} }
this._contentArea.add(actor, style ? style : {}); this._contentArea.add(actor, style ? style : {});
this._updated(); this.updated();
}, },
// addBody: // addBody:
@ -679,7 +681,7 @@ const Notification = new Lang.Class({
this._table.add_style_class_name('multi-line-notification'); this._table.add_style_class_name('multi-line-notification');
this._table.add(this._actionArea, props); this._table.add(this._actionArea, props);
this._updateLastColumnSettings(); this._updateLastColumnSettings();
this._updated(); this.updated();
}, },
_updateLastColumnSettings: function() { _updateLastColumnSettings: function() {
@ -734,7 +736,7 @@ const Notification = new Lang.Class({
addButton: function(id, label) { addButton: function(id, label) {
if (!this._buttonBox) { if (!this._buttonBox) {
let box = new St.BoxLayout({ name: 'notification-actions' }); let box = new St.BoxLayout({ style_class: 'notification-actions' });
this.setActionArea(box, { x_expand: false, this.setActionArea(box, { x_expand: false,
y_expand: false, y_expand: false,
x_fill: false, x_fill: false,
@ -744,6 +746,7 @@ const Notification = new Lang.Class({
} }
let button = new St.Button({ can_focus: true }); let button = new St.Button({ can_focus: true });
button._actionId = id;
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) { if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) {
button.add_style_class_name('notification-icon-button'); button.add_style_class_name('notification-icon-button');
@ -753,14 +756,39 @@ const Notification = new Lang.Class({
button.label = label; button.label = label;
} }
if (this._buttonBox.get_children().length > 0) if (this._buttonBox.get_n_children() > 0)
this._buttonFocusManager.remove_group(this._buttonBox); this._buttonFocusManager.remove_group(this._buttonBox);
this._buttonBox.add(button); this._buttonBox.add(button);
this._buttonFocusManager.add_group(this._buttonBox); this._buttonFocusManager.add_group(this._buttonBox);
button.connect('clicked', Lang.bind(this, this._onActionInvoked, id)); button.connect('clicked', Lang.bind(this, this._onActionInvoked, id));
this._updated(); this.updated();
},
// setButtonSensitive:
// @id: the action ID
// @sensitive: whether the button should be sensitive
//
// If the notification contains a button with action ID @id,
// its sensitivity will be set to @sensitive. Insensitive
// buttons cannot be clicked.
setButtonSensitive: function(id, sensitive) {
if (!this._buttonBox)
return;
let button = this._buttonBox.get_children().filter(function(b) {
return b._actionId == id;
})[0];
if (!button || button.reactive == sensitive)
return;
button.reactive = sensitive;
if (sensitive)
button.remove_style_pseudo_class('insensitive');
else
button.add_style_pseudo_class('insensitive');
}, },
setUrgency: function(urgency) { setUrgency: function(urgency) {
@ -856,7 +884,7 @@ const Notification = new Lang.Class({
if (this._canExpandContent()) { if (this._canExpandContent()) {
this._addBannerBody(); this._addBannerBody();
this._table.add_style_class_name('multi-line-notification'); this._table.add_style_class_name('multi-line-notification');
this._updated(); this.updated();
} }
return false; return false;
})); }));
@ -867,7 +895,7 @@ const Notification = new Lang.Class({
(!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification')); (!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification'));
}, },
_updated: function() { updated: function() {
if (this.expanded) if (this.expanded)
this.expand(false); this.expand(false);
}, },
@ -958,8 +986,10 @@ const Source = new Lang.Class({
ICON_SIZE: 24, ICON_SIZE: 24,
_init: function(title) { _init: function(title, iconName, iconType) {
this.title = title; this.title = title;
this.iconName = iconName;
this.iconType = iconType;
this.actor = new Shell.GenericContainer(); this.actor = new Shell.GenericContainer();
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
@ -989,6 +1019,8 @@ const Source = new Lang.Class({
this.isMuted = false; this.isMuted = false;
this.notifications = []; this.notifications = [];
this._setSummaryIcon(this.createNotificationIcon());
}, },
_getPreferredWidth: function (actor, forHeight, alloc) { _getPreferredWidth: function (actor, forHeight, alloc) {
@ -1059,10 +1091,12 @@ const Source = new Lang.Class({
}, },
// Called to create a new icon actor (of size this.ICON_SIZE). // Called to create a new icon actor (of size this.ICON_SIZE).
// Must be overridden by the subclass if you do not pass icons // Provides a sane default implementation, override if you need
// explicitly to the Notification() constructor. // something more fancy.
createNotificationIcon: function() { createNotificationIcon: function() {
throw new Error('no implementation of createNotificationIcon in ' + this); return new St.Icon({ icon_name: this.iconName,
icon_type: this.iconType,
icon_size: this.ICON_SIZE });
}, },
// Unlike createNotificationIcon, this always returns the same actor; // Unlike createNotificationIcon, this always returns the same actor;
@ -1113,16 +1147,14 @@ const Source = new Lang.Class({
}, },
//// Protected methods //// //// Protected methods ////
// The subclass must call this at least once to set the summary icon.
_setSummaryIcon: function(icon) { _setSummaryIcon: function(icon) {
if (this._iconBin.child) if (this._iconBin.child)
this._iconBin.child.destroy(); this._iconBin.child.destroy();
this._iconBin.child = icon; this._iconBin.child = icon;
}, },
// Default implementation is to do nothing, but subclasses can override
open: function(notification) { open: function(notification) {
this.emit('opened', notification);
}, },
destroyNonResidentNotifications: function() { destroyNonResidentNotifications: function() {
@ -1252,7 +1284,7 @@ const SummaryItem = new Lang.Class({
}, },
prepareNotificationStackForShowing: function() { prepareNotificationStackForShowing: function() {
if (this.notificationStack.get_children().length > 0) if (this.notificationStack.get_n_children() > 0)
return; return;
for (let i = 0; i < this.source.notifications.length; i++) { for (let i = 0; i < this.source.notifications.length; i++) {
@ -1261,7 +1293,6 @@ const SummaryItem = new Lang.Class({
}, },
doneShowingNotificationStack: function() { doneShowingNotificationStack: function() {
let notificationActors = this.notificationStack.get_children();
for (let i = 0; i < this._stackedNotifications.length; i++) { for (let i = 0; i < this._stackedNotifications.length; i++) {
let stackedNotification = this._stackedNotifications[i]; let stackedNotification = this._stackedNotifications[i];
let notification = stackedNotification.notification; let notification = stackedNotification.notification;
@ -1291,7 +1322,7 @@ const SummaryItem = new Lang.Class({
this._stackedNotifications.push(stackedNotification); this._stackedNotifications.push(stackedNotification);
if (!this.source.isChat) if (!this.source.isChat)
notification.enableScrolling(false); notification.enableScrolling(false);
if (this.notificationStack.get_children().length > 0) if (this.notificationStack.get_n_children() > 0)
notification.setIconVisible(false); notification.setIconVisible(false);
this.notificationStack.add(notification.actor); this.notificationStack.add(notification.actor);
notification.expand(false); notification.expand(false);
@ -1437,6 +1468,7 @@ const MessageTray = new Lang.Class({
this._overviewVisible = Main.overview.visible; this._overviewVisible = Main.overview.visible;
this._notificationRemoved = false; this._notificationRemoved = false;
this._reNotifyAfterHideNotification = null; this._reNotifyAfterHideNotification = null;
this._inFullscreen = false;
this._corner = new Clutter.Rectangle({ width: 1, this._corner = new Clutter.Rectangle({ width: 1,
height: 1, height: 1,
@ -1452,6 +1484,7 @@ const MessageTray = new Lang.Class({
Main.layoutManager.trackChrome(this._notificationBin); Main.layoutManager.trackChrome(this._notificationBin);
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._setSizePosition)); Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
Main.layoutManager.connect('primary-fullscreen-changed', Lang.bind(this, this._onFullscreenChanged));
this._setSizePosition(); this._setSizePosition();
@ -1925,6 +1958,11 @@ const MessageTray = new Lang.Class({
this._updateState(); this._updateState();
}, },
_onFullscreenChanged: function(obj, state) {
this._inFullscreen = state;
this._updateState();
},
_onStatusChanged: function(status) { _onStatusChanged: function(status) {
if (status == GnomeSession.PresenceStatus.BUSY) { if (status == GnomeSession.PresenceStatus.BUSY) {
// remove notification and allow the summary to be closed now // remove notification and allow the summary to be closed now
@ -1982,7 +2020,7 @@ const MessageTray = new Lang.Class({
_updateState: function() { _updateState: function() {
// Notifications // Notifications
let notificationUrgent = this._notificationQueue.length > 0 && this._notificationQueue[0].urgency == Urgency.CRITICAL; let notificationUrgent = this._notificationQueue.length > 0 && this._notificationQueue[0].urgency == Urgency.CRITICAL;
let notificationsPending = this._notificationQueue.length > 0 && (!this._busy || notificationUrgent); let notificationsPending = this._notificationQueue.length > 0 && ((!this._busy && !this._inFullscreen) || notificationUrgent);
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved; let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
let notificationExpanded = this._notificationBin.y < 0; let notificationExpanded = this._notificationBin.y < 0;
let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && !this._locked && !(this._pointerInKeyboard && notificationExpanded)) || this._notificationRemoved; let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && !this._locked && !(this._pointerInKeyboard && notificationExpanded)) || this._notificationRemoved;
@ -2018,7 +2056,7 @@ const MessageTray = new Lang.Class({
if (this._summaryState == State.HIDDEN && !mustHideSummary) { if (this._summaryState == State.HIDDEN && !mustHideSummary) {
if (summarySummoned) { if (summarySummoned) {
this._showSummary(0); this._showSummary(0);
} else if (notificationsDone && !this._busy) { } else if (notificationsDone && !this._busy && !this._inFullscreen) {
if (this._backFromAway && this._unseenNotifications.length > 0) if (this._backFromAway && this._unseenNotifications.length > 0)
this._showSummary(LONGER_SUMMARY_TIMEOUT); this._showSummary(LONGER_SUMMARY_TIMEOUT);
else if (this._newSummaryItems.length > 0) else if (this._newSummaryItems.length > 0)
@ -2397,7 +2435,7 @@ const MessageTray = new Lang.Class({
}, },
_onSummaryBoxPointerContentUpdated: function() { _onSummaryBoxPointerContentUpdated: function() {
if (this._summaryBoxPointerItem.notificationStack.get_children().length == 0) if (this._summaryBoxPointerItem.notificationStack.get_n_children() == 0)
this._hideSummaryBoxPointer(); this._hideSummaryBoxPointer();
this._adjustSummaryBoxPointerPosition(); this._adjustSummaryBoxPointerPosition();
@ -2431,7 +2469,7 @@ const MessageTray = new Lang.Class({
// We should be sure to hide the box pointer if all notifications in it are destroyed while // We should be sure to hide the box pointer if all notifications in it are destroyed while
// it is hiding, so that we don't show an an animation of an empty blob being hidden. // it is hiding, so that we don't show an an animation of an empty blob being hidden.
if (this._summaryBoxPointerState == State.HIDING && if (this._summaryBoxPointerState == State.HIDING &&
this._summaryBoxPointerItem.notificationStack.get_children().length == 0) { this._summaryBoxPointerItem.notificationStack.get_n_children() == 0) {
this._summaryBoxPointer.actor.hide(); this._summaryBoxPointer.actor.hide();
return; return;
} }
@ -2487,15 +2525,7 @@ const SystemNotificationSource = new Lang.Class({
Extends: Source, Extends: Source,
_init: function() { _init: function() {
this.parent(_("System Information")); this.parent(_("System Information"), 'dialog-information', St.IconType.SYMBOLIC);
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'dialog-information',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
}, },
open: function() { open: function() {

View File

@ -180,7 +180,7 @@ const ModalDialog = new Lang.Class({
}, },
_fadeOpen: function() { _fadeOpen: function() {
let monitor = Main.layoutManager.focusMonitor; let monitor = Main.layoutManager.currentMonitor;
this._backgroundBin.set_position(monitor.x, monitor.y); this._backgroundBin.set_position(monitor.x, monitor.y);
this._backgroundBin.set_size(monitor.width, monitor.height); this._backgroundBin.set_size(monitor.width, monitor.height);

View File

@ -221,12 +221,19 @@ const NotificationDaemon = new Lang.Class({
let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params; let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params;
let id; let id;
for (let hint in hints) {
// unpack the variants
hints[hint] = hints[hint].deep_unpack();
}
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
// Filter out chat, presence, calls and invitation notifications from // Filter out chat, presence, calls and invitation notifications from
// Empathy, since we handle that information from telepathyClient.js // Empathy, since we handle that information from telepathyClient.js
if (appName == 'Empathy' && (hints['category'] == 'im.received' || if (appName == 'Empathy' && (hints['category'] == 'im.received' ||
hints['category'] == 'x-empathy.im.room-invitation' || hints['category'] == 'x-empathy.im.room-invitation' ||
hints['category'] == 'x-empathy.call.incoming' || hints['category'] == 'x-empathy.call.incoming' ||
hints['category'] == 'x-empathy.call.incoming"' || hints['category'] == 'x-empathy.transfer.incoming' ||
hints['category'] == 'x-empathy.im.subscription-request' || hints['category'] == 'x-empathy.im.subscription-request' ||
hints['category'] == 'presence.online' || hints['category'] == 'presence.online' ||
hints['category'] == 'presence.offline')) { hints['category'] == 'presence.offline')) {
@ -249,13 +256,6 @@ const NotificationDaemon = new Lang.Class({
} }
} }
for (let hint in hints) {
// unpack the variants
hints[hint] = hints[hint].deep_unpack();
}
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
// Be compatible with the various hints for image data and image path // Be compatible with the various hints for image data and image path
// 'image-data' and 'image-path' are the latest name of these hints, introduced in 1.2 // 'image-data' and 'image-path' are the latest name of these hints, introduced in 1.2
@ -483,7 +483,7 @@ const NotificationDaemon = new Lang.Class({
}, },
_onTrayIconAdded: function(o, icon) { _onTrayIconAdded: function(o, icon) {
let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null, null, icon); let source = this._getSource(icon.title || icon.wm_class || C_("program", "Unknown"), icon.pid, null, null, icon);
}, },
_onTrayIconRemoved: function(o, icon) { _onTrayIconRemoved: function(o, icon) {
@ -578,11 +578,27 @@ const Source = new Lang.Class({
return true; return true;
}, },
_getApp: function() {
let app;
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
if (app != null)
return app;
if (this.trayIcon) {
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wmclass);
if (app != null)
return app;
}
return null;
},
_setApp: function() { _setApp: function() {
if (this.app) if (this.app)
return; return;
this.app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid); this.app = this._getApp();
if (!this.app) if (!this.app)
return; return;
@ -622,5 +638,10 @@ const Source = new Lang.Class({
} }
this.parent(); this.parent();
},
createNotificationIcon: function() {
// We set the summary icon ourselves.
return null;
} }
}); });

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Config = imports.misc.config;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@ -11,10 +12,9 @@ const Shell = imports.gi.Shell;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
const AppDisplay = imports.ui.appDisplay; const AppDisplay = imports.ui.appDisplay;
const ContactDisplay = imports.ui.contactDisplay; const ContactDisplay = Config.HAVE_FOLKS ? imports.ui.contactDisplay : null;
const Dash = imports.ui.dash; const Dash = imports.ui.dash;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Panel = imports.ui.panel; const Panel = imports.ui.panel;
@ -99,10 +99,8 @@ const ShellInfo = new Lang.Class({
const Overview = new Lang.Class({ const Overview = new Lang.Class({
Name: 'Overview', Name: 'Overview',
_init : function(params) { _init : function() {
params = Params.parse(params, { isDummy: false }); this.isDummy = !Main.sessionMode.hasOverview;
this.isDummy = params.isDummy;
// We only have an overview in user sessions, so // We only have an overview in user sessions, so
// create a dummy overview in other cases // create a dummy overview in other cases
@ -210,7 +208,8 @@ const Overview = new Lang.Class({
this.addSearchProvider(new AppDisplay.AppSearchProvider()); this.addSearchProvider(new AppDisplay.AppSearchProvider());
this.addSearchProvider(new AppDisplay.SettingsSearchProvider()); this.addSearchProvider(new AppDisplay.SettingsSearchProvider());
this.addSearchProvider(new PlaceDisplay.PlaceSearchProvider()); this.addSearchProvider(new PlaceDisplay.PlaceSearchProvider());
this.addSearchProvider(new ContactDisplay.ContactSearchProvider()); if (ContactDisplay != null)
this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
// Load remote search providers provided by applications // Load remote search providers provided by applications
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider)); RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));

View File

@ -4,6 +4,7 @@ const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@ -13,7 +14,6 @@ const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
@ -31,33 +31,6 @@ const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100; const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const SPINNER_ANIMATION_TIME = 0.2; const SPINNER_ANIMATION_TIME = 0.2;
const STANDARD_STATUS_AREA_ORDER = ['a11y', 'keyboard', 'volume', 'bluetooth', 'network', 'battery', 'userMenu'];
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'userMenu': imports.ui.userMenu.UserMenuButton
};
if (Config.HAVE_BLUETOOTH)
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
try {
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] = imports.ui.status.network.NMApplet;
} catch(e) {
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
}
const GDM_STATUS_AREA_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'battery', 'powerMenu'];
const GDM_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
};
// To make sure the panel corners blend nicely with the panel, // To make sure the panel corners blend nicely with the panel,
// we draw background and borders the same way, e.g. drawing // we draw background and borders the same way, e.g. drawing
// them as filled shapes from the outside inwards instead of // them as filled shapes from the outside inwards instead of
@ -961,7 +934,7 @@ const Panel = new Lang.Class({
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
/* Button on the left side of the panel. */ /* Button on the left side of the panel. */
if (global.session_type == Shell.SessionType.USER) { if (Main.sessionMode.hasOverview) {
this._activitiesButton = new ActivitiesButton(); this._activitiesButton = new ActivitiesButton();
this._activities = this._activitiesButton.actor; this._activities = this._activitiesButton.actor;
this._leftBox.add(this._activities); this._leftBox.add(this._activities);
@ -969,28 +942,19 @@ const Panel = new Lang.Class({
// The activities button has a pretend menu, so as to integrate // The activities button has a pretend menu, so as to integrate
// more cleanly with the rest of the panel // more cleanly with the rest of the panel
this._menus.addMenu(this._activitiesButton.menu); this._menus.addMenu(this._activitiesButton.menu);
}
if (Main.sessionMode.hasAppMenu) {
this._appMenu = new AppMenuButton(this._menus); this._appMenu = new AppMenuButton(this._menus);
this._leftBox.add(this._appMenu.actor); this._leftBox.add(this._appMenu.actor);
} }
/* center */ /* center */
if (global.session_type == Shell.SessionType.USER) this._dateMenu = new DateMenu.DateMenuButton();
this._dateMenu = new DateMenu.DateMenuButton({ showEvents: true });
else
this._dateMenu = new DateMenu.DateMenuButton({ showEvents: false });
this._centerBox.add(this._dateMenu.actor, { y_fill: true }); this._centerBox.add(this._dateMenu.actor, { y_fill: true });
this._menus.addMenu(this._dateMenu.menu); this._menus.addMenu(this._dateMenu.menu);
/* right */ /* right */
if (global.session_type == Shell.SessionType.GDM) {
this._status_area_order = GDM_STATUS_AREA_ORDER;
this._status_area_shell_implementation = GDM_STATUS_AREA_SHELL_IMPLEMENTATION;
} else {
this._status_area_order = STANDARD_STATUS_AREA_ORDER;
this._status_area_shell_implementation = STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION;
}
Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded)); Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved)); Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
@ -1112,10 +1076,19 @@ const Panel = new Lang.Class({
return true; return true;
}, },
openAppMenu: function() {
let menu = this._appMenu.menu;
if (!this._appMenu.actor.reactive || menu.isOpen)
return;
menu.open();
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
startStatusArea: function() { startStatusArea: function() {
for (let i = 0; i < this._status_area_order.length; i++) { for (let i = 0; i < Main.sessionMode.statusArea.order.length; i++) {
let role = this._status_area_order[i]; let role = Main.sessionMode.statusArea.order[i];
let constructor = this._status_area_shell_implementation[role]; let constructor = Main.sessionMode.statusArea.implementation[role];
if (!constructor) { if (!constructor) {
// This icon is not implemented (this is a bug) // This icon is not implemented (this is a bug)
continue; continue;
@ -1165,18 +1138,21 @@ const Panel = new Lang.Class({
}, },
_onTrayIconAdded: function(o, icon, role) { _onTrayIconAdded: function(o, icon, role) {
if (this._status_area_shell_implementation[role]) { if (Main.sessionMode.statusArea.implementation[role]) {
// This icon is legacy, and replaced by a Shell version // This icon is legacy, and replaced by a Shell version
// Hide it // Hide it
return; return;
} }
if (Main.sessionMode.statusArea.order.indexOf(role) == -1)
return;
icon.height = PANEL_ICON_SIZE; icon.height = PANEL_ICON_SIZE;
let buttonBox = new PanelMenu.ButtonBox(); let buttonBox = new PanelMenu.ButtonBox();
let box = buttonBox.actor; let box = buttonBox.actor;
box.add_actor(icon); box.add_actor(icon);
this._insertStatusItem(box, this._status_area_order.indexOf(role)); this._insertStatusItem(box, Main.sessionMode.statusArea.order.indexOf(role));
}, },
_onTrayIconRemoved: function(o, icon) { _onTrayIconRemoved: function(o, icon) {

View File

@ -189,7 +189,7 @@ const PlacesManager = new Lang.Class({
this._volumeMonitor.connect('drive-changed', Lang.bind(this, this._updateDevices)); this._volumeMonitor.connect('drive-changed', Lang.bind(this, this._updateDevices));
this._updateDevices(); this._updateDevices();
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']); this._bookmarksPath = GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']);
this._bookmarksFile = Gio.file_new_for_path(this._bookmarksPath); this._bookmarksFile = Gio.file_new_for_path(this._bookmarksPath);
this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null); this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null);
this._bookmarkTimeoutId = 0; this._bookmarkTimeoutId = 0;
@ -365,12 +365,13 @@ const PlaceSearchProvider = new Lang.Class({
_init: function() { _init: function() {
this.parent(_("PLACES & DEVICES")); this.parent(_("PLACES & DEVICES"));
this.placesManager = new PlacesManager();
}, },
getResultMetas: function(resultIds) { getResultMetas: function(resultIds, callback) {
let metas = []; let metas = [];
for (let i = 0; i < resultIds.length; i++) { for (let i = 0; i < resultIds.length; i++) {
let placeInfo = Main.placesManager.lookupPlaceById(resultIds[i]); let placeInfo = this.placesManager.lookupPlaceById(resultIds[i]);
if (!placeInfo) if (!placeInfo)
metas.push(null); metas.push(null);
else else
@ -381,24 +382,22 @@ const PlaceSearchProvider = new Lang.Class({
} }
}); });
} }
return metas; callback(metas);
}, },
activateResult: function(id, params) { activateResult: function(id, params) {
let placeInfo = Main.placesManager.lookupPlaceById(id); let placeInfo = this.placesManager.lookupPlaceById(id);
placeInfo.launch(params); placeInfo.launch(params);
}, },
_compareResultMeta: function (idA, idB) { _compareResultMeta: function (idA, idB) {
let infoA = Main.placesManager.lookupPlaceById(idA); let infoA = this.placesManager.lookupPlaceById(idA);
let infoB = Main.placesManager.lookupPlaceById(idB); let infoB = this.placesManager.lookupPlaceById(idB);
return infoA.name.localeCompare(infoB.name); return infoA.name.localeCompare(infoB.name);
}, },
_searchPlaces: function(places, terms) { _searchPlaces: function(places, terms) {
let multiplePrefixResults = [];
let prefixResults = []; let prefixResults = [];
let multipleSubstringResults = [];
let substringResults = []; let substringResults = [];
terms = terms.map(String.toLowerCase); terms = terms.map(String.toLowerCase);
@ -406,29 +405,26 @@ const PlaceSearchProvider = new Lang.Class({
for (let i = 0; i < places.length; i++) { for (let i = 0; i < places.length; i++) {
let place = places[i]; let place = places[i];
let mtype = place.matchTerms(terms); let mtype = place.matchTerms(terms);
if (mtype == Search.MatchType.MULTIPLE_PREFIX) if (mtype == Search.MatchType.PREFIX)
multiplePrefixResults.push(place.id);
else if (mtype == Search.MatchType.PREFIX)
prefixResults.push(place.id); prefixResults.push(place.id);
else if (mtype == Search.MatchType.MULTIPLE_SUBSTRING)
multipleSubstringResults.push(place.id);
else if (mtype == Search.MatchType.SUBSTRING) else if (mtype == Search.MatchType.SUBSTRING)
substringResults.push(place.id); substringResults.push(place.id);
} }
multiplePrefixResults.sort(this._compareResultMeta); prefixResults.sort(Lang.bind(this, this._compareResultMeta));
prefixResults.sort(this._compareResultMeta); substringResults.sort(Lang.bind(this, this._compareResultMeta));
multipleSubstringResults.sort(this._compareResultMeta);
substringResults.sort(this._compareResultMeta); this.searchSystem.pushResults(this, prefixResults.concat(substringResults));
return multiplePrefixResults.concat(prefixResults.concat(multipleSubstringResults.concat(substringResults)));
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
let places = Main.placesManager.getAllPlaces(); let places = this.placesManager.getAllPlaces();
return this._searchPlaces(places, terms); this._searchPlaces(places, terms);
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
let places = previousResults.map(function (id) { return Main.placesManager.lookupPlaceById(id); }); let places = previousResults.map(Lang.bind(this, function(id) {
return this._searchPlaces(places, terms); return this.placesManager.lookupPlaceById(id);
}));
this._searchPlaces(places, terms);
} }
}); });

View File

@ -167,6 +167,7 @@ const AuthenticationDialog = new Lang.Class({
*/ */
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label', this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
text: 'abc'}); text: 'abc'});
this._nullMessageLabel.add_style_class_name('hidden');
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._nullMessageLabel.clutter_text.line_wrap = true; this._nullMessageLabel.clutter_text.line_wrap = true;
messageBox.add(this._nullMessageLabel); messageBox.add(this._nullMessageLabel);

View File

@ -546,6 +546,10 @@ const PopupSliderMenuItem = new Lang.Class({
this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint)); this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint));
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging)); this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this.actor.connect('notify::mapped', Lang.bind(this, function() {
if (!this.actor.mapped)
this._endDragging();
}));
this._releaseId = this._motionId = 0; this._releaseId = this._motionId = 0;
this._dragging = false; this._dragging = false;
@ -884,8 +888,7 @@ const PopupMenuBase = new Lang.Class({
}, },
addSettingsAction: function(title, desktopFile) { addSettingsAction: function(title, desktopFile) {
// Don't allow user settings to get edited unless we're in a user session if (!Main.sessionMode.allowSettings)
if (global.session_type != Shell.SessionType.USER)
return null; return null;
let menuItem = this.addAction(title, function() { let menuItem = this.addAction(title, function() {
@ -903,7 +906,7 @@ const PopupMenuBase = new Lang.Class({
}, },
isEmpty: function() { isEmpty: function() {
return this.box.get_children().length == 0; return this.box.get_n_children() == 0;
}, },
isChildMenu: function(menu) { isChildMenu: function(menu) {
@ -1917,7 +1920,7 @@ const RemoteMenu = new Lang.Class({
while (k0 < currentItems.length && currentItems[k0]._ignored) while (k0 < currentItems.length && currentItems[k0]._ignored)
k0++; k0++;
// find the right menu item matching the model item // find the right menu item matching the model item
for (j0 = 0; j0 < position; j0++, k0++) { for (j0 = 0; k0 < currentItems.length && j0 < position; j0++, k0++) {
if (currentItems[k0]._ignored) if (currentItems[k0]._ignored)
k0++; k0++;
} }
@ -1927,7 +1930,7 @@ const RemoteMenu = new Lang.Class({
for (k = k0; k < currentItems.length; k++) for (k = k0; k < currentItems.length; k++)
currentItems[k].destroy(); currentItems[k].destroy();
} else { } else {
for (j = j0, k = k0; j < j0 + removed; j++, k++) { for (j = j0, k = k0; k < currentItems.length && j < j0 + removed; j++, k++) {
currentItems[k].destroy(); currentItems[k].destroy();
if (currentItems[k]._ignored) if (currentItems[k]._ignored)
@ -1958,8 +1961,9 @@ const RemoteMenu = new Lang.Class({
k++; k++;
} }
} else if (changeSignal) { } else if (changeSignal) {
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function() { let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
this.actionGroup.disconnect(signalId); actionGroup.disconnect(signalId);
if (this._actions[actionName]) return;
// force a full update // force a full update
this._modelChanged(model, 0, -1, model.get_n_items(), target); this._modelChanged(model, 0, -1, model.get_n_items(), target);

View File

@ -62,10 +62,25 @@ function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
let remoteProvider, title; let remoteProvider, title;
try { try {
let group = KEY_FILE_GROUP; let group = KEY_FILE_GROUP;
let icon = keyfile.get_string(group, 'Icon');
let busName = keyfile.get_string(group, 'BusName'); let busName = keyfile.get_string(group, 'BusName');
let objectPath = keyfile.get_string(group, 'ObjectPath'); let objectPath = keyfile.get_string(group, 'ObjectPath');
title = keyfile.get_locale_string(group, 'Title', null);
let appInfo = null;
try {
let desktopId = keyfile.get_string(group, 'DesktopId');
appInfo = Gio.DesktopAppInfo.new(desktopId);
} catch (e) {
}
let icon;
if (appInfo) {
icon = appInfo.get_icon();
title = appInfo.get_name();
} else {
let iconName = keyfile.get_string(group, 'Icon');
icon = new Gio.ThemedIcon({ name: iconName });
title = keyfile.get_locale_string(group, 'Title', null);
}
remoteProvider = new RemoteSearchProvider(title, remoteProvider = new RemoteSearchProvider(title,
icon, icon,
@ -91,7 +106,6 @@ const RemoteSearchProvider = new Lang.Class({
dbusName, dbusPath); dbusName, dbusPath);
this.parent(title.toUpperCase()); this.parent(title.toUpperCase());
this.async = true;
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
}, },
@ -120,7 +134,7 @@ const RemoteSearchProvider = new Lang.Class({
this.searchSystem.pushResults(this, results[0]); this.searchSystem.pushResults(this, results[0]);
}, },
getInitialResultSetAsync: function(terms) { getInitialResultSet: function(terms) {
this._cancellable.cancel(); this._cancellable.cancel();
this._cancellable.reset(); this._cancellable.reset();
try { try {
@ -133,7 +147,7 @@ const RemoteSearchProvider = new Lang.Class({
} }
}, },
getSubsearchResultSetAsync: function(previousResults, newTerms) { getSubsearchResultSet: function(previousResults, newTerms) {
this._cancellable.cancel(); this._cancellable.cancel();
this._cancellable.reset(); this._cancellable.reset();
try { try {
@ -164,7 +178,7 @@ const RemoteSearchProvider = new Lang.Class({
callback(resultMetas); callback(resultMetas);
}, },
getResultMetasAsync: function(ids, callback) { getResultMetas: function(ids, callback) {
this._cancellable.cancel(); this._cancellable.cancel();
this._cancellable.reset(); this._cancellable.reset();
try { try {

View File

@ -18,9 +18,7 @@ const DISABLED_OPEN_SEARCH_PROVIDERS_KEY = 'disabled-open-search-providers';
const MatchType = { const MatchType = {
NONE: 0, NONE: 0,
SUBSTRING: 1, SUBSTRING: 1,
MULTIPLE_SUBSTRING: 2, PREFIX: 2
PREFIX: 3,
MULTIPLE_PREFIX: 4
}; };
const SearchResultDisplay = new Lang.Class({ const SearchResultDisplay = new Lang.Class({
@ -53,7 +51,7 @@ const SearchResultDisplay = new Lang.Class({
* Remove all results from this display. * Remove all results from this display.
*/ */
clear: function() { clear: function() {
this.actor.get_children().forEach(function (actor) { actor.destroy(); }); this.actor.destroy_all_children();
}, },
/** /**
@ -72,11 +70,8 @@ const SearchResultDisplay = new Lang.Class({
* Subclass this object to add a new result type * Subclass this object to add a new result type
* to the search system, then call registerProvider() * to the search system, then call registerProvider()
* in SearchSystem with an instance. * in SearchSystem with an instance.
* By default, search is synchronous and uses the * Search is asynchronous and uses the
* getInitialResultSet()/getSubsearchResultSet() methods. * getInitialResultSet()/getSubsearchResultSet() methods.
* For asynchronous search, set the async property to true
* and implement getInitialResultSetAsync()/getSubsearchResultSetAsync()
* instead.
*/ */
const SearchProvider = new Lang.Class({ const SearchProvider = new Lang.Class({
Name: 'SearchProvider', Name: 'SearchProvider',
@ -84,7 +79,6 @@ const SearchProvider = new Lang.Class({
_init: function(title) { _init: function(title) {
this.title = title; this.title = title;
this.searchSystem = null; this.searchSystem = null;
this.async = false;
}, },
/** /**
@ -95,7 +89,7 @@ const SearchProvider = new Lang.Class({
* therefore a single term of length one or two), or when * therefore a single term of length one or two), or when
* a new term is added. * a new term is added.
* *
* Should return an array of result identifier strings representing * Should "return" an array of result identifier strings representing
* items which match the given search terms. This * items which match the given search terms. This
* is expected to be a substring match on the metadata for a given * is expected to be a substring match on the metadata for a given
* item. Ordering of returned results is up to the discretion of the provider, * item. Ordering of returned results is up to the discretion of the provider,
@ -105,6 +99,9 @@ const SearchProvider = new Lang.Class({
* description) before single matches * description) before single matches
* * Put items which match on a prefix before non-prefix substring matches * * Put items which match on a prefix before non-prefix substring matches
* *
* We say "return" above, but in order to make the query asynchronous, use
* this.searchSystem.pushResults();. The return value should be ignored.
*
* This function should be fast; do not perform unindexed full-text searches * This function should be fast; do not perform unindexed full-text searches
* or network queries. * or network queries.
*/ */
@ -112,18 +109,6 @@ const SearchProvider = new Lang.Class({
throw new Error('Not implemented'); throw new Error('Not implemented');
}, },
/**
* getInitialResultSetAsync:
* @terms: Array of search terms, treated as logical AND
*
* Like getInitialResultSet(), but the method should return immediately
* without a return value - use SearchSystem.pushResults() when the
* corresponding results are ready.
*/
getInitialResultSetAsync: function(terms) {
throw new Error('Not implemented');
},
/** /**
* getSubsearchResultSet: * getSubsearchResultSet:
* @previousResults: Array of item identifiers * @previousResults: Array of item identifiers
@ -136,46 +121,23 @@ const SearchProvider = new Lang.Class({
* *
* This allows search providers to only search through the previous * This allows search providers to only search through the previous
* result set, rather than possibly performing a full re-query. * result set, rather than possibly performing a full re-query.
*
* Similar to getInitialResultSet, the return value for this will
* be ignored; use this.searchSystem.pushResults();.
*/ */
getSubsearchResultSet: function(previousResults, newTerms) { getSubsearchResultSet: function(previousResults, newTerms) {
throw new Error('Not implemented'); throw new Error('Not implemented');
}, },
/**
* getSubsearchResultSetAsync:
* @previousResults: Array of item identifiers
* @newTerms: Updated search terms
*
* Like getSubsearchResultSet(), but the method should return immediately
* without a return value - use SearchSystem.pushResults() when the
* corresponding results are ready.
*/
getSubsearchResultSetAsync: function(previousResults, newTerms) {
throw new Error('Not implemented');
},
/** /**
* getResultMetas: * getResultMetas:
* @ids: Result identifier strings * @ids: Result identifier strings
* *
* Return an array of objects with 'id', 'name', (both strings) and * Call callback with array of objects with 'id', 'name', (both strings) and
* 'createIcon' (function(size) returning a Clutter.Texture) properties * 'createIcon' (function(size) returning a Clutter.Texture) properties
* with the same number of members as @ids * with the same number of members as @ids
*/ */
getResultMetas: function(ids) { getResultMetas: function(ids, callback) {
throw new Error('Not implemented');
},
/**
* getResultMetasAsync:
* @ids: Result identifier strings
* @callback: callback to pass the results to when ready
*
* Like getResultMetas(), but the method should return immediately
* without a return value - pass the results to the provided @callback
* when ready.
*/
getResultMetasAsync: function(ids, callback) {
throw new Error('Not implemented'); throw new Error('Not implemented');
}, },
@ -379,42 +341,33 @@ const SearchSystem = new Lang.Class({
} }
} }
let previousResultsArr = this._previousResults;
let results = []; let results = [];
this._previousTerms = terms;
this._previousResults = results;
if (isSubSearch) { if (isSubSearch) {
for (let i = 0; i < this._providers.length; i++) { for (let i = 0; i < this._providers.length; i++) {
let [provider, previousResults] = this._previousResults[i]; let [provider, previousResults] = previousResultsArr[i];
try { try {
if (provider.async) { results.push([provider, []]);
provider.getSubsearchResultSetAsync(previousResults, terms); provider.getSubsearchResultSet(previousResults, terms);
results.push([provider, []]);
} else {
let providerResults = provider.getSubsearchResultSet(previousResults, terms);
results.push([provider, providerResults]);
}
} catch (error) { } catch (error) {
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message); log('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
} }
} }
} else { } else {
for (let i = 0; i < this._providers.length; i++) { for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i]; let provider = this._providers[i];
try { try {
if (provider.async) { results.push([provider, []]);
provider.getInitialResultSetAsync(terms); provider.getInitialResultSet(terms);
results.push([provider, []]);
} else {
let providerResults = provider.getInitialResultSet(terms);
results.push([provider, providerResults]);
}
} catch (error) { } catch (error) {
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message); log('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
} }
} }
} }
this._previousTerms = terms;
this._previousResults = results;
this.emit('search-completed', results);
}, },
}); });
Signals.addSignalMethods(SearchSystem.prototype); Signals.addSignalMethods(SearchSystem.prototype);

View File

@ -5,6 +5,7 @@ const Lang = imports.lang;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const St = imports.gi.St; const St = imports.gi.St;
const Atk = imports.gi.Atk;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const IconGrid = imports.ui.iconGrid; const IconGrid = imports.ui.iconGrid;
@ -33,12 +34,13 @@ const SearchResult = new Lang.Class({
content = new St.Bin({ style_class: 'search-result-content', content = new St.Bin({ style_class: 'search-result-content',
reactive: true, reactive: true,
can_focus: true, can_focus: true,
track_hover: true }); track_hover: true,
accessible_role: Atk.Role.PUSH_BUTTON });
let icon = new IconGrid.BaseIcon(this.metaInfo['name'], let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] }); { createIcon: this.metaInfo['createIcon'] });
content.set_child(icon.actor); content.set_child(icon.actor);
this._dragActorSource = icon.icon; this._dragActorSource = icon.icon;
this.actor.label_actor = icon.label; content.label_actor = icon.label;
} else { } else {
if (content._delegate && content._delegate.getDragActorSource) if (content._delegate && content._delegate.getDragActorSource)
this._dragActorSource = content._delegate.getDragActorSource(); this._dragActorSource = content._delegate.getDragActorSource();
@ -119,13 +121,7 @@ const GridSearchResults = new Lang.Class({
if (results.length == 0) if (results.length == 0)
return; return;
if (provider.async) { provider.getResultMetas(results, Lang.bind(this, this.renderResults));
provider.getResultMetasAsync(results,
Lang.bind(this, this.renderResults));
} else {
let metas = provider.getResultMetas(results);
this.renderResults(metas);
}
})); }));
})); }));
this._notDisplayedResult = []; this._notDisplayedResult = [];
@ -135,7 +131,7 @@ const GridSearchResults = new Lang.Class({
getResultsForDisplay: function() { getResultsForDisplay: function() {
let alreadyVisible = this._pendingClear ? 0 : this._grid.visibleItemsCount(); let alreadyVisible = this._pendingClear ? 0 : this._grid.visibleItemsCount();
let canDisplay = this._grid.childrenInRow(this._width) * MAX_SEARCH_RESULTS_ROWS let canDisplay = this._grid.childrenInRow(this._width) * this._grid.getRowLimit()
- alreadyVisible; - alreadyVisible;
let numResults = Math.min(this._notDisplayedResult.length, canDisplay); let numResults = Math.min(this._notDisplayedResult.length, canDisplay);
@ -179,8 +175,7 @@ const SearchResults = new Lang.Class({
_init: function(searchSystem, openSearchSystem) { _init: function(searchSystem, openSearchSystem) {
this._searchSystem = searchSystem; this._searchSystem = searchSystem;
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateCurrentResults)); this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this._searchSystem.connect('search-completed', Lang.bind(this, this._updateResults));
this._openSearchSystem = openSearchSystem; this._openSearchSystem = openSearchSystem;
this.actor = new St.BoxLayout({ name: 'searchResults', this.actor = new St.BoxLayout({ name: 'searchResults',
@ -214,10 +209,8 @@ const SearchResults = new Lang.Class({
this._content.add(this._statusText); this._content.add(this._statusText);
this._providers = this._searchSystem.getProviders(); this._providers = this._searchSystem.getProviders();
this._providerMeta = []; this._providerMeta = [];
this._providerMetaResults = {};
for (let i = 0; i < this._providers.length; i++) { for (let i = 0; i < this._providers.length; i++) {
this.createProviderMeta(this._providers[i]); this.createProviderMeta(this._providers[i]);
this._providerMetaResults[this.providers[i].title] = [];
} }
this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' }); this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' });
this.actor.add(this._searchProvidersBox); this.actor.add(this._searchProvidersBox);
@ -290,8 +283,7 @@ const SearchResults = new Lang.Class({
this._providerMeta.push({ provider: provider, this._providerMeta.push({ provider: provider,
actor: providerBox, actor: providerBox,
resultDisplay: resultDisplay, resultDisplay: resultDisplay });
hasPendingResults: false });
this._content.add(providerBox); this._content.add(providerBox);
}, },
@ -307,7 +299,6 @@ const SearchResults = new Lang.Class({
}, },
_clearDisplay: function() { _clearDisplay: function() {
this._visibleResultsCount = 0;
for (let i = 0; i < this._providerMeta.length; i++) { for (let i = 0; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i]; let meta = this._providerMeta[i];
meta.resultDisplay.clear(); meta.resultDisplay.clear();
@ -335,6 +326,8 @@ const SearchResults = new Lang.Class({
doSearch: function (searchString) { doSearch: function (searchString) {
this._searchSystem.updateSearch(searchString); this._searchSystem.updateSearch(searchString);
let terms = this._searchSystem.getTerms();
this._openSearchSystem.setSearchTerms(terms);
}, },
_metaForProvider: function(provider) { _metaForProvider: function(provider) {
@ -346,8 +339,6 @@ const SearchResults = new Lang.Class({
for (let i = 0; i < this._providerMeta.length; i++) { for (let i = 0; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i]; let meta = this._providerMeta[i];
if (meta.hasPendingResults)
return;
if (!meta.actor.visible) if (!meta.actor.visible)
continue; continue;
@ -372,71 +363,57 @@ const SearchResults = new Lang.Class({
} }
}, },
_updateCurrentResults: function(searchSystem, results) { _updateStatusText: function () {
let terms = searchSystem.getTerms(); let haveResults = false;
let [provider, providerResults] = results;
let meta = this._metaForProvider(provider);
meta.hasPendingResults = false;
this._updateProviderResults(provider, providerResults, terms);
},
_updateProviderResults: function(provider, providerResults, terms) { for (let i = 0; i < this._providerMeta.length; ++i)
let meta = this._metaForProvider(provider); if (this._providerMeta[i].resultDisplay.getFirstResult()) {
if (providerResults.length == 0) { haveResults = true;
this._clearDisplayForProvider(provider); break;
meta.resultDisplay.setResults([], []);
} else {
this._providerMetaResults[provider.title] = providerResults;
meta.resultDisplay.setResults(providerResults, terms);
let results = meta.resultDisplay.getResultsForDisplay();
if (provider.async) {
provider.getResultMetasAsync(results, Lang.bind(this,
function(metas) {
this._clearDisplayForProvider(provider);
meta.actor.show();
this._content.hide();
meta.resultDisplay.renderResults(metas);
this._maybeSetInitialSelection();
this._content.show();
}));
} else {
let metas = provider.getResultMetas(results);
this._clearDisplayForProvider(provider);
meta.actor.show();
meta.resultDisplay.renderResults(metas);
} }
}
},
_updateResults: function(searchSystem, results) { if (!haveResults) {
if (results.length == 0) {
this._statusText.set_text(_("No matching results.")); this._statusText.set_text(_("No matching results."));
this._statusText.show(); this._statusText.show();
} else { } else {
this._statusText.hide(); this._statusText.hide();
} }
},
_updateResults: function(searchSystem, results) {
let terms = searchSystem.getTerms(); let terms = searchSystem.getTerms();
this._openSearchSystem.setSearchTerms(terms); let [provider, providerResults] = results;
let meta = this._metaForProvider(provider);
// To avoid CSS transitions causing flickering when the first search if (providerResults.length == 0) {
// result stays the same, we hide the content while filling in the this._clearDisplayForProvider(provider);
// results. meta.resultDisplay.setResults([], []);
this._content.hide(); this._maybeSetInitialSelection();
this._updateStatusText();
} else {
meta.resultDisplay.setResults(providerResults, terms);
let results = meta.resultDisplay.getResultsForDisplay();
for (let i = 0; i < results.length; i++) { provider.getResultMetas(results, Lang.bind(this, function(metas) {
let [provider, providerResults] = results[i]; this._clearDisplayForProvider(provider);
let meta = this._metaForProvider(provider); meta.actor.show();
meta.hasPendingResults = provider.async;
if (!meta.hasPendingResults) // Hiding drops the key focus if we have it
this._updateProviderResults(provider, providerResults, terms); let focus = global.stage.get_key_focus();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this._content.hide();
meta.resultDisplay.renderResults(metas);
this._maybeSetInitialSelection();
this._updateStatusText();
this._content.show();
if (this._content.contains(focus))
global.stage.set_key_focus(focus);
}));
} }
this._maybeSetInitialSelection();
this._content.show();
return true;
}, },
activateDefault: function() { activateDefault: function() {

124
js/ui/sessionMode.js Normal file
View File

@ -0,0 +1,124 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Config = imports.misc.config;
const Main = imports.ui.main;
const Params = imports.misc.params;
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'userMenu': imports.ui.userMenu.UserMenuButton
};
if (Config.HAVE_BLUETOOTH)
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] =
imports.ui.status.bluetooth.Indicator;
try {
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] =
imports.ui.status.network.NMApplet;
} catch(e) {
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
}
const DEFAULT_MODE = 'user';
const _modes = {
'gdm': { hasOverview: false,
hasAppMenu: false,
showCalendarEvents: false,
allowSettings: false,
allowExtensions: false,
allowKeybindingsWhenModal: true,
hasRunDialog: false,
hasWorkspaces: false,
createSession: Main.createGDMSession,
extraStylesheet: global.datadir + '/theme/gdm.css',
statusArea: {
order: [
'a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'
],
implementation: {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
}
}
},
'initial-setup': { hasOverview: false,
hasAppMenu: false,
showCalendarEvents: false,
allowSettings: false,
allowExtensions: false,
allowKeybindingsWhenModal: false,
hasRunDialog: false,
hasWorkspaces: false,
createSession: Main.createInitialSetupSession,
extraStylesheet: null,
statusArea: {
order: [
'a11y', 'keyboard', 'volume'
],
implementation: {
'a11y': imports.ui.status.accessibility.ATIndicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'volume': imports.ui.status.volume.Indicator
}
}
},
'user': { hasOverview: true,
hasAppMenu: true,
showCalendarEvents: true,
allowSettings: true,
allowExtensions: true,
allowKeybindingsWhenModal: false,
hasRunDialog: true,
hasWorkspaces: true,
createSession: Main.createUserSession,
extraStylesheet: null,
statusArea: {
order: [
'input-method', 'a11y', 'keyboard', 'volume', 'bluetooth',
'network', 'battery', 'userMenu'
],
implementation: STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION
}
}
};
function listModes() {
let modes = Object.getOwnPropertyNames(_modes);
for (let i = 0; i < modes.length; i++)
print(modes[i]);
}
const SessionMode = new Lang.Class({
Name: 'SessionMode',
_init: function() {
let params = _modes[global.session_mode];
params = Params.parse(params, _modes[DEFAULT_MODE]);
this._createSession = params.createSession;
delete params.createSession;
Lang.copyProperties(params, this);
},
createSession: function() {
if (this._createSession)
this._createSession();
}
});

View File

@ -7,6 +7,7 @@ const Shell = imports.gi.Shell;
const Config = imports.misc.config; const Config = imports.misc.config;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Flashspot = imports.ui.flashspot; const Flashspot = imports.ui.flashspot;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -56,15 +57,8 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="i" direction="in" name="width"/> <arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/> <arg type="i" direction="in" name="height"/>
</method> </method>
<method name="EnableExtension">
<arg type="s" direction="in" name="uuid"/>
</method>
<method name="DisableExtension">
<arg type="s" direction="in" name="uuid"/>
</method>
<method name="InstallRemoteExtension"> <method name="InstallRemoteExtension">
<arg type="s" direction="in" name="uuid"/> <arg type="s" direction="in" name="uuid"/>
<arg type="s" direction="in" name="version"/>
</method> </method>
<method name="UninstallExtension"> <method name="UninstallExtension">
<arg type="s" direction="in" name="uuid"/> <arg type="s" direction="in" name="uuid"/>
@ -73,6 +67,9 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<method name="LaunchExtensionPrefs"> <method name="LaunchExtensionPrefs">
<arg type="s" direction="in" name="uuid"/> <arg type="s" direction="in" name="uuid"/>
</method> </method>
<method name="ReloadExtension">
<arg type="s" direction="in" name="uuid"/>
</method>
<property name="OverviewActive" type="b" access="readwrite" /> <property name="OverviewActive" type="b" access="readwrite" />
<property name="ApiVersion" type="i" access="read" /> <property name="ApiVersion" type="i" access="read" />
<property name="ShellVersion" type="s" access="read" /> <property name="ShellVersion" type="s" access="read" />
@ -260,26 +257,12 @@ const GnomeShell = new Lang.Class({
return extension.errors; return extension.errors;
}, },
EnableExtension: function(uuid) { InstallRemoteExtension: function(uuid) {
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY); ExtensionDownloader.installExtensionFromUUID(uuid);
if (enabledExtensions.indexOf(uuid) == -1)
enabledExtensions.push(uuid);
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
},
DisableExtension: function(uuid) {
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
while (enabledExtensions.indexOf(uuid) != -1)
enabledExtensions.splice(enabledExtensions.indexOf(uuid), 1);
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
},
InstallRemoteExtension: function(uuid, version_tag) {
ExtensionSystem.installExtensionFromUUID(uuid, version_tag);
}, },
UninstallExtension: function(uuid) { UninstallExtension: function(uuid) {
return ExtensionSystem.uninstallExtensionFromUUID(uuid); return ExtensionDownloader.uninstallExtensionFromUUID(uuid);
}, },
LaunchExtensionPrefs: function(uuid) { LaunchExtensionPrefs: function(uuid) {
@ -289,6 +272,11 @@ const GnomeShell = new Lang.Class({
['extension:///' + uuid], -1, null); ['extension:///' + uuid], -1, null);
}, },
ReloadExtension: function(uuid) {
ExtensionSystem.unloadExtension(uuid);
ExtensionSystem.loadExtension(uuid);
},
get OverviewActive() { get OverviewActive() {
return Main.overview.visible; return Main.overview.visible;
}, },
@ -300,8 +288,6 @@ const GnomeShell = new Lang.Class({
Main.overview.hide(); Main.overview.hide();
}, },
ApiVersion: ExtensionSystem.API_VERSION,
ShellVersion: Config.PACKAGE_VERSION, ShellVersion: Config.PACKAGE_VERSION,
_extensionStateChanged: function(_, newState) { _extensionStateChanged: function(_, newState) {

View File

@ -1,17 +1,21 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const CheckBox = imports.ui.checkBox;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Params = imports.misc.params; const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const LIST_ITEM_ICON_SIZE = 48; const LIST_ITEM_ICON_SIZE = 48;
@ -48,6 +52,11 @@ function _setLabelsForMessage(dialog, message) {
_setLabelText(dialog.descriptionLabel, labels[1]); _setLabelText(dialog.descriptionLabel, labels[1]);
} }
function _createIcon(gicon) {
return new St.Icon({ gicon: gicon,
style_class: 'shell-mount-operation-icon' })
}
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
const ListItem = new Lang.Class({ const ListItem = new Lang.Class({
@ -91,11 +100,11 @@ const ShellMountOperation = new Lang.Class({
Name: 'ShellMountOperation', Name: 'ShellMountOperation',
_init: function(source, params) { _init: function(source, params) {
params = Params.parse(params, { reaskPassword: false }); params = Params.parse(params, { existingDialog: null });
this._reaskPassword = params.reaskPassword;
this._dialog = null; this._dialog = null;
this._dialogId = 0;
this._existingDialog = params.existingDialog;
this._processesDialog = null; this._processesDialog = null;
this.mountOp = new Shell.MountOperation(); this.mountOp = new Shell.MountOperation();
@ -107,99 +116,120 @@ const ShellMountOperation = new Lang.Class({
this.mountOp.connect('show-processes-2', this.mountOp.connect('show-processes-2',
Lang.bind(this, this._onShowProcesses2)); Lang.bind(this, this._onShowProcesses2));
this.mountOp.connect('aborted', this.mountOp.connect('aborted',
Lang.bind(this, this._onAborted)); Lang.bind(this, this.close));
this._icon = new St.Icon({ gicon: source.get_icon(), this._gicon = source.get_icon();
style_class: 'shell-mount-operation-icon' }); },
_closeExistingDialog: function() {
if (!this._existingDialog)
return;
this._existingDialog.close();
this._existingDialog = null;
}, },
_onAskQuestion: function(op, message, choices) { _onAskQuestion: function(op, message, choices) {
this._dialog = new ShellMountQuestionDialog(this._icon); this._closeExistingDialog();
this._dialog = new ShellMountQuestionDialog(this._gicon);
this._dialog.connect('response', this._dialogId = this._dialog.connect('response', Lang.bind(this,
Lang.bind(this, function(object, choice) { function(object, choice) {
this.mountOp.set_choice(choice); this.mountOp.set_choice(choice);
this.mountOp.reply(Gio.MountOperationResult.HANDLED); this.mountOp.reply(Gio.MountOperationResult.HANDLED);
this._dialog.close(global.get_current_time()); this.close();
this._dialog = null; }));
}));
this._dialog.update(message, choices); this._dialog.update(message, choices);
this._dialog.open(global.get_current_time()); this._dialog.open();
}, },
_onAskPassword: function(op, message) { _onAskPassword: function(op, message, defaultUser, defaultDomain, flags) {
this._notificationShowing = true; if (this._existingDialog) {
this._source = new ShellMountPasswordSource(message, this._icon, this._reaskPassword); this._dialog = this._existingDialog;
this._dialog.reaskPassword();
} else {
this._dialog = new ShellMountPasswordDialog(message, this._gicon, flags);
}
this._source.connect('password-ready', this._dialogId = this._dialog.connect('response', Lang.bind(this,
Lang.bind(this, function(source, password) { function(object, choice, password, remember) {
this.mountOp.set_password(password); if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.HANDLED); this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else {
if (remember)
this.mountOp.set_password_save(Gio.PasswordSave.PERMANENTLY);
else
this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
this._notificationShowing = false; this.mountOp.set_password(password);
this._source.destroy(); this.mountOp.reply(Gio.MountOperationResult.HANDLED);
})); }
}));
this._source.connect('destroy', this._dialog.open();
Lang.bind(this, function() {
if (!this._notificationShowing)
return;
this._notificationShowing = false;
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
}));
}, },
_onAborted: function(op) { close: function(op) {
if (!this._dialog) this._closeExistingDialog();
return; this._processesDialog = null;
this._dialog.close(global.get_current_time()); if (this._dialog) {
this._dialog = null; this._dialog.close();
this._dialog = null;
}
}, },
_onShowProcesses2: function(op) { _onShowProcesses2: function(op) {
this._closeExistingDialog();
let processes = op.get_show_processes_pids(); let processes = op.get_show_processes_pids();
let choices = op.get_show_processes_choices(); let choices = op.get_show_processes_choices();
let message = op.get_show_processes_message(); let message = op.get_show_processes_message();
if (!this._processesDialog) { if (!this._processesDialog) {
this._processesDialog = new ShellProcessesDialog(this._icon); this._processesDialog = new ShellProcessesDialog(this._gicon);
this._dialog = this._processesDialog; this._dialog = this._processesDialog;
this._processesDialog.connect('response', this._dialogId = this._processesDialog.connect('response', Lang.bind(this,
Lang.bind(this, function(object, choice) { function(object, choice) {
if (choice == -1) { if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.ABORTED); this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else { } else {
this.mountOp.set_choice(choice); this.mountOp.set_choice(choice);
this.mountOp.reply(Gio.MountOperationResult.HANDLED); this.mountOp.reply(Gio.MountOperationResult.HANDLED);
} }
this._processesDialog.close(global.get_current_time()); this.close();
this._dialog = null; }));
})); this._processesDialog.open();
this._processesDialog.open(global.get_current_time());
} }
this._processesDialog.update(message, processes, choices); this._processesDialog.update(message, processes, choices);
}, },
borrowDialog: function() {
if (this._dialogId != 0) {
this._dialog.disconnect(this._dialogId);
this._dialogId = 0;
}
return this._dialog;
}
}); });
const ShellMountQuestionDialog = new Lang.Class({ const ShellMountQuestionDialog = new Lang.Class({
Name: 'ShellMountQuestionDialog', Name: 'ShellMountQuestionDialog',
Extends: ModalDialog.ModalDialog, Extends: ModalDialog.ModalDialog,
_init: function(icon) { _init: function(gicon) {
this.parent({ styleClass: 'mount-question-dialog' }); this.parent({ styleClass: 'mount-question-dialog' });
let mainContentLayout = new St.BoxLayout(); let mainContentLayout = new St.BoxLayout();
this.contentLayout.add(mainContentLayout, { x_fill: true, this.contentLayout.add(mainContentLayout, { x_fill: true,
y_fill: false }); y_fill: false });
this._iconBin = new St.Bin({ child: icon }); this._iconBin = new St.Bin({ child: _createIcon(gicon) });
mainContentLayout.add(this._iconBin, mainContentLayout.add(this._iconBin,
{ x_fill: true, { x_fill: true,
y_fill: false, y_fill: false,
@ -234,62 +264,107 @@ const ShellMountQuestionDialog = new Lang.Class({
}); });
Signals.addSignalMethods(ShellMountQuestionDialog.prototype); Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
const ShellMountPasswordSource = new Lang.Class({ const ShellMountPasswordDialog = new Lang.Class({
Name: 'ShellMountPasswordSource', Name: 'ShellMountPasswordDialog',
Extends: MessageTray.Source, Extends: ModalDialog.ModalDialog,
_init: function(message, icon, reaskPassword) { _init: function(message, gicon, flags) {
let strings = message.split('\n'); let strings = message.split('\n');
this.parent(strings[0]); this.parent({ styleClass: 'prompt-dialog' });
this._notification = new ShellMountPasswordNotification(this, strings, icon, reaskPassword); let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
vertical: false });
this.contentLayout.add(mainContentBox);
// add ourselves as a source, and popup the notification let icon = _createIcon(gicon);
Main.messageTray.add(this); mainContentBox.add(icon,
this.notify(this._notification); { x_fill: true,
}, y_fill: false,
}); x_align: St.Align.END,
Signals.addSignalMethods(ShellMountPasswordSource.prototype); y_align: St.Align.START });
const ShellMountPasswordNotification = new Lang.Class({ this._messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
Name: 'ShellMountPasswordNotification', vertical: true });
Extends: MessageTray.Notification, mainContentBox.add(this._messageBox,
{ y_align: St.Align.START, expand: true, x_fill: true, y_fill: true });
_init: function(source, strings, icon, reaskPassword) { let subject = new St.Label({ style_class: 'prompt-dialog-headline' });
this.parent(source, strings[0], null, { customContent: true, icon: icon }); this._messageBox.add(subject,
{ y_fill: false,
// set the notification to transient and urgent, so that it y_align: St.Align.START });
// expands out if (strings[0])
this.setTransient(true); subject.set_text(strings[0]);
this.setUrgency(MessageTray.Urgency.CRITICAL);
let description = new St.Label({ style_class: 'prompt-dialog-description' });
description.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
description.clutter_text.line_wrap = true;
this._messageBox.add(description,
{ y_fill: true,
y_align: St.Align.START });
if (strings[1]) if (strings[1])
this.addBody(strings[1]); description.set_text(strings[1]);
if (reaskPassword) { this._passwordBox = new St.BoxLayout({ vertical: false });
let label = new St.Label({ style_class: 'mount-password-reask', this._messageBox.add(this._passwordBox);
text: _("Wrong password, please try again") });
this.addActor(label); this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
text: _("Passphrase") }));
this._passwordBox.add(this._passwordLabel);
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: "",
can_focus: true});
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
this._passwordBox.add(this._passwordEntry, {expand: true });
this.setInitialKeyFocus(this._passwordEntry);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didn\'t work. Please try again.") });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
this._errorMessageLabel.hide();
this._messageBox.add(this._errorMessageLabel);
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox();
this._rememberChoice.getLabelActor().text = _("Remember Passphrase");
this._rememberChoice.actor.checked = true;
this._messageBox.add(this._rememberChoice.actor);
} else {
this._rememberChoice = null;
} }
this._responseEntry = new St.Entry({ style_class: 'mount-password-entry', let buttons = [{ label: _("Cancel"),
can_focus: true }); action: Lang.bind(this, this._onCancelButton),
this.setActionArea(this._responseEntry); key: Clutter.Escape
},
{ label: _("Unlock"),
action: Lang.bind(this, this._onUnlockButton)
}];
this._responseEntry.clutter_text.connect('activate', this.setButtons(buttons);
Lang.bind(this, this._onEntryActivated));
this._responseEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
this._responseEntry.grab_key_focus();
}, },
_onEntryActivated: function() { reaskPassword: function() {
let text = this._responseEntry.get_text(); this._passwordEntry.set_text('');
if (text == '') this._errorMessageLabel.show();
return; },
this.source.emit('password-ready', text); _onCancelButton: function() {
this.emit('response', -1, '', false);
},
_onUnlockButton: function() {
this._onEntryActivate();
},
_onEntryActivate: function() {
this.emit('response', 1,
this._passwordEntry.get_text(),
this._rememberChoice &&
this._rememberChoice.actor.checked);
} }
}); });
@ -297,14 +372,14 @@ const ShellProcessesDialog = new Lang.Class({
Name: 'ShellProcessesDialog', Name: 'ShellProcessesDialog',
Extends: ModalDialog.ModalDialog, Extends: ModalDialog.ModalDialog,
_init: function(icon) { _init: function(gicon) {
this.parent({ styleClass: 'show-processes-dialog' }); this.parent({ styleClass: 'show-processes-dialog' });
let mainContentLayout = new St.BoxLayout(); let mainContentLayout = new St.BoxLayout();
this.contentLayout.add(mainContentLayout, { x_fill: true, this.contentLayout.add(mainContentLayout, { x_fill: true,
y_fill: false }); y_fill: false });
this._iconBin = new St.Bin({ child: icon }); this._iconBin = new St.Bin({ child: _createIcon(gicon) });
mainContentLayout.add(this._iconBin, mainContentLayout.add(this._iconBin,
{ x_fill: true, { x_fill: true,
y_fill: false, y_fill: false,
@ -346,13 +421,13 @@ const ShellProcessesDialog = new Lang.Class({
this._applicationList.connect('actor-added', this._applicationList.connect('actor-added',
Lang.bind(this, function() { Lang.bind(this, function() {
if (this._applicationList.get_children().length == 1) if (this._applicationList.get_n_children() == 1)
scrollView.show(); scrollView.show();
})); }));
this._applicationList.connect('actor-removed', this._applicationList.connect('actor-removed',
Lang.bind(this, function() { Lang.bind(this, function() {
if (this._applicationList.get_children().length == 0) if (this._applicationList.get_n_children() == 0)
scrollView.hide(); scrollView.hide();
})); }));
}, },
@ -386,3 +461,253 @@ const ShellProcessesDialog = new Lang.Class({
} }
}); });
Signals.addSignalMethods(ShellProcessesDialog.prototype); Signals.addSignalMethods(ShellProcessesDialog.prototype);
const GnomeShellMountOpIface = <interface name="org.Gtk.MountOperationHandler">
<method name="AskPassword">
<arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="icon_name"/>
<arg type="s" direction="in" name="default_user"/>
<arg type="s" direction="in" name="default_domain"/>
<arg type="u" direction="in" name="flags"/>
<arg type="u" direction="out" name="response"/>
<arg type="a{sv}" direction="out" name="response_details"/>
</method>
<method name="AskQuestion">
<arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="icon_name"/>
<arg type="as" direction="in" name="choices"/>
<arg type="u" direction="out" name="response"/>
<arg type="a{sv}" direction="out" name="response_details"/>
</method>
<method name="ShowProcesses">
<arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="icon_name"/>
<arg type="ai" direction="in" name="application_pids"/>
<arg type="as" direction="in" name="choices"/>
<arg type="u" direction="out" name="response"/>
<arg type="a{sv}" direction="out" name="response_details"/>
</method>
<method name="Close"/>
</interface>;
const ShellMountOperationType = {
NONE: 0,
ASK_PASSWORD: 1,
ASK_QUESTION: 2,
SHOW_PROCESSES: 3
};
const GnomeShellMountOpHandler = new Lang.Class({
Name: 'GnomeShellMountOpHandler',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler',
Gio.BusNameOwnerFlags.REPLACE, null, null);
this._dialog = null;
this._volumeMonitor = Gio.VolumeMonitor.get();
this._ensureEmptyRequest();
},
_ensureEmptyRequest: function() {
this._currentId = null;
this._currentInvocation = null;
this._currentType = ShellMountOperationType.NONE;
},
_clearCurrentRequest: function(response, details) {
if (this._currentInvocation) {
this._currentInvocation.return_value(
GLib.Variant.new('(ua{sv})', [response, details]));
}
this._ensureEmptyRequest();
},
_setCurrentRequest: function(invocation, id, type) {
let oldId = this._currentId;
let oldType = this._currentType;
let requestId = id + '@' + invocation.get_sender();
this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {});
this._currentInvocation = invocation;
this._currentId = requestId;
this._currentType = type;
if (this._dialog && (oldId == requestId) && (oldType == type))
return true;
return false;
},
_closeDialog: function() {
if (this._dialog) {
this._dialog.close();
this._dialog = null;
}
},
_createGIcon: function(iconName) {
let realIconName = iconName ? iconName : 'drive-harddisk';
return new Gio.ThemedIcon({ name: realIconName,
use_default_fallbacks: true });
},
/**
* AskPassword:
* @id: an opaque ID identifying the object for which the operation is requested
* The ID must be unique in the context of the calling process.
* @message: the message to display
* @icon_name: the name of an icon to display
* @default_user: the default username for display
* @default_domain: the default domain for display
* @flags: a set of GAskPasswordFlags
* @response: a GMountOperationResult
* @response_details: a dictionary containing the response details as
* entered by the user. The dictionary MAY contain the following properties:
* - "password" -> (s): a password to be used to complete the mount operation
* - "password_save" -> (u): a GPasswordSave
*
* The dialog will stay visible until clients call the Close() method, or
* another dialog becomes visible.
* Calling AskPassword again for the same id will have the effect to clear
* the existing dialog and update it with a message indicating the previous
* attempt went wrong.
*/
AskPasswordAsync: function(params, invocation) {
let [id, message, iconName, defaultUser, defaultDomain, flags] = params;
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_PASSWORD)) {
this._dialog.reaskPassword();
return;
}
this._closeDialog();
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
this._dialog.connect('response', Lang.bind(this,
function(object, choice, password, remember) {
let details = {};
let response;
if (choice == -1) {
response = Gio.MountOperationResult.ABORTED;
} else {
response = Gio.MountOperationResult.HANDLED;
let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
details['password_save'] = GLib.Variant.new('u', passSave);
details['password'] = GLib.Variant.new('s', password);
}
this._clearCurrentRequest(response, details);
}));
this._dialog.open();
},
/**
* AskQuestion:
* @id: an opaque ID identifying the object for which the operation is requested
* The ID must be unique in the context of the calling process.
* @message: the message to display
* @icon_name: the name of an icon to display
* @choices: an array of choice strings
* GetResponse:
* @response: a GMountOperationResult
* @response_details: a dictionary containing the response details as
* entered by the user. The dictionary MAY contain the following properties:
* - "choice" -> (i): the chosen answer among the array of strings passed in
*
* The dialog will stay visible until clients call the Close() method, or
* another dialog becomes visible.
* Calling AskQuestion again for the same id will have the effect to clear
* update the dialog with the new question.
*/
AskQuestionAsync: function(params, invocation) {
let [id, message, iconName, choices] = params;
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_QUESTION)) {
this._dialog.update(message, choices);
return;
}
this._closeDialog();
this._dialog = new ShellMountQuestionDialog(this._createGIcon(iconName), message);
this._dialog.connect('response', Lang.bind(this,
function(object, choice) {
this._clearCurrentRequest(Gio.MountOperationResult.HANDLED,
{ choice: GLib.Variant.new('i', choice) });
}));
this._dialog.update(message, choices);
this._dialog.open();
},
/**
* ShowProcesses:
* @id: an opaque ID identifying the object for which the operation is requested
* The ID must be unique in the context of the calling process.
* @message: the message to display
* @icon_name: the name of an icon to display
* @application_pids: the PIDs of the applications to display
* @choices: an array of choice strings
* @response: a GMountOperationResult
* @response_details: a dictionary containing the response details as
* entered by the user. The dictionary MAY contain the following properties:
* - "choice" -> (i): the chosen answer among the array of strings passed in
*
* The dialog will stay visible until clients call the Close() method, or
* another dialog becomes visible.
* Calling ShowProcesses again for the same id will have the effect to clear
* the existing dialog and update it with the new message and the new list
* of processes.
*/
ShowProcessesAsync: function(params, invocation) {
let [id, message, iconName, applicationPids, choices] = params;
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.SHOW_PROCESSES)) {
this._dialog.update(message, applicationPids, choices);
return;
}
this._closeDialog();
this._dialog = new ShellProcessesDialog(this._createGIcon(iconName));
this._dialog.connect('response', Lang.bind(this,
function(object, choice) {
let response;
let details = {};
if (choice == -1) {
response = Gio.MountOperationResult.ABORTED;
} else {
response = Gio.MountOperationResult.HANDLED;
details['choice'] = GLib.Variant.new('i', choice);
}
this._clearCurrentRequest(response, details);
}));
this._dialog.update(message, applicationPids, choices);
this._dialog.open();
},
/**
* Close:
*
* Closes a dialog previously opened by AskPassword, AskQuestion or ShowProcesses.
* If no dialog is open, does nothing.
*/
Close: function(params, invocation) {
this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {});
this._closeDialog();
}
});

View File

@ -56,9 +56,9 @@ const ATIndicator = new Lang.Class({
let textZoom = this._buildFontItem(); let textZoom = this._buildFontItem();
this.menu.addMenuItem(textZoom); this.menu.addMenuItem(textZoom);
// let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
// 'screen-reader-enabled'); 'screen-reader-enabled');
// this.menu.addMenuItem(screenReader); this.menu.addMenuItem(screenReader);
let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA, let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
'screen-keyboard-enabled'); 'screen-keyboard-enabled');

View File

@ -106,10 +106,7 @@ const Indicator = new Lang.Class({
/* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */ /* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */
this._killswitch.setStatus(_("hardware disabled")); this._killswitch.setStatus(_("hardware disabled"));
if (has_adapter) this.actor.visible = has_adapter;
this.actor.show();
else
this.actor.hide();
if (on) { if (on) {
this._discoverable.actor.show(); this._discoverable.actor.show();
@ -308,7 +305,7 @@ const Indicator = new Lang.Class({
_ensureSource: function() { _ensureSource: function() {
if (!this._source) { if (!this._source) {
this._source = new Source(); this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active', St.IconType.SYMBOLIC);
Main.messageTray.add(this._source); Main.messageTray.add(this._source);
} }
}, },
@ -333,35 +330,6 @@ const Indicator = new Lang.Class({
} }
}); });
const Source = new Lang.Class({
Name: 'BluetoothSource',
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Bluetooth"));
this._setSummaryIcon(this.createNotificationIcon());
},
notify: function(notification) {
this._private_destroyId = notification.connect('destroy', Lang.bind(this, function(notification) {
if (this.notification == notification) {
// the destroyed notification is the last for this source
this.notification.disconnect(this._private_destroyId);
this.destroy();
}
}));
this.parent(notification);
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'bluetooth-active',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
}
});
const AuthNotification = new Lang.Class({ const AuthNotification = new Lang.Class({
Name: 'AuthNotification', Name: 'AuthNotification',
Extends: MessageTray.Notification, Extends: MessageTray.Notification,
@ -412,7 +380,7 @@ const ConfirmNotification = new Lang.Class({
this._applet = applet; this._applet = applet;
this._devicePath = device_path; this._devicePath = device_path;
this.addBody(_("Device %s wants to pair with this computer").format(long_name)); this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addBody(_("Please confirm whether the PIN '%s' matches the one on the device.").format(pin)); this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin));
this.addButton('matches', _("Matches")); this.addButton('matches', _("Matches"));
this.addButton('does-not-match', _("Does not match")); this.addButton('does-not-match', _("Does not match"));
@ -448,7 +416,8 @@ const PinNotification = new Lang.Class({
this._entry.connect('key-release-event', Lang.bind(this, function(entry, event) { this._entry.connect('key-release-event', Lang.bind(this, function(entry, event) {
let key = event.get_key_symbol(); let key = event.get_key_symbol();
if (key == Clutter.KEY_Return) { if (key == Clutter.KEY_Return) {
this.emit('action-invoked', 'ok'); if (this._canActivateOkButton())
this.emit('action-invoked', 'ok');
return true; return true;
} else if (key == Clutter.KEY_Escape) { } else if (key == Clutter.KEY_Escape) {
this.emit('action-invoked', 'cancel'); this.emit('action-invoked', 'cancel');
@ -461,6 +430,12 @@ const PinNotification = new Lang.Class({
this.addButton('ok', _("OK")); this.addButton('ok', _("OK"));
this.addButton('cancel', _("Cancel")); this.addButton('cancel', _("Cancel"));
this.setButtonSensitive('ok', this._canActivateOkButton());
this._entry.clutter_text.connect('text-changed', Lang.bind(this,
function() {
this.setButtonSensitive('ok', this._canActivateOkButton());
}));
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'ok') { if (action == 'ok') {
if (this._numeric) { if (this._numeric) {
@ -483,6 +458,11 @@ const PinNotification = new Lang.Class({
})); }));
}, },
_canActivateOkButton: function() {
// PINs have a fixed length of 6
return this._entry.clutter_text.text.length == 6;
},
grabFocus: function(lockTray) { grabFocus: function(lockTray) {
this.parent(lockTray); this.parent(lockTray);
global.stage.set_key_focus(this._entry); global.stage.set_key_focus(this._entry);

View File

@ -2,9 +2,9 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GdkPixbuf = imports.gi.GdkPixbuf; const GdkPixbuf = imports.gi.GdkPixbuf;
const Gkbd = imports.gi.Gkbd;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@ -14,34 +14,32 @@ const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const Util = imports.misc.util; const Util = imports.misc.util;
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
const KEY_CURRENT_INPUT_SOURCE = 'current';
const KEY_INPUT_SOURCES = 'sources';
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const LayoutMenuItem = new Lang.Class({ const LayoutMenuItem = new Lang.Class({
Name: 'LayoutMenuItem', Name: 'LayoutMenuItem',
Extends: PopupMenu.PopupBaseMenuItem, Extends: PopupMenu.PopupBaseMenuItem,
_init: function(config, id, indicator, long_name) { _init: function(displayName, shortName) {
this.parent(); this.parent();
this._config = config; this.label = new St.Label({ text: displayName });
this._id = id; this.indicator = new St.Label({ text: shortName });
this.label = new St.Label({ text: long_name });
this.indicator = indicator;
this.addActor(this.label); this.addActor(this.label);
this.addActor(this.indicator); this.addActor(this.indicator);
},
activate: function(event) {
this.parent(event);
this._config.lock_group(this._id);
} }
}); });
const XKBIndicator = new Lang.Class({ const InputSourceIndicator = new Lang.Class({
Name: 'XKBIndicator', Name: 'InputSourceIndicator',
Extends: PanelMenu.Button, Extends: PanelMenu.Button,
_init: function() { _init: function() {
this.parent(0.0); this.parent(0.0, _("Keyboard"));
this._container = new Shell.GenericContainer(); this._container = new Shell.GenericContainer();
this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth)); this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
@ -50,122 +48,144 @@ const XKBIndicator = new Lang.Class({
this.actor.add_actor(this._container); this.actor.add_actor(this._container);
this.actor.add_style_class_name('panel-status-button'); this.actor.add_style_class_name('panel-status-button');
this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' }); this._labelActors = {};
this._container.add_actor(this._iconActor); this._layoutItems = {};
this._labelActors = [ ];
this._layoutItems = [ ];
this._showFlags = false; this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._config = Gkbd.Configuration.get(); this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
this._config.connect('changed', Lang.bind(this, this._syncConfig)); this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
this._config.connect('group-changed', Lang.bind(this, this._syncGroup));
this._config.start_listen();
this._syncConfig(); this._currentSourceIndex = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
this._xkbInfo = new GnomeDesktop.XkbInfo();
if (global.session_type == Shell.SessionType.USER) { this._inputSourcesChanged();
// re-using "allowSettings" for the keyboard layout is a bit shady,
// but at least for now it is used as "allow popping up windows
// from shell menus"; we can always add a separate sessionMode
// option if need arises.
if (Main.sessionMode.allowSettings) {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() { this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
Main.overview.hide();
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
}));
} }
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop'); this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
}, },
_adjustGroupNames: function(names) { _currentInputSourceChanged: function() {
// Disambiguate duplicate names with a subscript let nVisibleSources = Object.keys(this._layoutItems).length;
// This is O(N^2) to avoid sorting names if (nVisibleSources < 2)
// but N <= 4 so who cares? return;
for (let i = 0; i < names.length; i++) { let nSources = this._settings.get_value(KEY_INPUT_SOURCES).n_children();
let name = names[i]; let newCurrentSourceIndex = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
let cnt = 0; if (newCurrentSourceIndex >= nSources)
for (let j = i + 1; j < names.length; j++) { return;
if (names[j] == name) {
cnt++; if (!this._layoutItems[newCurrentSourceIndex]) {
// U+2081 SUBSCRIPT ONE // This source index is invalid as we weren't able to
names[j] = name + String.fromCharCode(0x2081 + cnt); // build a menu item for it, so we hide ourselves since we
} // can't fix it here. *shrug*
} this.menu.close();
if (cnt != 0) this.actor.hide();
names[i] = name + '\u2081'; return;
} else {
this.actor.show();
} }
return names; if (this._layoutItems[this._currentSourceIndex]) {
this._layoutItems[this._currentSourceIndex].setShowDot(false);
this._container.set_skip_paint(this._labelActors[this._currentSourceIndex], true);
}
this._layoutItems[newCurrentSourceIndex].setShowDot(true);
this._container.set_skip_paint(this._labelActors[newCurrentSourceIndex], false);
this._currentSourceIndex = newCurrentSourceIndex;
}, },
_syncConfig: function() { _inputSourcesChanged: function() {
this._showFlags = this._config.if_flags_shown(); let sources = this._settings.get_value(KEY_INPUT_SOURCES);
if (this._showFlags) { let nSources = sources.n_children();
this._container.set_skip_paint(this._iconActor, false);
} else { for (let i in this._layoutItems)
this._container.set_skip_paint(this._iconActor, true); this._layoutItems[i].destroy();
for (let i in this._labelActors)
this._labelActors[i].destroy();
this._layoutItems = {};
this._labelActors = {};
let infos = [];
let infosByShortName = {};
for (let i = 0; i < nSources; i++) {
let [type, id] = sources.get_child_value(i).deep_unpack();
if (type != INPUT_SOURCE_TYPE_XKB)
continue;
let info = {};
[info.exists, info.displayName, info.shortName, , ] =
this._xkbInfo.get_layout_info(id);
if (!info.exists)
continue;
info.sourceIndex = i;
if (!(info.shortName in infosByShortName))
infosByShortName[info.shortName] = [];
infosByShortName[info.shortName].push(info);
infos.push(info);
} }
let groups = this._config.get_group_names(); if (infos.length > 1) {
if (groups.length > 1) {
this.actor.show(); this.actor.show();
} else { } else {
this.menu.close(); this.menu.close();
this.actor.hide(); this.actor.hide();
} }
for (let i = 0; i < this._layoutItems.length; i++) for (let i = 0; i < infos.length; i++) {
this._layoutItems[i].destroy(); let info = infos[i];
if (infosByShortName[info.shortName].length > 1) {
let sub = infosByShortName[info.shortName].indexOf(info) + 1;
info.shortName += String.fromCharCode(0x2080 + sub);
}
for (let i = 0; i < this._labelActors.length; i++) let item = new LayoutMenuItem(info.displayName, info.shortName);
this._labelActors[i].destroy(); this._layoutItems[info.sourceIndex] = item;
let short_names = this._adjustGroupNames(this._config.get_short_group_names());
this._selectedLayout = null;
this._layoutItems = [ ];
this._selectedLabel = null;
this._labelActors = [ ];
for (let i = 0; i < groups.length; i++) {
let icon_name = this._config.get_group_name(i);
let actor;
if (this._showFlags)
actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon' });
else
actor = new St.Label({ text: short_names[i] });
let item = new LayoutMenuItem(this._config, i, actor, groups[i]);
item._short_group_name = short_names[i];
item._icon_name = icon_name;
this._layoutItems.push(item);
this.menu.addMenuItem(item, i); this.menu.addMenuItem(item, i);
item.connect('activate', Lang.bind(this, function() {
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
GLib.Variant.new_uint32(info.sourceIndex));
}));
let shortLabel = new St.Label({ text: short_names[i] }); let shortLabel = new St.Label({ text: info.shortName });
this._labelActors.push(shortLabel); this._labelActors[info.sourceIndex] = shortLabel;
this._container.add_actor(shortLabel); this._container.add_actor(shortLabel);
this._container.set_skip_paint(shortLabel, true); this._container.set_skip_paint(shortLabel, true);
} }
this._syncGroup(); this._currentInputSourceChanged();
}, },
_syncGroup: function() { _showLayout: function() {
let selected = this._config.get_current_group(); Main.overview.hide();
if (this._selectedLayout) { let sources = this._settings.get_value(KEY_INPUT_SOURCES);
this._selectedLayout.setShowDot(false); let current = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
this._selectedLayout = null; let id = sources.get_child_value(current).deep_unpack()[1];
} let [, , , xkbLayout, xkbVariant] = this._xkbInfo.get_layout_info(id);
if (this._selectedLabel) { if (!xkbLayout || xkbLayout.length == 0)
this._container.set_skip_paint(this._selectedLabel, true); return;
this._selectedLabel = null;
}
let item = this._layoutItems[selected]; let description = xkbLayout;
item.setShowDot(true); if (xkbVariant.length > 0)
description = description + '\t' + xkbVariant;
this._iconActor.icon_name = item._icon_name; Util.spawn(['gkbd-keyboard-display', '-l', description]);
this._selectedLabel = this._labelActors[selected];
this._container.set_skip_paint(this._selectedLabel, this._showFlags);
this._selectedLayout = item;
}, },
_containerGetPreferredWidth: function(container, for_height, alloc) { _containerGetPreferredWidth: function(container, for_height, alloc) {
@ -173,15 +193,11 @@ const XKBIndicator = new Lang.Class({
// for the height of all children, but we ignore the results // for the height of all children, but we ignore the results
// for those we don't actually display. // for those we don't actually display.
let max_min_width = 0, max_natural_width = 0; let max_min_width = 0, max_natural_width = 0;
if (this._showFlags)
[max_min_width, max_natural_width] = this._iconActor.get_preferred_width(for_height);
for (let i = 0; i < this._labelActors.length; i++) { for (let i in this._labelActors) {
let [min_width, natural_width] = this._labelActors[i].get_preferred_width(for_height); let [min_width, natural_width] = this._labelActors[i].get_preferred_width(for_height);
if (!this._showFlags) { max_min_width = Math.max(max_min_width, min_width);
max_min_width = Math.max(max_min_width, min_width); max_natural_width = Math.max(max_natural_width, natural_width);
max_natural_width = Math.max(max_natural_width, natural_width);
}
} }
alloc.min_size = max_min_width; alloc.min_size = max_min_width;
@ -190,15 +206,11 @@ const XKBIndicator = new Lang.Class({
_containerGetPreferredHeight: function(container, for_width, alloc) { _containerGetPreferredHeight: function(container, for_width, alloc) {
let max_min_height = 0, max_natural_height = 0; let max_min_height = 0, max_natural_height = 0;
if (this._showFlags)
[max_min_height, max_natural_height] = this._iconActor.get_preferred_height(for_width);
for (let i = 0; i < this._labelActors.length; i++) { for (let i in this._labelActors) {
let [min_height, natural_height] = this._labelActors[i].get_preferred_height(for_width); let [min_height, natural_height] = this._labelActors[i].get_preferred_height(for_width);
if (!this._showFlags) { max_min_height = Math.max(max_min_height, min_height);
max_min_height = Math.max(max_min_height, min_height); max_natural_height = Math.max(max_natural_height, natural_height);
max_natural_height = Math.max(max_natural_height, natural_height);
}
} }
alloc.min_size = max_min_height; alloc.min_size = max_min_height;
@ -212,8 +224,7 @@ const XKBIndicator = new Lang.Class({
box.y2 -= box.y1; box.y2 -= box.y1;
box.y1 = 0; box.y1 = 0;
this._iconActor.allocate_align_fill(box, 0.5, 0, false, false, flags); for (let i in this._labelActors)
for (let i = 0; i < this._labelActors.length; i++)
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags); this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
} }
}); });

View File

@ -101,11 +101,10 @@ const NMNetworkMenuItem = new Lang.Class({
Name: 'NMNetworkMenuItem', Name: 'NMNetworkMenuItem',
Extends: PopupMenu.PopupBaseMenuItem, Extends: PopupMenu.PopupBaseMenuItem,
_init: function(accessPoints, title, params) { _init: function(bestAP, title, params) {
this.parent(params); this.parent(params);
accessPoints = sortAccessPoints(accessPoints); this.bestAP = bestAP;
this.bestAP = accessPoints[0];
if (!title) { if (!title) {
let ssid = this.bestAP.get_ssid(); let ssid = this.bestAP.get_ssid();
@ -127,24 +126,10 @@ const NMNetworkMenuItem = new Lang.Class({
this.bestAP._secType != NMAccessPointSecurity.NONE) this.bestAP._secType != NMAccessPointSecurity.NONE)
this._secureIcon.icon_name = 'network-wireless-encrypted'; this._secureIcon.icon_name = 'network-wireless-encrypted';
this._icons.add_actor(this._secureIcon); this._icons.add_actor(this._secureIcon);
this._accessPoints = [ ];
for (let i = 0; i < accessPoints.length; i++) {
let ap = accessPoints[i];
// need a wrapper object here, because the access points can be shared
// between many NMNetworkMenuItems
let apObj = {
ap: ap,
updateId: ap.connect('notify::strength', Lang.bind(this, this._updated))
};
this._accessPoints.push(apObj);
}
}, },
_updated: function(ap) { updateBestAP: function(ap) {
if (ap.strength > this.bestAP.strength) this.bestAP = ap;
this.bestAP = ap;
this._signalIcon.icon_name = this._getIcon(); this._signalIcon.icon_name = this._getIcon();
}, },
@ -153,36 +138,6 @@ const NMNetworkMenuItem = new Lang.Class({
return 'network-workgroup'; return 'network-workgroup';
else else
return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength); return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength);
},
updateAccessPoints: function(accessPoints) {
for (let i = 0; i < this._accessPoints.length; i++) {
let apObj = this._accessPoints[i];
apObj.ap.disconnect(apObj.updateId);
apObj.updateId = 0;
}
accessPoints = sortAccessPoints(accessPoints);
this.bestAP = accessPoints[0];
this._accessPoints = [ ];
for (let i = 0; i < accessPoints; i++) {
let ap = accessPoints[i];
let apObj = {
ap: ap,
updateId: ap.connect('notify::strength', Lang.bind(this, this._updated))
};
this._accessPoints.push(apObj);
}
},
destroy: function() {
for (let i = 0; i < this._accessPoints.length; i++) {
let apObj = this._accessPoints[i];
apObj.ap.disconnect(apObj.updateId);
apObj.updateId = 0;
}
this.parent();
} }
}); });
@ -297,16 +252,17 @@ const NMDevice = new Lang.Class({
this._client = client; this._client = client;
this._connections = [ ]; this._connections = [ ];
for (let i = 0; i < connections.length; i++) { for (let i = 0; i < connections.length; i++) {
if (!connections[i]._uuid) if (!connections[i].get_uuid())
continue; continue;
if (!this.connectionValid(connections[i])) if (!this.connectionValid(connections[i]))
continue; continue;
// record the connection // record the connection
let obj = { let obj = {
connection: connections[i], connection: connections[i],
name: connections[i]._name, name: connections[i].get_id(),
uuid: connections[i]._uuid, uuid: connections[i].get_uuid(),
timestamp: connections[i]._timestamp, timestamp: connections[i]._timestamp,
item: null,
}; };
this._connections.push(obj); this._connections.push(obj);
} }
@ -401,48 +357,46 @@ const NMDevice = new Lang.Class({
}, },
checkConnection: function(connection) { checkConnection: function(connection) {
let pos = this._findConnection(connection._uuid); let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1; let exists = pos != -1;
let valid = this.connectionValid(connection); let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
if (exists && !valid) // Check if connection changed name or id
this.removeConnection(connection); similar = existing.name == connection.get_id() &&
else if (!exists && valid) existing.timestamp == connection._timestamp;
this.addConnection(connection);
else if (exists && valid) {
// propagate changes and update the UI
if (this._connections[pos].timestamp != connection._timestamp) {
this._connections[pos].timestamp = connection._timestamp;
this._connections.sort(this._connectionSortFunction);
this._clearSection();
this._queueCreateSection();
}
} }
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
}, },
addConnection: function(connection) { addConnection: function(connection) {
// record the connection // record the connection
let obj = { let obj = {
connection: connection, connection: connection,
name: connection._name, name: connection.get_id(),
uuid: connection._uuid, uuid: connection.get_uuid(),
timestamp: connection._timestamp, timestamp: connection._timestamp,
item: null,
}; };
this._connections.push(obj); Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._connections.sort(this._connectionSortFunction);
this._clearSection(); this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
}, },
removeConnection: function(connection) { removeConnection: function(connection) {
if (!connection._uuid) { let pos = this._findConnection(connection.get_uuid());
log('Cannot remove a connection without an UUID');
return;
}
let pos = this._findConnection(connection._uuid);
if (pos == -1) { if (pos == -1) {
// this connection was never added, nothing to do here // this connection was never added, nothing to do here
return; return;
@ -614,7 +568,7 @@ const NMDevice = new Lang.Class({
let title; let title;
let active = this._activeConnection._connection; let active = this._activeConnection._connection;
if (active) { if (active) {
title = active._name; title = active.get_id();
} else { } else {
/* TRANSLATORS: this is the indication that a connection for another logged in user is active, /* TRANSLATORS: this is the indication that a connection for another logged in user is active,
and we cannot access its settings (including the name) */ and we cannot access its settings (including the name) */
@ -707,18 +661,15 @@ const NMDeviceWired = new Lang.Class({
// the device // the device
// we can do it here because addConnection and removeConnection // we can do it here because addConnection and removeConnection
// both call _createSection at some point // both call _createSection at some point
if (this._connections.length <= 1) this.section.actor.visible = this._connections.length > 1;
this.section.actor.hide();
else
this.section.actor.show();
}, },
_createAutomaticConnection: function() { _createAutomaticConnection: function() {
let connection = new NetworkManager.Connection(); let connection = new NetworkManager.Connection();
connection._uuid = NetworkManager.utils_uuid_generate(); let uuid = NetworkManager.utils_uuid_generate();
connection.add_setting(new NetworkManager.SettingWired()); connection.add_setting(new NetworkManager.SettingWired());
connection.add_setting(new NetworkManager.SettingConnection({ connection.add_setting(new NetworkManager.SettingConnection({
uuid: connection._uuid, uuid: uuid,
id: this._autoConnectionName, id: this._autoConnectionName,
type: NetworkManager.SETTING_WIRED_SETTING_NAME, type: NetworkManager.SETTING_WIRED_SETTING_NAME,
autoconnect: true autoconnect: true
@ -862,10 +813,10 @@ const NMDeviceBluetooth = new Lang.Class({
_createAutomaticConnection: function() { _createAutomaticConnection: function() {
let connection = new NetworkManager.Connection; let connection = new NetworkManager.Connection;
connection._uuid = NetworkManager.utils_uuid_generate(); let uuid = NetworkManager.utils_uuid_generate();
connection.add_setting(new NetworkManager.SettingBluetooth); connection.add_setting(new NetworkManager.SettingBluetooth);
connection.add_setting(new NetworkManager.SettingConnection({ connection.add_setting(new NetworkManager.SettingConnection({
uuid: connection._uuid, uuid: uuid,
id: this._autoConnectionName, id: this._autoConnectionName,
type: NetworkManager.SETTING_BLUETOOTH_SETTING_NAME, type: NetworkManager.SETTING_BLUETOOTH_SETTING_NAME,
autoconnect: false autoconnect: false
@ -900,12 +851,12 @@ const NMDeviceVPN = new Lang.Class({
Name: 'NMDeviceVPN', Name: 'NMDeviceVPN',
Extends: NMDevice, Extends: NMDevice,
_init: function(client) { _init: function(client, device, connections) {
// Disable autoconnections // Disable autoconnections
this._autoConnectionName = null; this._autoConnectionName = null;
this.category = NMConnectionCategory.VPN; this.category = NMConnectionCategory.VPN;
this.parent(client, null, [ ]); this.parent(client, null, connections);
}, },
connectionValid: function(connection) { connectionValid: function(connection) {
@ -917,13 +868,24 @@ const NMDeviceVPN = new Lang.Class({
}, },
get connected() { get connected() {
return !!this._activeConnection; if (!this._activeConnection)
return false;
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
}, },
setActiveConnection: function(activeConnection) { setActiveConnection: function(activeConnection) {
if (this._stateChangeId)
this._activeConnection.disconnect(this._stateChangeId);
this._stateChangeId = 0;
this.parent(activeConnection); this.parent(activeConnection);
this.emit('active-connection-changed'); if (this._activeConnection)
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
this.emit('state-changed');
}, },
_shouldShowConnectionList: function() { _shouldShowConnectionList: function() {
@ -936,7 +898,39 @@ const NMDeviceVPN = new Lang.Class({
}, },
getStatusLabel: function() { getStatusLabel: function() {
return null; if (!this._activeConnection) // Same as DISCONNECTED
return null;
switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
_connectionStateChanged: function(connection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
// Differently from real NMDevices, there is no need to queue
// an update of the menu section, contents wouldn't change anyway
this.emit('state-changed');
} }
}); });
@ -987,6 +981,7 @@ const NMDeviceWireless = new Lang.Class({
obj.ssidText = ssidToLabel(obj.ssid); obj.ssidText = ssidToLabel(obj.ssid);
this._networks.push(obj); this._networks.push(obj);
} }
ap._updateId = ap.connect('notify::strength', Lang.bind(this, this._onApStrengthChanged));
// Check if some connection is valid for this AP // Check if some connection is valid for this AP
for (let j = 0; j < validConnections.length; j++) { for (let j = 0; j < validConnections.length; j++) {
@ -998,6 +993,10 @@ const NMDeviceWireless = new Lang.Class({
} }
} }
// Sort APs within each network by strength
for (let i = 0; i < this._networks.length; i++)
sortAccessPoints(this._networks[i].accessPoints);
if (this.device.active_access_point) { if (this.device.active_access_point) {
let networkPos = this._findNetwork(this.device.active_access_point); let networkPos = this._findNetwork(this.device.active_access_point);
@ -1038,13 +1037,8 @@ const NMDeviceWireless = new Lang.Class({
}, },
setEnabled: function(enabled) { setEnabled: function(enabled) {
if (enabled) { this.statusItem.actor.visible = enabled;
this.statusItem.actor.show(); this.section.actor.visible = enabled;
this.section.actor.show();
} else {
this.statusItem.actor.hide();
this.section.actor.hide();
}
}, },
activate: function() { activate: function() {
@ -1085,7 +1079,7 @@ const NMDeviceWireless = new Lang.Class({
// the user toggles the switch and has more than one wireless device) // the user toggles the switch and has more than one wireless device)
if (this._networks.length > 0) { if (this._networks.length > 0) {
let connection = this._createAutomaticConnection(this._networks[0]); let connection = this._createAutomaticConnection(this._networks[0]);
let accessPoints = sortAccessPoints(this._networks[0].accessPoints); let accessPoints = this._networks[0].accessPoints;
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null); this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null);
} }
}, },
@ -1155,6 +1149,13 @@ const NMDeviceWireless = new Lang.Class({
else if (!oneHasConnection && twoHasConnection) else if (!oneHasConnection && twoHasConnection)
return 1; return 1;
let oneStrength = one.accessPoints[0].strength;
let twoStrength = two.accessPoints[0].strength;
// place stronger connections first
if (oneStrength != twoStrength)
return oneStrength < twoStrength ? 1 : -1;
let oneHasSecurity = one.security != NMAccessPointSecurity.NONE; let oneHasSecurity = one.security != NMAccessPointSecurity.NONE;
let twoHasSecurity = two.security != NMAccessPointSecurity.NONE; let twoHasSecurity = two.security != NMAccessPointSecurity.NONE;
@ -1204,6 +1205,28 @@ const NMDeviceWireless = new Lang.Class({
return -1; return -1;
}, },
_onApStrengthChanged: function(ap) {
let res = this._findExistingNetwork(ap);
if (res == null) {
// Uhm... stale signal?
return;
}
let network = this._networks[res.network];
network.accessPoints.splice(res.ap, 1);
Util.insertSorted(network.accessPoints, ap, function(one, two) {
return two.strength - one.strength;
});
this._networks.splice(res.network, 1);
let newPos = Util.insertSorted(this._networks, network, Lang.bind(this, this._networkSortFunction));
if (newPos != res.network) {
this._clearSection();
this._queueCreateSection();
}
},
_accessPointAdded: function(device, accessPoint) { _accessPointAdded: function(device, accessPoint) {
if (accessPoint.get_ssid() == null) { if (accessPoint.get_ssid() == null) {
// This access point is not visible yet // This access point is not visible yet
@ -1223,9 +1246,11 @@ const NMDeviceWireless = new Lang.Class({
return; return;
} }
apObj.accessPoints.push(accessPoint); Util.insertSorted(apObj.accessPoints, accessPoint, function(one, two) {
return two.strength - one.strength;
});
if (apObj.item) if (apObj.item)
apObj.item.updateAccessPoints(apObj.accessPoints); apObj.item.updateBestAP(apObj.accessPoints[0]);
} else { } else {
apObj = { ssid: accessPoint.get_ssid(), apObj = { ssid: accessPoint.get_ssid(),
mode: accessPoint.mode, mode: accessPoint.mode,
@ -1236,6 +1261,7 @@ const NMDeviceWireless = new Lang.Class({
}; };
apObj.ssidText = ssidToLabel(apObj.ssid); apObj.ssidText = ssidToLabel(apObj.ssid);
} }
accessPoint._updateId = accessPoint.connect('notify::strength', Lang.bind(this, this._onApStrengthChanged));
// check if this enables new connections for this group // check if this enables new connections for this group
for (let i = 0; i < this._connections.length; i++) { for (let i = 0; i < this._connections.length; i++) {
@ -1243,23 +1269,26 @@ const NMDeviceWireless = new Lang.Class({
if (accessPoint.connection_valid(connection) && if (accessPoint.connection_valid(connection) &&
apObj.connections.indexOf(connection) == -1) { apObj.connections.indexOf(connection) == -1) {
apObj.connections.push(connection); apObj.connections.push(connection);
// this potentially changes the order
needsupdate = true;
} }
} }
if (pos == -1 || needsupdate) { if (pos != -1)
if (pos != -1) this._networks.splice(pos, 1);
this._networks.splice(pos, 1); let newPos = Util.insertSorted(this._networks, apObj, this._networkSortFunction);
pos = Util.insertSorted(this._networks, apObj, this._networkSortFunction);
// Queue an update of the UI if we changed the order
if (newPos != pos) {
this._clearSection(); this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
} }
}, },
_accessPointRemoved: function(device, accessPoint) { _accessPointRemoved: function(device, accessPoint) {
if (accessPoint._updateId) {
accessPoint.disconnect(accessPoint._updateId);
accessPoint._updateId = 0;
}
let res = this._findExistingNetwork(accessPoint); let res = this._findExistingNetwork(accessPoint);
if (res == null) { if (res == null) {
@ -1301,17 +1330,30 @@ const NMDeviceWireless = new Lang.Class({
this._overflowItem = null; this._overflowItem = null;
} }
} }
this._networks.splice(res.network, 1);
} else if (apObj.item) this._networks.splice(res.network, 1);
apObj.item.updateAccessPoints(apObj.accessPoints); } else {
let okPrev = true, okNext = true;
if (res.network > 0)
okPrev = this._networkSortFunction(this._networks[res.network - 1], apObj) >= 0;
if (res.network < this._networks.length-1)
okNext = this._networkSortFunction(this._networks[res.network + 1], apObj) <= 0;
if (!okPrev || !okNext) {
this._clearSection();
this._queueCreateSection();
} else if (apObj.item) {
apObj.item.updateBestAP(apObj.accessPoints[0]);
}
}
}, },
_createAPItem: function(connection, accessPointObj, useConnectionName) { _createAPItem: function(connection, accessPointObj, useConnectionName) {
let item = new NMNetworkMenuItem(accessPointObj.accessPoints, useConnectionName ? connection._name : undefined); let item = new NMNetworkMenuItem(accessPointObj.accessPoints[0], useConnectionName ? connection.get_id() : undefined);
item._connection = connection; item._connection = connection;
item.connect('activate', Lang.bind(this, function() { item.connect('activate', Lang.bind(this, function() {
let accessPoints = sortAccessPoints(accessPointObj.accessPoints); let accessPoints = accessPointObj.accessPoints;
for (let i = 0; i < accessPoints.length; i++) { for (let i = 0; i < accessPoints.length; i++) {
if (accessPoints[i].connection_valid(connection)) { if (accessPoints[i].connection_valid(connection)) {
this._client.activate_connection(connection, this.device, accessPoints[i].dbus_path, null); this._client.activate_connection(connection, this.device, accessPoints[i].dbus_path, null);
@ -1331,9 +1373,7 @@ const NMDeviceWireless = new Lang.Class({
}, },
removeConnection: function(connection) { removeConnection: function(connection) {
if (!connection._uuid) let pos = this._findConnection(connection.get_uuid());
return;
let pos = this._findConnection(connection._uuid);
if (pos == -1) { if (pos == -1) {
// removing connection that was never added // removing connection that was never added
return; return;
@ -1347,7 +1387,7 @@ const NMDeviceWireless = new Lang.Class({
let apObj = this._networks[i]; let apObj = this._networks[i];
let connections = apObj.connections; let connections = apObj.connections;
for (let k = 0; k < connections.length; k++) { for (let k = 0; k < connections.length; k++) {
if (connections[k]._uuid == connection._uuid) { if (connections[k].get_uuid() == connection.get_uuid()) {
// remove the connection from the access point group // remove the connection from the access point group
connections.splice(k); connections.splice(k);
forceupdate = forceupdate || connections.length == 0; forceupdate = forceupdate || connections.length == 0;
@ -1363,7 +1403,7 @@ const NMDeviceWireless = new Lang.Class({
forceupdate = true; forceupdate = true;
} else { } else {
for (let j = 0; j < items.length; j++) { for (let j = 0; j < items.length; j++) {
if (items[j]._connection._uuid == connection._uuid) { if (items[j]._connection.get_uuid() == connection.get_uuid()) {
items[j].destroy(); items[j].destroy();
break; break;
} }
@ -1390,8 +1430,8 @@ const NMDeviceWireless = new Lang.Class({
// record the connection // record the connection
let obj = { let obj = {
connection: connection, connection: connection,
name: connection._name, name: connection.get_id(),
uuid: connection._uuid, uuid: connection.get_uuid(),
}; };
this._connections.push(obj); this._connections.push(obj);
@ -1420,27 +1460,19 @@ const NMDeviceWireless = new Lang.Class({
}, },
_createActiveConnectionItem: function() { _createActiveConnectionItem: function() {
let icon, title; let title;
if (this._activeConnection && this._activeConnection._connection) { if (this._activeConnection && this._activeConnection._connection)
let connection = this._activeConnection._connection; title = this._activeConnection._connection.get_id();
if (this._activeNetwork) else
this._activeConnectionItem = new NMNetworkMenuItem(this._activeNetwork.accessPoints, undefined, title = _("Connected (private)");
{ reactive: false });
else if (this._activeNetwork)
this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(connection._name, this._activeConnectionItem = new NMNetworkMenuItem(this.device.active_access_point, undefined,
'network-wireless-connected', { reactive: false });
{ reactive: false }); else
} else { this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(title,
// We cannot read the connection (due to ACL, or API incompatibility), but we still show signal if we have it 'network-wireless-connected',
let menuItem; { reactive: false });
if (this._activeNetwork)
this._activeConnectionItem = new NMNetworkMenuItem(this._activeNetwork.accessPoints, undefined,
{ reactive: false });
else
this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(_("Connected (private)"),
'network-wireless-connected',
{ reactive: false });
}
this._activeConnectionItem.setShowDot(true); this._activeConnectionItem.setShowDot(true);
}, },
@ -1480,9 +1512,9 @@ const NMDeviceWireless = new Lang.Class({
apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true)); apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true));
} }
} else { } else {
apObj.item = new NMNetworkMenuItem(apObj.accessPoints); apObj.item = new NMNetworkMenuItem(apObj.accessPoints[0]);
apObj.item.connect('activate', Lang.bind(this, function() { apObj.item.connect('activate', Lang.bind(this, function() {
let accessPoints = sortAccessPoints(apObj.accessPoints); let accessPoints = apObj.accessPoints;
if ( (accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT) if ( (accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT)
|| (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) { || (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) {
// 802.1x-enabled APs require further configuration, so they're // 802.1x-enabled APs require further configuration, so they're
@ -1535,10 +1567,25 @@ const NMDeviceWireless = new Lang.Class({
const NMApplet = new Lang.Class({ const NMApplet = new Lang.Class({
Name: 'NMApplet', Name: 'NMApplet',
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.Button,
_init: function() { _init: function() {
this.parent('network-error', _("Network")); this.parent(0.0, _('Network'));
this._box = new St.BoxLayout({ name: 'networkMenu' });
this.actor.add_actor (this._box);
this.actor.add_style_class_name('panel-status-button');
this._primaryIcon = new St.Icon({ icon_name: 'network-offline',
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' });
this._box.add_actor(this._primaryIcon);
this._secondaryIcon = new St.Icon({ icon_name: 'network-vpn',
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon',
visible: false });
this._box.add_actor(this._secondaryIcon);
this._client = NMClient.Client.new(); this._client = NMClient.Client.new();
@ -1552,6 +1599,16 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(this._statusSection); this.menu.addMenuItem(this._statusSection);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._activeConnections = [ ];
this._connections = [ ];
this._mainConnection = null;
this._vpnConnection = null;
this._activeAccessPointUpdateId = 0;
this._activeAccessPoint = null;
this._mobileUpdateId = 0;
this._mobileUpdateDevice = null;
this._devices = { }; this._devices = { };
this._devices.wired = { this._devices.wired = {
@ -1587,13 +1644,9 @@ const NMApplet = new Lang.Class({
this._devices.vpn = { this._devices.vpn = {
section: new PopupMenu.PopupMenuSection(), section: new PopupMenu.PopupMenuSection(),
device: new NMDeviceVPN(this._client), device: this._makeWrapperDevice(NMDeviceVPN, null),
item: new NMWiredSectionTitleMenuItem(_("VPN Connections")) item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
}; };
this._devices.vpn.device.connect('active-connection-changed', Lang.bind(this, function() {
this._devices.vpn.item.updateForDevice(this._devices.vpn.device);
}));
this._devices.vpn.item.updateForDevice(this._devices.vpn.device);
this._devices.vpn.section.addMenuItem(this._devices.vpn.item); this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section); this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
this._devices.vpn.section.actor.hide(); this._devices.vpn.section.actor.hide();
@ -1601,15 +1654,6 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
this._activeConnections = [ ];
this._connections = [ ];
this._mainConnection = null;
this._activeAccessPointUpdateId = 0;
this._activeAccessPoint = null;
this._mobileUpdateId = 0;
this._mobileUpdateDevice = null;
// Device types // Device types
this._dtypes = { }; this._dtypes = { };
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired; this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
@ -1650,9 +1694,16 @@ const NMApplet = new Lang.Class({
})); }));
}, },
setIcon: function(iconName) {
this._primaryIcon.icon_name = iconName;
},
_ensureSource: function() { _ensureSource: function() {
if (!this._source) { if (!this._source) {
this._source = new NMMessageTraySource(); this._source = new MessageTray.Source(_("Network Manager"),
'network-transmit-receive',
St.IconType.SYMBOLIC);
this._source.connect('destroy', Lang.bind(this, function() { this._source.connect('destroy', Lang.bind(this, function() {
this._source = null; this._source = null;
})); }));
@ -1673,6 +1724,18 @@ const NMApplet = new Lang.Class({
}, },
_syncSectionTitle: function(category) { _syncSectionTitle: function(category) {
if (category == NMConnectionCategory.VPN) {
// Special case VPN: it's only one device (and a fake one
// actually), and we don't show it if empty
let device = this._devices.vpn.device;
let section = this._devices.vpn.section;
let item = this._devices.vpn.item;
section.actor.visible = !device.empty;
item.updateForDevice(device);
return;
}
let devices = this._devices[category].devices; let devices = this._devices[category].devices;
let item = this._devices[category].item; let item = this._devices[category].item;
let section = this._devices[category].section; let section = this._devices[category].section;
@ -1723,6 +1786,29 @@ const NMApplet = new Lang.Class({
this._source.notify(device._notification); this._source.notify(device._notification);
}, },
_makeWrapperDevice: function(wrapperClass, device) {
let wrapper = new wrapperClass(this._client, device, this._connections);
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
}));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.disconnect(wrapper._destroyId);
});
return wrapper;
},
_deviceAdded: function(client, device) { _deviceAdded: function(client, device) {
if (device._delegate) { if (device._delegate) {
// already seen, not adding again // already seen, not adding again
@ -1730,24 +1816,8 @@ const NMApplet = new Lang.Class({
} }
let wrapperClass = this._dtypes[device.get_device_type()]; let wrapperClass = this._dtypes[device.get_device_type()];
if (wrapperClass) { if (wrapperClass) {
let wrapper = new wrapperClass(this._client, device, this._connections); let wrapper = this._makeWrapperDevice(wrapperClass, device);
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
}));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.disconnect(wrapper._destroyId);
});
let section = this._devices[wrapper.category].section; let section = this._devices[wrapper.category].section;
let devices = this._devices[wrapper.category].devices; let devices = this._devices[wrapper.category].devices;
@ -1801,6 +1871,8 @@ const NMApplet = new Lang.Class({
this._activeConnections = newActiveConnections; this._activeConnections = newActiveConnections;
this._mainConnection = null; this._mainConnection = null;
this._vpnConnection = null;
let activating = null; let activating = null;
let default_ip4 = null; let default_ip4 = null;
let default_ip6 = null; let default_ip6 = null;
@ -1834,17 +1906,17 @@ const NMApplet = new Lang.Class({
default_ip4 = a; default_ip4 = a;
if (a.default6) if (a.default6)
default_ip6 = a; default_ip6 = a;
if (a._type == 'vpn') if (a._type == 'vpn')
active_vpn = a; active_vpn = a;
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
activating = a; activating = a;
if (!a._primaryDevice) { if (!a._primaryDevice) {
if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) { if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) {
// find a good device to be considered primary // find a good device to be considered primary
a._primaryDevice = null; a._primaryDevice = null;
let devices = a.get_devices(); let devices = a.get_devices() || [];
for (let j = 0; j < devices.length; j++) { for (let j = 0; j < devices.length; j++) {
let d = devices[j]; let d = devices[j];
if (d._delegate) { if (d._delegate) {
@ -1866,7 +1938,8 @@ const NMApplet = new Lang.Class({
} }
} }
this._mainConnection = activating || active_vpn || default_ip4 || default_ip6 || this._activeConnections[0] || null; this._mainConnection = activating || default_ip4 || default_ip6 || this._activeConnections[0] || null;
this._vpnConnection = active_vpn;
}, },
_notifyActivated: function(activeConnection) { _notifyActivated: function(activeConnection) {
@ -1883,7 +1956,7 @@ const NMApplet = new Lang.Class({
let connections = this._settings.list_connections(); let connections = this._settings.list_connections();
for (let i = 0; i < connections.length; i++) { for (let i = 0; i < connections.length; i++) {
let connection = connections[i]; let connection = connections[i];
if (connection._uuid) { if (connection._updatedId) {
// connection was already seen (for example because NetworkManager was restarted) // connection was already seen (for example because NetworkManager was restarted)
continue; continue;
} }
@ -1896,7 +1969,7 @@ const NMApplet = new Lang.Class({
}, },
_newConnection: function(settings, connection) { _newConnection: function(settings, connection) {
if (connection._uuid) { if (connection._updatedId) {
// connection was already seen // connection was already seen
return; return;
} }
@ -1919,35 +1992,31 @@ const NMApplet = new Lang.Class({
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.removeConnection(connection); this._devices.vpn.device.removeConnection(connection);
if (this._devices.vpn.device.empty) this._syncSectionTitle(section);
this._devices.vpn.section.actor.hide();
} else if (section != NMConnectionCategory.INVALID) { } else if (section != NMConnectionCategory.INVALID) {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) for (let i = 0; i < devices.length; i++)
devices[i].removeConnection(connection); devices[i].removeConnection(connection);
} }
connection._uuid = null;
connection.disconnect(connection._removedId); connection.disconnect(connection._removedId);
connection.disconnect(connection._updatedId); connection.disconnect(connection._updatedId);
connection._removedId = connection._updatedId = 0;
}, },
_updateConnection: function(connection) { _updateConnection: function(connection) {
let connectionSettings = connection.get_setting_by_name(NetworkManager.SETTING_CONNECTION_SETTING_NAME); let connectionSettings = connection.get_setting_by_name(NetworkManager.SETTING_CONNECTION_SETTING_NAME);
connection._type = connectionSettings.type; connection._type = connectionSettings.type;
connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID; connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID;
connection._name = connectionSettings.id;
connection._uuid = connectionSettings.uuid;
connection._timestamp = connectionSettings.timestamp; connection._timestamp = connectionSettings.timestamp;
let section = connection._section; let section = connection._section;
if (connection._section == NMConnectionCategory.INVALID) if (section == NMConnectionCategory.INVALID)
return; return;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.checkConnection(connection); this._devices.vpn.device.checkConnection(connection);
this._devices.vpn.section.actor.show(); this._syncSectionTitle(section);
} else { } else {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) { for (let i = 0; i < devices.length; i++) {
@ -1970,12 +2039,10 @@ const NMApplet = new Lang.Class({
this._statusSection.actor.hide(); this._statusSection.actor.hide();
this._syncSectionTitle('wired'); this._syncSectionTitle(NMConnectionCategory.WIRED);
this._syncSectionTitle('wireless'); this._syncSectionTitle(NMConnectionCategory.WIRELESS);
this._syncSectionTitle('wwan'); this._syncSectionTitle(NMConnectionCategory.WWAN);
this._syncSectionTitle(NMConnectionCategory.VPN);
if (!this._devices.vpn.device.empty)
this._devices.vpn.section.actor.show();
}, },
_syncNMState: function() { _syncNMState: function() {
@ -2018,9 +2085,6 @@ const NMApplet = new Lang.Class({
case NMConnectionCategory.WIRED: case NMConnectionCategory.WIRED:
this.setIcon('network-wired-acquiring'); this.setIcon('network-wired-acquiring');
break; break;
case NMConnectionCategory.VPN:
this.setIcon('network-vpn-acquiring');
break;
default: default:
// fallback to a generic connected icon // fallback to a generic connected icon
// (it could be a private connection of some other user) // (it could be a private connection of some other user)
@ -2083,9 +2147,6 @@ const NMApplet = new Lang.Class({
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality)); this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality));
hasMobileIcon = true; hasMobileIcon = true;
break; break;
case NMConnectionCategory.VPN:
this.setIcon('network-vpn');
break;
default: default:
// fallback to a generic connected icon // fallback to a generic connected icon
// (it could be a private connection of some other user) // (it could be a private connection of some other user)
@ -2094,6 +2155,25 @@ const NMApplet = new Lang.Class({
} }
} }
// update VPN indicator
if (this._vpnConnection) {
let vpnIconName = 'network-vpn';
if (this._vpnConnection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
vpnIconName = 'network-vpn-acquiring';
// only show a separate icon when we're using a wireless/3g connection
if (mc._section == NMConnectionCategory.WIRELESS ||
mc._section == NMConnectionCategory.WWAN) {
this._secondaryIcon.icon_name = vpnIconName;
this._secondaryIcon.visible = true;
} else {
this.setIcon(vpnIconName);
this._secondaryIcon.visible = false;
}
} else {
this._secondaryIcon.visible = false;
}
// cleanup stale signal connections // cleanup stale signal connections
if (!hasApIcon && this._activeAccessPointUpdateId) { if (!hasApIcon && this._activeAccessPointUpdateId) {
@ -2108,18 +2188,3 @@ const NMApplet = new Lang.Class({
} }
} }
}); });
const NMMessageTraySource = new Lang.Class({
Name: 'NMMessageTraySource',
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Network Manager"));
let icon = new St.Icon({ icon_name: 'network-transmit-receive',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE
});
this._setSummaryIcon(icon);
}
});

View File

@ -212,7 +212,7 @@ const DeviceItem = new Lang.Class({
case UPDeviceType.COMPUTER: case UPDeviceType.COMPUTER:
return _("Computer"); return _("Computer");
default: default:
return _("Unknown"); return C_("device", "Unknown");
} }
} }
}); });

View File

@ -149,13 +149,9 @@ const Indicator = new Lang.Class({
} }
} }
} }
if (showInput) {
this._inputTitle.actor.show(); this._inputTitle.actor.visible = showInput;
this._inputSlider.actor.show(); this._inputSlider.actor.visible = showInput;
} else {
this._inputTitle.actor.hide();
this._inputSlider.actor.hide();
}
}, },
_volumeToIcon: function(volume) { _volumeToIcon: function(volume) {

View File

@ -132,6 +132,9 @@ const Client = new Lang.Class({
let channel = channels[i]; let channel = channels[i];
let [targetHandle, targetHandleType] = channel.get_handle(); let [targetHandle, targetHandleType] = channel.get_handle();
if (Shell.is_channel_invalidated(channel))
continue;
/* Only observe contact text channels */ /* Only observe contact text channels */
if ((!(channel instanceof Tp.TextChannel)) || if ((!(channel instanceof Tp.TextChannel)) ||
targetHandleType != Tp.HandleType.CONTACT) targetHandleType != Tp.HandleType.CONTACT)
@ -181,6 +184,9 @@ const Client = new Lang.Class({
continue; continue;
} }
if (Shell.is_channel_invalidated(channel))
continue;
// 'notify' will be true when coming from an actual HandleChannels // 'notify' will be true when coming from an actual HandleChannels
// call, and not when from a successful Claim call. The point is // call, and not when from a successful Claim call. The point is
// we don't want to notify for a channel we just claimed which // we don't want to notify for a channel we just claimed which
@ -231,12 +237,19 @@ const Client = new Lang.Class({
let channel = channels[0]; let channel = channels[0];
let chanType = channel.get_channel_type(); let chanType = channel.get_channel_type();
if (Shell.is_channel_invalidated(channel)) {
Shell.decline_dispatch_op(context, 'Channel is invalidated');
return;
}
if (chanType == Tp.IFACE_CHANNEL_TYPE_TEXT) if (chanType == Tp.IFACE_CHANNEL_TYPE_TEXT)
this._approveTextChannel(account, conn, channel, dispatchOp, context); this._approveTextChannel(account, conn, channel, dispatchOp, context);
else if (chanType == Tp.IFACE_CHANNEL_TYPE_CALL) else if (chanType == Tp.IFACE_CHANNEL_TYPE_CALL)
this._approveCall(account, conn, channel, dispatchOp, context); this._approveCall(account, conn, channel, dispatchOp, context);
else if (chanType == Tp.IFACE_CHANNEL_TYPE_FILE_TRANSFER) else if (chanType == Tp.IFACE_CHANNEL_TYPE_FILE_TRANSFER)
this._approveFileTransfer(account, conn, channel, dispatchOp, context); this._approveFileTransfer(account, conn, channel, dispatchOp, context);
else
Shell.decline_dispatch_op(context, 'Unsupported channel type');
}, },
_approveTextChannel: function(account, conn, channel, dispatchOp, context) { _approveTextChannel: function(account, conn, channel, dispatchOp, context) {
@ -365,8 +378,9 @@ const Client = new Lang.Class({
_ensureSubscriptionSource: function() { _ensureSubscriptionSource: function() {
if (this._subscriptionSource == null) { if (this._subscriptionSource == null) {
this._subscriptionSource = new MultiNotificationSource( this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
_("Subscription request"), 'gtk-dialog-question'); 'gtk-dialog-question',
St.IconType.FULLCOLOR);
Main.messageTray.add(this._subscriptionSource); Main.messageTray.add(this._subscriptionSource);
this._subscriptionSource.connect('destroy', Lang.bind(this, function () { this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
this._subscriptionSource = null; this._subscriptionSource = null;
@ -401,8 +415,9 @@ const Client = new Lang.Class({
_ensureAccountSource: function() { _ensureAccountSource: function() {
if (this._accountSource == null) { if (this._accountSource == null) {
this._accountSource = new MultiNotificationSource( this._accountSource = new MessageTray.Source(_("Connection error"),
_("Connection error"), 'gtk-dialog-error'); 'gtk-dialog-error',
St.IconType.FULLCOLOR);
Main.messageTray.add(this._accountSource); Main.messageTray.add(this._accountSource);
this._accountSource.connect('destroy', Lang.bind(this, function () { this._accountSource.connect('destroy', Lang.bind(this, function () {
this._accountSource = null; this._accountSource = null;
@ -418,14 +433,13 @@ const ChatSource = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(account, conn, channel, contact, client) { _init: function(account, conn, channel, contact, client) {
this.parent(contact.get_alias());
this.isChat = true;
this._account = account; this._account = account;
this._contact = contact; this._contact = contact;
this._client = client; this._client = client;
this.parent(contact.get_alias());
this.isChat = true;
this._pendingMessages = []; this._pendingMessages = [];
this._conn = conn; this._conn = conn;
@ -446,8 +460,6 @@ const ChatSource = new Lang.Class({
this._receivedId = this._channel.connect('message-received', Lang.bind(this, this._messageReceived)); this._receivedId = this._channel.connect('message-received', Lang.bind(this, this._messageReceived));
this._pendingId = this._channel.connect('pending-message-removed', Lang.bind(this, this._pendingRemoved)); this._pendingId = this._channel.connect('pending-message-removed', Lang.bind(this, this._pendingRemoved));
this._setSummaryIcon(this.createNotificationIcon());
this._notifyAliasId = this._contact.connect('notify::alias', Lang.bind(this, this._updateAlias)); this._notifyAliasId = this._contact.connect('notify::alias', Lang.bind(this, this._updateAlias));
this._notifyAvatarId = this._contact.connect('notify::avatar-file', Lang.bind(this, this._updateAvatarIcon)); this._notifyAvatarId = this._contact.connect('notify::avatar-file', Lang.bind(this, this._updateAvatarIcon));
this._presenceChangedId = this._contact.connect('presence-changed', Lang.bind(this, this._presenceChanged)); this._presenceChangedId = this._contact.connect('presence-changed', Lang.bind(this, this._presenceChanged));
@ -510,10 +522,10 @@ const ChatSource = new Lang.Class({
_getLogMessages: function() { _getLogMessages: function() {
let logManager = Tpl.LogManager.dup_singleton(); let logManager = Tpl.LogManager.dup_singleton();
let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT); let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT);
Shell.get_contact_events(logManager,
this._account, entity, logManager.get_filtered_events_async(this._account, entity,
SCROLLBACK_HISTORY_LINES, Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
Lang.bind(this, this._displayPendingMessages)); null, Lang.bind(this, this._displayPendingMessages));
}, },
_displayPendingMessages: function(logManager, result) { _displayPendingMessages: function(logManager, result) {
@ -803,7 +815,7 @@ const ChatNotification = new Lang.Class({
let groups = this._contentArea.get_children(); let groups = this._contentArea.get_children();
for (let i = 0; i < groups.length; i++) { for (let i = 0; i < groups.length; i++) {
let group = groups[i]; let group = groups[i];
if (group.get_children().length == 0) if (group.get_n_children() == 0)
group.destroy(); group.destroy();
} }
}, },
@ -853,6 +865,8 @@ const ChatNotification = new Lang.Class({
this._lastGroupActor.add(body, props.childProps); this._lastGroupActor.add(body, props.childProps);
this.updated();
let timestamp = props.timestamp; let timestamp = props.timestamp;
this._history.unshift({ actor: body, time: timestamp, this._history.unshift({ actor: body, time: timestamp,
realMessage: group != 'meta' }); realMessage: group != 'meta' });
@ -1000,10 +1014,9 @@ const ApproverSource = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(dispatchOp, text, gicon) { _init: function(dispatchOp, text, gicon) {
this.parent(text);
this._gicon = gicon; this._gicon = gicon;
this._setSummaryIcon(this.createNotificationIcon());
this.parent(text);
this._dispatchOp = dispatchOp; this._dispatchOp = dispatchOp;
@ -1026,7 +1039,6 @@ const ApproverSource = new Lang.Class({
createNotificationIcon: function() { createNotificationIcon: function() {
return new St.Icon({ gicon: this._gicon, return new St.Icon({ gicon: this._gicon,
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE }); icon_size: this.ICON_SIZE });
} }
}); });
@ -1149,40 +1161,6 @@ const FileTransferNotification = new Lang.Class({
} }
}); });
// A notification source that can embed multiple notifications
const MultiNotificationSource = new Lang.Class({
Name: 'MultiNotificationSource',
Extends: MessageTray.Source,
_init: function(title, icon) {
this.parent(title);
this._icon = icon;
this._setSummaryIcon(this.createNotificationIcon());
this._nbNotifications = 0;
},
notify: function(notification) {
this.parent(notification);
this._nbNotifications += 1;
// Display the source while there is at least one notification
notification.connect('destroy', Lang.bind(this, function () {
this._nbNotifications -= 1;
if (this._nbNotifications == 0)
this.destroy();
}));
},
createNotificationIcon: function() {
return new St.Icon({ gicon: Gio.icon_new_for_string(this._icon),
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
}
});
// Subscription request // Subscription request
const SubscriptionRequestNotification = new Lang.Class({ const SubscriptionRequestNotification = new Lang.Class({
Name: 'SubscriptionRequestNotification', Name: 'SubscriptionRequestNotification',

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const AccountsService = imports.gi.AccountsService; const AccountsService = imports.gi.AccountsService;
const GdmGreeter = imports.gi.GdmGreeter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
@ -132,7 +133,7 @@ const IMStatusChooserItem = new Lang.Class({
item = new IMStatusItem(_("Busy"), 'user-busy'); item = new IMStatusItem(_("Busy"), 'user-busy');
this._combo.addMenuItem(item, IMStatus.BUSY); this._combo.addMenuItem(item, IMStatus.BUSY);
item = new IMStatusItem(_("Hidden"), 'user-invisible'); item = new IMStatusItem(_("Invisible"), 'user-invisible');
this._combo.addMenuItem(item, IMStatus.HIDDEN); this._combo.addMenuItem(item, IMStatus.HIDDEN);
item = new IMStatusItem(_("Away"), 'user-away'); item = new IMStatusItem(_("Away"), 'user-away');
@ -473,13 +474,22 @@ const UserMenuButton = new Lang.Class({
style_class: 'popup-menu-icon' }); style_class: 'popup-menu-icon' });
this._idleIcon = new St.Icon({ icon_name: 'user-idle', this._idleIcon = new St.Icon({ icon_name: 'user-idle',
style_class: 'popup-menu-icon' }); style_class: 'popup-menu-icon' });
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending',
style_class: 'popup-menu-icon' });
this._accountMgr.connect('most-available-presence-changed', this._accountMgr.connect('most-available-presence-changed',
Lang.bind(this, this._updatePresenceIcon)); Lang.bind(this, this._updatePresenceIcon));
this._accountMgr.connect('account-enabled',
Lang.bind(this, this._onAccountEnabled));
this._accountMgr.connect('account-disabled',
Lang.bind(this, this._onAccountDisabled));
this._accountMgr.connect('account-removed',
Lang.bind(this, this._onAccountDisabled));
this._accountMgr.prepare_async(null, Lang.bind(this, this._accountMgr.prepare_async(null, Lang.bind(this,
function(mgr) { function(mgr) {
let [presence, s, msg] = mgr.get_most_available_presence(); let [presence, s, msg] = mgr.get_most_available_presence();
this._updatePresenceIcon(mgr, presence, s, msg); this._updatePresenceIcon(mgr, presence, s, msg);
this._setupAccounts();
})); }));
this._name = new St.Label(); this._name = new St.Label();
@ -497,13 +507,13 @@ const UserMenuButton = new Lang.Class({
})); }));
this._userManager.connect('notify::is-loaded', this._userManager.connect('notify::is-loaded',
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateMultiUser));
this._userManager.connect('notify::has-multiple-users', this._userManager.connect('notify::has-multiple-users',
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateMultiUser));
this._userManager.connect('user-added', this._userManager.connect('user-added',
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateMultiUser));
this._userManager.connect('user-removed', this._userManager.connect('user-removed',
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateMultiUser));
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY, this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY, this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
@ -542,30 +552,32 @@ const UserMenuButton = new Lang.Class({
this._name.set_text(""); this._name.set_text("");
}, },
_updateMultiUser: function() {
this._updateSwitchUser();
this._updateLogout();
},
_updateSwitchUser: function() { _updateSwitchUser: function() {
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY); let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
if (allowSwitch && let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users;
this._userManager.can_switch() && let multiSession = GdmGreeter.get_session_ids().length > 1;
this._userManager.has_multiple_users)
this._loginScreenItem.actor.show(); this._loginScreenItem.label.set_text(multiUser ? _("Switch User")
else : _("Switch Session"));
this._loginScreenItem.actor.hide(); this._loginScreenItem.actor.visible = allowSwitch && (multiUser || multiSession);
}, },
_updateLogout: function() { _updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY); let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
if (allowLogout) let multiUser = this._userManager.has_multiple_users;
this._logoutItem.actor.show(); let multiSession = GdmGreeter.get_session_ids().length > 1;
else
this._logoutItem.actor.hide(); this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
}, },
_updateLockScreen: function() { _updateLockScreen: function() {
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY); let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
if (allowLockScreen) this._lockScreenItem.actor.visible = allowLockScreen;
this._lockScreenItem.actor.show();
else
this._lockScreenItem.actor.hide();
}, },
_updateHaveShutdown: function() { _updateHaveShutdown: function() {
@ -584,19 +596,16 @@ const UserMenuButton = new Lang.Class({
if (!this._suspendOrPowerOffItem) if (!this._suspendOrPowerOffItem)
return; return;
if (!this._haveShutdown && !this._haveSuspend) this._suspendOrPowerOffItem.actor.visible = this._haveShutdown || this._haveSuspend;
this._suspendOrPowerOffItem.actor.hide();
else
this._suspendOrPowerOffItem.actor.show();
// If we can't suspend show Power Off... instead // If we can't power off show Suspend instead
// and disable the alt key // and disable the alt key
if (!this._haveSuspend) { if (!this._haveShutdown) {
this._suspendOrPowerOffItem.updateText(_("Power Off..."), null);
} else if (!this._haveShutdown) {
this._suspendOrPowerOffItem.updateText(_("Suspend"), null); this._suspendOrPowerOffItem.updateText(_("Suspend"), null);
} else if (!this._haveSuspend) {
this._suspendOrPowerOffItem.updateText(_("Power Off"), null);
} else { } else {
this._suspendOrPowerOffItem.updateText(_("Suspend"), _("Power Off...")); this._suspendOrPowerOffItem.updateText(_("Power Off"), _("Suspend"));
} }
}, },
@ -620,11 +629,52 @@ const UserMenuButton = new Lang.Class({
this._iconBox.child = this._offlineIcon; this._iconBox.child = this._offlineIcon;
}, },
_setupAccounts: function() {
let accounts = this._accountMgr.get_valid_accounts();
for (let i = 0; i < accounts.length; i++) {
accounts[i]._changingId = accounts[i].connect('notify::connection-status',
Lang.bind(this, this._updateChangingPresence));
}
this._updateChangingPresence();
},
_onAccountEnabled: function(accountMgr, account) {
if (!account._changingId)
account._changingId = account.connect('notify::connection-status',
Lang.bind(this, this._updateChangingPresence));
this._updateChangingPresence();
},
_onAccountDisabled: function(accountMgr, account) {
account.disconnect(account._changingId);
account._changingId = 0;
this._updateChangingPresence();
},
_updateChangingPresence: function() {
let accounts = this._accountMgr.get_valid_accounts();
let changing = false;
for (let i = 0; i < accounts.length; i++) {
if (accounts[i].connection_status == Tp.ConnectionStatus.CONNECTING) {
changing = true;
break;
}
}
if (changing) {
this._iconBox.child = this._pendingIcon;
} else {
let [presence, s, msg] = this._accountMgr.get_most_available_presence();
this._updatePresenceIcon(this._accountMgr, presence, s, msg);
}
},
_createSubMenu: function() { _createSubMenu: function() {
let item; let item;
item = new IMStatusChooserItem(); item = new IMStatusChooserItem();
item.connect('activate', Lang.bind(this, this._onMyAccountActivate)); if (Main.sessionMode.allowSettings)
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._statusChooser = item; this._statusChooser = item;
@ -636,28 +686,28 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem(); item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Online Accounts")); if (Main.sessionMode.allowSettings) {
item.connect('activate', Lang.bind(this, this._onOnlineAccountsActivate)); item = new PopupMenu.PopupMenuItem(_("System Settings"));
this.menu.addMenuItem(item); item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
this.menu.addMenuItem(item);
}
item = new PopupMenu.PopupMenuItem(_("System Settings")); item = new PopupMenu.PopupAlternatingMenuItem(_("Power Off"),
item.connect('activate', Lang.bind(this, this._onPreferencesActivate)); _("Suspend"));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item.connect('activate', Lang.bind(this, this._onSuspendOrPowerOffActivate));
this._suspendOrPowerOffItem = item;
this._updateSuspendOrPowerOff();
item = new PopupMenu.PopupSeparatorMenuItem(); item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
this.menu.addMenuItem(item);
this._lockScreenItem = item;
item = new PopupMenu.PopupMenuItem(_("Switch User")); item = new PopupMenu.PopupMenuItem(_("Switch User"));
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate)); item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._loginScreenItem = item; this._loginScreenItem = item;
item = new PopupMenu.PopupMenuItem(_("Log Out...")); item = new PopupMenu.PopupMenuItem(_("Log Out"));
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate)); item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._logoutItem = item; this._logoutItem = item;
@ -665,12 +715,10 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem(); item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item = new PopupMenu.PopupAlternatingMenuItem(_("Suspend"), item = new PopupMenu.PopupMenuItem(_("Lock"));
_("Power Off...")); item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._suspendOrPowerOffItem = item; this._lockScreenItem = item;
item.connect('activate', Lang.bind(this, this._onSuspendOrPowerOffActivate));
this._updateSuspendOrPowerOff();
}, },
_updatePresenceStatus: function(item, event) { _updatePresenceStatus: function(item, event) {
@ -698,12 +746,6 @@ const UserMenuButton = new Lang.Class({
app.activate(); app.activate();
}, },
_onOnlineAccountsActivate: function() {
Main.overview.hide();
let app = Shell.AppSystem.get_default().lookup_setting('gnome-online-accounts-panel.desktop');
app.activate(-1);
},
_onPreferencesActivate: function() { _onPreferencesActivate: function() {
Main.overview.hide(); Main.overview.hide();
let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop'); let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop');
@ -732,14 +774,14 @@ const UserMenuButton = new Lang.Class({
_onSuspendOrPowerOffActivate: function() { _onSuspendOrPowerOffActivate: function() {
Main.overview.hide(); Main.overview.hide();
if (this._haveSuspend && if (this._haveShutdown &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._session.ShutdownRemote();
} else {
// Ensure we only suspend after locking the screen // Ensure we only suspend after locking the screen
this._screenSaverProxy.LockRemote(Lang.bind(this, function() { this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.suspend_sync(null); this._upClient.suspend_sync(null);
})); }));
} else {
this._session.ShutdownRemote();
} }
} }
}); });

View File

@ -168,34 +168,35 @@ const WandaSearchProvider = new Lang.Class({
this.parent(_("Your favorite Easter Egg")); this.parent(_("Your favorite Easter Egg"));
}, },
getResultMetas: function(fish) { getResultMetas: function(fish, callback) {
return [{ 'id': fish[0], // there may be many fish in the sea, but callback([{ 'id': fish[0], // there may be many fish in the sea, but
// only one which speaks the truth! // only one which speaks the truth!
'name': capitalize(fish[0]), 'name': capitalize(fish[0]),
'createIcon': function(iconSize) { 'createIcon': function(iconSize) {
// for DND only (maybe could be improved) // for DND only (maybe could be improved)
// DON'T use St.Icon here, it crashes the shell // DON'T use St.Icon here, it crashes the shell
// (dnd.js code assumes it can query the actor size // (dnd.js code assumes it can query the actor size
// without parenting it, while StWidget accesses // without parenting it, while StWidget accesses
// StThemeNode in get_preferred_width/height, which // StThemeNode in get_preferred_width/height, which
// triggers an assertion failure) // triggers an assertion failure)
return St.TextureCache.get_default().load_icon_name(null, return St.TextureCache.get_default().load_icon_name(null,
'face-smile', 'face-smile',
St.IconType.FULLCOLOR, St.IconType.FULLCOLOR,
iconSize); iconSize);
} }
}]; }]);
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
if (terms.join(' ') == MAGIC_FISH_KEY) { if (terms.join(' ') == MAGIC_FISH_KEY) {
return [ FISH_NAME ]; this.searchSystem.pushResults(this, [ FISH_NAME ]);
} else {
this.searchSystem.pushResults(this, []);
} }
return [];
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
return this.getInitialResultSet(terms); this.getInitialResultSet(terms);
}, },
activateResult: function(fish, params) { activateResult: function(fish, params) {

View File

@ -53,10 +53,10 @@ const Source = new Lang.Class({
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(app, window) { _init: function(app, window) {
this.parent(app.get_name());
this._window = window; this._window = window;
this._app = app; this._app = app;
this._setSummaryIcon(this.createNotificationIcon());
this.parent(app.get_name());
this.signalIDs = []; this.signalIDs = [];
this.signalIDs.push(this._window.connect('notify::demands-attention', Lang.bind(this, function() { this.destroy(); }))); this.signalIDs.push(this._window.connect('notify::demands-attention', Lang.bind(this, function() { this.destroy(); })));

View File

@ -13,6 +13,7 @@ const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const WINDOW_ANIMATION_TIME = 0.25; const WINDOW_ANIMATION_TIME = 0.25;
const DIM_TIME = 0.500; const DIM_TIME = 0.500;
const UNDIM_TIME = 0.250; const UNDIM_TIME = 0.250;
@ -134,6 +135,10 @@ const WindowManager = new Lang.Class({
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
Meta.keybindings_set_custom_handler('switch-panels', Meta.keybindings_set_custom_handler('switch-panels',
Lang.bind(this, this._startA11ySwitcher)); Lang.bind(this, this._startA11ySwitcher));
global.display.add_keybinding('open-application-menu',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Lang.bind(this, this._openAppMenu));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++) for (let i = 0; i < this._dimmedWindows.length; i++)
@ -547,6 +552,10 @@ const WindowManager = new Lang.Class({
Main.ctrlAltTabManager.popup(backwards, binding.get_mask()); Main.ctrlAltTabManager.popup(backwards, binding.get_mask());
}, },
_openAppMenu : function(display, screen, window, event, binding) {
Main.panel.openAppMenu();
},
_showWorkspaceSwitcher : function(display, screen, window, binding) { _showWorkspaceSwitcher : function(display, screen, window, binding) {
if (screen.n_workspaces == 1) if (screen.n_workspaces == 1)
return; return;

View File

@ -1121,26 +1121,6 @@ const Workspace = new Lang.Class({
} }
}, },
_showAllOverlays: function() {
let currentWorkspace = global.screen.get_active_workspace();
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
let overlay = this._windowOverlays[i];
this._showWindowOverlay(clone, overlay,
this.metaWorkspace == null || this.metaWorkspace == currentWorkspace);
}
},
_hideAllOverlays: function() {
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
Tweener.removeTweens(clone.actor);
let overlay = this._windowOverlays[i];
if (overlay)
overlay.hide();
}
},
_delayedWindowRepositioning: function() { _delayedWindowRepositioning: function() {
if (this._windowIsZooming) if (this._windowIsZooming)
return true; return true;
@ -1252,7 +1232,7 @@ const Workspace = new Lang.Class({
if (!this._isMyWindow(win) || !this._isOverviewWindow(win)) if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
return; return;
let clone = this._addWindowClone(win); let [clone, overlay] = this._addWindowClone(win);
if (win._overviewHint) { if (win._overviewHint) {
let x = win._overviewHint.x - this.actor.x; let x = win._overviewHint.x - this.actor.x;
@ -1262,6 +1242,7 @@ const Workspace = new Lang.Class({
clone.actor.set_position (x, y); clone.actor.set_position (x, y);
clone.actor.set_scale (scale, scale); clone.actor.set_scale (scale, scale);
this._updateWindowOverlayPositions(clone, overlay, x, y, scale, false);
} else { } else {
// Position new windows at the top corner of the workspace rather // Position new windows at the top corner of the workspace rather
// than where they were placed for real to avoid the window // than where they were placed for real to avoid the window
@ -1321,7 +1302,10 @@ const Workspace = new Lang.Class({
this.leavingOverview = true; this.leavingOverview = true;
this._hideAllOverlays(); for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
Tweener.removeTweens(clone.actor);
}
if (this._repositionWindowsId > 0) { if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
@ -1336,6 +1320,10 @@ const Workspace = new Lang.Class({
// Position and scale the windows. // Position and scale the windows.
for (let i = 0; i < this._windows.length; i++) { for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i]; let clone = this._windows[i];
let overlay = this._windowOverlays[i];
if (overlay)
overlay.hide();
clone.zoomFromOverview(); clone.zoomFromOverview();
@ -1360,7 +1348,6 @@ const Workspace = new Lang.Class({
}); });
} }
} }
}, },
destroy : function() { destroy : function() {
@ -1451,7 +1438,7 @@ const Workspace = new Lang.Class({
this._windows.push(clone); this._windows.push(clone);
this._windowOverlays.push(overlay); this._windowOverlays.push(overlay);
return clone; return [clone, overlay];
}, },
_onShowOverlayClose: function (windowOverlay) { _onShowOverlayClose: function (windowOverlay) {

View File

@ -667,7 +667,7 @@ const ThumbnailsBox = new Lang.Class({
if (this._dropWorkspace != -1) if (this._dropWorkspace != -1)
return this._thumbnails[this._dropWorkspace].handleDragOverInternal(source, time); return this._thumbnails[this._dropWorkspace].handleDragOverInternal(source, time);
else if (this._dropPlaceholderPos != -1) else if (this._dropPlaceholderPos != -1)
return DND.DragMotionResult.MOVE_DROP; return source.realWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP;
else else
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, },

View File

@ -529,9 +529,11 @@ const WorkspacesDisplay = new Lang.Class({
this._updateAlwaysZoom(); this._updateAlwaysZoom();
})); }));
global.screen.connect('notify::n-workspaces',
Lang.bind(this, this._workspacesChanged));
this._switchWorkspaceNotifyId = 0; this._switchWorkspaceNotifyId = 0;
this._nWorkspacesChangedId = 0;
this._itemDragBeginId = 0; this._itemDragBeginId = 0;
this._itemDragCancelledId = 0; this._itemDragCancelledId = 0;
this._itemDragEndId = 0; this._itemDragEndId = 0;
@ -570,9 +572,6 @@ const WorkspacesDisplay = new Lang.Class({
global.screen.connect('restacked', global.screen.connect('restacked',
Lang.bind(this, this._onRestacked)); Lang.bind(this, this._onRestacked));
if (this._nWorkspacesChangedId == 0)
this._nWorkspacesChangedId = global.screen.connect('notify::n-workspaces',
Lang.bind(this, this._workspacesChanged));
if (this._itemDragBeginId == 0) if (this._itemDragBeginId == 0)
this._itemDragBeginId = Main.overview.connect('item-drag-begin', this._itemDragBeginId = Main.overview.connect('item-drag-begin',
Lang.bind(this, this._dragBegin)); Lang.bind(this, this._dragBegin));
@ -844,10 +843,7 @@ const WorkspacesDisplay = new Lang.Class({
if (!primaryView) if (!primaryView)
return; return;
primaryView.actor.opacity = opacity; primaryView.actor.opacity = opacity;
if (opacity == 0) primaryView.actor.visible = opacity != 0;
primaryView.actor.hide();
else
primaryView.actor.show();
})); }));
})); }));
}, },
@ -928,19 +924,16 @@ const WorkspacesDisplay = new Lang.Class({
}, },
_workspacesChanged: function() { _workspacesChanged: function() {
let oldNumWorkspaces = this._workspaces[0].length;
let newNumWorkspaces = global.screen.n_workspaces;
let active = global.screen.get_active_workspace_index();
if (oldNumWorkspaces == newNumWorkspaces)
return;
this._updateAlwaysZoom(); this._updateAlwaysZoom();
this._updateZoom(); this._updateZoom();
if (this._workspacesViews == null) if (this._workspacesViews == null)
return; return;
let oldNumWorkspaces = this._workspaces[0].length;
let newNumWorkspaces = global.screen.n_workspaces;
let active = global.screen.get_active_workspace_index();
let lostWorkspaces = []; let lostWorkspaces = [];
if (newNumWorkspaces > oldNumWorkspaces) { if (newNumWorkspaces > oldNumWorkspaces) {
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;

View File

@ -1,6 +1,6 @@
data/gnome-shell.desktop.in.in data/gnome-shell.desktop.in.in
data/gnome-shell-extension-prefs.desktop.in.in data/gnome-shell-extension-prefs.desktop.in.in
data/org.gnome.shell.gschema.xml.in data/org.gnome.shell.gschema.xml.in.in
js/extensionPrefs/main.js js/extensionPrefs/main.js
js/gdm/loginDialog.js js/gdm/loginDialog.js
js/gdm/powerMenu.js js/gdm/powerMenu.js
@ -13,6 +13,7 @@ js/ui/contactDisplay.js
js/ui/dash.js js/ui/dash.js
js/ui/dateMenu.js js/ui/dateMenu.js
js/ui/endSessionDialog.js js/ui/endSessionDialog.js
js/ui/extensionDownloader.js
js/ui/extensionSystem.js js/ui/extensionSystem.js
js/ui/keyboard.js js/ui/keyboard.js
js/ui/keyringPrompt.js js/ui/keyringPrompt.js

View File

@ -1,2 +1,3 @@
data/gnome-shell.desktop.in data/gnome-shell.desktop.in
data/gnome-shell-extension-prefs.desktop.in data/gnome-shell-extension-prefs.desktop.in
data/org.gnome.shell.evolution.calendar.gschema.xml.in

613
po/ar.po

File diff suppressed because it is too large Load Diff

View File

@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-19 14:09+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-03-24 20:44+0300\n" "PO-Revision-Date: 2012-04-05 15:36+0300\n"
"Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n" "Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n" "Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -132,34 +132,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Калі ўключана, паказваць тыдзень у календары ў ISO-фармаце." msgstr "Калі ўключана, паказваць тыдзень у календары ў ISO-фармаце."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Клавіятурны скарот для адкрыцця праграмнага меню"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Клавіятурны скарот для адкрыцця праграмнага меню."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Ужываная клавіятура" msgstr "Ужываная клавіятура"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Від ужыванай клавіятуры." msgstr "Від ужыванай клавіятуры."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Паказваць час з секундамі" msgstr "Паказваць час з секундамі"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Калі ўключана, паказваць час з секундамі." msgstr "Калі ўключана, паказваць час з секундамі."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Паказваць дату на гадзінніку" msgstr "Паказваць дату на гадзінніку"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Калі ўключана, паказваць на гадзінніку дату разам з часам." msgstr "Калі ўключана, паказваць на гадзінніку дату разам з часам."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Частата змены кадраў для запісу скрынкасту." msgstr "Частата змены кадраў для запісу скрынкасту."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -167,11 +175,11 @@ msgstr ""
"Частата змены кадраў выніковага скрынкасту, запісанага пры дапамозе абалонкі " "Частата змены кадраў выніковага скрынкасту, запісанага пры дапамозе абалонкі "
"GNOME (кадраў на секунду)." "GNOME (кадраў на секунду)."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Канвеер gstreamer для кадавання скрынкастаў" msgstr "Канвеер gstreamer для кадавання скрынкастаў"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -196,11 +204,11 @@ msgstr ""
"speed=6 threads=%T ! queue ! webmmux\" і запісвае ў WEBM з дапамогай кодэка " "speed=6 threads=%T ! queue ! webmmux\" і запісвае ў WEBM з дапамогай кодэка "
"VP8. %T ўжываецца ў якасці замены аптымальнай для сістэмы колькасці ніцяў." "VP8. %T ўжываецца ў якасці замены аптымальнай для сістэмы колькасці ніцяў."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Пашырэнне файла для захавання скрынкасту" msgstr "Пашырэнне файла для захавання скрынкасту"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -691,51 +699,51 @@ msgstr "Пароль:"
msgid "Type again:" msgid "Type again:"
msgstr "Паўтарыце пароль:" msgstr "Паўтарыце пароль:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Няма ўсталяваных пашырэнняў" msgstr "Няма ўсталяваных пашырэнняў"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s не зрабіў ніякіх памылак." msgstr "%s не зрабіў ніякіх памылак."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Хаваць памылкі" msgstr "Хаваць памылкі"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Паказваць памылкі" msgstr "Паказваць памылкі"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Уключана" msgstr "Уключана"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Выключана" msgstr "Выключана"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Памылка" msgstr "Памылка"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Састарэла" msgstr "Састарэла"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Сцягванне" msgstr "Сцягванне"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Паглядзець выточны код" msgstr "Паглядзець выточны код"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Сеціўная старонка" msgstr "Сеціўная старонка"
@ -866,17 +874,17 @@ msgstr "Праграмы"
msgid "Dash" msgid "Dash"
msgstr "Прыборная дошка" msgstr "Прыборная дошка"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Выйсці" msgstr "Выйсці"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Заняткі" msgstr "Заняткі"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Верхняя панэль" msgstr "Верхняя панэль"
@ -930,11 +938,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Увядзіце загад:" msgstr "Увядзіце загад:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Пошук..." msgstr "Пошук..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Нічога адпаведнага не знойдзена." msgstr "Нічога адпаведнага не знойдзена."

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-21 06:49+0200\n" "POT-Creation-Date: 2012-04-01 17:44+0300\n"
"PO-Revision-Date: 2012-03-21 06:49+0200\n" "PO-Revision-Date: 2012-04-01 17:44+0300\n"
"Last-Translator: Ivaylo Valkov <ivaylo@e-valkov.org>\n" "Last-Translator: Ivaylo Valkov <ivaylo@e-valkov.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n" "Language: bg\n"
@ -134,34 +134,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Показване на деня от седмицата по ISO, ако е истина." msgstr "Показване на деня от седмицата по ISO, ако е истина."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Клавишна комбинация за менюто за програми"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Клавишна комбинация за отваряне на менюто за програми."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Коя клавиатура да се ползва" msgstr "Коя клавиатура да се ползва"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Видът на клавиатурата, която да се ползва." msgstr "Видът на клавиатурата, която да се ползва."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Показване на секунди към времето" msgstr "Показване на секунди към времето"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Показване на секундите в допълнение към времето, ако е истина." msgstr "Показване на секундите в допълнение към времето, ако е истина."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Показване на дата в часовника" msgstr "Показване на дата в часовника"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Показване на дата в допълнение към времето, ако е истина." msgstr "Показване на дата в допълнение към времето, ако е истина."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Честота на кадрите за създаваните записи" msgstr "Честота на кадрите за създаваните записи"
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -169,11 +177,11 @@ msgstr ""
"Честота на кадрите за записа на екрана създаден от записващата програма на " "Честота на кадрите за записа на екрана създаден от записващата програма на "
"Обвивката на GNOME в кадри за секунда." "Обвивката на GNOME в кадри за секунда."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Конвейерът на gstreamer за кодиране на записа на екрана" msgstr "Конвейерът на gstreamer за кодиране на записа на екрана"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -199,11 +207,11 @@ msgstr ""
"използва кодера VP8. Стойността в „%T“ указва предполагаемия оптимален брой " "използва кодера VP8. Стойността в „%T“ указва предполагаемия оптимален брой "
"нишки за системата." "нишки за системата."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Разширение на файла за съхранение на записите" msgstr "Разширение на файла за съхранение на записите"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -691,51 +699,51 @@ msgstr "Парола:"
msgid "Type again:" msgid "Type again:"
msgstr "Въведете отново:" msgstr "Въведете отново:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Няма инсталирани разширения" msgstr "Няма инсталирани разширения"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Разширението %s не е обозначило никакви грешки." msgstr "Разширението %s не е обозначило никакви грешки."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Скриване на грешките" msgstr "Скриване на грешките"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Показване на грешките" msgstr "Показване на грешките"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Включено" msgstr "Включено"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Изключено" msgstr "Изключено"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Грешка" msgstr "Грешка"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Остаряло" msgstr "Остаряло"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Изтегляне" msgstr "Изтегляне"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Преглед на изходния код" msgstr "Преглед на изходния код"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Домашна страница" msgstr "Домашна страница"
@ -864,17 +872,17 @@ msgstr "Програми"
msgid "Dash" msgid "Dash"
msgstr "Най-ползвани" msgstr "Най-ползвани"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Спиране на програмата" msgstr "Спиране на програмата"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Дейности" msgstr "Дейности"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Горна лента" msgstr "Горна лента"

132
po/ca.po
View File

@ -3,19 +3,21 @@
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>, 2009. # Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>, 2009.
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2012. # Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2012.
# Jordi Serratosa <jordis@softcatala.cat>, 2012.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"POT-Creation-Date: 2012-03-19 22:35+0100\n" "shell&keywords=I18N+L10N&component=general\n"
"PO-Revision-Date: 2012-03-19 22:35+0100\n" "POT-Creation-Date: 2012-04-01 22:09+0000\n"
"PO-Revision-Date: 2012-04-02 00:08+0200\n"
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n" "Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
"Language-Team: català; valencià <tradgnome@softcatala.org>\n" "Language-Team: català; valencià <tradgnome@softcatala.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bits\n" "Content-Transfer-Encoding: 8bits\n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
@ -134,35 +136,43 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Si és «true» (cert) es mostra el número de la setmana en el calendari." msgstr "Si és «true» (cert) es mostra el número de la setmana en el calendari."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Vinculació per obrir el menú d'aplicació"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "La vinculació per obrir el menú d'aplicació."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Quin tipus de teclat s'ha d'utilitzar" msgstr "Quin tipus de teclat s'ha d'utilitzar"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "El tipus de teclat que s'utilitzarà." msgstr "El tipus de teclat que s'utilitzarà."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Mostra l'hora amb segons" msgstr "Mostra l'hora amb segons"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Si és «true» (cert) es mostren els segons." msgstr "Si és «true» (cert) es mostren els segons."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Mostra la data en el rellotge" msgstr "Mostra la data en el rellotge"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "" msgstr ""
"Si és «true» (cert) es mostra la data en el rellotge a més a més de l'hora." "Si és «true» (cert) es mostra la data en el rellotge a més a més de l'hora."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Imatges per segon per enregistrar els screencasts." msgstr "Imatges per segon per enregistrar els screencasts."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -170,11 +180,11 @@ msgstr ""
"Les imatges per segon, en fotogrames per segon, de l'screencast enregistrat " "Les imatges per segon, en fotogrames per segon, de l'screencast enregistrat "
"per l'eina d'enregistrament del GNOME Shell." "per l'eina d'enregistrament del GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "El conducte GStreamer per enregistrar els screencasts" msgstr "El conducte GStreamer per enregistrar els screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -200,11 +210,11 @@ msgstr ""
"enregistra amb el format WEBM i utilitza el còdec VP8. El %T és una variable " "enregistra amb el format WEBM i utilitza el còdec VP8. El %T és una variable "
"per estimar el nombre de fils d'execució paral·lels òptims del sistema." "per estimar el nombre de fils d'execució paral·lels òptims del sistema."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Extensió de fitxer per desar l'screencast" msgstr "Extensió de fitxer per desar l'screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -505,7 +515,7 @@ msgstr "Ocupat"
#: ../js/ui/contactDisplay.js:102 #: ../js/ui/contactDisplay.js:102
msgid "Offline" msgid "Offline"
msgstr "Fora de lnia" msgstr "Fora de línia"
#: ../js/ui/contactDisplay.js:153 #: ../js/ui/contactDisplay.js:153
msgid "CONTACTS" msgid "CONTACTS"
@ -684,51 +694,51 @@ msgstr "Contrasenya:"
msgid "Type again:" msgid "Type again:"
msgstr "Torneu a escriure-la:" msgstr "Torneu a escriure-la:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "No hi ha cap extensió instal·lada" msgstr "No hi ha cap extensió instal·lada"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s no ha emès cap error." msgstr "%s no ha emès cap error."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Amaga els errors" msgstr "Amaga els errors"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Mostra els errors" msgstr "Mostra els errors"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Habilitat" msgstr "Habilitat"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Inhabilitat" msgstr "Inhabilitat"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Error" msgstr "Error"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Fora d'hora" msgstr "Fora d'hora"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "S'està baixant" msgstr "S'està baixant"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Mostra el codi font" msgstr "Mostra el codi font"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Pàgina web" msgstr "Pàgina web"
@ -796,15 +806,15 @@ msgstr "La xarxa sense fil requereix autenticació"
#: ../js/ui/networkAgent.js:330 #: ../js/ui/networkAgent.js:330
#, c-format #, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network '%"
"'%s'." "s'."
msgstr "" msgstr ""
"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus " "Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
"d'encriptació." "d'encriptació."
#: ../js/ui/networkAgent.js:334 #: ../js/ui/networkAgent.js:334
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticaci 802.1X amb fil" msgstr "Autenticació 802.1X amb fil"
#: ../js/ui/networkAgent.js:336 #: ../js/ui/networkAgent.js:336
msgid "Network name: " msgid "Network name: "
@ -812,15 +822,15 @@ msgstr "Nom de la xarxa: "
#: ../js/ui/networkAgent.js:341 #: ../js/ui/networkAgent.js:341
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticaci DSL" msgstr "Autenticació DSL"
#: ../js/ui/networkAgent.js:348 #: ../js/ui/networkAgent.js:348
msgid "PIN code required" msgid "PIN code required"
msgstr "Cal que introduu el codi PIN" msgstr "Cal que introduïu el codi PIN"
#: ../js/ui/networkAgent.js:349 #: ../js/ui/networkAgent.js:349
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Cal que introduu el codi PIN del dispositiu de banda ampla mbil" msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil"
#: ../js/ui/networkAgent.js:350 #: ../js/ui/networkAgent.js:350
msgid "PIN: " msgid "PIN: "
@ -828,12 +838,12 @@ msgstr "PIN: "
#: ../js/ui/networkAgent.js:356 #: ../js/ui/networkAgent.js:356
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Contrasenya de la xarxa de banda ampla mbil" msgstr "Contrasenya de la xarxa de banda ampla mòbil"
#: ../js/ui/networkAgent.js:357 #: ../js/ui/networkAgent.js:357
#, c-format #, c-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Cal que introduu una contrasenya per connectar-vos a «%s»." msgstr "Cal que introduïu una contrasenya per connectar-vos a «%s»."
#: ../js/ui/overview.js:90 #: ../js/ui/overview.js:90
msgid "Undo" msgid "Undo"
@ -857,17 +867,17 @@ msgstr "Aplicacions"
msgid "Dash" msgid "Dash"
msgstr "Quadre d'aplicacions" msgstr "Quadre d'aplicacions"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Surt" msgstr "Surt"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Activitats" msgstr "Activitats"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -921,11 +931,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Introduïu una ordre:" msgstr "Introduïu una ordre:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "S'està cercant..." msgstr "S'està cercant..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "No s'ha trobat cap coincidència." msgstr "No s'ha trobat cap coincidència."
@ -1068,7 +1078,7 @@ msgstr "Paràmetres de so"
#: ../js/ui/status/bluetooth.js:372 #: ../js/ui/status/bluetooth.js:372
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Hi ha una petició d'autorització des de %s" msgstr "Hi ha una sol·licitud d'autorització des de %s"
#: ../js/ui/status/bluetooth.js:378 #: ../js/ui/status/bluetooth.js:378
#, c-format #, c-format
@ -1238,7 +1248,7 @@ msgstr "Paràmetres de xarxa"
#: ../js/ui/status/network.js:1739 #: ../js/ui/status/network.js:1739
msgid "Connection failed" msgid "Connection failed"
msgstr "Ha fallat la connexi" msgstr "Ha fallat la connexió"
#: ../js/ui/status/network.js:1740 #: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
@ -1367,11 +1377,11 @@ msgstr "Trucada"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:287 #: ../js/ui/telepathyClient.js:287
msgid "File Transfer" msgid "File Transfer"
msgstr "Transferncia de fitxers" msgstr "Transferència de fitxers"
#: ../js/ui/telepathyClient.js:369 #: ../js/ui/telepathyClient.js:369
msgid "Subscription request" msgid "Subscription request"
msgstr "Teniu una petició de subscripció" msgstr "Teniu una sol·licitud de subscripció"
#: ../js/ui/telepathyClient.js:405 #: ../js/ui/telepathyClient.js:405
msgid "Connection error" msgid "Connection error"
@ -1482,7 +1492,7 @@ msgstr "En/na %s us envia %s"
#: ../js/ui/telepathyClient.js:1194 #: ../js/ui/telepathyClient.js:1194
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s vol poder saber quan esteu en lnia" msgstr "%s vol poder saber quan esteu en línia"
#: ../js/ui/telepathyClient.js:1287 #: ../js/ui/telepathyClient.js:1287
msgid "Network error" msgid "Network error"
@ -1490,7 +1500,7 @@ msgstr "Error de la xarxa"
#: ../js/ui/telepathyClient.js:1289 #: ../js/ui/telepathyClient.js:1289
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Ha fallat l'autenticaci" msgstr "Ha fallat l'autenticació"
#: ../js/ui/telepathyClient.js:1291 #: ../js/ui/telepathyClient.js:1291
msgid "Encryption error" msgid "Encryption error"
@ -1502,19 +1512,19 @@ msgstr "No s'ha proporcionat el certificat"
#: ../js/ui/telepathyClient.js:1295 #: ../js/ui/telepathyClient.js:1295
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "El certificat no s de confiana" msgstr "El certificat no és de confiança"
#: ../js/ui/telepathyClient.js:1297 #: ../js/ui/telepathyClient.js:1297
msgid "Certificate expired" msgid "Certificate expired"
msgstr "El certificat ha venut" msgstr "El certificat ha vençut"
#: ../js/ui/telepathyClient.js:1299 #: ../js/ui/telepathyClient.js:1299
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "El certificat no est activat" msgstr "El certificat no està activat"
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "No coincideix el nom de la mquina del certificat" msgstr "No coincideix el nom de la màquina del certificat"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
@ -1530,33 +1540,33 @@ msgstr "S'ha establert l'estat a fora de línia"
#: ../js/ui/telepathyClient.js:1309 #: ../js/ui/telepathyClient.js:1309
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "L'encriptaci no est disponible" msgstr "L'encriptació no està disponible"
#: ../js/ui/telepathyClient.js:1311 #: ../js/ui/telepathyClient.js:1311
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "El certificat no s vlid" msgstr "El certificat no és vàlid"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1313
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "S'ha rebutjat la connexi" msgstr "S'ha rebutjat la connexió"
#: ../js/ui/telepathyClient.js:1315 #: ../js/ui/telepathyClient.js:1315
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "No es pot establir la connexi" msgstr "No es pot establir la connexió"
#: ../js/ui/telepathyClient.js:1317 #: ../js/ui/telepathyClient.js:1317
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "S'ha perdut la connexi" msgstr "S'ha perdut la connexió"
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1319
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Aquest compte ja est connectat al servidor" msgstr "Aquest compte ja està connectat al servidor"
#: ../js/ui/telepathyClient.js:1321 #: ../js/ui/telepathyClient.js:1321
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"S'ha reemplaat la connexi per una altra de nova fent servir el mateix " "S'ha reemplaçat la connexió per una altra de nova fent servir el mateix "
"recurs" "recurs"
#: ../js/ui/telepathyClient.js:1323 #: ../js/ui/telepathyClient.js:1323
@ -1565,7 +1575,7 @@ msgstr "Ja existeix aquest compte al servidor"
#: ../js/ui/telepathyClient.js:1325 #: ../js/ui/telepathyClient.js:1325
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "El servidor est massa ocupat per gestionar la connexi" msgstr "El servidor està massa ocupat per gestionar la connexió"
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1327
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
@ -1575,8 +1585,8 @@ msgstr "S'ha revocat el certificat"
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"El certificat utilitza un algorisme criptgraf no segur o la seva fortalesa " "El certificat utilitza un algorisme criptògraf no segur o la seva fortalesa "
"criptogrfica s feble" "criptogràfica és feble"
#: ../js/ui/telepathyClient.js:1331 #: ../js/ui/telepathyClient.js:1331
msgid "" msgid ""
@ -1584,7 +1594,7 @@ msgid ""
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
msgstr "" msgstr ""
"La llargada del certificat del servidor o la profunditat de la cadena de " "La llargada del certificat del servidor o la profunditat de la cadena de "
"certificaci excedeix els lmits de la biblioteca criptogrfica" "certificació excedeix els límits de la biblioteca criptogràfica"
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1333
msgid "Internal error" msgid "Internal error"

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +1,26 @@
# Czech translation of gnome-shell. # Czech translation of gnome-shell.
# Copyright (C) 2009, 2010, 2011 the author(s) of gnome-shell. # Copyright (C) 2009, 2010, 2011 the author(s) of gnome-shell.
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
#
# Andre Klapper <ak-47@gmx.net>, 2009. # Andre Klapper <ak-47@gmx.net>, 2009.
# Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011. # Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011, 2012.
# Adam Matoušek <adydas95@gmail.com>, 2012 # Adam Matoušek <adydas95@gmail.com>, 2012
# Marek Černocký <marek@manet.cz>, 2012. # Marek Černocký <marek@manet.cz>, 2012.
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-19 14:09+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-03-22 11:28+0100\n" "PO-Revision-Date: 2012-04-16 15:34+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Lokalize 1.2\n" "X-Generator: Virtaal 0.7.1\n"
"X-Project-Style: gnome\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
@ -134,34 +133,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO." msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Klávesová zkratka na otevření nabídky aplikace"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Klávesová zkratka na otevření nabídky aplikace."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Která klávesnice se má používat" msgstr "Která klávesnice se má používat"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ klávesnice, který se má používat." msgstr "Typ klávesnice, který se má používat."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Zobrazovat čas včetně sekund" msgstr "Zobrazovat čas včetně sekund"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Je-li zapnuto, zobrazovat čas včetně sekund." msgstr "Je-li zapnuto, zobrazovat čas včetně sekund."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Zobrazovat v hodinách datum" msgstr "Zobrazovat v hodinách datum"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Je-li zapnuto, zobrazovat v hodinách kromě času i datum." msgstr "Je-li zapnuto, zobrazovat v hodinách kromě času i datum."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Frekvence snímků při nahrávání dění na obrazovce." msgstr "Frekvence snímků při nahrávání dění na obrazovce."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -169,11 +176,11 @@ msgstr ""
"Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla " "Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla "
"nahrána záznamovým programem GNOME Shell." "nahrána záznamovým programem GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce" msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -197,11 +204,11 @@ msgstr ""
"%T ! queue ! webmmux“ s nahráváním do WEBM s kodekem VP8. %T je použito jako " "%T ! queue ! webmmux“ s nahráváním do WEBM s kodekem VP8. %T je použito jako "
"zástupný symbol odhadu nejvhodnějšího počtu vláken na systému." "zástupný symbol odhadu nejvhodnějšího počtu vláken na systému."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Přípona souboru s nahrávkou dění na obrazovce" msgstr "Přípona souboru s nahrávkou dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -697,51 +704,51 @@ msgstr "Heslo:"
msgid "Type again:" msgid "Type again:"
msgstr "Napište znovu:" msgstr "Napište znovu:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nejsou nainstalována žádná rozšíření" msgstr "Nejsou nainstalována žádná rozšíření"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Rozšíření %s nevyvolalo žádné chyby." msgstr "Rozšíření %s nevyvolalo žádné chyby."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Skrývat chyby" msgstr "Skrývat chyby"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Zobrazovat chyby" msgstr "Zobrazovat chyby"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Povoleno" msgstr "Povoleno"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Zakázáno" msgstr "Zakázáno"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Chyba" msgstr "Chyba"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Neaktuální" msgstr "Neaktuální"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Stahování" msgstr "Stahování"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Zobrazit zdroj" msgstr "Zobrazit zdroj"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Webová stránka" msgstr "Webová stránka"
@ -809,8 +816,8 @@ msgstr "K bezdrátové síti je vyžadováno ověření"
#: ../js/ui/networkAgent.js:330 #: ../js/ui/networkAgent.js:330
#, c-format #, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network '%"
"'%s'." "s'."
msgstr "" msgstr ""
"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací " "Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací "
"klíče." "klíče."
@ -870,17 +877,17 @@ msgstr "Aplikace"
msgid "Dash" msgid "Dash"
msgstr "Oblíbené" msgstr "Oblíbené"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Ukončit" msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Činnosti" msgstr "Činnosti"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Horní lišta" msgstr "Horní lišta"
@ -934,11 +941,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Zadejte prosím příkaz:" msgstr "Zadejte prosím příkaz:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Hledá se…" msgstr "Hledá se…"
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Neodpovídá ani jeden z výsledků." msgstr "Neodpovídá ani jeden z výsledků."

116
po/de.po
View File

@ -11,15 +11,16 @@
# Jakob Kramer <jakob.kramer@gmx.de>, 2010. # Jakob Kramer <jakob.kramer@gmx.de>, 2010.
# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010, 2011. # Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010, 2011.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2010, 2011, 2012. # Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2010, 2011, 2012.
# Wolfgang Stöggl <c72578@yahoo.de>, 2012.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-18 00:40+0000\n" "POT-Creation-Date: 2012-04-13 19:40+0000\n"
"PO-Revision-Date: 2012-03-18 01:04+0100\n" "PO-Revision-Date: 2012-04-14 16:04+0200\n"
"Last-Translator: Christian Kirbach <Christian.Kirbach@googlemail.com>\n" "Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -142,34 +143,42 @@ msgstr ""
"Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt." "Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Zu verwendende Tastatur" msgstr "Zu verwendende Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Der Typ der zu verwendenden Tastatur" msgstr "Der Typ der zu verwendenden Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Zeit sekundengenau anzeigen" msgstr "Zeit sekundengenau anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Legt fest, ob in der Uhrzeit Sekunden angezeigt werden." msgstr "Legt fest, ob in der Uhrzeit Sekunden angezeigt werden."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Datum in der Uhr anzeigen" msgstr "Datum in der Uhr anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Legt fest, ob das Datum zusätzlich zur Uhrzeit angezeigt wird." msgstr "Legt fest, ob das Datum zusätzlich zur Uhrzeit angezeigt wird."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts" msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -178,12 +187,12 @@ msgstr ""
"der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde." "der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde."
# hmm Enkodieren oder Kodieren? # hmm Enkodieren oder Kodieren?
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts" msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts"
# Hier blicke ich überhaupt nicht durch. # Hier blicke ich überhaupt nicht durch.
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -210,11 +219,11 @@ msgstr ""
"mittels des VP8-Codecs aufzeichnet. %T wird als Platzhalter für die " "mittels des VP8-Codecs aufzeichnet. %T wird als Platzhalter für die "
"vermutete optimale Thread-Anzahl auf dem System verwendet." "vermutete optimale Thread-Anzahl auf dem System verwendet."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Die Dateiendung zum Speichern des Screencast" msgstr "Die Dateiendung zum Speichern des Screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -238,53 +247,53 @@ msgstr "<b>Erweiterung</b>"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen." msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:627
msgid "Session..." msgid "Session..."
msgstr "Sitzung …" msgstr "Sitzung …"
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:789
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Anmelden" msgstr "Anmelden"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:834
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(oder benutzen Sie den Fingerabdruckleser)" msgstr "(oder benutzen Sie den Fingerabdruckleser)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:855
msgid "Not listed?" msgid "Not listed?"
msgstr "Nicht aufgeführt?" msgstr "Nicht aufgeführt?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401 #: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1028
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Anmelden" msgstr "Anmelden"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1380
msgid "Login Window" msgid "Login Window"
msgstr "Anmeldefenster" msgstr "Anmeldefenster"
#: ../js/gdm/powerMenu.js:152 ../js/ui/userMenu.js:597 #: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668 #: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend" msgid "Suspend"
msgstr "Bereitschaft" msgstr "Bereitschaft"
#: ../js/gdm/powerMenu.js:157 #: ../js/gdm/powerMenu.js:160
msgid "Restart" msgid "Restart"
msgstr "Neu starten" msgstr "Neu starten"
#: ../js/gdm/powerMenu.js:162 #: ../js/gdm/powerMenu.js:165
msgid "Power Off" msgid "Power Off"
msgstr "Ausschalten" msgstr "Ausschalten"
@ -679,11 +688,11 @@ msgstr[1] "Das System wird automatisch in %d Sekunden neu gestartet."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Neustart des Systems." msgstr "Neustart des Systems."
#: ../js/ui/extensionSystem.js:403 #: ../js/ui/extensionSystem.js:404
msgid "Install" msgid "Install"
msgstr "Installieren" msgstr "Installieren"
#: ../js/ui/extensionSystem.js:407 #: ../js/ui/extensionSystem.js:408
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
@ -692,7 +701,8 @@ msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
msgid "tray" msgid "tray"
msgstr "Benachrichtigungsfeld" msgstr "Benachrichtigungsfeld"
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatur" msgstr "Tastatur"
@ -704,51 +714,51 @@ msgstr "Passwort:"
msgid "Type again:" msgid "Type again:"
msgstr "Erneut eingeben:" msgstr "Erneut eingeben:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Keine Erweiterungen installiert" msgstr "Keine Erweiterungen installiert"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s hat keine Fehler ausgegeben." msgstr "%s hat keine Fehler ausgegeben."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Fehler verbergen" msgstr "Fehler verbergen"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Fehler anzeigen" msgstr "Fehler anzeigen"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Aktiviert" msgstr "Aktiviert"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "Deaktiviert" msgstr "Deaktiviert"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Fehler" msgstr "Fehler"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Veraltet" msgstr "Veraltet"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Herunterladen" msgstr "Herunterladen"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Quelle zeigen" msgstr "Quelle zeigen"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Webseite" msgstr "Webseite"
@ -859,32 +869,36 @@ msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
msgid "Undo" msgid "Undo"
msgstr "Rückgängig" msgstr "Rückgängig"
#: ../js/ui/overview.js:199 #: ../js/ui/overview.js:132
msgid "Overview"
msgstr "Übersicht"
#: ../js/ui/overview.js:202
msgid "Windows" msgid "Windows"
msgstr "Fenster" msgstr "Fenster"
#: ../js/ui/overview.js:202 #: ../js/ui/overview.js:205
msgid "Applications" msgid "Applications"
msgstr "Anwendungen" msgstr "Anwendungen"
# Würde ich so übernehmen, oder evtl. »Dock«. # Würde ich so übernehmen, oder evtl. »Dock«.
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:228 #: ../js/ui/overview.js:231
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Aktivitäten" msgstr "Aktivitäten"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Obere Leiste" msgstr "Obere Leiste"
@ -938,11 +952,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Bitte geben Sie einen Befehl ein:" msgstr "Bitte geben Sie einen Befehl ein:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Suche läuft …" msgstr "Suche läuft …"
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:415
msgid "No matching results." msgid "No matching results."
msgstr "Keine passenden Ergebnisse." msgstr "Keine passenden Ergebnisse."
@ -1193,7 +1207,7 @@ msgstr "Verbindung gescheitert"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505 #: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..." msgid "More..."
msgstr "Mehr ..." msgstr "Mehr "
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
@ -1720,7 +1734,7 @@ msgstr "»%s« ist bereit"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1100 #: ../src/gvc/gvc-mixer-control.c:1089
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1729,14 +1743,14 @@ msgstr[1] "%u Ausgänge"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1110 #: ../src/gvc/gvc-mixer-control.c:1099
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u Eingang" msgstr[0] "%u Eingang"
msgstr[1] "%u Eingänge" msgstr[1] "%u Eingänge"
#: ../src/gvc/gvc-mixer-control.c:1408 #: ../src/gvc/gvc-mixer-control.c:1397
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemklänge" msgstr "Systemklänge"

1249
po/el.po

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-13 14:03+0000\n" "POT-Creation-Date: 2012-04-13 13:20+0100\n"
"PO-Revision-Date: 2012-03-13 14:06+0100\n" "PO-Revision-Date: 2012-04-13 13:20+0100\n"
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n" "Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
"Language-Team: British English <en@li.org>\n" "Language-Team: British English <en@li.org>\n"
"Language: en_GB\n" "Language: en_GB\n"
@ -129,34 +129,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "If true, display the ISO week date in the calendar." msgstr "If true, display the ISO week date in the calendar."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Keybinding to open the application menu"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Keybinding to open the application menu."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Which keyboard to use" msgstr "Which keyboard to use"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "The type of keyboard to use." msgstr "The type of keyboard to use."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Show time with seconds" msgstr "Show time with seconds"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "If true, display seconds in time." msgstr "If true, display seconds in time."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Show date in clock" msgstr "Show date in clock"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "If true, display date in the clock, in addition to time." msgstr "If true, display date in the clock, in addition to time."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Framerate used for recording screencasts." msgstr "Framerate used for recording screencasts."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -164,11 +172,11 @@ msgstr ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames per second." "screencast recorder in frames per second."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "The GStreamer pipeline used to encode the screencast" msgstr "The GStreamer pipeline used to encode the screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -193,11 +201,11 @@ msgstr ""
"using the VP8 codec. %T is used as a placeholder for a guess at the optimal " "using the VP8 codec. %T is used as a placeholder for a guess at the optimal "
"thread count on the system." "thread count on the system."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "File extension used for storing the screencast" msgstr "File extension used for storing the screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -220,53 +228,53 @@ msgstr "<b>Extension</b>"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Select an extension to configure using the combobox above." msgstr "Select an extension to configure using the combobox above."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:627
msgid "Session..." msgid "Session..."
msgstr "Session…" msgstr "Session…"
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:789
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Sign In" msgstr "Sign In"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:834
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(or swipe finger)" msgstr "(or swipe finger)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:855
msgid "Not listed?" msgid "Not listed?"
msgstr "Not listed?" msgstr "Not listed?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419 #: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Cancel" msgstr "Cancel"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1028
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Sign In" msgstr "Sign In"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1380
msgid "Login Window" msgid "Login Window"
msgstr "Login Window" msgstr "Login Window"
#: ../js/gdm/powerMenu.js:152 ../js/ui/userMenu.js:591 #: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:593 ../js/ui/userMenu.js:662 #: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend" msgid "Suspend"
msgstr "Suspend" msgstr "Suspend"
#: ../js/gdm/powerMenu.js:157 #: ../js/gdm/powerMenu.js:160
msgid "Restart" msgid "Restart"
msgstr "Restart" msgstr "Restart"
#: ../js/gdm/powerMenu.js:162 #: ../js/gdm/powerMenu.js:165
msgid "Power Off" msgid "Power Off"
msgstr "Power Off" msgstr "Power Off"
@ -286,27 +294,27 @@ msgid "Execution of '%s' failed:"
msgstr "Execution of '%s' failed:" msgstr "Execution of '%s' failed:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:251 #: ../js/ui/appDisplay.js:255
msgid "All" msgid "All"
msgstr "All" msgstr "All"
#: ../js/ui/appDisplay.js:310 #: ../js/ui/appDisplay.js:314
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "APPLICATIONS" msgstr "APPLICATIONS"
#: ../js/ui/appDisplay.js:371 #: ../js/ui/appDisplay.js:375
msgid "SETTINGS" msgid "SETTINGS"
msgstr "SETTINGS" msgstr "SETTINGS"
#: ../js/ui/appDisplay.js:676 #: ../js/ui/appDisplay.js:680
msgid "New Window" msgid "New Window"
msgstr "New Window" msgstr "New Window"
#: ../js/ui/appDisplay.js:679 #: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Remove from Favourites" msgstr "Remove from Favourites"
#: ../js/ui/appDisplay.js:680 #: ../js/ui/appDisplay.js:684
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Add to Favourites" msgstr "Add to Favourites"
@ -479,28 +487,28 @@ msgstr "This week"
msgid "Next week" msgid "Next week"
msgstr "Next week" msgstr "Next week"
#: ../js/ui/contactDisplay.js:64 ../js/ui/notificationDaemon.js:486 #: ../js/ui/contactDisplay.js:66 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:372 #: ../js/ui/status/power.js:215 ../src/shell-app.c:374
msgid "Unknown" msgid "Unknown"
msgstr "Unknown" msgstr "Unknown"
#: ../js/ui/contactDisplay.js:85 ../js/ui/userMenu.js:127 #: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:129
msgid "Available" msgid "Available"
msgstr "Available" msgstr "Available"
#: ../js/ui/contactDisplay.js:90 ../js/ui/userMenu.js:136 #: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:138
msgid "Away" msgid "Away"
msgstr "Away" msgstr "Away"
#: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:130 #: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:132
msgid "Busy" msgid "Busy"
msgstr "Busy" msgstr "Busy"
#: ../js/ui/contactDisplay.js:98 #: ../js/ui/contactDisplay.js:102
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: ../js/ui/contactDisplay.js:149 #: ../js/ui/contactDisplay.js:153
msgid "CONTACTS" msgid "CONTACTS"
msgstr "CONTACTS" msgstr "CONTACTS"
@ -508,58 +516,58 @@ msgstr "CONTACTS"
msgid "Remove" msgid "Remove"
msgstr "Remove" msgstr "Remove"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:103
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Date and Time Settings" msgstr "Date and Time Settings"
#: ../js/ui/dateMenu.js:123 #: ../js/ui/dateMenu.js:129
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Open Calendar" msgstr "Open Calendar"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:187
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R:%S" msgstr "%a %e %b, %R:%S"
#: ../js/ui/dateMenu.js:182 #: ../js/ui/dateMenu.js:188
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e %b, %R" msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:192
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:187 #: ../js/ui/dateMenu.js:193
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:200
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l:%M:%S %p" msgstr "%a %e %b, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:195 #: ../js/ui/dateMenu.js:201
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l:%M %p" msgstr "%a %e %b, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:205
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:200 #: ../js/ui/dateMenu.js:206
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:211 #: ../js/ui/dateMenu.js:217
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y" msgstr "%A %e %B, %Y"
@ -651,20 +659,21 @@ msgstr[1] "The system will restart automatically in %d seconds."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Restarting the system." msgstr "Restarting the system."
#: ../js/ui/extensionSystem.js:403 #: ../js/ui/extensionSystem.js:404
msgid "Install" msgid "Install"
msgstr "Install" msgstr "Install"
#: ../js/ui/extensionSystem.js:407 #: ../js/ui/extensionSystem.js:408
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Download and install '%s' from extensions.gnome.org?" msgstr "Download and install '%s' from extensions.gnome.org?"
#: ../js/ui/keyboard.js:322 #: ../js/ui/keyboard.js:327
msgid "tray" msgid "tray"
msgstr "tray" msgstr "tray"
#: ../js/ui/keyboard.js:539 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "Keyboard" msgstr "Keyboard"
@ -676,51 +685,51 @@ msgstr "Password:"
msgid "Type again:" msgid "Type again:"
msgstr "Type again:" msgstr "Type again:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "No extensions installed" msgstr "No extensions installed"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s has not emitted any errors." msgstr "%s has not emitted any errors."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Hide Errors" msgstr "Hide Errors"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Show Errors" msgstr "Show Errors"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Enabled" msgstr "Enabled"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "Disabled" msgstr "Disabled"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Error" msgstr "Error"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Out of date" msgstr "Out of date"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Downloading" msgstr "Downloading"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "View Source" msgstr "View Source"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Web Page" msgstr "Web Page"
@ -742,7 +751,7 @@ msgstr "Unmute"
msgid "Mute" msgid "Mute"
msgstr "Mute" msgstr "Mute"
#: ../js/ui/messageTray.js:2450 #: ../js/ui/messageTray.js:2490
msgid "System Information" msgid "System Information"
msgstr "System Information" msgstr "System Information"
@ -831,31 +840,35 @@ msgstr "A password is required to connect to '%s'."
msgid "Undo" msgid "Undo"
msgstr "Undo" msgstr "Undo"
#: ../js/ui/overview.js:199 #: ../js/ui/overview.js:132
msgid "Overview"
msgstr "Overview"
#: ../js/ui/overview.js:202
msgid "Windows" msgid "Windows"
msgstr "Windows" msgstr "Windows"
#: ../js/ui/overview.js:202 #: ../js/ui/overview.js:205
msgid "Applications" msgid "Applications"
msgstr "Applications" msgstr "Applications"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:228 #: ../js/ui/overview.js:231
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:583 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Quit" msgstr "Quit"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:614 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Activities" msgstr "Activities"
#: ../js/ui/panel.js:987 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Top Bar" msgstr "Top Bar"
@ -901,7 +914,7 @@ msgstr "Sorry, that didn't work. Please try again."
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:720 #: ../js/ui/popupMenu.js:724
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-us" msgstr "toggle-switch-us"
@ -909,11 +922,11 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Please enter a command:" msgstr "Please enter a command:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Searching…" msgstr "Searching…"
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:415
msgid "No matching results." msgid "No matching results."
msgstr "No matching results." msgstr "No matching results."
@ -1595,51 +1608,51 @@ msgstr "Edit account"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Unknown reason" msgstr "Unknown reason"
#: ../js/ui/userMenu.js:133 #: ../js/ui/userMenu.js:135
msgid "Hidden" msgid "Hidden"
msgstr "Hidden" msgstr "Hidden"
#: ../js/ui/userMenu.js:139 #: ../js/ui/userMenu.js:141
msgid "Idle" msgid "Idle"
msgstr "Idle" msgstr "Idle"
#: ../js/ui/userMenu.js:142 #: ../js/ui/userMenu.js:144
msgid "Unavailable" msgid "Unavailable"
msgstr "Unavailable" msgstr "Unavailable"
#: ../js/ui/userMenu.js:589 ../js/ui/userMenu.js:593 ../js/ui/userMenu.js:663 #: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
msgid "Power Off..." msgid "Power Off..."
msgstr "Power Off…" msgstr "Power Off…"
#: ../js/ui/userMenu.js:625 #: ../js/ui/userMenu.js:631
msgid "Notifications" msgid "Notifications"
msgstr "Notifications" msgstr "Notifications"
#: ../js/ui/userMenu.js:633 #: ../js/ui/userMenu.js:639
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Online Accounts" msgstr "Online Accounts"
#: ../js/ui/userMenu.js:637 #: ../js/ui/userMenu.js:643
msgid "System Settings" msgid "System Settings"
msgstr "System Settings" msgstr "System Settings"
#: ../js/ui/userMenu.js:644 #: ../js/ui/userMenu.js:650
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Lock Screen" msgstr "Lock Screen"
#: ../js/ui/userMenu.js:649 #: ../js/ui/userMenu.js:655
msgid "Switch User" msgid "Switch User"
msgstr "Switch User" msgstr "Switch User"
#: ../js/ui/userMenu.js:654 #: ../js/ui/userMenu.js:660
msgid "Log Out..." msgid "Log Out..."
msgstr "Log Out…" msgstr "Log Out…"
#: ../js/ui/userMenu.js:682 #: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Your chat status will be set to busy" msgstr "Your chat status will be set to busy"
#: ../js/ui/userMenu.js:683 #: ../js/ui/userMenu.js:689
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1684,7 +1697,7 @@ msgstr "'%s' is ready"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1100 #: ../src/gvc/gvc-mixer-control.c:1089
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1693,14 +1706,14 @@ msgstr[1] "%u Outputs"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1110 #: ../src/gvc/gvc-mixer-control.c:1099
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u Input" msgstr[0] "%u Input"
msgstr[1] "%u Inputs" msgstr[1] "%u Inputs"
#: ../src/gvc/gvc-mixer-control.c:1408 #: ../src/gvc/gvc-mixer-control.c:1397
msgid "System Sounds" msgid "System Sounds"
msgstr "System Sounds" msgstr "System Sounds"
@ -1712,7 +1725,7 @@ msgstr "Print version"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Mode used by GDM for login screen" msgstr "Mode used by GDM for login screen"
#: ../src/shell-app.c:617 #: ../src/shell-app.c:619
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Failed to launch '%s'" msgstr "Failed to launch '%s'"

673
po/es.po

File diff suppressed because it is too large Load Diff

221
po/fa.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "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" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-02-29 22:27+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-03-04 20:00+0330\n" "PO-Revision-Date: 2012-03-31 01:45+0330\n"
"Last-Translator: Arash Mousavi <mousavi.arash@gmail.com>\n" "Last-Translator: Arash Mousavi <mousavi.arash@gmail.com>\n"
"Language-Team: Persian\n" "Language-Team: Persian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -99,63 +99,59 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "در صورت تنظیم بر روی «درست»، تاریخ هفتگی ایزو را در تقویم نشان می‌دهد." msgstr "در صورت تنظیم بر روی «درست»، تاریخ هفتگی ایزو را در تقویم نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "کلید مقید برای باز کردن منو برنامه"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "کلید مقید برای باز کردن منو برنامه."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "استفاده از کدام صفحه‌کلید" msgstr "استفاده از کدام صفحه‌کلید"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "نوع صفحه‌کلید جهت استفاده" msgstr "نوع صفحه‌کلید جهت استفاده"
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "نمایش ساعت همراه با ثانیه" msgstr "نمایش ساعت همراه با ثانیه"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "در صورت تنظیم بر روی «درست»، ثانیه‌ها را در ساعت نشان می‌دهد." msgstr "در صورت تنظیم بر روی «درست»، ثانیه‌ها را در ساعت نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "نمایش تاریخ در ساعت" msgstr "نمایش تاریخ در ساعت"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "اگر روی «درست» تنظیم شود، تاریخ را در کنار ساعت نشان می‌دهد." msgstr "اگر روی «درست» تنظیم شود، تاریخ را در کنار ساعت نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "سرعت فریم استفاده شده در تصویربرداری از صفحه‌نمایش." msgstr "سرعت فریم استفاده شده در تصویربرداری از صفحه‌نمایش."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second." msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
msgstr "سرعت فریم حاصل از تصویربرداری از صفحه نمایش با استفاده از ضبط کننده نمایشگر پوسته‌ی گنوم بر اساس فریم بر ثانیه" msgstr "سرعت فریم حاصل از تصویربرداری از صفحه نمایش با استفاده از ضبط کننده نمایشگر پوسته‌ی گنوم بر اساس فریم بر ثانیه"
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "مجرای ارتباطی gstreamer برای کدگذاری تصویربرداری از صفحه نمایش" msgstr "مجرای ارتباطی gstreamer برای کدگذاری تصویربرداری از صفحه نمایش"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
#| msgid ""
#| "Sets the GStreamer pipeline used to encode recordings. It follows the "
#| "syntax used for gst-launch. The pipeline should have an unconnected sink "
#| "pad where the recorded video is recorded. It will normally have a "
#| "unconnected source pad; output from that pad will be written into the "
#| "output file. However the pipeline can also take care of its own output - "
#| "this might be used to send the output to an icecast server via shout2send "
#| "or similar. When unset or set to an empty value, the default pipeline "
#| "will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 "
#| "threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T "
#| "is used as a placeholder for a guess at the optimal thread count on the "
#| "system."
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system."
msgstr "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." msgstr "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "پسوند پرونده‌ی قابل استفاده برای ذخیره تصویربرداری از صفحه‌نمایش" msgstr "پسوند پرونده‌ی قابل استفاده برای ذخیره تصویربرداری از صفحه‌نمایش"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format." msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format."
msgstr "نام پرونده‌ی ضبط شده برای تصویربرداری از صفحه‌نمایش یکتا و براساس تاریخ جاری خواهد بود و از این افزونه استفاده خواهد کرد. اگر در زمان ضبط از قالب دیگری استفاده کنید باید تغییر کند." msgstr "نام پرونده‌ی ضبط شده برای تصویربرداری از صفحه‌نمایش یکتا و براساس تاریخ جاری خواهد بود و از این افزونه استفاده خواهد کرد. اگر در زمان ضبط از قالب دیگری استفاده کنید باید تغییر کند."
@ -195,8 +191,8 @@ msgid "Not listed?"
msgstr "فهرست نشده؟" msgstr "فهرست نشده؟"
#: ../js/gdm/loginDialog.js:1020 #: ../js/gdm/loginDialog.js:1020
#: ../js/ui/endSessionDialog.js:419 #: ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:401 #: ../js/ui/extensionSystem.js:399
#: ../js/ui/networkAgent.js:153 #: ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 #: ../js/ui/polkitAuthenticationAgent.js:175
#: ../js/ui/status/bluetooth.js:462 #: ../js/ui/status/bluetooth.js:462
@ -212,18 +208,18 @@ msgstr "ورود"
msgid "Login Window" msgid "Login Window"
msgstr "پنجره‌ی ورود به سیستم" msgstr "پنجره‌ی ورود به سیستم"
#: ../js/gdm/powerMenu.js:152 #: ../js/gdm/powerMenu.js:155
#: ../js/ui/userMenu.js:581 #: ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:583 #: ../js/ui/userMenu.js:599
#: ../js/ui/userMenu.js:652 #: ../js/ui/userMenu.js:668
msgid "Suspend" msgid "Suspend"
msgstr "تعلیق" msgstr "تعلیق"
#: ../js/gdm/powerMenu.js:157 #: ../js/gdm/powerMenu.js:160
msgid "Restart" msgid "Restart"
msgstr "راه‌اندازی مجدد" msgstr "راه‌اندازی مجدد"
#: ../js/gdm/powerMenu.js:162 #: ../js/gdm/powerMenu.js:165
msgid "Power Off" msgid "Power Off"
msgstr "خاموش کردن" msgstr "خاموش کردن"
@ -243,27 +239,27 @@ msgid "Execution of '%s' failed:"
msgstr "اجرای «%s» شکست خورد:" msgstr "اجرای «%s» شکست خورد:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:251 #: ../js/ui/appDisplay.js:255
msgid "All" msgid "All"
msgstr "همه" msgstr "همه"
#: ../js/ui/appDisplay.js:310 #: ../js/ui/appDisplay.js:314
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "برنامه‌ها" msgstr "برنامه‌ها"
#: ../js/ui/appDisplay.js:371 #: ../js/ui/appDisplay.js:375
msgid "SETTINGS" msgid "SETTINGS"
msgstr "تنظیمات" msgstr "تنظیمات"
#: ../js/ui/appDisplay.js:676 #: ../js/ui/appDisplay.js:680
msgid "New Window" msgid "New Window"
msgstr "پنجره‌ی جدید" msgstr "پنجره‌ی جدید"
#: ../js/ui/appDisplay.js:679 #: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "حذف از مورد پسندها" msgstr "حذف از مورد پسندها"
#: ../js/ui/appDisplay.js:680 #: ../js/ui/appDisplay.js:684
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "اضافه کردن به مورد پسندها" msgstr "اضافه کردن به مورد پسندها"
@ -436,93 +432,93 @@ msgstr "این هفته"
msgid "Next week" msgid "Next week"
msgstr "هفته آینده" msgstr "هفته آینده"
#: ../js/ui/contactDisplay.js:63 #: ../js/ui/contactDisplay.js:66
#: ../js/ui/notificationDaemon.js:486 #: ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:215
#: ../src/shell-app.c:372 #: ../src/shell-app.c:374
msgid "Unknown" msgid "Unknown"
msgstr "ناشناخته" msgstr "ناشناخته"
#: ../js/ui/contactDisplay.js:84 #: ../js/ui/contactDisplay.js:89
#: ../js/ui/userMenu.js:127 #: ../js/ui/userMenu.js:129
msgid "Available" msgid "Available"
msgstr "در دسترس" msgstr "در دسترس"
#: ../js/ui/contactDisplay.js:89 #: ../js/ui/contactDisplay.js:94
#: ../js/ui/userMenu.js:136 #: ../js/ui/userMenu.js:138
msgid "Away" msgid "Away"
msgstr "غائب" msgstr "غائب"
#: ../js/ui/contactDisplay.js:93 #: ../js/ui/contactDisplay.js:98
#: ../js/ui/userMenu.js:130 #: ../js/ui/userMenu.js:132
msgid "Busy" msgid "Busy"
msgstr "مشغول" msgstr "مشغول"
#: ../js/ui/contactDisplay.js:97 #: ../js/ui/contactDisplay.js:102
msgid "Offline" msgid "Offline"
msgstr "برون‌خط" msgstr "برون‌خط"
#: ../js/ui/contactDisplay.js:148 #: ../js/ui/contactDisplay.js:153
msgid "CONTACTS" msgid "CONTACTS"
msgstr "CONTACTS" msgstr "CONTACTS"
#: ../js/ui/dash.js:229 #: ../js/ui/dash.js:229
#: ../js/ui/messageTray.js:1204 #: ../js/ui/messageTray.js:1207
msgid "Remove" msgid "Remove"
msgstr "حذف" msgstr "حذف"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:103
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "تنظیمات تاریخ و ساعت" msgstr "تنظیمات تاریخ و ساعت"
#: ../js/ui/dateMenu.js:123 #: ../js/ui/dateMenu.js:129
msgid "Open Calendar" msgid "Open Calendar"
msgstr "بازکردن تقویم" msgstr "بازکردن تقویم"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:187
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %Od %b %OH:%OM:%OS" msgstr "%a %Od %b %OH:%OM:%OS"
#: ../js/ui/dateMenu.js:182 #: ../js/ui/dateMenu.js:188
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %Od %b %OH:%OM" msgstr "%a %Od %b %OH:%OM"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:192
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %OH:%OM:%OS" msgstr "%a %OH:%OM:%OS"
#: ../js/ui/dateMenu.js:187 #: ../js/ui/dateMenu.js:193
msgid "%a %R" msgid "%a %R"
msgstr "%a %OH:%OM" msgstr "%a %OH:%OM"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:200
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a Od% %b %OH:%OM:%OS" msgstr "%a Od% %b %OH:%OM:%OS"
#: ../js/ui/dateMenu.js:195 #: ../js/ui/dateMenu.js:201
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %Od %b %OH:%OM" msgstr "%a %Od %b %OH:%OM"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:205
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %OH:%OM:%OS" msgstr "%a %OH:%OM:%OS"
#: ../js/ui/dateMenu.js:200 #: ../js/ui/dateMenu.js:206
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %OH:%OM" msgstr "%a %OH:%OM"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:211 #: ../js/ui/dateMenu.js:217
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %Od %B" msgstr "%A %Od %B"
@ -615,20 +611,20 @@ msgstr[1] "سیستم پس از %Id ثانیه به طور خودکار مجدد
msgid "Restarting the system." msgid "Restarting the system."
msgstr "درحال راه‌اندازی مجدد سیستم." msgstr "درحال راه‌اندازی مجدد سیستم."
#: ../js/ui/extensionSystem.js:405 #: ../js/ui/extensionSystem.js:403
msgid "Install" msgid "Install"
msgstr "نصب" msgstr "نصب"
#: ../js/ui/extensionSystem.js:409 #: ../js/ui/extensionSystem.js:407
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "بارگیری و نصب «%s» از extensions.gnome.org؟" msgstr "بارگیری و نصب «%s» از extensions.gnome.org؟"
#: ../js/ui/keyboard.js:322 #: ../js/ui/keyboard.js:327
msgid "tray" msgid "tray"
msgstr "سینی" msgstr "سینی"
#: ../js/ui/keyboard.js:539 #: ../js/ui/keyboard.js:544
#: ../js/ui/status/power.js:203 #: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "صفحه‌کلید" msgstr "صفحه‌کلید"
@ -642,75 +638,75 @@ msgstr "گذرواژه"
msgid "Type again:" msgid "Type again:"
msgstr "تلاش مجدد:" msgstr "تلاش مجدد:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "هیچ افزونه‌ای نصب نشده است" msgstr "هیچ افزونه‌ای نصب نشده است"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "افزونه %s هیچ خطایی منتشر نکرده است." msgstr "افزونه %s هیچ خطایی منتشر نکرده است."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "مخفی کردن خطاها" msgstr "مخفی کردن خطاها"
#: ../js/ui/lookingGlass.js:789 #: ../js/ui/lookingGlass.js:796
#: ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "نمایش خطاها" msgstr "نمایش خطاها"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "به کار انداختن" msgstr "به کار انداختن"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 #: ../js/ui/lookingGlass.js:808
#: ../src/gvc/gvc-mixer-control.c:1093 #: ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "از کار انداختن" msgstr "از کار انداختن"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "خطا" msgstr "خطا"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "قدیمی" msgstr "قدیمی"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "در حال بارگیری" msgstr "در حال بارگیری"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "نمایش منبع" msgstr "نمایش منبع"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "صفحه‌ی وب" msgstr "صفحه‌ی وب"
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:116 #: ../js/ui/main.js:118
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "ویدئو صفحه‌نمایش %Id %t" msgstr "ویدئو صفحه‌نمایش %Id %t"
#: ../js/ui/messageTray.js:1197 #: ../js/ui/messageTray.js:1200
msgid "Open" msgid "Open"
msgstr "بازکردن" msgstr "بازکردن"
#: ../js/ui/messageTray.js:1214 #: ../js/ui/messageTray.js:1217
msgid "Unmute" msgid "Unmute"
msgstr "باصدا" msgstr "باصدا"
#: ../js/ui/messageTray.js:1214 #: ../js/ui/messageTray.js:1217
msgid "Mute" msgid "Mute"
msgstr "بی‌صدا" msgstr "بی‌صدا"
#: ../js/ui/messageTray.js:2447 #: ../js/ui/messageTray.js:2490
msgid "System Information" msgid "System Information"
msgstr "اطلاعات سیستم" msgstr "اطلاعات سیستم"
@ -798,31 +794,35 @@ msgstr "برای اتصال به «%s» گذرواژه لازم است."
msgid "Undo" msgid "Undo"
msgstr "برگردان" msgstr "برگردان"
#: ../js/ui/overview.js:199 #: ../js/ui/overview.js:132
msgid "Overview"
msgstr "نمای‌کلی"
#: ../js/ui/overview.js:202
msgid "Windows" msgid "Windows"
msgstr "پنجره‌‌ها" msgstr "پنجره‌‌ها"
#: ../js/ui/overview.js:202 #: ../js/ui/overview.js:205
msgid "Applications" msgid "Applications"
msgstr "برنامه‌ها" msgstr "برنامه‌ها"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:228 #: ../js/ui/overview.js:231
msgid "Dash" msgid "Dash"
msgstr "دَش" msgstr "دَش"
#: ../js/ui/panel.js:583 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "خروج" msgstr "خروج"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:614 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "فعالیت‌ها" msgstr "فعالیت‌ها"
#: ../js/ui/panel.js:987 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "نوار بالا" msgstr "نوار بالا"
@ -868,7 +868,7 @@ msgstr "متاسفتم، تاثیری نداشت! مجددا تلاش کنید."
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:720 #: ../js/ui/popupMenu.js:724
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -876,11 +876,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "لطفا یک فرمان وارد کنید:" msgstr "لطفا یک فرمان وارد کنید:"
#: ../js/ui/searchDisplay.js:349 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "درحال حستجو..." msgstr "درحال حستجو..."
#: ../js/ui/searchDisplay.js:417 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "نتیجه‌ی منطبقی پیدا نشد." msgstr "نتیجه‌ی منطبقی پیدا نشد."
@ -905,7 +905,6 @@ msgid "Wrong password, please try again"
msgstr "گذرواژه‌ی نادرست، لطفا دوباره تلاش کنید" msgstr "گذرواژه‌ی نادرست، لطفا دوباره تلاش کنید"
#: ../js/ui/status/accessibility.js:47 #: ../js/ui/status/accessibility.js:47
#| msgid "Visibility"
msgid "Accessibility" msgid "Accessibility"
msgstr "دسترسی‌پذیری" msgstr "دسترسی‌پذیری"
@ -1178,7 +1177,6 @@ msgid "Auto wireless"
msgstr "بیسیم خودکار" msgstr "بیسیم خودکار"
#: ../js/ui/status/network.js:1541 #: ../js/ui/status/network.js:1541
#| msgid "Network error"
msgid "Network" msgid "Network"
msgstr "شبکه" msgstr "شبکه"
@ -1523,7 +1521,6 @@ msgid "Connection has been lost"
msgstr "اتصال از دست رفته است" msgstr "اتصال از دست رفته است"
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1319
#| msgid "This resource is already connected to the server"
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "این حساب قبلا به کارگزار متصل شده است" msgstr "این حساب قبلا به کارگزار متصل شده است"
@ -1552,7 +1549,6 @@ msgid "The length of the server certificate, or the depth of the server certific
msgstr "اندازه گواهینامه کارگزار، یا عمق حلقه‌ی گواهینامه کارگزار، از محدودیت اعمال شده توسط کتابخانه cryptography تجاوز کرد" msgstr "اندازه گواهینامه کارگزار، یا عمق حلقه‌ی گواهینامه کارگزار، از محدودیت اعمال شده توسط کتابخانه cryptography تجاوز کرد"
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1333
#| msgid "Connection error"
msgid "Internal error" msgid "Internal error"
msgstr "خطای داخلی" msgstr "خطای داخلی"
@ -1575,53 +1571,53 @@ msgstr "ویرایش حساب"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "دلیل ناشناخته" msgstr "دلیل ناشناخته"
#: ../js/ui/userMenu.js:133 #: ../js/ui/userMenu.js:135
msgid "Hidden" msgid "Hidden"
msgstr "نامرئی" msgstr "نامرئی"
#: ../js/ui/userMenu.js:139 #: ../js/ui/userMenu.js:141
msgid "Idle" msgid "Idle"
msgstr "بی‌کار" msgstr "بی‌کار"
#: ../js/ui/userMenu.js:142 #: ../js/ui/userMenu.js:144
msgid "Unavailable" msgid "Unavailable"
msgstr "خارج از دسترس" msgstr "خارج از دسترس"
#: ../js/ui/userMenu.js:579 #: ../js/ui/userMenu.js:595
#: ../js/ui/userMenu.js:583 #: ../js/ui/userMenu.js:599
#: ../js/ui/userMenu.js:653 #: ../js/ui/userMenu.js:669
msgid "Power Off..." msgid "Power Off..."
msgstr "خاموش کردن..." msgstr "خاموش کردن..."
#: ../js/ui/userMenu.js:615 #: ../js/ui/userMenu.js:631
msgid "Notifications" msgid "Notifications"
msgstr "اعلان‌ها" msgstr "اعلان‌ها"
#: ../js/ui/userMenu.js:623 #: ../js/ui/userMenu.js:639
msgid "Online Accounts" msgid "Online Accounts"
msgstr "حساب‌های برخط" msgstr "حساب‌های برخط"
#: ../js/ui/userMenu.js:627 #: ../js/ui/userMenu.js:643
msgid "System Settings" msgid "System Settings"
msgstr "تنظیمات سیستم" msgstr "تنظیمات سیستم"
#: ../js/ui/userMenu.js:634 #: ../js/ui/userMenu.js:650
msgid "Lock Screen" msgid "Lock Screen"
msgstr "قفل کردن صفحه" msgstr "قفل کردن صفحه"
#: ../js/ui/userMenu.js:639 #: ../js/ui/userMenu.js:655
msgid "Switch User" msgid "Switch User"
msgstr "تعویض کاربر" msgstr "تعویض کاربر"
#: ../js/ui/userMenu.js:644 #: ../js/ui/userMenu.js:660
msgid "Log Out..." msgid "Log Out..."
msgstr "خروج از سیستم..." msgstr "خروج از سیستم..."
#: ../js/ui/userMenu.js:672 #: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "وضعیت گپ شما «مشغول» تنظیم می‌شود" msgstr "وضعیت گپ شما «مشغول» تنظیم می‌شود"
#: ../js/ui/userMenu.js:673 #: ../js/ui/userMenu.js:689
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "هم‌اکنون اعلان‌ها، از جمله پیام‌های گپ، غیرفعال هستند. وضعیتِ برخطِ شما به گونه‌ای تنظیم شده است که به دیگران نشان دهد ممکن است شما پیام‌هایشان را نبینید." msgstr "هم‌اکنون اعلان‌ها، از جمله پیام‌های گپ، غیرفعال هستند. وضعیتِ برخطِ شما به گونه‌ای تنظیم شده است که به دیگران نشان دهد ممکن است شما پیام‌هایشان را نبینید."
@ -1683,21 +1679,20 @@ msgstr[1] "%Iu ورودی"
msgid "System Sounds" msgid "System Sounds"
msgstr "صداهای سیستم" msgstr "صداهای سیستم"
#: ../src/main.c:262 #: ../src/main.c:255
msgid "Print version" msgid "Print version"
msgstr "چاپ نسخه" msgstr "چاپ نسخه"
#: ../src/main.c:268 #: ../src/main.c:261
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "حالت استفاده شده توسط GDM برای صفحه ورود به سیستم" msgstr "حالت استفاده شده توسط GDM برای صفحه ورود به سیستم"
#: ../src/shell-app.c:617 #: ../src/shell-app.c:619
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "راه‌اندازی «%s» شکست خورد" msgstr "راه‌اندازی «%s» شکست خورد"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:708
#| msgid "Does not match"
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "گذرواژه‌های منطبق نیستند." msgstr "گذرواژه‌های منطبق نیستند."

View File

@ -15,8 +15,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master fr\n" "Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-20 17:23+0000\n" "POT-Creation-Date: 2012-04-03 18:35+0000\n"
"PO-Revision-Date: 2012-03-05 20:54+0100\n" "PO-Revision-Date: 2012-03-31 15:56+0300\n"
"Last-Translator: Bruno Brouard <annoa.b@gmail.com>\n" "Last-Translator: Bruno Brouard <annoa.b@gmail.com>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n" "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -141,35 +141,43 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Si vrai, afficher le numéro de semaine ISO dans le calendrier." msgstr "Si vrai, afficher le numéro de semaine ISO dans le calendrier."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Combinaison de touches pour ouvrir le menu de l'application"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Combinaison de touches pour ouvrir le menu de l'application."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Le clavier utilisé" msgstr "Le clavier utilisé"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Le type de clavier utilisé." msgstr "Le type de clavier utilisé."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Afficher l'heure avec les secondes" msgstr "Afficher l'heure avec les secondes"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Si vrai, afficher les secondes dans l'horloge." msgstr "Si vrai, afficher les secondes dans l'horloge."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Afficher la date dans l'horloge" msgstr "Afficher la date dans l'horloge"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Si vrai, afficher la date dans l'horloge, en plus de l'heure." msgstr "Si vrai, afficher la date dans l'horloge, en plus de l'heure."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "" msgstr ""
"Nombre d'images par seconde pour l'enregistrement des animations d'écran." "Nombre d'images par seconde pour l'enregistrement des animations d'écran."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -177,11 +185,11 @@ msgstr ""
"Le nombre d'images par seconde des animations d'écran enregistrées par " "Le nombre d'images par seconde des animations d'écran enregistrées par "
"l'outil idoine de GNOME Shell." "l'outil idoine de GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Le pipeline GStreamer utilisé pour coder l'animation d'écran" msgstr "Le pipeline GStreamer utilisé pour coder l'animation d'écran"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -208,11 +216,11 @@ msgstr ""
"VP8. %T est utilisé comme paramètre pour une supposition quant au nombre " "VP8. %T est utilisé comme paramètre pour une supposition quant au nombre "
"optimal de threads à utiliser sur le système." "optimal de threads à utiliser sur le système."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Extension de fichier à utiliser pour enregistrer l'animation d'écran" msgstr "Extension de fichier à utiliser pour enregistrer l'animation d'écran"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -730,51 +738,51 @@ msgstr "Mot de passe :"
msgid "Type again:" msgid "Type again:"
msgstr "Saisissez à nouveau :" msgstr "Saisissez à nouveau :"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Aucune extension installée" msgstr "Aucune extension installée"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s n'a émis aucune erreur." msgstr "%s n'a émis aucune erreur."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Masquer les erreurs" msgstr "Masquer les erreurs"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Afficher les erreurs" msgstr "Afficher les erreurs"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Activé" msgstr "Activé"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Désactivé" msgstr "Désactivé"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Erreur" msgstr "Erreur"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Périmé" msgstr "Périmé"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Téléchargement" msgstr "Téléchargement"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Afficher la source" msgstr "Afficher la source"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Page Web" msgstr "Page Web"
@ -782,7 +790,7 @@ msgstr "Page Web"
#: ../js/ui/main.js:118 #: ../js/ui/main.js:118
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "Animation d'écran %d %t" msgstr "Vidéo d'écran %d %t"
#: ../js/ui/messageTray.js:1200 #: ../js/ui/messageTray.js:1200
msgid "Open" msgid "Open"
@ -903,17 +911,17 @@ msgstr "Applications"
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Quitter" msgstr "Quitter"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Barre supérieure" msgstr "Barre supérieure"

712
po/gl.po

File diff suppressed because it is too large Load Diff

320
po/gu.po
View File

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gu\n" "Project-Id-Version: gu\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug." "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" "cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-02-29 22:27+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-03-15 14:01+0530\n" "PO-Revision-Date: 2012-04-03 11:24+0530\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: gu_IN <kde-i18n-doc@kde.org>\n" "Language-Team: gu_IN <kde-i18n-doc@kde.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -25,20 +25,20 @@ msgstr "GNOME શેલ"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching" msgid "Window management and application launching"
msgstr "" msgstr "વિન્ડો સંચાલન અને કાર્યક્રમ શરૂઆત"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153 #: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "" msgstr "GNOME Shell ઍક્સટેન્શન પસંદગીઓ"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions" msgid "Configure GNOME Shell Extensions"
msgstr "" msgstr "GNOME Shell ઍક્સટેન્શનને રૂપરેખાંકિત કરો"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2" msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "" msgstr "Alt-F2 માંથી ડેવલપર અને ટેસ્ટર માટે ઉપયોગી આંતરિક સાધનોને સક્રિય કરો"
#: ../data/org.gnome.shell.gschema.xml.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "" msgid ""
@ -47,7 +47,6 @@ msgid ""
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.h:3
#| msgid "No extensions installed"
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "સક્રિય કરવા માટે એક્સટેન્શનનું Uuids" msgstr "સક્રિય કરવા માટે એક્સટેન્શનનું Uuids"
@ -83,14 +82,13 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "" msgstr "નિષ્ક્રિય થયેલ OpenSearch પ્રબંધક"
#: ../data/org.gnome.shell.gschema.xml.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "આદેશ (Alt-F2) સંવાદ માટે ઇતિહાસ" msgstr "આદેશ (Alt-F2) સંવાદ માટે ઇતિહાસ"
#: ../data/org.gnome.shell.gschema.xml.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.h:11
#| msgid "History for command (Alt-F2) dialog"
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "ગ્લાસ સંવાદને જોવા માટે ઇતિહાસ" msgstr "ગ્લાસ સંવાદને જોવા માટે ઇતિહાસ"
@ -112,47 +110,55 @@ msgstr "કૅલેન્ડરમાં અઠવાડિયા તારી
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr "જો true હોય તો, કૅલેન્ડરમાં ISO અઠવાડિયાની તારીખને દર્શાવો."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Which keyboard to use" msgid "Keybinding to open the application menu"
msgstr "" msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "The type of keyboard to use." msgid "Keybinding to open the application menu."
msgstr "" msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use"
msgstr "ક્યુ કિબોર્ડ વાપરવુ છે"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use."
msgstr "વાપરવા માટે કિબોર્ડનો પ્રકાર."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "સેકંડોમાં સમયને બતાવો" msgstr "સેકંડોમાં સમયને બતાવો"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "" msgstr "જો true હોય તો, સમયમાં સેકંડ બતાવો."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "ઘડિયાળમાં તારીખને બતાવો" msgstr "ઘડિયાળમાં તારીખને બતાવો"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display date in the clock, in addition to time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Framerate used for recording screencasts."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time."
msgstr "જો true હોય તો, ઘડિયાળમાં તારીખ બતાવો, સમય સાથે વધુમાં."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts."
msgstr "રેકોર્ડીંગ સ્ક્રીનકાસ્ટ માટે વાપરેલ ફ્રેમરેટ."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "સ્ક્રીનકાસ્ટને એનકોડ કરવા માટે વાપરેલ gstreamer પાઇપલાઇન"
#: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -167,11 +173,11 @@ msgid ""
"thread count on the system." "thread count on the system."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "" msgstr "સ્ક્રીનકાસ્ટને સંગ્રહ કરવા માટે વાપરેલ ફાઇલ ઍક્સટેન્શન"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -181,15 +187,15 @@ msgstr ""
#: ../js/extensionPrefs/main.js:125 #: ../js/extensionPrefs/main.js:125
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
msgstr "" msgstr "ત્યાં %s માટે પસંદગી સંવાદને લાવવામાં ભૂલ હતી:"
#: ../js/extensionPrefs/main.js:165 #: ../js/extensionPrefs/main.js:165
msgid "<b>Extension</b>" msgid "<b>Extension</b>"
msgstr "" msgstr "<b>ઍક્સટેન્શન</b>"
#: ../js/extensionPrefs/main.js:189 #: ../js/extensionPrefs/main.js:189
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr "ઉપર કોમ્બોબોક્સની મદદથી રૂપરેખાંકિત કરવા માટે ઍક્સટેન્શનને પસંદ કરો."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:624
msgid "Session..." msgid "Session..."
@ -198,23 +204,23 @@ msgstr "સત્ર..."
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:786
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr "પ્રવેશો"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "" msgstr "(અથવા સ્વાઇપ આંગળી)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:852
msgid "Not listed?" msgid "Not listed?"
msgstr "" msgstr "શું યાદી થયેલ નથી?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419 #: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:401 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "રદ કરો" msgstr "રદ કરો"
@ -222,23 +228,22 @@ msgstr "રદ કરો"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1025
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr "પ્રવેશો"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1377
#| msgid "New Window"
msgid "Login Window" msgid "Login Window"
msgstr "પ્રવેશ વિન્ડો" msgstr "પ્રવેશ વિન્ડો"
#: ../js/gdm/powerMenu.js:152 ../js/ui/userMenu.js:581 #: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:652 #: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend" msgid "Suspend"
msgstr "અટકાવો" msgstr "અટકાવો"
#: ../js/gdm/powerMenu.js:157 #: ../js/gdm/powerMenu.js:160
msgid "Restart" msgid "Restart"
msgstr "પુન:શરૂ કરો" msgstr "પુન:શરૂ કરો"
#: ../js/gdm/powerMenu.js:162 #: ../js/gdm/powerMenu.js:165
msgid "Power Off" msgid "Power Off"
msgstr "પાવર બંધ" msgstr "પાવર બંધ"
@ -255,30 +260,30 @@ msgstr "આદેશનું પદચ્છેદન કરી શક્યા
#: ../js/misc/util.js:127 #: ../js/misc/util.js:127
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "" msgstr "'%s' ને અમલમાં મૂકવાનુ નિષ્ફળ:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:251 #: ../js/ui/appDisplay.js:255
msgid "All" msgid "All"
msgstr "બધા" msgstr "બધા"
#: ../js/ui/appDisplay.js:310 #: ../js/ui/appDisplay.js:314
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "APPLICATIONS" msgstr "APPLICATIONS"
#: ../js/ui/appDisplay.js:371 #: ../js/ui/appDisplay.js:375
msgid "SETTINGS" msgid "SETTINGS"
msgstr "SETTINGS" msgstr "SETTINGS"
#: ../js/ui/appDisplay.js:676 #: ../js/ui/appDisplay.js:680
msgid "New Window" msgid "New Window"
msgstr "નવી વિન્ડો" msgstr "નવી વિન્ડો"
#: ../js/ui/appDisplay.js:679 #: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "પસંદીદાઓ માંથી દૂર કરો" msgstr "પસંદીદાઓ માંથી દૂર કરો"
#: ../js/ui/appDisplay.js:680 #: ../js/ui/appDisplay.js:684
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "પસંદીદાને ઉમેરો" msgstr "પસંદીદાને ઉમેરો"
@ -294,15 +299,14 @@ msgstr "%s ને તમારી પસંદીદામાંથી દૂર
#: ../js/ui/autorunManager.js:265 #: ../js/ui/autorunManager.js:265
msgid "Removable Devices" msgid "Removable Devices"
msgstr "" msgstr "દૂર કરી શકાય તેવા ઉપકરણો"
#: ../js/ui/autorunManager.js:560 #: ../js/ui/autorunManager.js:560
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "" msgstr "%s સાથે ખોલો"
#: ../js/ui/autorunManager.js:586 #: ../js/ui/autorunManager.js:586
#| msgid "Reject"
msgid "Eject" msgid "Eject"
msgstr "રદ કરો" msgstr "રદ કરો"
@ -422,7 +426,7 @@ msgstr "S"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:681 #: ../js/ui/calendar.js:681
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "" msgstr "અનુસૂચિત કંઇ નથી"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:697 #: ../js/ui/calendar.js:697
@ -452,99 +456,97 @@ msgstr "આ અઠવાડિયે"
msgid "Next week" msgid "Next week"
msgstr "આગળનું અઠવાડિયું" msgstr "આગળનું અઠવાડિયું"
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486 #: ../js/ui/contactDisplay.js:66 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:372 #: ../js/ui/status/power.js:215 ../src/shell-app.c:374
msgid "Unknown" msgid "Unknown"
msgstr "અજ્ઞાત" msgstr "અજ્ઞાત"
#: ../js/ui/contactDisplay.js:84 ../js/ui/userMenu.js:127 #: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:129
msgid "Available" msgid "Available"
msgstr "ઉપલબ્ધ" msgstr "ઉપલબ્ધ"
#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:136 #: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:138
msgid "Away" msgid "Away"
msgstr "" msgstr "દૂર"
#: ../js/ui/contactDisplay.js:93 ../js/ui/userMenu.js:130 #: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:132
msgid "Busy" msgid "Busy"
msgstr "વ્યસ્ત" msgstr "વ્યસ્ત"
#: ../js/ui/contactDisplay.js:97 #: ../js/ui/contactDisplay.js:102
msgid "Offline" msgid "Offline"
msgstr "ઓફલાઇન" msgstr "ઓફલાઇન"
#: ../js/ui/contactDisplay.js:148 #: ../js/ui/contactDisplay.js:153
msgid "CONTACTS" msgid "CONTACTS"
msgstr "" msgstr "સંપર્કો"
#: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1204 #: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1207
msgid "Remove" msgid "Remove"
msgstr "દૂર કરો" msgstr "દૂર કરો"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:103
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "તારીખ અને સમય સુયોજનો" msgstr "તારીખ અને સમય સુયોજનો"
#: ../js/ui/dateMenu.js:123 #: ../js/ui/dateMenu.js:129
msgid "Open Calendar" msgid "Open Calendar"
msgstr "કૅલેન્ડરને ખોલો" msgstr "કૅલેન્ડરને ખોલો"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:187
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S" msgstr "%a %b %e, %R:%S"
#: ../js/ui/dateMenu.js:182 #: ../js/ui/dateMenu.js:188
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %b %e, %R" msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:192
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:187 #: ../js/ui/dateMenu.js:193
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:200
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p" msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:195 #: ../js/ui/dateMenu.js:201
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p" msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:205
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:200 #: ../js/ui/dateMenu.js:206
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:211 #: ../js/ui/dateMenu.js:217
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y" msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:61 #: ../js/ui/endSessionDialog.js:61
#, c-format #, c-format
#| msgid "Log Out %s"
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "%s માંથી બહાર નીકળો" msgstr "%s માંથી બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:62 #: ../js/ui/endSessionDialog.js:62
#| msgid "Log Out"
msgctxt "title" msgctxt "title"
msgid "Log Out" msgid "Log Out"
msgstr "બહાર નીકળો" msgstr "બહાર નીકળો"
@ -556,7 +558,6 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
#, c-format #, c-format
#| msgid "The system will power off automatically in %d seconds."
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s એ %d સેકંડમાં આપમેળે બહાર નીકળી જશે." msgstr[0] "%s એ %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
@ -564,7 +565,6 @@ msgstr[1] "%s એ %d સેકંડોમાં આપમેળે બહાર
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, c-format #, c-format
#| msgid "The system will power off automatically in %d seconds."
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "તમે %d સેકંડમાં આપમેળે બહાર નીકળી જશે." msgstr[0] "તમે %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
@ -575,13 +575,11 @@ msgid "Logging out of the system."
msgstr "સિસ્ટમની બહાર નીકળી રહ્યા છે." msgstr "સિસ્ટમની બહાર નીકળી રહ્યા છે."
#: ../js/ui/endSessionDialog.js:76 #: ../js/ui/endSessionDialog.js:76
#| msgid "Log Out"
msgctxt "button" msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "બહાર નીકળો" msgstr "બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:81 #: ../js/ui/endSessionDialog.js:81
#| msgid "Power Off"
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "પાવર બંધ" msgstr "પાવર બંધ"
@ -593,7 +591,6 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:84 #: ../js/ui/endSessionDialog.js:84
#, c-format #, c-format
#| msgid "The system will power off automatically in %d seconds."
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે." msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે."
@ -604,19 +601,16 @@ msgid "Powering off the system."
msgstr "સિસ્ટમનો પાવર બંધ કરી રહ્યા છે." msgstr "સિસ્ટમનો પાવર બંધ કરી રહ્યા છે."
#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107 #: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107
#| msgid "Restart"
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "પુન:શરૂ કરો" msgstr "પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:92 #: ../js/ui/endSessionDialog.js:92
#| msgid "Power Off"
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "પાવર બંધ" msgstr "પાવર બંધ"
#: ../js/ui/endSessionDialog.js:98 #: ../js/ui/endSessionDialog.js:98
#| msgid "Restart"
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "પુન:શરૂ કરો" msgstr "પુન:શરૂ કરો"
@ -628,7 +622,6 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:101 #: ../js/ui/endSessionDialog.js:101
#, c-format #, c-format
#| msgid "The system will restart automatically in %d seconds."
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે." msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે."
@ -638,21 +631,20 @@ msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે
msgid "Restarting the system." msgid "Restarting the system."
msgstr "સિસ્ટમને પુન:શરૂ કરી રહ્યા છે." msgstr "સિસ્ટમને પુન:શરૂ કરી રહ્યા છે."
#: ../js/ui/extensionSystem.js:405 #: ../js/ui/extensionSystem.js:403
msgid "Install" msgid "Install"
msgstr "સ્થાપિત કરો" msgstr "સ્થાપિત કરો"
#: ../js/ui/extensionSystem.js:409 #: ../js/ui/extensionSystem.js:407
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "extensions.gnome.org માંથી '%s' ને સ્થાપિત અને ડાઉનલોડ કરો?" msgstr "extensions.gnome.org માંથી '%s' ને સ્થાપિત અને ડાઉનલોડ કરો?"
#: ../js/ui/keyboard.js:322 #: ../js/ui/keyboard.js:327
#| msgid "Retry"
msgid "tray" msgid "tray"
msgstr "ટ્રે" msgstr "ટ્રે"
#: ../js/ui/keyboard.js:539 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "કિબોર્ડ" msgstr "કિબોર્ડ"
@ -664,78 +656,73 @@ msgstr "પાસવર્ડ:"
msgid "Type again:" msgid "Type again:"
msgstr "ફરીથી પ્રયત્ન કરો:" msgstr "ફરીથી પ્રયત્ન કરો:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "એક્સટેન્શનો સ્થાપિત થયેલ નથી" msgstr "એક્સટેન્શનો સ્થાપિત થયેલ નથી"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "" msgstr "%s એ કોઇપણ ભૂલોને બહાર કાઢતા નથી."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
#| msgid "Error"
msgid "Hide Errors" msgid "Hide Errors"
msgstr "ભૂલો છુપાડો" msgstr "ભૂલો છુપાડો"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
#| msgid "Error"
msgid "Show Errors" msgid "Show Errors"
msgstr "ભૂલો બતાવો" msgstr "ભૂલો બતાવો"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "સક્રિય" msgstr "સક્રિય"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "નિષ્ક્રિય" msgstr "નિષ્ક્રિય"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "ભૂલ" msgstr "ભૂલ"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "અપ્રચલિત" msgstr "અપ્રચલિત"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "ડાઉનલોડ કરી રહ્યા છે" msgstr "ડાઉનલોડ કરી રહ્યા છે"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "સ્ત્રોત દર્શાવો" msgstr "સ્ત્રોત દર્શાવો"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "વેબ પાનું" msgstr "વેબ પાનું"
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:116 #: ../js/ui/main.js:118
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "%d %t માંથી સ્ક્રીનકાસ્ટ" msgstr "%d %t માંથી સ્ક્રીનકાસ્ટ"
#: ../js/ui/messageTray.js:1197 #: ../js/ui/messageTray.js:1200
msgid "Open" msgid "Open"
msgstr "ખોલો" msgstr "ખોલો"
#: ../js/ui/messageTray.js:1214 #: ../js/ui/messageTray.js:1217
#| msgid "minute"
#| msgid_plural "minutes"
msgid "Unmute" msgid "Unmute"
msgstr "અવાજ ચાલુ રાખો" msgstr "અવાજ ચાલુ રાખો"
#: ../js/ui/messageTray.js:1214 #: ../js/ui/messageTray.js:1217
#| msgid "Mouse"
msgid "Mute" msgid "Mute"
msgstr "મૂંગુ" msgstr "મૂંગુ"
#: ../js/ui/messageTray.js:2447 #: ../js/ui/messageTray.js:2490
msgid "System Information" msgid "System Information"
msgstr "સિસ્ટમ જાણકારી" msgstr "સિસ્ટમ જાણકારી"
@ -815,40 +802,42 @@ msgstr "મોબાઇલ બ્રોડબેન્ડ નેટવર્ક
#: ../js/ui/networkAgent.js:357 #: ../js/ui/networkAgent.js:357
#, c-format #, c-format
#| msgid "You're now connected to '%s'"
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "પાસવર્ડ '%s' સાથે જોડાવા માટે જરૂરી છે." msgstr "પાસવર્ડ '%s' સાથે જોડાવા માટે જરૂરી છે."
#: ../js/ui/overview.js:90 #: ../js/ui/overview.js:90
msgid "Undo" msgid "Undo"
msgstr "" msgstr "રદ કરો"
#: ../js/ui/overview.js:199 #: ../js/ui/overview.js:132
msgid "Overview"
msgstr "ઝાંખી"
#: ../js/ui/overview.js:202
msgid "Windows" msgid "Windows"
msgstr "વિન્ડો" msgstr "વિન્ડો"
#: ../js/ui/overview.js:202 #: ../js/ui/overview.js:205
msgid "Applications" msgid "Applications"
msgstr "કાર્યક્રમો" msgstr "કાર્યક્રમો"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:228 #: ../js/ui/overview.js:231
msgid "Dash" msgid "Dash"
msgstr "ડૅશ" msgstr "ડૅશ"
#: ../js/ui/panel.js:583 #: ../js/ui/panel.js:592
#| msgid "Quit %s"
msgid "Quit" msgid "Quit"
msgstr "બહાર નીકળો" msgstr "બહાર નીકળો"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:614 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "પ્રવૃત્તિઓ" msgstr "પ્રવૃત્તિઓ"
#: ../js/ui/panel.js:987 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "ટોચની પટ્ટી" msgstr "ટોચની પટ્ટી"
@ -867,7 +856,7 @@ msgstr "ની સાથે જોડાવો..."
#: ../js/ui/placeDisplay.js:367 #: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "" msgstr "સ્થાનો અને ઉપકરણો"
#: ../js/ui/polkitAuthenticationAgent.js:71 #: ../js/ui/polkitAuthenticationAgent.js:71
msgid "Authentication Required" msgid "Authentication Required"
@ -894,7 +883,7 @@ msgstr "દિલગીર છું, કામ કરતુ નથી. મહ
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:720 #: ../js/ui/popupMenu.js:724
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-us" msgstr "toggle-switch-us"
@ -902,11 +891,11 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "મહેરબાની કરીને આદેશને દાખલ કરો:" msgstr "મહેરબાની કરીને આદેશને દાખલ કરો:"
#: ../js/ui/searchDisplay.js:349 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "શોધી રહ્યા છે..." msgstr "શોધી રહ્યા છે..."
#: ../js/ui/searchDisplay.js:417 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "પરિણામો બંધબેસતાનથી." msgstr "પરિણામો બંધબેસતાનથી."
@ -923,7 +912,6 @@ msgid "Show Text"
msgstr "લખાણ બતાવો" msgstr "લખાણ બતાવો"
#: ../js/ui/shellEntry.js:79 #: ../js/ui/shellEntry.js:79
#| msgid "Large Text"
msgid "Hide Text" msgid "Hide Text"
msgstr "લખાણ છુપાડો" msgstr "લખાણ છુપાડો"
@ -932,7 +920,6 @@ msgid "Wrong password, please try again"
msgstr "ખોટો પાસવર્ડ, મહેરબાની કરીને ફરીથી પ્રયત્ન કરો" msgstr "ખોટો પાસવર્ડ, મહેરબાની કરીને ફરીથી પ્રયત્ન કરો"
#: ../js/ui/status/accessibility.js:47 #: ../js/ui/status/accessibility.js:47
#| msgid "Visibility"
msgid "Accessibility" msgid "Accessibility"
msgstr "ઉપલબ્ધતા" msgstr "ઉપલબ્ધતા"
@ -944,13 +931,12 @@ msgstr "નાનુ મોટુ કરો"
#. 'screen-reader-enabled'); #. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader); #. this.menu.addMenuItem(screenReader);
#: ../js/ui/status/accessibility.js:63 #: ../js/ui/status/accessibility.js:63
#| msgid "Keyboard"
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "સ્ક્રીન કિબોર્ડ" msgstr "સ્ક્રીન કિબોર્ડ"
#: ../js/ui/status/accessibility.js:67 #: ../js/ui/status/accessibility.js:67
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "" msgstr "દેખાતી ચેતવણીઓ"
#: ../js/ui/status/accessibility.js:70 #: ../js/ui/status/accessibility.js:70
msgid "Sticky Keys" msgid "Sticky Keys"
@ -1013,7 +999,6 @@ msgid "Connection"
msgstr "જોડાણ" msgstr "જોડાણ"
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491 #: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
#| msgid "connecting..."
msgid "disconnecting..." msgid "disconnecting..."
msgstr "જોડાઇ તૂટી રહ્યુ છે..." msgstr "જોડાઇ તૂટી રહ્યુ છે..."
@ -1058,7 +1043,7 @@ msgstr "%s માંથી સત્તાધિકરણ માંગણી"
#: ../js/ui/status/bluetooth.js:378 #: ../js/ui/status/bluetooth.js:378
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "" msgstr "ઉપકરણ %s એ સેવા %s' માટે પ્રવેશ ઇચ્છે છે"
#: ../js/ui/status/bluetooth.js:380 #: ../js/ui/status/bluetooth.js:380
msgid "Always grant access" msgid "Always grant access"
@ -1075,12 +1060,12 @@ msgstr "રદ કરો"
#: ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:408
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "" msgstr "%s માટો જોડીની ખાતરી"
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444 #: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "" msgstr "ઉપકરણ %s આ કમ્પ્યૂટર સાથે જોડી કરવા માંગે છે"
#: ../js/ui/status/bluetooth.js:415 #: ../js/ui/status/bluetooth.js:415
#, c-format #, c-format
@ -1098,7 +1083,7 @@ msgstr "બંધબેસતુ નથી"
#: ../js/ui/status/bluetooth.js:437 #: ../js/ui/status/bluetooth.js:437
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "" msgstr "%s માટે જોડી માંગણી"
#: ../js/ui/status/bluetooth.js:445 #: ../js/ui/status/bluetooth.js:445
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
@ -1182,12 +1167,10 @@ msgstr ""
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452 #: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format #, c-format
#| msgid "Quit %s"
msgid "Auto %s" msgid "Auto %s"
msgstr "આપમેળે %s" msgstr "આપમેળે %s"
#: ../js/ui/status/network.js:881 #: ../js/ui/status/network.js:881
#| msgid "Bluetooth"
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "આપમેળે બ્લુટુથ" msgstr "આપમેળે બ્લુટુથ"
@ -1196,7 +1179,6 @@ msgid "Auto wireless"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:1541 #: ../js/ui/status/network.js:1541
#| msgid "Network error"
msgid "Network" msgid "Network"
msgstr "નેટવર્ક" msgstr "નેટવર્ક"
@ -1427,7 +1409,7 @@ msgstr "%s માં આમંત્રણ"
#: ../js/ui/telepathyClient.js:1050 #: ../js/ui/telepathyClient.js:1050
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "" msgstr "%s એ તમને %s માં જોડાવા માટે આમંત્રણ આપી રહ્યા છે"
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131 #: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131
#: ../js/ui/telepathyClient.js:1229 #: ../js/ui/telepathyClient.js:1229
@ -1464,13 +1446,13 @@ msgstr "જવાબ"
#: ../js/ui/telepathyClient.js:1125 #: ../js/ui/telepathyClient.js:1125
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "" msgstr "%s એ %s માં મોકલી રહ્યા છે"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1194 #: ../js/ui/telepathyClient.js:1194
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "" msgstr "%s ને જોવા માટે પરવાનગી આપવાનું ગમે થે જ્યારે તમે ઓનલાઇન હોય"
#: ../js/ui/telepathyClient.js:1287 #: ../js/ui/telepathyClient.js:1287
msgid "Network error" msgid "Network error"
@ -1502,11 +1484,11 @@ msgstr "પ્રમાણપત્ર સક્રિય થયેલ નથી
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "" msgstr "પ્રમાણપત્ર યજમાનનામ બંધબેસતુ નથી"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "" msgstr "પ્રમાણપજ્ઞ ફિંગરપ્રિન્ટ બંધબેસતુ નથી"
#: ../js/ui/telepathyClient.js:1305 #: ../js/ui/telepathyClient.js:1305
msgid "Certificate self-signed" msgid "Certificate self-signed"
@ -1525,7 +1507,6 @@ msgid "Certificate is invalid"
msgstr "પ્રમાણપત્ર અમાન્ય છે" msgstr "પ્રમાણપત્ર અમાન્ય છે"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1313
#| msgid "Connection established"
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "જોડાણને નામંજૂર કરી દેવામાં આવ્યુ છે" msgstr "જોડાણને નામંજૂર કરી દેવામાં આવ્યુ છે"
@ -1538,7 +1519,6 @@ msgid "Connection has been lost"
msgstr "જોડાણ ખોવાઈ ગયેલ છે" msgstr "જોડાણ ખોવાઈ ગયેલ છે"
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1319
#| msgid "This resource is already connected to the server"
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "આ ખાતુ પહેલેથી જ સર્વર સાથે જોડાયેલ છે" msgstr "આ ખાતુ પહેલેથી જ સર્વર સાથે જોડાયેલ છે"
@ -1556,7 +1536,7 @@ msgstr "સર્વર એ જોડાણને સંચાલિત કર
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1327
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "" msgstr "પ્રમાણપત્રને રદ કરી દેવામાં આવ્યુ છે"
#: ../js/ui/telepathyClient.js:1329 #: ../js/ui/telepathyClient.js:1329
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
@ -1569,7 +1549,6 @@ msgid ""
msgstr "" msgstr ""
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1333
#| msgid "Connection error"
msgid "Internal error" msgid "Internal error"
msgstr "આંતરિક ભૂલ" msgstr "આંતરિક ભૂલ"
@ -1592,51 +1571,51 @@ msgstr "ખાતામાં ફેરફાર કરો"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "અજ્ઞાત કારણ" msgstr "અજ્ઞાત કારણ"
#: ../js/ui/userMenu.js:133 #: ../js/ui/userMenu.js:135
msgid "Hidden" msgid "Hidden"
msgstr "છુપાયેલ" msgstr "છુપાયેલ"
#: ../js/ui/userMenu.js:139 #: ../js/ui/userMenu.js:141
msgid "Idle" msgid "Idle"
msgstr "" msgstr "નિષ્ક્રિય"
#: ../js/ui/userMenu.js:142 #: ../js/ui/userMenu.js:144
msgid "Unavailable" msgid "Unavailable"
msgstr "બિનઉપલબ્ધ" msgstr "બિનઉપલબ્ધ"
#: ../js/ui/userMenu.js:579 ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:653 #: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
msgid "Power Off..." msgid "Power Off..."
msgstr "પાવર બંધ..." msgstr "પાવર બંધ..."
#: ../js/ui/userMenu.js:615 #: ../js/ui/userMenu.js:631
msgid "Notifications" msgid "Notifications"
msgstr "સૂચનાઓ" msgstr "સૂચનાઓ"
#: ../js/ui/userMenu.js:623 #: ../js/ui/userMenu.js:639
msgid "Online Accounts" msgid "Online Accounts"
msgstr "ઓનલાઇન ખાતુ" msgstr "ઓનલાઇન ખાતુ"
#: ../js/ui/userMenu.js:627 #: ../js/ui/userMenu.js:643
msgid "System Settings" msgid "System Settings"
msgstr "સિસ્ટમ સુયોજનો" msgstr "સિસ્ટમ સુયોજનો"
#: ../js/ui/userMenu.js:634 #: ../js/ui/userMenu.js:650
msgid "Lock Screen" msgid "Lock Screen"
msgstr "સ્ક્રીનને તાળુ મારો" msgstr "સ્ક્રીનને તાળુ મારો"
#: ../js/ui/userMenu.js:639 #: ../js/ui/userMenu.js:655
msgid "Switch User" msgid "Switch User"
msgstr "વપરાશકર્તાને બદલો" msgstr "વપરાશકર્તાને બદલો"
#: ../js/ui/userMenu.js:644 #: ../js/ui/userMenu.js:660
msgid "Log Out..." msgid "Log Out..."
msgstr "બહાર નીકળો..." msgstr "બહાર નીકળો..."
#: ../js/ui/userMenu.js:672 #: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "" msgstr "તમારી વાર્તાલાપ પરિસ્થિતિ વ્યસ્ત તરીકે સુયોજિત હશે"
#: ../js/ui/userMenu.js:673 #: ../js/ui/userMenu.js:689
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1668,7 +1647,7 @@ msgstr ""
#: ../js/ui/wanda.js:168 #: ../js/ui/wanda.js:168
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "" msgstr "તમારા મનગમતા ઇસ્ટર ઇંડા"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
@ -1697,28 +1676,26 @@ msgstr[1] "%u ઇનપુટો"
msgid "System Sounds" msgid "System Sounds"
msgstr "સિસ્ટમ અવાજો" msgstr "સિસ્ટમ અવાજો"
#: ../src/main.c:262 #: ../src/main.c:255
msgid "Print version" msgid "Print version"
msgstr "ા" msgstr "ા"
#: ../src/main.c:268 #: ../src/main.c:261
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "લૉગિન સ્ક્રીન માટે GDM દ્દારા વાપરેલ સ્થિતિ" msgstr "લૉગિન સ્ક્રીન માટે GDM દ્દારા વાપરેલ સ્થિતિ"
#: ../src/shell-app.c:617 #: ../src/shell-app.c:619
#, c-format #, c-format
#| msgid "Failed to unmount '%s'"
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "'%s' ને શરૂ કરવામાં નિષ્ફળતા" msgstr "'%s' ને શરૂ કરવામાં નિષ્ફળતા"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:708
#| msgid "Does not match"
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "પાસવર્ડ બંધબેસતો નથી" msgstr "પાસવર્ડ બંધબેસતો નથી"
#: ../src/shell-keyring-prompt.c:716 #: ../src/shell-keyring-prompt.c:716
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "" msgstr "પાસવર્ડને ખાલી રાખી શકાતો નથી"
#: ../src/shell-mobile-providers.c:80 #: ../src/shell-mobile-providers.c:80
msgid "United Kingdom" msgid "United Kingdom"
@ -1735,7 +1712,6 @@ msgstr ""
#. Translators: this is the same string as the one found in #. Translators: this is the same string as the one found in
#. * nautilus #. * nautilus
#: ../src/shell-util.c:97 #: ../src/shell-util.c:97
#| msgid "Volume"
msgid "Home" msgid "Home"
msgstr "ઘર" msgstr "ઘર"

687
po/he.po

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-22 08:22+0100\n" "POT-Creation-Date: 2012-04-04 15:45+0200\n"
"PO-Revision-Date: 2012-03-22 08:23+0100\n" "PO-Revision-Date: 2012-04-04 15:45+0200\n"
"Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n" "Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n" "Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: \n" "Language: \n"
@ -107,10 +107,18 @@ msgstr ""
"állapot. Az itteni érték a GsmPresenceStatus felsorolásból származik." "állapot. Az itteni érték a GsmPresenceStatus felsorolásból származik."
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Keybinding to open the application menu"
msgstr "Billentyűtársítás az alkalmazásmenü megnyitásához"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Keybinding to open the application menu."
msgstr "Billentyűtársítás az alkalmazásmenü megnyitásához."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "A kedvenc alkalmazások asztalifájl-azonosítóinak listája" msgstr "A kedvenc alkalmazások asztalifájl-azonosítóinak listája"
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:17
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -137,19 +145,19 @@ msgstr ""
"használatával. A %T egy helykitöltő, a rendszeren optimális szálmennyiség " "használatával. A %T egy helykitöltő, a rendszeren optimális szálmennyiség "
"megtippelésére." "megtippelésére."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Dátum megjelenítése az órában" msgstr "Dátum megjelenítése az órában"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Hetek számának megjelenítése a naptárban" msgstr "Hetek számának megjelenítése a naptárban"
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Másodpercek megjelenítése" msgstr "Másodpercek megjelenítése"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
@ -157,7 +165,7 @@ msgstr ""
"Az itt felsorolt azonosítóknak megfelelő alkalmazások jelennek meg a " "Az itt felsorolt azonosítóknak megfelelő alkalmazások jelennek meg a "
"kedvencek területen." "kedvencek területen."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -167,7 +175,7 @@ msgstr ""
"névvel, és ezzel a kiterjesztéssel fog rendelkezni. Más tárolóformátumba " "névvel, és ezzel a kiterjesztéssel fog rendelkezni. Más tárolóformátumba "
"való rögzítéskor módosítani kell." "való rögzítéskor módosítani kell."
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -175,11 +183,11 @@ msgstr ""
"A GNOME Shell képernyőfelvevője által felvett eredményül kapott " "A GNOME Shell képernyőfelvevője által felvett eredményül kapott "
"képernyővideó képkockasebessége képkocka/másodpercben." "képernyővideó képkockasebessége képkocka/másodpercben."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A képernyővideó kódolására használt GStreamer adatcsatorna" msgstr "A képernyővideó kódolására használt GStreamer adatcsatorna"
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The shell normally monitors active applications in order to present the most " "The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may " "used ones (e.g. in launchers). While this data will be kept private, you may "
@ -191,23 +199,23 @@ msgstr ""
"titkosak maradnak, magánszférájának védelme érdekében letilthatja ezek " "titkosak maradnak, magánszférájának védelme érdekében letilthatja ezek "
"gyűjtését. Ne feledje, hogy ez nem fogja a már mentett adatokat törölni." "gyűjtését. Ne feledje, hogy ez nem fogja a már mentett adatokat törölni."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Használandó billentyűzet típusa." msgstr "Használandó billentyűzet típusa."
#: ../data/org.gnome.shell.gschema.xml.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.h:27
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "Engedélyezendő kiterjesztések uuid-jei" msgstr "Engedélyezendő kiterjesztések uuid-jei"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
msgstr "Statisztikák gyűjtése alkalmazások használatáról" msgstr "Statisztikák gyűjtése alkalmazások használatáról"
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "A használandó billentyűzet" msgstr "A használandó billentyűzet"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "kikapcsolt OpenSearch szolgáltatók" msgstr "kikapcsolt OpenSearch szolgáltatók"
@ -686,51 +694,51 @@ msgstr "Jelszó:"
msgid "Type again:" msgid "Type again:"
msgstr "Írja be újra:" msgstr "Írja be újra:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nincsenek kiterjesztések telepítve" msgstr "Nincsenek kiterjesztések telepítve"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s nem adott hibát." msgstr "%s nem adott hibát."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Hibák elrejtése" msgstr "Hibák elrejtése"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Hibák megjelenítése" msgstr "Hibák megjelenítése"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Engedélyezve" msgstr "Engedélyezve"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Tiltva" msgstr "Tiltva"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Hiba" msgstr "Hiba"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Elavult" msgstr "Elavult"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Letöltés" msgstr "Letöltés"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Forrás megtekintése" msgstr "Forrás megtekintése"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Weblap" msgstr "Weblap"
@ -860,17 +868,17 @@ msgstr "Alkalmazások"
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Kilépés" msgstr "Kilépés"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Tevékenységek" msgstr "Tevékenységek"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Felső sáv" msgstr "Felső sáv"
@ -1685,7 +1693,7 @@ msgstr ""
#: ../js/ui/wanda.js:128 #: ../js/ui/wanda.js:128
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Az orákulum ezt mondja: %s" msgstr "%s az orákulum ezt mondja"
#: ../js/ui/wanda.js:168 #: ../js/ui/wanda.js:168
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"

1179
po/id.po

File diff suppressed because it is too large Load Diff

668
po/it.po

File diff suppressed because it is too large Load Diff

608
po/ja.po

File diff suppressed because it is too large Load Diff

1614
po/kn.po

File diff suppressed because it is too large Load Diff

303
po/ko.po
View File

@ -1,14 +1,19 @@
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Young-Ho Cha <ganadist@gmail.com>, 2009. # Young-Ho Cha <ganadist@gmail.com>, 2009.
# Changwoo Ryu <cwryu@debian.org>, 2011-2012.
# Seong-ho Cho <darkcircle.0426@gmail.com>, 2012. # Seong-ho Cho <darkcircle.0426@gmail.com>, 2012.
# Changwoo Ryu <cwryu@debian.org>, 2011-2012.
#
#
# 주의 사항:
# - 이 프로그램의 이름인 shell은 "셸"이라고 쓰고, "쉘"이라고 하지 않음.
# - instance messanger 또는 IM은 메신저라고 번역
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "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" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-19 14:09+0000\n" "POT-Creation-Date: 2012-04-19 21:14+0000\n"
"PO-Revision-Date: 2012-03-27 01:36+0900\n" "PO-Revision-Date: 2012-05-19 22:57+0900\n"
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n" "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n" "Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -23,31 +28,30 @@ msgstr "그놈 셸"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching" msgid "Window management and application launching"
msgstr "창 관리 프로그램 시작" msgstr "창 관리 프로그램 실행"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153 #: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "그놈 확장 기본 설정" msgstr "그놈 확장 기본 설정"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions" msgid "Configure GNOME Shell Extensions"
msgstr "그놈 확장을 설정합니다" msgstr "그놈 확장을 설정합니다"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2" msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "Alt-F2를 이용해 개발 및 테스트용 내부 프로그램 사용 가능" msgstr "Alt-F2에서 개발 및 테스트용 내부 기능 사용 가능"
#: ../data/org.gnome.shell.gschema.xml.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "" msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 " "Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog." "dialog."
msgstr "" msgstr "Alt-F2 대화 상자에서 내부 디버깅 및 감시 기능에 접근을 허용합니다."
"Alt-F2 대화 상자를 사용할 때 내부 디버깅 및 감시 도구에 접근을 허용합니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "사용할 확장 기능의 UUID" msgstr "사용할 확장의 UUID 목록"
#: ../data/org.gnome.shell.gschema.xml.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "" msgid ""
@ -55,14 +59,11 @@ msgid ""
"should be loaded. Any extension that wants to be loaded needs to be in this " "should be loaded. Any extension that wants to be loaded needs to be in this "
"list. You can also manipulate this list with the EnableExtension and " "list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell." "DisableExtension DBus methods on org.gnome.Shell."
msgstr "" msgstr "그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 읽어들일 확장의 UUID를 나열합니다. 읽어들이려는 확장은 모두 이 목록에 들어 있어야 합니다. EnableExtension 및 DisableExtension D-버스 메소드를 이용해 이 목록을 조작할 수도 있습니다."
"그놈 셸 확장에 UUID 속성이 있으며 이 키는 불러올 확장을 나열합니다. 불러오려"
"는 확장은 이 목록에 있을 필요가 있습니다. 또한 이 목록을 org.gnome.Shell에 있"
"는 EnableExtension과 DisableExtension DBus 메서드로 조작할 수 있습니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
msgstr "프로그램 사용 통계를 저장할지 여부" msgstr "프로그램 사용 통계를 수집할지 여부"
#: ../data/org.gnome.shell.gschema.xml.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "" msgid ""
@ -70,11 +71,7 @@ msgid ""
"used ones (e.g. in launchers). While this data will be kept private, you may " "used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't " "want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data." "remove already saved data."
msgstr "" msgstr "셸에서는 최근에 사용한 프로그램을(실행 메뉴 등에서) 표시하는 목적으로, 현재 사용 중인 프로그램을 감시합니다. 이 데이터는 비공개 데이터이지만 사생활 문제가 걱정된다면 이 기능을 끌 수도 있습니다. 단 이 기능을 사용하지 않더라도 이미 저장된 데이터를 제거하지는 않습니다."
"셸에서는 최근에 사용한 프로그램을 (실행 메뉴 등에서) 표시하는 목적으로, 현재 "
"사용 중인 프로그램을 감시합니다. 이 데이터는 비공개 데이터이지만 사생활 문제"
"가 걱정된다면 이 기능을 끌 수도 있습니다. 단 이 기능을 사용하지 않더라도 이"
"미 저장된 데이터를 제거하지는 않습니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
@ -84,35 +81,31 @@ msgstr "즐겨찾기 프로그램의 데스크톱 파일 ID 목록"
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
msgstr " ID에 해당하는 프로그램은 즐겨찾기 영역에 표시됩니다." msgstr "여기 들어 있는 ID에 해당하는 프로그램은 즐겨찾기 영역에 표시됩니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "OpenSearch 서비스 사용하지 않음" msgstr "사용하지 않는 OpenSearch 서비스"
#: ../data/org.gnome.shell.gschema.xml.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "명령어 (Alt-F2) 대화 상자에 명령어 기록 기능" msgstr "명령어 대화 상자에(Alt-F2) 기록 기능"
#: ../data/org.gnome.shell.gschema.xml.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "돋보기 대화 창의 기록" msgstr "돋보기 대화 상자에 기록 기능"
#: ../data/org.gnome.shell.gschema.xml.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "" msgid ""
"Internally used to store the last IM presence explicitly set by the user. " "Internally used to store the last IM presence explicitly set by the user. "
"The value here is from the TpConnectionPresenceType enumeration." "The value here is from the TpConnectionPresenceType enumeration."
msgstr "" msgstr "사용자가 직접 설정한 메신저 상태를 저장하는데 내부적으로 사용. 여기에 사용하는 값은 TpConnectionPresenceType 열거 상수 값입니다."
"사용자가 명시적으로 설정한 최근 IM 존재를 저장하기 위해 내부적으로 사용했습니"
"다. 이 값은 TpConnectionPresenceType 열거상수로부터 왔습니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "" msgid ""
"Internally used to store the last session presence status for the user. The " "Internally used to store the last session presence status for the user. The "
"value here is from the GsmPresenceStatus enumeration." "value here is from the GsmPresenceStatus enumeration."
msgstr "" msgstr "사용자의 최근 세션 상태를 저장하는데 내부적으로 사용. 여기에 사용하는 값은 GsmPresenceStatus 열거 상수 값입니다."
"사용자를 위한 최근 세션 존재 상태를 저장하기 위해 내부적으로 사용합니다. 이 "
"값은 GsmPresenceStatus 열거상수로부터 왔습니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@ -123,45 +116,52 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "참이면 달력에 ISO 요일을 표시합니다." msgstr "참이면 달력에 ISO 요일을 표시합니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "프로그램 메뉴를 여는 키 바인딩"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "프로그램 메뉴를 여는 키 바인딩."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "사용할 키보드" msgstr "사용할 키보드"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "사용할 키보드의 종류." msgstr "사용할 키보드의 종류."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "시각에 초 표시" msgstr "시각에 초 표시"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "참이면 시각에 초를 표시합니다." msgstr "참이면 시각에 초를 표시합니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "시계에 날짜 표시" msgstr "시계에 날짜 표시"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "참이면 시계에 날짜를 시각과 같이 표시합니다." msgstr "참이면 시계에 날짜를 시각과 같이 표시합니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "스크린 방송 녹화에 사용할 프레임수." msgstr "스크린 방송 녹화에 사용할 프레임수."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "" msgstr "그놈 셸의 스크린 방송의 녹화 결과물에 사용할 프레임수, 초당 프레임수 단위."
"그놈 셸의 스크린 방송의 녹화 결과물에 사용할 프레임수, 초당 프레임 수 단위."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "스크린 방송 인코딩에 사용할 gstreamer 파이프라인" msgstr "스크린 방송 인코딩에 사용할 gstreamer 파이프라인"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -174,29 +174,18 @@ msgid ""
"'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM " "'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM "
"using the VP8 codec. %T is used as a placeholder for a guess at the optimal " "using the VP8 codec. %T is used as a placeholder for a guess at the optimal "
"thread count on the system." "thread count on the system."
msgstr "" msgstr "녹화 인코딩에 사용할 GStreamer 파이프라인을 지정합니다. gst-launch 프로그램에 사용하는 문법을 따릅니다. 녹화한 영상이 입력되는 싱크 패드는 이 파이프라인에 연결하지 않은 상태여야 합니다. 보통은 소스 패드도 연결하지 않고, 소스 패드의 출력을 출력 파일에 기록합니다. 하지만 파이프라인에서 이 출력을 처리할 수도 있습니다. shout2send 같은 프로그램을 이용해 아이스캐스트 서버로 출력을 보내거나 하는 용도로 사용할 수 있습니다. 설정을 취소하거나 빈 값으로 설정하면, 기본 파이프라인을 사용합니다. 기본 파이프라인은 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux'이고 VP8 코덱을 사용해 WEBM 형식으로 녹화합니다. '%T' 기호는 시스템에서 최적으로 생각되는 스레드 수로 대체됩니다."
"녹화 인코딩에 사용할 GStreamer 파이프라인을 지정합니다. gst-launch에 사용하"
"는 문법을 따릅니다. 파이프라인은 녹화한 영상이 있는 싱크 패드를 연결하지 않"
"은 상태여야 합니다. 보통 소스 패드와 연결하지 않았을 것입니다. 이 패드의 출력"
"은 출력 파일에 기록할 것입니다. 그러나 파이프라인은 이 출력을 다룰 수 있기도 "
"합니다 - 아마 shout2send와 같은 것을 통해 icecast 서버로 출력을 보내는데 사용"
"할지도 모릅니다. 만약 설정을 취소하거나 빈 값으로 설정한다면, 기본 파이프라인"
"을 사용할 것입니다. 이것은 현재 'vp8enc quality=8 speed=6 threads=%T ! "
"queue ! webmmux' 이며 VP8 코덱을 사용하여 WEBM으로 녹화합니다. %T는 시스템 상"
"의 최적의 스레드 수를 추측하기 위해 대체기호로 사용합니다."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "스크린 방송 저장 사용할 파일 확장자" msgstr "스크린 방송 저장할 때 사용할 파일 확장자"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
"a different container format." "a different container format."
msgstr "" msgstr "녹화한 스크린 방송 영상 파일은, 현재 날짜와 여기서 설정하는 확장자를 붙여 파일 이름을 만듭니다. 다른 컨테이너 형식으로 녹화하려면 이 값을 바꿔야 합니다."
"스크린 방송 녹화 파일 이름은 현재 날짜와 이 확장자를 사용해서 결정됩니다. 녹"
"화할 때 다른 형식으로 바꿀 수도 있습니다."
#: ../js/extensionPrefs/main.js:125 #: ../js/extensionPrefs/main.js:125
#, c-format #, c-format
@ -209,42 +198,42 @@ msgstr "<b>확장</b>"
#: ../js/extensionPrefs/main.js:189 #: ../js/extensionPrefs/main.js:189
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "위의 콤보상자를 사용하여 설정할 확장을 선택하십시오." msgstr "위의 콤보상자를 사용 설정할 확장을 선택하십시오."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:627
msgid "Session..." msgid "Session..."
msgstr "세션..." msgstr "세션..."
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:789
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "로그인" msgstr "로그인"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:834
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(또는 지문을 문지르십시오)" msgstr "(또는 지문을 문지르십시오)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:855
msgid "Not listed?" msgid "Not listed?"
msgstr "목록에 없습니까?" msgstr "목록에 없습니까?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401 #: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "취소" msgstr "취소"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1028
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "로그인" msgstr "로그인"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1380
msgid "Login Window" msgid "Login Window"
msgstr "로그인 창" msgstr "로그인 창"
@ -638,11 +627,11 @@ msgstr[0] "시스템이 %d초 뒤에 자동으로 다시 시작합니다."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "시스템을 다시 시작합니다." msgstr "시스템을 다시 시작합니다."
#: ../js/ui/extensionSystem.js:403 #: ../js/ui/extensionSystem.js:404
msgid "Install" msgid "Install"
msgstr "설치" msgstr "설치"
#: ../js/ui/extensionSystem.js:407 #: ../js/ui/extensionSystem.js:408
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "" msgstr ""
@ -652,7 +641,8 @@ msgstr ""
msgid "tray" msgid "tray"
msgstr "트레이" msgstr "트레이"
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "키보드" msgstr "키보드"
@ -664,59 +654,60 @@ msgstr "암호:"
msgid "Type again:" msgid "Type again:"
msgstr "다시 입력하십시오:" msgstr "다시 입력하십시오:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "확장 기능을 설치하지 않았습니다" msgstr "확장을 설치하지 않았습니다"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s이(가) 발생한 에러가 없습니다." msgstr "%s에서 발생한 에러가 없습니다."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "오류 숨기기" msgstr "오류 숨기기"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "오류 보이기" msgstr "오류 보이기"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "사용" msgstr "사용"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "사용 않음" msgstr "사용 않음"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "오류" msgstr "오류"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "오래 된 버전" msgstr "오래 된 버전"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "다운로드 중" msgstr "다운로드 중"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "소스 보기" msgstr "소스 보기"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "웹페이지" msgstr "웹페이지"
# 주의: 파일이름, %d %t는 날짜와 시각, 이상하게 번역하지 말 것
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:118 #: ../js/ui/main.js:118
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "%d %t의 스크린캐스트" msgstr "스크린 방송, %d %t"
#: ../js/ui/messageTray.js:1200 #: ../js/ui/messageTray.js:1200
msgid "Open" msgid "Open"
@ -835,17 +826,17 @@ msgstr "프로그램"
msgid "Dash" msgid "Dash"
msgstr "대시보드" msgstr "대시보드"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "끝내기" msgstr "끝내기"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "현재 활동" msgstr "현재 활동"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "위 막대" msgstr "위 막대"
@ -899,11 +890,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "명령을 입력하십시오:" msgstr "명령을 입력하십시오:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "검색하는 중..." msgstr "검색하는 중..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:415
msgid "No matching results." msgid "No matching results."
msgstr "일치하는 결과가 없습니다." msgstr "일치하는 결과가 없습니다."
@ -921,7 +912,7 @@ msgstr "텍스트 보이기"
#: ../js/ui/shellEntry.js:79 #: ../js/ui/shellEntry.js:79
msgid "Hide Text" msgid "Hide Text"
msgstr "글자 숨기기" msgstr "텍스트 숨기기"
#: ../js/ui/shellMountOperation.js:271 #: ../js/ui/shellMountOperation.js:271
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
@ -1061,7 +1052,7 @@ msgstr "항상 접근 허용"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "이번에만 허용" msgstr "이번에만 허용"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1091 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject" msgid "Reject"
msgstr "거부" msgstr "거부"
@ -1127,7 +1118,7 @@ msgstr "관리되지 않음"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:500 #: ../js/ui/status/network.js:500
msgid "authentication required" msgid "authentication required"
msgstr "인증 필요합니다" msgstr "인증 필요"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
@ -1138,7 +1129,7 @@ msgstr "펌웨어 없음"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:517 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "케이블 분리되었습니다" msgstr "케이블 분리"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
@ -1148,7 +1139,7 @@ msgstr "사용 불가"
#: ../js/ui/status/network.js:524 #: ../js/ui/status/network.js:524
msgid "connection failed" msgid "connection failed"
msgstr "연결 실패했습니다" msgstr "연결 실패"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505 #: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..." msgid "More..."
@ -1158,7 +1149,7 @@ msgstr "더 보기..."
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440 #: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)" msgid "Connected (private)"
msgstr "연결됨 (개인)" msgstr "연결됨(개인)"
#: ../js/ui/status/network.js:696 #: ../js/ui/status/network.js:696
msgid "Auto Ethernet" msgid "Auto Ethernet"
@ -1375,35 +1366,35 @@ msgstr "%s 부재중."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:887 #: ../js/ui/telepathyClient.js:889
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "보낸 때: <b>%A</b> <b>%H시 %M분</b>" msgstr "보낸 때: <b>%A</b> <b>%H시 %M분</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:893 #: ../js/ui/telepathyClient.js:895
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "보낸 때: <b>%B %d일</b> <b>%A</b>" msgstr "보낸 때: <b>%B %d일</b> <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:898 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "보낸 때: %Y년 <b>%B %d일</b> <b>%A</b>" msgstr "보낸 때: %Y년 <b>%B %d일</b> <b>%A</b>"
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/telepathyClient.js:940 #: ../js/ui/telepathyClient.js:942
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s의 대화명이 이제 %s입니다" msgstr "%s의 대화명이 이제 %s입니다"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1042 #: ../js/ui/telepathyClient.js:1044
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "%s에 초대" msgstr "%s에 초대"
@ -1411,35 +1402,35 @@ msgstr "%s에 초대"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1050 #: ../js/ui/telepathyClient.js:1052
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s 님이 %s에 입장하도록 초대합니다" msgstr "%s 님이 %s에 입장하도록 초대합니다"
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131 #: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
#: ../js/ui/telepathyClient.js:1229 #: ../js/ui/telepathyClient.js:1231
msgid "Decline" msgid "Decline"
msgstr "거부" msgstr "거부"
#: ../js/ui/telepathyClient.js:1053 ../js/ui/telepathyClient.js:1132 #: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
#: ../js/ui/telepathyClient.js:1230 #: ../js/ui/telepathyClient.js:1232
msgid "Accept" msgid "Accept"
msgstr "허용" msgstr "허용"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1083 #: ../js/ui/telepathyClient.js:1085
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "%s에서 영상 호출" msgstr "%s에서 영상 호출"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1086 #: ../js/ui/telepathyClient.js:1088
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "%s에서 호출" msgstr "%s에서 호출"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1093 #: ../js/ui/telepathyClient.js:1095
msgid "Answer" msgid "Answer"
msgstr "응답" msgstr "응답"
@ -1448,108 +1439,108 @@ msgstr "응답"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1125 #: ../js/ui/telepathyClient.js:1127
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s님이 %s 파일을 보냅니다" msgstr "%s님이 %s 파일을 보냅니다"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1194 #: ../js/ui/telepathyClient.js:1196
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "연결 상태인지 알 수 있는 권한을 %s님이 요청합니다" msgstr "연결 상태인지 알 수 있는 권한을 %s님이 요청합니다"
#: ../js/ui/telepathyClient.js:1287 #: ../js/ui/telepathyClient.js:1289
msgid "Network error" msgid "Network error"
msgstr "네트워크 오류" msgstr "네트워크 오류"
#: ../js/ui/telepathyClient.js:1289 #: ../js/ui/telepathyClient.js:1291
msgid "Authentication failed" msgid "Authentication failed"
msgstr "인증이 실패했습니다" msgstr "인증이 실패했습니다"
#: ../js/ui/telepathyClient.js:1291 #: ../js/ui/telepathyClient.js:1293
msgid "Encryption error" msgid "Encryption error"
msgstr "암호화 오류" msgstr "암호화 오류"
#: ../js/ui/telepathyClient.js:1293 #: ../js/ui/telepathyClient.js:1295
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "인증서가 없습니다" msgstr "인증서가 없습니다"
#: ../js/ui/telepathyClient.js:1295 #: ../js/ui/telepathyClient.js:1297
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "인증서를 신뢰할 수 없습니다" msgstr "인증서를 신뢰할 수 없습니다"
#: ../js/ui/telepathyClient.js:1297 #: ../js/ui/telepathyClient.js:1299
msgid "Certificate expired" msgid "Certificate expired"
msgstr "인증서가 만료되었습니다" msgstr "인증서가 만료되었습니다"
#: ../js/ui/telepathyClient.js:1299 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "인증서를 활성화하지 않았습니다" msgstr "인증서를 활성화하지 않았습니다"
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "인증서 호스트 이름이 맞지 않습니다" msgstr "인증서 호스트 이름이 맞지 않습니다"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1305
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "인증서 핑거프린트가 맞지 않습니다" msgstr "인증서 핑거프린트가 맞지 않습니다"
#: ../js/ui/telepathyClient.js:1305 #: ../js/ui/telepathyClient.js:1307
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "인증서가 자기 서명한 인증서입니다" msgstr "인증서가 자기 서명한 인증서입니다"
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1309
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "상태를 오프라인으로 설정" msgstr "상태를 오프라인으로 설정"
#: ../js/ui/telepathyClient.js:1309 #: ../js/ui/telepathyClient.js:1311
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "암호화를 사용할 수 없습니다" msgstr "암호화를 사용할 수 없습니다"
#: ../js/ui/telepathyClient.js:1311 #: ../js/ui/telepathyClient.js:1313
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "인증서가 올바르지 않습니다" msgstr "인증서가 올바르지 않습니다"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1315
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "연결이 거부되었습니다" msgstr "연결이 거부되었습니다"
#: ../js/ui/telepathyClient.js:1315 #: ../js/ui/telepathyClient.js:1317
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "연결할 수 없습니다" msgstr "연결할 수 없습니다"
#: ../js/ui/telepathyClient.js:1317 #: ../js/ui/telepathyClient.js:1319
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "연결이 끊어졌습니다" msgstr "연결이 끊어졌습니다"
#: ../js/ui/telepathyClient.js:1319
msgid "This account is already connected to the server"
msgstr "이미 서버에 이 계정을 연결했습니다"
#: ../js/ui/telepathyClient.js:1321 #: ../js/ui/telepathyClient.js:1321
msgid "This account is already connected to the server"
msgstr "이 계정은 이미 서버에 연결했습니다"
#: ../js/ui/telepathyClient.js:1323
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "같은 자원을 사용하는 새로운 연결로 바꾸었습니다" msgstr "같은 자원을 사용하는 새로운 연결로 바꾸었습니다"
#: ../js/ui/telepathyClient.js:1323 #: ../js/ui/telepathyClient.js:1325
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "계정이 이미 서버에 있습니다" msgstr "계정이 이미 서버에 있습니다"
#: ../js/ui/telepathyClient.js:1325 #: ../js/ui/telepathyClient.js:1327
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "서버가 처리할 작업이 많아 연결을 처리할 수 없습니다" msgstr "서버가 처리할 작업이 많아 연결을 처리할 수 없습니다"
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1329
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "인증서를 철회했습니다" msgstr "인증서를 철회했습니다"
#: ../js/ui/telepathyClient.js:1329 #: ../js/ui/telepathyClient.js:1331
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "인증서가 보안에 취약한 알고리즘을 사용하거나 암호화 기능이 취약합니다." msgstr "인증서가 보안에 취약한 알고리즘을 사용하거나 암호화 기능이 취약합니다."
#: ../js/ui/telepathyClient.js:1331 #: ../js/ui/telepathyClient.js:1333
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1557,26 +1548,26 @@ msgstr ""
"서버 인증서의 길이, 또는 서버 인증서 체인의 단계가 암호화 라이브러리의 제한" "서버 인증서의 길이, 또는 서버 인증서 체인의 단계가 암호화 라이브러리의 제한"
"을 넘어갑니다." "을 넘어갑니다."
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1335
msgid "Internal error" msgid "Internal error"
msgstr "내부 오류" msgstr "내부 오류"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1343 #: ../js/ui/telepathyClient.js:1345
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "%s에 연결이 실패했습니다" msgstr "%s에 연결이 실패했습니다"
#: ../js/ui/telepathyClient.js:1352 #: ../js/ui/telepathyClient.js:1354
msgid "Reconnect" msgid "Reconnect"
msgstr "다시 연결" msgstr "다시 연결"
#: ../js/ui/telepathyClient.js:1353 #: ../js/ui/telepathyClient.js:1355
msgid "Edit account" msgid "Edit account"
msgstr "계정 편집" msgstr "계정 편집"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1401
msgid "Unknown reason" msgid "Unknown reason"
msgstr "알 수 없는 이유" msgstr "알 수 없는 이유"
@ -1650,7 +1641,7 @@ msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
"%s" "%s"
msgstr "" msgstr ""
"죄송하지만, 오늘 조언해 줄 것이 없습니다:\n" "죄송합니다. 오늘 조언할 내용이 없습니다:\n"
"%s" "%s"
# 원래 "신탁"이지만 한국인이 이해하기 쉽게 맞게 변경. # 원래 "신탁"이지만 한국인이 이해하기 쉽게 맞게 변경.
@ -1670,7 +1661,7 @@ msgstr "'%s' 프로그램이 준비되었습니다"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1100 #: ../src/gvc/gvc-mixer-control.c:1089
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1678,13 +1669,13 @@ msgstr[0] "%u개 출력"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1110 #: ../src/gvc/gvc-mixer-control.c:1099
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u개 입력" msgstr[0] "%u개 입력"
#: ../src/gvc/gvc-mixer-control.c:1408 #: ../src/gvc/gvc-mixer-control.c:1397
msgid "System Sounds" msgid "System Sounds"
msgstr "시스템 소리" msgstr "시스템 소리"
@ -1708,7 +1699,7 @@ msgstr "암호가 일치하지 않습니다."
#: ../src/shell-keyring-prompt.c:716 #: ../src/shell-keyring-prompt.c:716
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "암호는 비울 수 없습니다" msgstr "빈 암호를 쓸 수 없습니다"
#: ../src/shell-mobile-providers.c:80 #: ../src/shell-mobile-providers.c:80
msgid "United Kingdom" msgid "United Kingdom"
@ -1744,27 +1735,3 @@ msgstr "파일 시스템"
#, c-format #, c-format
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%s: %s" msgstr "%s: %s"
#~ msgid "RECENT ITEMS"
#~ msgstr "최근 항목"
#~ msgid "Show password"
#~ msgstr "암호 표시"
#~ msgid "Home Folder"
#~ msgstr "내 폴더"
#~ msgid "%s has finished starting"
#~ msgstr "%s 프로그램이 시작했습니다"
#~ msgid "If true, display onscreen keyboard."
#~ msgstr "참이면 화면 키보드를 표시합니다."
#~ msgid "Show the onscreen keyboard"
#~ msgstr "화면 키보드 표시"
#~ msgid "Connectivity lost"
#~ msgstr "연결 끊어짐"
#~ msgid "You're no longer connected to the network"
#~ msgstr "이제 네트워크에 연결되어 있지 않습니다"

222
po/lt.po
View File

@ -3,19 +3,20 @@
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Žygimantas Beručka <zygis@gnome.org>, 2010, 2011, 2012. # Žygimantas Beručka <zygis@gnome.org>, 2010, 2011, 2012.
# Algimantas Margevičius <gymka@mail.ru>, 2011. # Algimantas Margevičius <gymka@mail.ru>, 2011.
# Mantas Kriaučiūnas <mantas@akl.lt>, 2012.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-19 14:09+0000\n" "POT-Creation-Date: 2012-05-19 13:58+0000\n"
"PO-Revision-Date: 2012-03-20 14:09+0300\n" "PO-Revision-Date: 2012-04-05 15:14+0300\n"
"Last-Translator: Žygimantas Beručka <zygis@gnome.org>\n" "Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
"Language-Team: Lithuanian\n" "Language-Team: Lithuanian\n"
"Language: lt\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: lt\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%"
"100<10 || n%100>=20) ? 1 : 2);\n" "100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Virtaal 0.7.0\n" "X-Generator: Virtaal 0.7.0\n"
@ -23,7 +24,7 @@ msgstr ""
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell aplinka"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching" msgid "Window management and application launching"
@ -79,10 +80,11 @@ msgid ""
"want to disable this for privacy reasons. Please note that doing so won't " "want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data." "remove already saved data."
msgstr "" msgstr ""
"Apvalkalas paprastai stebi aktyvias programas siekiant pateikti dažniausiai " "Įprastai GNOME aplinka stebi aktyvias programas siekiant pateikti "
"naudojamas (pvz., leistukuose). Nors šie duomenys konfidencialiai saugomi, " "dažniausiai naudojamas (pvz., leistukuose). Nors šie duomenys "
"jei norite, saugumo sumetimais galite šią funkciją išjungti. Atminkite, kad " "konfidencialiai saugomi, jei norite, saugumo sumetimais galite šią funkciją "
"tai padarius jau įrašyti duomenys jau nebus įrašyti." "išjungti. Atminkite, kad išjungus šią funkciją anksčiau įrašyti duomenys "
"nebus pašalinti."
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
@ -133,34 +135,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą." msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Kurią klaviatūrą naudoti" msgstr "Kurią klaviatūrą naudoti"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Naudotinas klaviatūros tipas." msgstr "Naudotinas klaviatūros tipas."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Rodyti laiką su sekundėmis" msgstr "Rodyti laiką su sekundėmis"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Jeigu reikšmė teigiama, rodyti laike sekundes." msgstr "Jeigu reikšmė teigiama, rodyti laike sekundes."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Rodyti datą laikrodyje" msgstr "Rodyti datą laikrodyje"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Jei reikšmė teigiama, laikrodyje šalia laiko rodyti ir datą." msgstr "Jei reikšmė teigiama, laikrodyje šalia laiko rodyti ir datą."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Kadrų dažnis, naudojamas norint įrašyti ekrano vaizdo įrašą." msgstr "Kadrų dažnis, naudojamas norint įrašyti ekrano vaizdo įrašą."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -168,11 +178,11 @@ msgstr ""
"GNOME Shell ekranų įrašymo programa sukurto ekrano įrašo kadrų dažnis " "GNOME Shell ekranų įrašymo programa sukurto ekrano įrašo kadrų dažnis "
"kadrais per sekundę." "kadrais per sekundę."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer konvejeris, naudojamas užkoduojant ekrano vaizdo įrašą." msgstr "Gstreamer konvejeris, naudojamas užkoduojant ekrano vaizdo įrašą."
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -197,11 +207,11 @@ msgstr ""
"speed=6 threads=%T ! queue ! webmmux“ ir įrašo į WEBM naudojant VP8 kodeką. %" "speed=6 threads=%T ! queue ! webmmux“ ir įrašo į WEBM naudojant VP8 kodeką. %"
"T yra naudojamas kaip žymeklis optimalaus gijų skaičiaus sistemoje spėjimui." "T yra naudojamas kaip žymeklis optimalaus gijų skaičiaus sistemoje spėjimui."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Failų plėtinys, naudojamas įrašyti ekrano vaizdo įrašą" msgstr "Failų plėtinys, naudojamas įrašyti ekrano vaizdo įrašą"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -214,7 +224,7 @@ msgstr ""
#: ../js/extensionPrefs/main.js:125 #: ../js/extensionPrefs/main.js:125
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:" msgstr "Įvyko klaida įkeliant %s nustatymų dialogą:"
#: ../js/extensionPrefs/main.js:165 #: ../js/extensionPrefs/main.js:165
msgid "<b>Extension</b>" msgid "<b>Extension</b>"
@ -224,40 +234,40 @@ msgstr "<b>Plėtinys</b>"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Išskleidžiamajame sąraše pasirinkite konfigūruotiną plėtinį." msgstr "Išskleidžiamajame sąraše pasirinkite konfigūruotiną plėtinį."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:627
msgid "Session..." msgid "Session..."
msgstr "Seansas..." msgstr "Seansas..."
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:789
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prisijungti" msgstr "Prisijungti"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:834
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(arba perbraukite pirštu)" msgstr "(arba perbraukite pirštu)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:855
msgid "Not listed?" msgid "Not listed?"
msgstr "Nėra sąraše?" msgstr "Nėra sąraše?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401 #: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Atšaukti" msgstr "Atsisakyti"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1028
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prisijungti" msgstr "Prisijungti"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1380
msgid "Login Window" msgid "Login Window"
msgstr "Prisijungimo langas" msgstr "Prisijungimo langas"
@ -665,11 +675,11 @@ msgstr[2] "Sistema bus paleista iš naujo po %d sekundžių."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Sistema paleidžiama iš naujo." msgstr "Sistema paleidžiama iš naujo."
#: ../js/ui/extensionSystem.js:403 #: ../js/ui/extensionSystem.js:404
msgid "Install" msgid "Install"
msgstr "Įdiegti" msgstr "Įdiegti"
#: ../js/ui/extensionSystem.js:407 #: ../js/ui/extensionSystem.js:408
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?" msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
@ -678,7 +688,8 @@ msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
msgid "tray" msgid "tray"
msgstr "dėklas" msgstr "dėklas"
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "Klaviatūra" msgstr "Klaviatūra"
@ -690,51 +701,51 @@ msgstr "Slaptažodis:"
msgid "Type again:" msgid "Type again:"
msgstr "Įveskite dar kartą:" msgstr "Įveskite dar kartą:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nėra įdiegtų plėtinių" msgstr "Nėra įdiegtų plėtinių"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s nepranešė apie jokias klaidas." msgstr "%s nepranešė apie jokias klaidas."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Slėpti klaidas" msgstr "Slėpti klaidas"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Rodyti klaidas" msgstr "Rodyti klaidas"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Įjungta" msgstr "Įjungta"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "Išjungta" msgstr "Išjungta"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Klaida" msgstr "Klaida"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Pasenęs" msgstr "Pasenęs"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Atsiunčiama" msgstr "Atsiunčiama"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Žiūrėti šaltinį" msgstr "Žiūrėti šaltinį"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Tinklalapis" msgstr "Tinklalapis"
@ -863,17 +874,17 @@ msgstr "Programos"
msgid "Dash" msgid "Dash"
msgstr "Paleidimo sritis" msgstr "Paleidimo sritis"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Užverti" msgstr "Užverti"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Apžvalga" msgstr "Apžvalga"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Viršutinė juosta" msgstr "Viršutinė juosta"
@ -927,11 +938,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Įveskite komandą:" msgstr "Įveskite komandą:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Ieškoma..." msgstr "Ieškoma..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:415
msgid "No matching results." msgid "No matching results."
msgstr "Nerasta atitikmenų." msgstr "Nerasta atitikmenų."
@ -1089,7 +1100,7 @@ msgstr "Visada leisti prieigą"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Leisti tik šį kartą" msgstr "Leisti tik šį kartą"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1091 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject" msgid "Reject"
msgstr "Atmesti" msgstr "Atmesti"
@ -1166,7 +1177,7 @@ msgstr "Trūksta integruotos programinės įrangos (firmware)"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:517 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabelis neįjungtas" msgstr "atjungtas laidas"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
@ -1180,7 +1191,7 @@ msgstr "nepavyko prisijungti"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505 #: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..." msgid "More..."
msgstr "Daugiau..." msgstr "Rodyti daugiau tinklų..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
@ -1377,7 +1388,7 @@ msgstr "Skambutis"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:287 #: ../js/ui/telepathyClient.js:287
msgid "File Transfer" msgid "File Transfer"
msgstr "Failo perdavimas" msgstr "Failo persiuntimas"
#: ../js/ui/telepathyClient.js:369 #: ../js/ui/telepathyClient.js:369
msgid "Subscription request" msgid "Subscription request"
@ -1410,35 +1421,35 @@ msgstr "%s yra užsiėmęs (-usi)."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:887 #: ../js/ui/telepathyClient.js:889
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Išsiųsta <b>%X</b> <b>%A</b>" msgstr "Išsiųsta <b>%X</b> <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:893 #: ../js/ui/telepathyClient.js:895
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Išsiųsta <b>%B %d</b>, <b>%A</b>" msgstr "Išsiųsta <b>%B %d</b>, <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:898 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Išsiųsta %Y <b>%B %d</b>, <b>%A</b>" msgstr "Išsiųsta %Y <b>%B %d</b>, <b>%A</b>"
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/telepathyClient.js:940 #: ../js/ui/telepathyClient.js:942
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s nuo šiol vadinasi %s" msgstr "%s nuo šiol vadinasi %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1042 #: ../js/ui/telepathyClient.js:1044
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Kvietimas į %s" msgstr "Kvietimas į %s"
@ -1446,35 +1457,35 @@ msgstr "Kvietimas į %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1050 #: ../js/ui/telepathyClient.js:1052
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s jus kviečia prisijungti prie %s" msgstr "%s jus kviečia prisijungti prie %s"
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131 #: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
#: ../js/ui/telepathyClient.js:1229 #: ../js/ui/telepathyClient.js:1231
msgid "Decline" msgid "Decline"
msgstr "Atmesti" msgstr "Atmesti"
#: ../js/ui/telepathyClient.js:1053 ../js/ui/telepathyClient.js:1132 #: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
#: ../js/ui/telepathyClient.js:1230 #: ../js/ui/telepathyClient.js:1232
msgid "Accept" msgid "Accept"
msgstr "Priimti" msgstr "Priimti"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1083 #: ../js/ui/telepathyClient.js:1085
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Vaizdo skambutis nuo %s" msgstr "Vaizdo skambutis nuo %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1086 #: ../js/ui/telepathyClient.js:1088
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Skambutis nuo %s" msgstr "Skambutis nuo %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1093 #: ../js/ui/telepathyClient.js:1095
msgid "Answer" msgid "Answer"
msgstr "Atsiliepti" msgstr "Atsiliepti"
@ -1483,110 +1494,110 @@ msgstr "Atsiliepti"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1125 #: ../js/ui/telepathyClient.js:1127
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s jums siunčia %s" msgstr "%s jums siunčia %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1194 #: ../js/ui/telepathyClient.js:1196
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s pageidauja matyti, kai esate prisijungę prie interneto" msgstr "%s pageidauja matyti, kai esate prisijungę prie interneto"
#: ../js/ui/telepathyClient.js:1287 #: ../js/ui/telepathyClient.js:1289
msgid "Network error" msgid "Network error"
msgstr "Tinklo klaida" msgstr "Tinklo klaida"
#: ../js/ui/telepathyClient.js:1289 #: ../js/ui/telepathyClient.js:1291
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Nepavyko patvirtinti tapatybės" msgstr "Nepavyko patvirtinti tapatybės"
#: ../js/ui/telepathyClient.js:1291 #: ../js/ui/telepathyClient.js:1293
msgid "Encryption error" msgid "Encryption error"
msgstr "Šifravimo klaida" msgstr "Šifravimo klaida"
#: ../js/ui/telepathyClient.js:1293 #: ../js/ui/telepathyClient.js:1295
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Liudijimas nepateiktas" msgstr "Liudijimas nepateiktas"
#: ../js/ui/telepathyClient.js:1295 #: ../js/ui/telepathyClient.js:1297
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Liudijimas nepatikimas" msgstr "Liudijimas nepatikimas"
#: ../js/ui/telepathyClient.js:1297 #: ../js/ui/telepathyClient.js:1299
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Liudijimo galiojimas pasibaigęs" msgstr "Liudijimo galiojimas pasibaigęs"
#: ../js/ui/telepathyClient.js:1299 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Liudijimas neaktyvuotas" msgstr "Liudijimas neaktyvuotas"
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Liudijimo serverio vardo nesutapimas" msgstr "Liudijimo serverio vardo nesutapimas"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1305
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Liudijimo piršto atspaudo nesutapimas" msgstr "Liudijimo piršto atspaudo nesutapimas"
#: ../js/ui/telepathyClient.js:1305 #: ../js/ui/telepathyClient.js:1307
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Liudijimas pačių pasirašytas" msgstr "Liudijimas pačių pasirašytas"
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1309
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Nustatyta atsijungimo būsena" msgstr "Nustatyta atsijungimo būsena"
#: ../js/ui/telepathyClient.js:1309 #: ../js/ui/telepathyClient.js:1311
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Šifravimas negalimas" msgstr "Šifravimas negalimas"
#: ../js/ui/telepathyClient.js:1311 #: ../js/ui/telepathyClient.js:1313
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Liudijimas netinkamas" msgstr "Liudijimas netinkamas"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1315
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Ryšys atmestas" msgstr "Ryšys atmestas"
#: ../js/ui/telepathyClient.js:1315 #: ../js/ui/telepathyClient.js:1317
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Nepavyko užmegzti ryšio" msgstr "Nepavyko užmegzti ryšio"
#: ../js/ui/telepathyClient.js:1317 #: ../js/ui/telepathyClient.js:1319
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Ryšys nutrūko" msgstr "Ryšys nutrūko"
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1321
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Ši paskyra jau prijungta prie serverio" msgstr "Ši paskyra jau prijungta prie serverio"
#: ../js/ui/telepathyClient.js:1321 #: ../js/ui/telepathyClient.js:1323
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "Ryšys pakeistas nauju ryšiu naudojant tą patį išteklių" msgstr "Ryšys pakeistas nauju ryšiu naudojant tą patį išteklių"
#: ../js/ui/telepathyClient.js:1323 #: ../js/ui/telepathyClient.js:1325
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Tokia paskyra serveryje jau yra" msgstr "Tokia paskyra serveryje jau yra"
#: ../js/ui/telepathyClient.js:1325 #: ../js/ui/telepathyClient.js:1327
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Šiuo metu serveris per daug užimtas šiai užklausai apdoroti" msgstr "Šiuo metu serveris per daug užimtas šiai užklausai apdoroti"
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1329
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Liudijimas atšauktas" msgstr "Liudijimas atšauktas"
#: ../js/ui/telepathyClient.js:1329 #: ../js/ui/telepathyClient.js:1331
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Liudijimui naudojamas nesaugus šifravimo algoritmas arba jis kriptografiškai " "Liudijimui naudojamas nesaugus šifravimo algoritmas arba jis kriptografiškai "
"silpnas" "silpnas"
#: ../js/ui/telepathyClient.js:1331 #: ../js/ui/telepathyClient.js:1333
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1594,26 +1605,26 @@ msgstr ""
"Serverio liudijimo ilgis arba liudijimų eilės dydis viršija kriptografijos " "Serverio liudijimo ilgis arba liudijimų eilės dydis viršija kriptografijos "
"bibliotekos apribojimus" "bibliotekos apribojimus"
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1335
msgid "Internal error" msgid "Internal error"
msgstr "Vidinė klaida" msgstr "Vidinė klaida"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1343 #: ../js/ui/telepathyClient.js:1345
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Nepavyko prisijungti prie %s" msgstr "Nepavyko prisijungti prie %s"
#: ../js/ui/telepathyClient.js:1352 #: ../js/ui/telepathyClient.js:1354
msgid "Reconnect" msgid "Reconnect"
msgstr "Prisijungti iš naujo" msgstr "Prisijungti iš naujo"
#: ../js/ui/telepathyClient.js:1353 #: ../js/ui/telepathyClient.js:1355
msgid "Edit account" msgid "Edit account"
msgstr "Taisyti paskyrą" msgstr "Taisyti paskyrą"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1401
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Nežinoma priežastis" msgstr "Nežinoma priežastis"
@ -1639,7 +1650,7 @@ msgstr "Pranešimai"
#: ../js/ui/userMenu.js:639 #: ../js/ui/userMenu.js:639
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Tinklo paskyros" msgstr "Interneto paskyros"
#: ../js/ui/userMenu.js:643 #: ../js/ui/userMenu.js:643
msgid "System Settings" msgid "System Settings"
@ -1694,11 +1705,11 @@ msgstr ""
#: ../js/ui/wanda.js:128 #: ../js/ui/wanda.js:128
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Orakulė sako %s" msgstr "Orakulė %s sako"
#: ../js/ui/wanda.js:168 #: ../js/ui/wanda.js:168
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Jūsų mėgstamiausias vėlykinis kiaušinis" msgstr "Jūsų mėgstamiausias velykinis kiaušinis"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
@ -1707,7 +1718,7 @@ msgstr "„%s“ yra pasirengusi"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1100 #: ../src/gvc/gvc-mixer-control.c:1089
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1717,7 +1728,7 @@ msgstr[2] "%u išvestys"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1110 #: ../src/gvc/gvc-mixer-control.c:1099
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
@ -1725,15 +1736,15 @@ msgstr[0] "%u įvestis"
msgstr[1] "%u įvestys" msgstr[1] "%u įvestys"
msgstr[2] "%u įvestys" msgstr[2] "%u įvestys"
#: ../src/gvc/gvc-mixer-control.c:1408 #: ../src/gvc/gvc-mixer-control.c:1397
msgid "System Sounds" msgid "System Sounds"
msgstr "Sistemos garsai" msgstr "Sistemos garsai"
#: ../src/main.c:255 #: ../src/main.c:256
msgid "Print version" msgid "Print version"
msgstr "Išvesti versijos numerį" msgstr "Išvesti versijos numerį"
#: ../src/main.c:261 #: ../src/main.c:262
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Veiksena, naudojama GDM prisijungimo ekrane" msgstr "Veiksena, naudojama GDM prisijungimo ekrane"
@ -1743,7 +1754,6 @@ msgid "Failed to launch '%s'"
msgstr "Nepavyko paleisti „%s“" msgstr "Nepavyko paleisti „%s“"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:708
#| msgid "Does not match"
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Slaptažodžiai nesutampa." msgstr "Slaptažodžiai nesutampa."
@ -1767,7 +1777,7 @@ msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"
#. * nautilus #. * nautilus
#: ../src/shell-util.c:97 #: ../src/shell-util.c:97
msgid "Home" msgid "Home"
msgstr "Namai" msgstr "Namų aplankas"
#. Translators: this is the same string as the one found in #. Translators: this is the same string as the one found in
#. * nautilus #. * nautilus

View File

@ -9,17 +9,17 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-19 14:09+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-03-24 18:43+0200\n" "PO-Revision-Date: 2012-04-13 19:12+0300\n"
"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n" "Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
"Language-Team: Latvian <lata-l10n@googlegroups.com>\n" "Language-Team: Latvian <lata-l18n@googlegroups.com>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: lv\n" "Language: lv\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
"2);\n" "2);\n"
"X-Generator: Lokalize 1.2\n" "X-Generator: Lokalize 1.4\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
@ -132,34 +132,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Ja patiess, kalendārā rādīt ISO nedēļas datumus." msgstr "Ja patiess, kalendārā rādīt ISO nedēļas datumus."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Taustiņu sasaiste, lai atvērtu lietotnes izvēlni"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Taustiņu sasaiste, lai atvērtu lietotnes izvēlni."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Kuru tastatūru izmantot" msgstr "Kuru tastatūru izmantot"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Izmantojamās tastatūras tips." msgstr "Izmantojamās tastatūras tips."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Rādīt laiku ar sekundēm" msgstr "Rādīt laiku ar sekundēm"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Ja patiess, rādīt pulkstenī arī sekundes." msgstr "Ja patiess, rādīt pulkstenī arī sekundes."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Pie pulksteņa rādīt arī datumu" msgstr "Pie pulksteņa rādīt arī datumu"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Ja patiess, rādīt pulkstenī arī datumu, ne tikai laiku." msgstr "Ja patiess, rādīt pulkstenī arī datumu, ne tikai laiku."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Kadrātrums, ko izmantot, ierakstot ekrānraides." msgstr "Kadrātrums, ko izmantot, ierakstot ekrānraides."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -167,11 +175,11 @@ msgstr ""
"Iegūtās ekrānraides kadrātrums, ko ieraksta GNOME Shell ekrānraižu " "Iegūtās ekrānraides kadrātrums, ko ieraksta GNOME Shell ekrānraižu "
"ierakstītājs. Norāda kadros sekundē." "ierakstītājs. Norāda kadros sekundē."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer konveijers, ko izmanto ekrānraides iekodēšanai" msgstr "Gstreamer konveijers, ko izmanto ekrānraides iekodēšanai"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -196,11 +204,11 @@ msgstr ""
"threads=%T ! queue ! webmmux' un ieraksta WEBM ar VP8 kodeku. %T tiek " "threads=%T ! queue ! webmmux' un ieraksta WEBM ar VP8 kodeku. %T tiek "
"izmantots kā vietturis, lai uzminētu optimālo pavedienu skaitu sistēmā." "izmantots kā vietturis, lai uzminētu optimālo pavedienu skaitu sistēmā."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Failu paplašinājumi, ko izmanto ekrānraižu saglabāšanai" msgstr "Failu paplašinājumi, ko izmanto ekrānraižu saglabāšanai"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -686,51 +694,51 @@ msgstr "Parole:"
msgid "Type again:" msgid "Type again:"
msgstr "Ierakstiet vēlreiz:" msgstr "Ierakstiet vēlreiz:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nav instalētu paplašinājumu" msgstr "Nav instalētu paplašinājumu"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s nav izdevis nevienu kļūdu." msgstr "%s nav izdevis nevienu kļūdu."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Slēpt kļūdas" msgstr "Slēpt kļūdas"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Rādīt kļūdas" msgstr "Rādīt kļūdas"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Aktivēta" msgstr "Aktivēta"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Deaktivēta" msgstr "Deaktivēta"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Kļūda" msgstr "Kļūda"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Nav aktuāls" msgstr "Nav aktuāls"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Lejupielādē" msgstr "Lejupielādē"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Skatīt avotu" msgstr "Skatīt avotu"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Tīmekļa lapa" msgstr "Tīmekļa lapa"
@ -859,17 +867,17 @@ msgstr "Lietotnes"
msgid "Dash" msgid "Dash"
msgstr "Panelis" msgstr "Panelis"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Iziet" msgstr "Iziet"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Aktivitātes" msgstr "Aktivitātes"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Augšējā josla" msgstr "Augšējā josla"
@ -923,11 +931,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Lūdzu, ievadiet komandu:" msgstr "Lūdzu, ievadiet komandu:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Meklē..." msgstr "Meklē..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Nav rezultātu." msgstr "Nav rezultātu."

1494
po/mr.po

File diff suppressed because it is too large Load Diff

559
po/nb.po

File diff suppressed because it is too large Load Diff

717
po/pa.po

File diff suppressed because it is too large Load Diff

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-19 18:59+0100\n" "POT-Creation-Date: 2012-03-31 04:10+0200\n"
"PO-Revision-Date: 2012-03-19 19:00+0100\n" "PO-Revision-Date: 2012-03-31 04:11+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n" "Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n" "Language: pl\n"
@ -137,46 +137,54 @@ msgstr ""
"w kalendarzu." "w kalendarzu."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Skrót do otwarcia menu programu"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Skrót do otwarcia menu programu."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Której klawiatury używać" msgstr "Której klawiatury używać"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ używanej klawiatury." msgstr "Typ używanej klawiatury."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Wyświetlanie czasu z sekundami" msgstr "Wyświetlanie czasu z sekundami"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Jeśli jest ustawione na \"true\", to wyświetla sekundy w zegarze." msgstr "Jeśli jest ustawione na \"true\", to wyświetla sekundy w zegarze."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Wyświetlanie daty w zegarze" msgstr "Wyświetlanie daty w zegarze"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "" msgstr ""
"Jeśli jest ustawione na \"true\", to wyświetla datę w zegarze, dodatkowo do " "Jeśli jest ustawione na \"true\", to wyświetla datę w zegarze, dodatkowo do "
"czasu." "czasu."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Liczba klatek na sekundę do nagrywania pulpitu." msgstr "Liczba klatek na sekundę do nagrywania pulpitu."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "Liczba klatek na sekundę wynikowego nagrania pulpitu." msgstr "Liczba klatek na sekundę wynikowego nagrania pulpitu."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania pulpitu" msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania pulpitu"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -200,11 +208,11 @@ msgstr ""
"threads=%T ! queue ! webmmux\" i nagrywa do formatu WebM używając kodeka " "threads=%T ! queue ! webmmux\" i nagrywa do formatu WebM używając kodeka "
"VP8. %T jest zamieniane na odgadniętą optymalną liczbę wątków dla komputera." "VP8. %T jest zamieniane na odgadniętą optymalną liczbę wątków dla komputera."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Rozszerzenie pliku używane do przechowywania nagrań pulpitu" msgstr "Rozszerzenie pliku używane do przechowywania nagrań pulpitu"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -692,51 +700,51 @@ msgstr "Hasło:"
msgid "Type again:" msgid "Type again:"
msgstr "Proszę wpisać ponownie:" msgstr "Proszę wpisać ponownie:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nie zainstalowano rozszerzeń" msgstr "Nie zainstalowano rozszerzeń"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Rozszerzenie %s nie wysłało żadnych błędów." msgstr "Rozszerzenie %s nie wysłało żadnych błędów."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Ukryj błędy" msgstr "Ukryj błędy"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Wyświetl błędy" msgstr "Wyświetl błędy"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Włączone" msgstr "Włączone"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Wyłączone" msgstr "Wyłączone"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Błąd" msgstr "Błąd"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Nieaktualne" msgstr "Nieaktualne"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Pobieranie" msgstr "Pobieranie"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Wyświetl źródło" msgstr "Wyświetl źródło"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Strona WWW" msgstr "Strona WWW"
@ -865,17 +873,17 @@ msgstr "Programy"
msgid "Dash" msgid "Dash"
msgstr "Ulubione" msgstr "Ulubione"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Zakończ" msgstr "Zakończ"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Podgląd" msgstr "Podgląd"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Górny pasek" msgstr "Górny pasek"
@ -929,11 +937,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Proszę wprowadzić polecenie:" msgstr "Proszę wprowadzić polecenie:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Wyszukiwanie..." msgstr "Wyszukiwanie..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Brak wyników." msgstr "Brak wyników."

View File

@ -14,15 +14,15 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-21 21:00-0300\n" "POT-Creation-Date: 2012-04-28 10:45-0300\n"
"PO-Revision-Date: 2012-03-13 11:54-0300\n" "PO-Revision-Date: 2012-04-28 10:45-0300\n"
"Last-Translator: Jonh Wendell <jwendell@gnome.org>\n" "Last-Translator: Jonh Wendell <jwendell@gnome.org>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n" "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
@ -114,11 +114,19 @@ msgstr ""
"valor usado aqui vem da enumeração GsmPresenceStatus." "valor usado aqui vem da enumeração GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Keybinding to open the application menu"
msgstr "Atalho de teclado para abrir o menu aplicativo"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Keybinding to open the application menu."
msgstr "Atalho de teclado para abrir o menu aplicativo."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "" msgstr ""
"Lista dos IDs de arquivo de área de trabalho para os aplicativos favoritos" "Lista dos IDs de arquivo de área de trabalho para os aplicativos favoritos"
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:17
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -144,19 +152,19 @@ msgstr ""
"usando o codec VP8. %T é usado como uma tentativa de descobrir a melhor " "usando o codec VP8. %T é usado como uma tentativa de descobrir a melhor "
"quantidade de threads a serem usadas." "quantidade de threads a serem usadas."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Mostrar data no relógio" msgstr "Mostrar data no relógio"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Mostrar o número da semana no calendário" msgstr "Mostrar o número da semana no calendário"
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Mostrar horário com segundos" msgstr "Mostrar horário com segundos"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
@ -164,7 +172,7 @@ msgstr ""
"Os aplicativos correspondentes a estes identificadores serão exibidos na " "Os aplicativos correspondentes a estes identificadores serão exibidos na "
"área de favoritos." "área de favoritos."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -174,7 +182,7 @@ msgstr ""
"baseado na data atual e usará esta extensão. Ele deve ser alterado ao gravar " "baseado na data atual e usará esta extensão. Ele deve ser alterado ao gravar "
"para um contêiner de formato diferente." "para um contêiner de formato diferente."
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -182,11 +190,11 @@ msgstr ""
"A taxa de quadros do screencast resultante do gravador de screencasts do " "A taxa de quadros do screencast resultante do gravador de screencasts do "
"GNOME Shell em quadros por segundo." "GNOME Shell em quadros por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A fila de processamento gstreamer usada para codificar o screencast" msgstr "A fila de processamento gstreamer usada para codificar o screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The shell normally monitors active applications in order to present the most " "The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may " "used ones (e.g. in launchers). While this data will be kept private, you may "
@ -198,23 +206,23 @@ msgstr ""
"segurança, você pode querer desabilitá-los por razões de privacidade. Por " "segurança, você pode querer desabilitá-los por razões de privacidade. Por "
"favor, note que ao fazer isso não removerá os dados já salvos." "favor, note que ao fazer isso não removerá os dados já salvos."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "O tipo do teclado para usar." msgstr "O tipo do teclado para usar."
#: ../data/org.gnome.shell.gschema.xml.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.h:27
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "Uuids das extensões para habilitar" msgstr "Uuids das extensões para habilitar"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
msgstr "Quando coletar dados sobre uso de aplicativos" msgstr "Quando coletar dados sobre uso de aplicativos"
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Qual teclado usar" msgstr "Qual teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "Provedores OpenSearch desabilitados" msgstr "Provedores OpenSearch desabilitados"
@ -231,40 +239,40 @@ msgstr "<b>Extensão</b>"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Escolha uma extensão para configurar usando a caixa acima." msgstr "Escolha uma extensão para configurar usando a caixa acima."
#: ../js/gdm/loginDialog.js:624 #: ../js/gdm/loginDialog.js:627
msgid "Session..." msgid "Session..."
msgstr "Sessão..." msgstr "Sessão..."
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:789
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sessão" msgstr "Iniciar sessão"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:831 #: ../js/gdm/loginDialog.js:834
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ou deslize o dedo)" msgstr "(ou deslize o dedo)"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:852 #: ../js/gdm/loginDialog.js:855
msgid "Not listed?" msgid "Not listed?"
msgstr "Não listado?" msgstr "Não listado?"
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401 #: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153 #: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:1025 #: ../js/gdm/loginDialog.js:1028
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Entrar" msgstr "Entrar"
#: ../js/gdm/loginDialog.js:1377 #: ../js/gdm/loginDialog.js:1380
msgid "Login Window" msgid "Login Window"
msgstr "Janela de sessão" msgstr "Janela de sessão"
@ -663,11 +671,11 @@ msgstr[1] "O sistema será reiniciado automaticamente em %d segundos."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Reiniciando o sistema." msgstr "Reiniciando o sistema."
#: ../js/ui/extensionSystem.js:403 #: ../js/ui/extensionSystem.js:404
msgid "Install" msgid "Install"
msgstr "Instalar" msgstr "Instalar"
#: ../js/ui/extensionSystem.js:407 #: ../js/ui/extensionSystem.js:408
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Baixar e instalar \"%s\" de extensions.gnome.org?" msgstr "Baixar e instalar \"%s\" de extensions.gnome.org?"
@ -676,7 +684,8 @@ msgstr "Baixar e instalar \"%s\" de extensions.gnome.org?"
msgid "tray" msgid "tray"
msgstr "bandeja" msgstr "bandeja"
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203 #: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
@ -688,51 +697,51 @@ msgstr "Senha:"
msgid "Type again:" msgid "Type again:"
msgstr "Digite novamente:" msgstr "Digite novamente:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nenhuma extensão instalada" msgstr "Nenhuma extensão instalada"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s não produziu nenhum erro." msgstr "%s não produziu nenhum erro."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Mostrar erros" msgstr "Mostrar erros"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Esconder erros" msgstr "Esconder erros"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Habilitada" msgstr "Habilitada"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "Desabilitada" msgstr "Desabilitada"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Erro" msgstr "Erro"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Obsoleta" msgstr "Obsoleta"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Baixando" msgstr "Baixando"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Ver fonte" msgstr "Ver fonte"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
@ -861,17 +870,17 @@ msgstr "Aplicativos"
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Sair" msgstr "Sair"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Atividades" msgstr "Atividades"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -929,7 +938,7 @@ msgstr "Por favor, digite um comando:"
msgid "Searching..." msgid "Searching..."
msgstr "Pesquisando..." msgstr "Pesquisando..."
#: ../js/ui/searchDisplay.js:414 #: ../js/ui/searchDisplay.js:415
msgid "No matching results." msgid "No matching results."
msgstr "Nenhum resultado encontrado." msgstr "Nenhum resultado encontrado."
@ -1087,7 +1096,7 @@ msgstr "Sempre permitir acesso"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Permitir apenas desta vez" msgstr "Permitir apenas desta vez"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1091 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject" msgid "Reject"
msgstr "Rejeitar" msgstr "Rejeitar"
@ -1404,35 +1413,35 @@ msgstr "%s está ocupado."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:887 #: ../js/ui/telepathyClient.js:889
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Enviado <b>%A</b>, <b>%X</b>" msgstr "Enviado <b>%A</b>, <b>%X</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:893 #: ../js/ui/telepathyClient.js:895
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Enviado <b>%A</b>, <b>%d de %B</b>" msgstr "Enviado <b>%A</b>, <b>%d de %B</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:898 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Enviado <b>%A</b>, <b>%d de %B</b> de %Y" msgstr "Enviado <b>%A</b>, <b>%d de %B</b> de %Y"
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/telepathyClient.js:940 #: ../js/ui/telepathyClient.js:942
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s agora é conhecido como %s" msgstr "%s agora é conhecido como %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1042 #: ../js/ui/telepathyClient.js:1044
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Convite para %s" msgstr "Convite para %s"
@ -1440,35 +1449,35 @@ msgstr "Convite para %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1050 #: ../js/ui/telepathyClient.js:1052
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s está convidando você para entrar em %s" msgstr "%s está convidando você para entrar em %s"
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131 #: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
#: ../js/ui/telepathyClient.js:1229 #: ../js/ui/telepathyClient.js:1231
msgid "Decline" msgid "Decline"
msgstr "Recusar" msgstr "Recusar"
#: ../js/ui/telepathyClient.js:1053 ../js/ui/telepathyClient.js:1132 #: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
#: ../js/ui/telepathyClient.js:1230 #: ../js/ui/telepathyClient.js:1232
msgid "Accept" msgid "Accept"
msgstr "Aceitar" msgstr "Aceitar"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1083 #: ../js/ui/telepathyClient.js:1085
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Vídeo-chamada de %s" msgstr "Vídeo-chamada de %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1086 #: ../js/ui/telepathyClient.js:1088
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Chamada de %s" msgstr "Chamada de %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1093 #: ../js/ui/telepathyClient.js:1095
msgid "Answer" msgid "Answer"
msgstr "Atender" msgstr "Atender"
@ -1477,110 +1486,110 @@ msgstr "Atender"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1125 #: ../js/ui/telepathyClient.js:1127
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s está enviando %s" msgstr "%s está enviando %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1194 #: ../js/ui/telepathyClient.js:1196
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s quer permissão para vê-lo quando conectado" msgstr "%s quer permissão para vê-lo quando conectado"
#: ../js/ui/telepathyClient.js:1287 #: ../js/ui/telepathyClient.js:1289
msgid "Network error" msgid "Network error"
msgstr "Erro de rede" msgstr "Erro de rede"
#: ../js/ui/telepathyClient.js:1289 #: ../js/ui/telepathyClient.js:1291
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Falha de autenticação" msgstr "Falha de autenticação"
#: ../js/ui/telepathyClient.js:1291 #: ../js/ui/telepathyClient.js:1293
msgid "Encryption error" msgid "Encryption error"
msgstr "Erro de criptografia" msgstr "Erro de criptografia"
#: ../js/ui/telepathyClient.js:1293 #: ../js/ui/telepathyClient.js:1295
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certificado não fornecido" msgstr "Certificado não fornecido"
#: ../js/ui/telepathyClient.js:1295 #: ../js/ui/telepathyClient.js:1297
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Certificado não confiável" msgstr "Certificado não confiável"
#: ../js/ui/telepathyClient.js:1297 #: ../js/ui/telepathyClient.js:1299
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certificado expirado" msgstr "Certificado expirado"
#: ../js/ui/telepathyClient.js:1299 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certificado não ativado" msgstr "Certificado não ativado"
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Máquina do certificado não confere" msgstr "Máquina do certificado não confere"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1305
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Impressão digital do certificado não confere" msgstr "Impressão digital do certificado não confere"
#: ../js/ui/telepathyClient.js:1305 #: ../js/ui/telepathyClient.js:1307
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certificado auto-assinado" msgstr "Certificado auto-assinado"
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1309
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "O status está definido como desconectado." msgstr "O status está definido como desconectado."
#: ../js/ui/telepathyClient.js:1309 #: ../js/ui/telepathyClient.js:1311
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Criptografia não disponível" msgstr "Criptografia não disponível"
#: ../js/ui/telepathyClient.js:1311 #: ../js/ui/telepathyClient.js:1313
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "O certificado é inválido" msgstr "O certificado é inválido"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1315
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "A conexão foi recusada" msgstr "A conexão foi recusada"
#: ../js/ui/telepathyClient.js:1315 #: ../js/ui/telepathyClient.js:1317
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "A conexão não pode ser estabelecida" msgstr "A conexão não pode ser estabelecida"
#: ../js/ui/telepathyClient.js:1317 #: ../js/ui/telepathyClient.js:1319
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Conexão perdida" msgstr "Conexão perdida"
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1321
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Esta conta já está conectada ao servidor" msgstr "Esta conta já está conectada ao servidor"
#: ../js/ui/telepathyClient.js:1321 #: ../js/ui/telepathyClient.js:1323
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "A conexão foi substituída por uma nova conexão usando o mesmo recurso" msgstr "A conexão foi substituída por uma nova conexão usando o mesmo recurso"
#: ../js/ui/telepathyClient.js:1323 #: ../js/ui/telepathyClient.js:1325
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "A conta já existe no servidor" msgstr "A conta já existe no servidor"
#: ../js/ui/telepathyClient.js:1325 #: ../js/ui/telepathyClient.js:1327
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "O servidor está atualmente muito ocupado para controlar a conexão" msgstr "O servidor está atualmente muito ocupado para controlar a conexão"
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1329
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "O certificado foi revogado" msgstr "O certificado foi revogado"
#: ../js/ui/telepathyClient.js:1329 #: ../js/ui/telepathyClient.js:1331
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"O certificado usa um algoritmo de cifragem inseguro ou é criptograficamente " "O certificado usa um algoritmo de cifragem inseguro ou é criptograficamente "
"fraco" "fraco"
#: ../js/ui/telepathyClient.js:1331 #: ../js/ui/telepathyClient.js:1333
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1588,26 +1597,26 @@ msgstr ""
"O comprimento do certificado do servidor, ou a profundidade da cadeia do " "O comprimento do certificado do servidor, ou a profundidade da cadeia do "
"certificado excedeu os limites impostos pela biblioteca de criptografia" "certificado excedeu os limites impostos pela biblioteca de criptografia"
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1335
msgid "Internal error" msgid "Internal error"
msgstr "Erro interno" msgstr "Erro interno"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1343 #: ../js/ui/telepathyClient.js:1345
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "A conexão com %s falhou" msgstr "A conexão com %s falhou"
#: ../js/ui/telepathyClient.js:1352 #: ../js/ui/telepathyClient.js:1354
msgid "Reconnect" msgid "Reconnect"
msgstr "Reconectar" msgstr "Reconectar"
#: ../js/ui/telepathyClient.js:1353 #: ../js/ui/telepathyClient.js:1355
msgid "Edit account" msgid "Edit account"
msgstr "Editar conta" msgstr "Editar conta"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1401
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razão desconhecida" msgstr "Razão desconhecida"
@ -1701,7 +1710,7 @@ msgstr "\"%s\" está pronto"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1100 #: ../src/gvc/gvc-mixer-control.c:1089
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1710,14 +1719,14 @@ msgstr[1] "%u saídas"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1110 #: ../src/gvc/gvc-mixer-control.c:1099
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u entrada" msgstr[0] "%u entrada"
msgstr[1] "%u entradas" msgstr[1] "%u entradas"
#: ../src/gvc/gvc-mixer-control.c:1408 #: ../src/gvc/gvc-mixer-control.c:1397
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons do sistema" msgstr "Sons do sistema"

717
po/ru.po

File diff suppressed because it is too large Load Diff

664
po/sl.po

File diff suppressed because it is too large Load Diff

View File

@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-20 09:50+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-02-29 11:26+0200\n" "PO-Revision-Date: 2012-03-31 10:20+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: sr\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n%" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
@ -130,34 +130,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Ако је изабрано, приказује ИСО дан у недељи у календару." msgstr "Ако је изабрано, приказује ИСО дан у недељи у календару."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Свеза тастера за отварање изборника програма"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Свеза тастера за отварање изборника програма."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Која ће тастатура бити коришћена" msgstr "Која ће тастатура бити коришћена"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Врста тастатуре за употребу." msgstr "Врста тастатуре за употребу."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Приказује време и секунде" msgstr "Приказује време и секунде"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Ако је изабрано, приказује секунде у времену." msgstr "Ако је изабрано, приказује секунде у времену."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Приказује датум у панелу" msgstr "Приказује датум у панелу"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Ако је изабрано, приказује датум у часовнику, као додатак времену." msgstr "Ако је изабрано, приказује датум у часовнику, као додатак времену."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Учестаност кадрова за видео снимак екрана." msgstr "Учестаност кадрова за видео снимак екрана."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -165,11 +173,11 @@ msgstr ""
"Учестаност кадрова снимка снимљених помоћу Гномове шкољке у кадровима по " "Учестаност кадрова снимка снимљених помоћу Гномове шкољке у кадровима по "
"секунди." "секунди."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Процесни ланац Гстримера коришћен за кодирање видео снимка екрана" msgstr "Процесни ланац Гстримера коришћен за кодирање видео снимка екрана"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -195,11 +203,11 @@ msgstr ""
"webmmux“ и записује у „WEBM“ користећи ВП8 кодек. „%T“ се користи као " "webmmux“ и записује у „WEBM“ користећи ВП8 кодек. „%T“ се користи као "
"носилац за откривање при оптималном прорачуну нити на систему." "носилац за откривање при оптималном прорачуну нити на систему."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Проширење датотеке за чување видео снимака екрана" msgstr "Проширење датотеке за чување видео снимака екрана"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -690,51 +698,51 @@ msgstr "Лозинка:"
msgid "Type again:" msgid "Type again:"
msgstr "Упишите поново:" msgstr "Упишите поново:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Нису инсталирана проширења" msgstr "Нису инсталирана проширења"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s није објавио никакве грешке." msgstr "%s није објавио никакве грешке."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Сакриј грешке" msgstr "Сакриј грешке"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Сакриј грешке" msgstr "Сакриј грешке"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Омогућено" msgstr "Омогућено"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Онемогућено" msgstr "Онемогућено"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Грешка" msgstr "Грешка"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Изван датума" msgstr "Изван датума"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Преузимање" msgstr "Преузимање"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Погледај извор" msgstr "Погледај извор"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Интернет страница" msgstr "Интернет страница"
@ -862,17 +870,17 @@ msgstr "Програми"
msgid "Dash" msgid "Dash"
msgstr "Полет" msgstr "Полет"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Изађи" msgstr "Изађи"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Активности" msgstr "Активности"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Горња трака" msgstr "Горња трака"
@ -926,11 +934,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Унесите наредбу:" msgstr "Унесите наредбу:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Тражим..." msgstr "Тражим..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Нема одговарајућих резултата." msgstr "Нема одговарајућих резултата."
@ -952,7 +960,7 @@ msgstr "Сакриј текст"
#: ../js/ui/shellMountOperation.js:271 #: ../js/ui/shellMountOperation.js:271
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "Погрешна лозинка, покушајте поново:" msgstr "Погрешна лозинка, покушајте поново"
#: ../js/ui/status/accessibility.js:47 #: ../js/ui/status/accessibility.js:47
msgid "Accessibility" msgid "Accessibility"
@ -1043,7 +1051,7 @@ msgstr "повезујем се..."
#: ../js/ui/status/bluetooth.js:245 #: ../js/ui/status/bluetooth.js:245
msgid "Send Files..." msgid "Send Files..."
msgstr "Пошаљи датотеке.." msgstr "Пошаљи датотеке..."
#: ../js/ui/status/bluetooth.js:250 #: ../js/ui/status/bluetooth.js:250
msgid "Browse Files..." msgid "Browse Files..."

View File

@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-20 09:50+0000\n" "POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-02-29 11:26+0200\n" "PO-Revision-Date: 2012-03-31 10:20+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: sr\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n%" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
@ -130,34 +130,42 @@ msgid "If true, display the ISO week date in the calendar."
msgstr "Ako je izabrano, prikazuje ISO dan u nedelji u kalendaru." msgstr "Ako je izabrano, prikazuje ISO dan u nedelji u kalendaru."
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Keybinding to open the application menu"
msgstr "Sveza tastera za otvaranje izbornika programa"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Keybinding to open the application menu."
msgstr "Sveza tastera za otvaranje izbornika programa."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Koja će tastatura biti korišćena" msgstr "Koja će tastatura biti korišćena"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Vrsta tastature za upotrebu." msgstr "Vrsta tastature za upotrebu."
#: ../data/org.gnome.shell.gschema.xml.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "Prikazuje vreme i sekunde" msgstr "Prikazuje vreme i sekunde"
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "Ako je izabrano, prikazuje sekunde u vremenu." msgstr "Ako je izabrano, prikazuje sekunde u vremenu."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock" msgid "Show date in clock"
msgstr "Prikazuje datum u panelu" msgstr "Prikazuje datum u panelu"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Ako je izabrano, prikazuje datum u časovniku, kao dodatak vremenu." msgstr "Ako je izabrano, prikazuje datum u časovniku, kao dodatak vremenu."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Učestanost kadrova za video snimak ekrana." msgstr "Učestanost kadrova za video snimak ekrana."
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -165,11 +173,11 @@ msgstr ""
"Učestanost kadrova snimka snimljenih pomoću Gnomove školjke u kadrovima po " "Učestanost kadrova snimka snimljenih pomoću Gnomove školjke u kadrovima po "
"sekundi." "sekundi."
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Procesni lanac Gstrimera korišćen za kodiranje video snimka ekrana" msgstr "Procesni lanac Gstrimera korišćen za kodiranje video snimka ekrana"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -195,11 +203,11 @@ msgstr ""
"webmmux“ i zapisuje u „WEBM“ koristeći VP8 kodek. „%T“ se koristi kao " "webmmux“ i zapisuje u „WEBM“ koristeći VP8 kodek. „%T“ se koristi kao "
"nosilac za otkrivanje pri optimalnom proračunu niti na sistemu." "nosilac za otkrivanje pri optimalnom proračunu niti na sistemu."
#: ../data/org.gnome.shell.gschema.xml.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Proširenje datoteke za čuvanje video snimaka ekrana" msgstr "Proširenje datoteke za čuvanje video snimaka ekrana"
#: ../data/org.gnome.shell.gschema.xml.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -690,51 +698,51 @@ msgstr "Lozinka:"
msgid "Type again:" msgid "Type again:"
msgstr "Upišite ponovo:" msgstr "Upišite ponovo:"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:732
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nisu instalirana proširenja" msgstr "Nisu instalirana proširenja"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:779 #: ../js/ui/lookingGlass.js:786
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s nije objavio nikakve greške." msgstr "%s nije objavio nikakve greške."
#: ../js/ui/lookingGlass.js:785 #: ../js/ui/lookingGlass.js:792
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Sakrij greške" msgstr "Sakrij greške"
#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 #: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors" msgid "Show Errors"
msgstr "Sakrij greške" msgstr "Sakrij greške"
#: ../js/ui/lookingGlass.js:798 #: ../js/ui/lookingGlass.js:805
msgid "Enabled" msgid "Enabled"
msgstr "Omogućeno" msgstr "Omogućeno"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 #: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled" msgid "Disabled"
msgstr "Onemogućeno" msgstr "Onemogućeno"
#: ../js/ui/lookingGlass.js:803 #: ../js/ui/lookingGlass.js:810
msgid "Error" msgid "Error"
msgstr "Greška" msgstr "Greška"
#: ../js/ui/lookingGlass.js:805 #: ../js/ui/lookingGlass.js:812
msgid "Out of date" msgid "Out of date"
msgstr "Izvan datuma" msgstr "Izvan datuma"
#: ../js/ui/lookingGlass.js:807 #: ../js/ui/lookingGlass.js:814
msgid "Downloading" msgid "Downloading"
msgstr "Preuzimanje" msgstr "Preuzimanje"
#: ../js/ui/lookingGlass.js:828 #: ../js/ui/lookingGlass.js:835
msgid "View Source" msgid "View Source"
msgstr "Pogledaj izvor" msgstr "Pogledaj izvor"
#: ../js/ui/lookingGlass.js:834 #: ../js/ui/lookingGlass.js:841
msgid "Web Page" msgid "Web Page"
msgstr "Internet stranica" msgstr "Internet stranica"
@ -862,17 +870,17 @@ msgstr "Programi"
msgid "Dash" msgid "Dash"
msgstr "Polet" msgstr "Polet"
#: ../js/ui/panel.js:591 #: ../js/ui/panel.js:592
msgid "Quit" msgid "Quit"
msgstr "Izađi" msgstr "Izađi"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:623 #: ../js/ui/panel.js:624
msgid "Activities" msgid "Activities"
msgstr "Aktivnosti" msgstr "Aktivnosti"
#: ../js/ui/panel.js:998 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "Gornja traka" msgstr "Gornja traka"
@ -926,11 +934,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Unesite naredbu:" msgstr "Unesite naredbu:"
#: ../js/ui/searchDisplay.js:331 #: ../js/ui/searchDisplay.js:332
msgid "Searching..." msgid "Searching..."
msgstr "Tražim..." msgstr "Tražim..."
#: ../js/ui/searchDisplay.js:413 #: ../js/ui/searchDisplay.js:414
msgid "No matching results." msgid "No matching results."
msgstr "Nema odgovarajućih rezultata." msgstr "Nema odgovarajućih rezultata."
@ -952,7 +960,7 @@ msgstr "Sakrij tekst"
#: ../js/ui/shellMountOperation.js:271 #: ../js/ui/shellMountOperation.js:271
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "Pogrešna lozinka, pokušajte ponovo:" msgstr "Pogrešna lozinka, pokušajte ponovo"
#: ../js/ui/status/accessibility.js:47 #: ../js/ui/status/accessibility.js:47
msgid "Accessibility" msgid "Accessibility"
@ -1043,7 +1051,7 @@ msgstr "povezujem se..."
#: ../js/ui/status/bluetooth.js:245 #: ../js/ui/status/bluetooth.js:245
msgid "Send Files..." msgid "Send Files..."
msgstr "Pošalji datoteke.." msgstr "Pošalji datoteke..."
#: ../js/ui/status/bluetooth.js:250 #: ../js/ui/status/bluetooth.js:250
msgid "Browse Files..." msgid "Browse Files..."

1015
po/sv.po

File diff suppressed because it is too large Load Diff

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