Compare commits

..

289 Commits

Author SHA1 Message Date
7031449f01 Bump version to 3.37.3
Update NEWS.
2020-07-07 19:01:21 +02:00
06df79286d windowPreview: Adapt to ClutterActor API changes
The API of clutter_actor_allocate_preferred_size() changed with
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1310, so adapt to
this change and pass the origin to the function.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1322
2020-07-07 16:51:33 +00:00
9297d87775 workspacesView: Do not animate primary view geometry when fading
When going straight to the app picker, we fade in the overview instead
of doing the full-blown zoom transition. In order to keep windows at
their floating position, we must apply the same to the view itself
and not transition to the overview geometry when fading.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1353
2020-07-07 13:41:54 +02:00
ef56b14553 workspacesView: Always sync geometry after showing overview
We don't always want to sync the geometry when entering the overview,
namely when the fade transition is used.

However we do want the correct geometry once we have entered the overview,
so that workspaces are at their place when switching from the app picker.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1353
2020-07-07 13:41:54 +02:00
30ff76272e workspacesView: Decouple syncing geometry from updating views
This gives us more control over when the geometry is synced. We
will soon use that to keep the primary view at the work area
geometry while fading to the overview.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1353
2020-07-07 13:41:54 +02:00
52a7481ba6 workspacesView: Only animate primary view
Non-primary views always use their monitor's work area for their
geometry, so there's nothing to animate when leaving the overview.

The animation is already limited to the primary view when entering
the overview, so this is also more consistent.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1353
2020-07-07 13:41:54 +02:00
14cfd74f08 workspace: Always start in FLOATING state
It doesn't matter which animation we use to enter the overview,
we always want to start and end with the floating layout.

The simplest way to achieve that is by creating the state adjustment
with the correct value in the first place.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1353
2020-07-07 13:41:54 +02:00
fa97f7141b workspace: Remove reserved slots
This is a pre-3.0 feature that was dropped before
the 3.0 release, but managed to find its way until
now, 11 years later.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1352
2020-07-07 12:26:59 +02:00
03bcd4c05b unlockDialog: Small cleanup
It's silly to initialize a variable to 0 right before setting it
to its actual value.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1352
2020-07-07 12:26:58 +02:00
89574abc83 windowPreview: Remove slotId property
We're no longer using that property, so clean up a bit and remove the
last occurences of it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1351
2020-07-07 11:22:20 +02:00
602078cbde workspacesView: Add back overview transition
The transition was temporarily removed when switching to the new
workspace layout manager. Now everything is in place to reimplement
it with a combination of the layout manager's state adjustment and
the view's allocation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:09:29 +02:00
96f63b08c2 workspacesView: Properly allocate workspaces
So far we've been allocating workspaces in a stack, and relied on
translation to move them to the right position. And as the position
depends on both the workspace's index and the view's viewport, some
care is needed to prevent gestures/scrolling from interfering with
layout updates.

Clean that up by properly allocating workspaces in a row or column,
and use a translation to reflect the current scroll position.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
d66cd0d206 workspacesView: Don't set full geometry
It's not used anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
ff13ad9e71 workspacesView: Stop using full geometry
Since the workspaces themselves stopped using it, there is little
reason for upholding the difference between "full" and "actual"
geometry.

Just base positioning/swiping on the view's allocation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
5e4b65d37e workspacesView: Use work area for default geometry
The workspace's layout manager keeps the workspace at the same ratio as
the work area, so it makes more sense to base the views' default geometry
on that as well than the monitor area we are using right now.

(It shouldn't matter much in practice, as this only affects views on
non-primary monitors where the work area usually matches the monitor area)

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
51fd0875d1 workspacesView: Simplify syncing actual geometry
We adjust the size and position of the primary view to match the workspaces
display, but views on other monitors are always set to fill their monitor.

Take that into account and create views with a fixed size and position, then
only sync the primary view to the new geometry.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
75f8903c7e workspace: Use actual container allocation
We currently assume that the passed in Clutter.ActorBox matches
the container allocation, but in reality it is the container's
content area.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
124eb1ca18 workspace: Account for window picker padding
Workspaces are supposed to request the work area as their preferred
size, however the widget will adjust the sizes returned by the
layout manager to account for borders and padding.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
b5d925817f workspace: Disable preview overlays unless fully zoomed out
The overlays are only meant to be shown when the workspace is fully
zoomed out, not when using the floating layout or some in-between state.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:53 +02:00
c134091268 windowPreview: Allow to disable overlay
WindowPreviews now contain and manage overlaid elements like close
button or title label themselves. That's generally better, but right now
the only way to disable those overlays (for example during transitions)
is to prevent any hover or focus events from getting to the preview.

Instead, add some explicit API for enabling or disabling overlay support.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:06:49 +02:00
ff89693998 workspace: Handle minimized windows in layout
The new layout manager always uses the window's regular size and position
for the floating state, but the preview of minimized windows should be
hidden instead.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1345
2020-07-07 00:05:36 +02:00
c26860dcb7 windowPreview: Ensure style as soon as preview is realized
For the windowPreview we need to ensure the style information of the
border and title is up-to-date when chromeWidths() or chromeHeights() is
called. Since the introduction of the WorkspaceLayout those functions
may be called during an allocation cycle, which means we should avoid
calling queuing relayouts inside them. Calling StWidgets ensure_style()
method will queue a relayout though in case the newly generated theme
node has a different geometry.

So avoid queueing a relayout during allocation cycles (and the warning
Clutter logs because of that) by ensuring the style of the border and
title earlier, as soon as the WindowPreview is attached to a stage.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1305
2020-07-06 23:16:15 +02:00
6757c7d20a workspace: Animate opening new windows while in overview
Use the pivot point and scale to animate in new windows which are opened
while the overview is shown.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1305
2020-07-06 23:16:15 +02:00
751189253a workspace: Use the new WorkspaceLayout for allocating window clones
Switch to the new WorkspaceLayout layout manager to allocate the window
clones of the overview properly using Clutters layouting mechanisms.

Since we now no longer make use of the fullGeometry, we can remove the
setFullGeometry() function from the Workspace class. Also we can stop
setting the actualGeometry on the Workspaces and WorkspaceViews and
instead just set the fixed position and size of the views to their
full or actual geometry. This also has the benefit that we no longer
have to set a custom clip, but can simply enable clip_to_allocation.

The geometry needs to be set inside a BEFORE_REDRAW later because
_updateWorkspacesActualGeometry() is called from a notify::allocation
handler.

This isn't doing any animations when showing/hiding the overview yet,
we'll add that in the next commit.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1305
2020-07-06 23:16:15 +02:00
21187a4cec workspace: Introduce layout manager for allocating the Workspace
Add a new ClutterLayoutManager for layouting the workspaces of the
overview, WorkspaceLayout.

This layout manager integrates the existing LayoutStrategies used to
layout the window clones of the overview and supports freezing the
layout, animating between layout changes and adjusting the spacing for
the width and height of the window chrome. It also adds support for a
layout of the windows that looks the same as the actual workspace,
transitioning between that layout and the LayoutStrategy can be done by
setting the value of an StAdjustment, available using the
stateAdjustment getter function.

This will replace the current static-positioning based layouting of the
window clones in the next commit.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1305
2020-07-06 23:16:15 +02:00
b7db56ca9b workspacesViews: Use translation for showing Workspaces
We're going to use fixed position for positioning workspaces when
they're allocated by their own layout manager, using those positions to
scroll between different workspaces interferes with that, so do that
using translations instead.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1305
2020-07-06 23:16:15 +02:00
261d36ba72 keyboard: Request a bigger size in portrait orientation
In portrait orientation, we set the height to the preferred height
for the monitor width (or, if smaller, a third o the screen height).

However as the forWidth currently doesn't make a difference, the height
is effectively controlled by the natural height of the keys - which is
rather small.

Address this by making AspectContainer request an appropriate preferred
size based on the fixed ratio.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2349
2020-07-06 15:16:35 +00:00
1e72874192 keyboard: Fix setting height in portrait orientation
get_preferred_height() returns both the minimum and natural height,
not a single size. Math.min() doesn't handle that and returns NaN,
whoops.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2349
2020-07-06 15:16:35 +00:00
f29dbd1f18 shell/window-tracker: Match on WM_CLASS first
Currently our heuristics for matching a window to its app check
for the application ID before the WM_CLASS, as the ID is more
reliable in so far that it is outside the application's control
and so it cannot use it to spoof a different application.

However this also prevents applications with multiple .desktop
files like LibreOffice from matching any .desktop files other
than the one under the main ID.

Since we now no longer allow the WM_CLASS to match a .desktop
file that doesn't belong to the sandboxed application, we can
fix that issue by checking the WM_CLASS first, without opening
the door to spoofing.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/219
2020-07-06 14:59:51 +00:00
b60836932a shell/window-tracker: Enforce prefix for sandboxed applications
At least flatpak (no idea about snap, sorry) enforces that all .desktop
files exported by a sandboxed app use the application ID as prefix.

Add the same check when trying to find a match based on the WM_CLASS,
to prevent sandboxed apps from matching a .desktop file they do not
own.

At the moment this is unlikely as we check for a match on the
sandboxed app ID first, but we are about to change that.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/219
2020-07-06 14:59:51 +00:00
bf47d1b22d shell/window-tracker: Minor simplification
Switching to autocleanup gives us a better separation between the
app/no-app cases.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/219
2020-07-06 14:59:51 +00:00
4ea0fca4fc gdm: Introduce vmware credential manager for pre-authenticated logins
The previous commit implemented a new CredentialManager interface to
    facilitate adding additional providers for pre-authenticating the user
    at the login screen.

    This commit implements a new credential manager using that interface
    for vmware deployments.

    Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1983
2020-07-04 08:11:49 +08:00
809f820cd4 gdm: Refactor oVirt to a generic CredentialManager interface
Commit 4cda61a1 added support for pre-authenticated logins in
    oVirt environments. This feature prevents a user from having
    to type their password twice (once to the oVirt management machine,
    and then immediately again in the provisioned guest running gnome-shell).
    That feature is currently oVirt specific, but a similar feature would
    be useful in non-oVirt based virt farm environments.

    Toward that end, this commit generalizes the various aspects of the
    oVirt integration code, so that it can be reused in a subsequent
    commit for adding single sign on support in vmware deployments, too.

    Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1983
2020-07-04 08:11:49 +08:00
75235624b2 background: Use actor.content.background
Because actor.background no longer exists and emitted errors when
referenced.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2949

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1343
2020-07-03 14:41:48 +08:00
5ea54426b9 st/adjustment: Add ::actor property
Will be used by transitions to set the timeline actor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1299
2020-07-02 20:50:03 +00:00
4aabcd9e7d shell/global: Adapt to after-paint signal type signature
A stage view parameter was added.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1299
2020-07-02 20:50:03 +00:00
918b3eeb42 st/theme-node-transition: Pass actor when constructing timeline
Timelines now take an actor, to be able to derive an appropriate frame
clock, so pass the one of the actor we're transitioning on.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1299
2020-07-02 20:50:03 +00:00
482c655590 messageTray: Remove SourceActorWithLabel class
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1346
2020-07-01 20:20:26 -03:00
86b5a43008 shell/app: Add new get_icon() method
Now that we can always associate a GIcon with the app, add a method
to access it. While create_icon_texture() is still likely to be more
convenient in most cases, exposing the icon can still be useful, for
example to add it to a different kind of actor or to compare it with
other GIcons.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1342
2020-07-01 12:42:57 +02:00
d7cb2eeebc st/texture-cache: Return a GIcon from bind_cairo_surface_property()
We still load the surface into an StImageContent, but instead of
adding the content to an actor we hand out, return the content
itself (as GIcon).

That means we lose the ability to specify an icon size, but as we
get the pixel data from a fixed-size surface anyway, that shouldn't
matter much in practice.

Not to mention that the function is only used for fallback X11 icons,
which are already shit more often than not.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1342
2020-07-01 12:42:57 +02:00
770231c2d7 st/image-content: Implement GIcon interface
On the one hand, this is a bit of a stretch: StImageContent is what
we create from GIcons.

But on the other hand, there's some justification: StImageContent does
represent an image (and likely icon) after all, and there's some
precedent with GdkPixbuf.

In the end as we don't care about serialization or loading from other
API, we can go with a very crude implementation that allows us to
pass out a content as GIcon and use it directly when "loading" it.

We will use that soon to represent X11 window icons as GIcons, which
in turn will allow us to unify app icon handling.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1342
2020-07-01 12:42:57 +02:00
ecdf62d63e st/viewport: Invalidate transform when it changes
Since ClutterActor now caches the whole transformation matrix for an
actor, we need to invalidate the cached transform if the matrix returned
by apply_transform() implementations changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1308
2020-06-30 19:17:58 +02:00
d885486397 st/widget: Remove get_resource_scale function
ClutterActor provides the same function, but with a different return
value. So since we already switched to the ClutterActor implementation
in our C code, we can now safely remove st_widget_get_resource_scale()
and update the JS code that's still using the old API.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1287
2020-06-30 13:42:18 +00:00
1524abc947 Switch to ClutterActors resource-scale-changed signal
Instead of using the "notify::resource-scale" signal and StWidgets
"resource-scale-changed" signal, use the new "resource-scale-changed"
signal of ClutterActor, which replaces its "resource-scale" property.

Since we'd now have two "resource-scale-changed" signals, one on
ClutterActor and one on StWidget, remove the StWidget one in favour of
the new one.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1287
2020-06-30 13:42:18 +00:00
cb9842e4a4 Use new clutter_actor_get_resource_scale() API
Update the existing users of clutter_actor_get_resource_scale() to the
new API which doesn't return a boolean value.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1287
2020-06-30 13:42:18 +00:00
140ab4dec1 unlockDialog: Fix scale-factor handling on multihead
The blur effect needs to take the scale-factor into account, so we
listen for scale changes. However we set up the signal handler when
creating a background, which is repeated for each monitor, and every
time the monitor configuration changes. But we only disconnect the
last handler that was connected, and only when we are destroyed,
not when recreating backgrounds.

Fix this by splitting out updating the effect parameters to a separate
method that iterates over all backgrounds, so we can simply set up the
handler from the constructor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1341
2020-06-30 13:12:08 +00:00
845122497b altTab: Remove down arrow when removing an app from switcher
The arrow of the removed app was still left in the list with the
visibility of the arrow still depending on the original list order. This
could either lead to apps with just one window now suddenly having a
down arrow or apps with multiple windows not having one. If the last
window in the list had a down arrow, it would have been displayed
outside the window switcher.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2935

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1340
2020-06-29 22:51:41 +02:00
d51a622fc0 Update Latvian translation 2020-06-29 18:12:25 +00:00
e90466347a cleanup: Use Meta.Workspace.active property
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1337
2020-06-29 17:09:38 +02:00
73f8c1c482 inhibitShortcutsDialog: Enable line wrapping for additional label
The inhibitShortcutsDialog can show an additional label which explains
how to restore shortcuts. This label is not managed by the
MessageDialogContent, so we need to enable line wrapping and disable
ellipsization ourselves.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2616

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1336
2020-06-29 10:17:07 +00:00
0ff75941ea dialog: Return GLib.SOURCE_REMOVE instead of false
This is more readable than just returning false.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1336
2020-06-29 10:17:07 +00:00
e4bb2037ca dialog: Check whether text changed when setting title or description
As usually with GObject setters, we should check whether the property
actually changed before setting the value and notifying the property. So
check whether the title or description text actually changed before
setting it.

This fixes a bug which makes the title flicker and change its size,
because when updating the title we remove the "leightweight" css class
and reapply it inside a later, which makes the title appear larger for
one frame.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2574

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1336
2020-06-29 10:17:07 +00:00
481014ac9e st/viewport: Only extend child allocation when scrolled
When scrolled, the container's allocation is smaller than the allocation
of the content. To account for that, commit 2717ca9d08 added the
additional size reported by the layout manager to the content allocation.

However as it did so unconditionally, we now allow children to extend
outside the parent even when *not* scrolled, which breaks any constraints
set on the container (like "width" or "max-height").

Fix this by only extending the child allocation in scrollable dimensions.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2491
2020-06-29 00:42:03 +02:00
6dbcb5f9da Update Kazakh translation 2020-06-27 18:29:23 +00:00
c1f06daf88 st/tests: Replace ClutterGroup by ClutterActor
ClutterGroup is deprecated and can be 1:1 replaced by ClutterActor,
so let's do it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1334
2020-06-26 21:03:57 +00:00
0717f76362 Replace anchor point by translation and pivot point
Anchor point is deprecated and will eventually be removed from
Mutter's Clutter. Replace them by a combination of pivot point
and translation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1334
2020-06-26 21:03:57 +00:00
da738988cd workspacesView: Small cleanup
scrollToActive() and friends are only used for handling the 'switch-workspace'
animation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1333
2020-06-26 16:19:57 +02:00
e86e88ea47 workspacesView: Don't make reactive
Since commit a11f417cd0, scroll events are handled by the SwipeTracker.
There's no other reason for the view to be reactive, so don't make it so.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1333
2020-06-26 16:19:57 +02:00
ae338af1e8 st-label: Keep labels fully pre-rendered on the GPU
The performance of the icon grid was being hindered by a large number
of primitives (a few hundred) being copied from the CPU to the GPU on
each frame. This was first noticed in mutter#971 but we failed to
investigate all the issues at the time.

You can also see the high number using `COGL_DEBUG=batching` or
`COGL_DEBUG=disable-texturing`. So now it's obvious that high number is
every letter of every label being uploaded as a separate quad. Let's not
do that and instead treat the whole label as a single quad/texture.

Measured performance on an i7-7700 at UHD 3840x2160:

Journal entries per frame on the icon grid:
 * Before: 288 (18 KB copied from CPU to GPU)
 * After:   73 ( 4 KB copied from CPU to GPU)

Spring animation:
 * Before: 20-30 FPS, avg 22/peak 45 milliseconds per frame
 * After:  30-40 FPS, avg 14/peak 28 milliseconds per frame

Scrolling the icon grid:
 * Before: 15 FPS, 50 milliseconds per frame
 * After:  30 FPS, 28 milliseconds per frame

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1329
2020-06-25 09:09:36 +00:00
3f9cc0ed37 Update Kazakh translation
(cherry picked from commit d3384d29e4)
2020-06-25 04:34:40 +00:00
8f8ecdb983 appDisplay: Update folder dialog field before ungrabbing
Noticed while working on customizable folders. Calling GrabHelper.ungrab()
ends up calling FolderDialog.popdown(), but at this point the '_isOpen'
field isn't updated yet, so we end up calling popdown() twice.

Update the '_isOpen' field before ungrabbing.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1332
2020-06-24 18:06:21 -03:00
8f547c9d5d iconGrid: Adjust animation delay
As per design feedback, adjust the animation delay to be shorter.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1332
2020-06-24 18:06:21 -03:00
821f3e8ddf overview: Pass drag source on item-drag-* signals
Overview has signals to notify about starting, cancelling, and
finishing icon drags, but none of these signals pass the dragged
item to the callbacks.

Pass the dragged items to the 'item-drag-*' overview signals.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1332
2020-06-24 18:06:21 -03:00
81be25bbd6 Update Kazakh translation 2020-06-24 16:17:48 +00:00
26d27fdbf8 overview: Define ANIMATION_TIME earlier
Commit c7e597cf72 tried to improve the slide animations when entering
the overview by using the same time as the overall overview animation,
but in fact broke the animation most of the times.

That is because the Overview imports OverviewControls before defining
the ANIMATION_TIME variable, so any javascript code that is evaluated
during that import will see the value as "undefined" (which is converted
to 0 for the animation).

Fix this by moving the ANIMATION_TIME variable before the imports instead
of the usual placement.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1331
2020-06-24 15:41:12 +02:00
c7e597cf72 overviewControls: Animate sidebars the same duration as windows
When you tap Super and see the sidebars and windows slide, it looks more
cohesive if those animations complete at the same time.

Previously there were 0.09 seconds difference between the two animations
which was enough to make it look slightly buggy. Now it doesn't.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1289
2020-06-23 19:07:30 +00:00
e4db68a1da Revert "workspacesView: Work around spurious allocation changes"
We now found the underlying bug: The ControlsManager (which causes the
bad call to `_updateWorkspacesFullGeometry()`) is getting (re-)allocated
while we add the view to the overviewGroup actor because the
overviewGroup is already visible and the view is immediately getting
mapped by `clutter_actor_add_child_internal()`. That causes a
resource-scale calculation and that indirectly causes a call to
`_clutter_stage_maybe_relayout()` (explained more detailed in the last
commit).

So now that we got rid of the immediate relayout happening when mapping
the view, we can revert this fix.

This reverts commit 6cc19ee6f0.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1315
2020-06-23 19:05:05 +00:00
980a90f8fb dateMenu: Do not ellipsize clock
This addresses the issue with ellipsized clock that occurs when using
extensions that move the clock from the middle to the side of the top
bar.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1327

Signed-off-by: MOZGIII <mike-n@narod.ru>
2020-06-23 16:14:24 +00:00
87e4bf52b7 windowPreview: Fix a division by zero
When the bounding box size is 0 during allocation (which happens right
after creating a window for example), we're doing a division by zero and
end up with a NaN scale. This ends up making the childBox NaN, which
triggers an error in Clutters allocation machinery.

So fix that and fall back to a scale of 1 in case the bounding box is
empty.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1320
2020-06-23 15:50:03 +00:00
a368df61ac volume: Update indicator when microphone volume changes
The current microphone indicator only indicates if the microphone is in
use. Users might be also interested if their microphone is recording
or is muted, this commit enables that without opening the pop-up
menu. The microphone icon changes itself, depending on the sensitivity
of the microphone. It behaves similar to the already existing volume
indicator.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2902
2020-06-23 11:34:16 +02:00
5e66b104dc Updated Lithuanian translation 2020-06-21 22:18:03 +03:00
08a5f41505 windowManager: Support prepending workspace with horizontal layouts
Commit ce35d523a2 implemented that behavior for vertical workspace layouts,
there is no reason to not allow the same for horizontal layouts.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2916
2020-06-20 08:15:44 +00:00
ec36762309 st: Add st_clipboard_get_content()
Complementing st_clipboard_set_content(), this function allows retrieving
specific mimetypes from the selection as GBytes.

Related: https://gitlab.gnome.org/GNOME/nautilus/-/issues/634

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1321
2020-06-19 13:44:15 +02:00
aa70020bc8 appDisplay: Compare indicator and grid pages
In the past, the icon grid would update the number of pages
during the call to adaptToSize(). However, after the new grid
layout landed, the number of pages is updated by the time an
item is added or removed.

Instead of comparing the old and new number of pages in the
icon grid, compare the pages shown by the indicator, and the
grid pages.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
1e77e6fc79 pageIndicator: Add getter for current number of pages
Add a getter to PageIndicators to retrieve the number of pages
it currently displays.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
68203e7091 appDisplay: Allow a slighly bigger area for drag overshoot
Now that we don't have the Frequent tab anymore, and subsequently
the buttons to switch tabs, the app grid fill all the way to the
bottom, leaving no room for drag overshoot.

Add a 20px (i.e. OVERSHOOT_THRESHOLD) area at the bottom of the
grid where dragging actually scrolls to the next page.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
cff0752bcc appDisplay: Factor out shared code into BaseAppView
The two BaseAppView subclasses now share a lot in terms of
widgetry: they both have a scroll view, pagination dots, swipe
management, etc.

Move this shared code into BaseAppView. Notice, however, that
BaseAppView only creates the widgetry, but it doesn't add them
to any specific layout. FolderView arranges the widgetry in a
vertical box, while AppDisplay arranges it in a ShellStack.

Add a new 'orientation' parameter to BaseAppView and use it
to determine the orientation of the pagination dots, the swipe
tracker direction, and the scroll event handling.

It is worth noticing that the scroll event is a bit more
sophisticated now: when the orientation is horizontal, it
handles all directions since mice wheels usually only generate
up/down events.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
45d8e11123 Add pagination to the folder dialog
Make the folder dialog's app grid horizontal, and add
paginators to it as well. Add a new _createGrid() method
to BaseAppView that created an IconGrid.IconGrid by
default, and make FolderView override it to return the
new FolderGrid class.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2436

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:22 -03:00
5aee714b70 theme: Adjust folder dialog CSS
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:32:01 -03:00
3c3c3b7c69 appDisplay: Don't destroy FolderView directly
When FolderIcon is destroyed, it destroyed the FolderView and, if
there's a folder dialog present, it destroys the dialog as well.

Turns out, the folder dialog adds the icon's FolderView to itself.
The view becomes part of the dialog's actor tree. When the dialog
is destroyed, it also tries to destroy the view - but the folder
view was already destroyed by FolderIcon!

Fix that by letting the dialog destroy the folder view if it exists,
otherwise destroy the folder view directly.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:32:01 -03:00
6ba2913075 appDisplay: Add items in order
Add app icons to the exact page and position they're located
instead of always appending. This will be useful later when
custom icon positions are in place.

For now, it assumes pages are always filled, which is true,
but this will also change with custom icon positions.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:31:57 -03:00
75c4e1cd63 appDisplay: Actually destroy icons
AppDisplay currently adds all icons, and hides the ones inside
a folder. Change that to only add the icons that are not inside
folders. Adding an icon to a folder removes the icon from the
main grid.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
fb4a4ca4a2 appDisplay: Redisplay folders before AppDisplay
When filtering out the app icons, AppDisplay calls FolderIcon.getAppIds(),
which then calls FolderView.getAllItems(). This last function reads the
already added app icons inside the given folder, and return their app ids.

So far, so good.

When the GSettings backing a folder changes, FolderIcon emits 'apps-changed'
to notify AppDisplay that the folder changed.

Cool.

When AppDisplay receives this signal, it first recreates its own icons, then
updates the folders, and finally hides the icons that are inside folders.

This series of events is unfortunate. Future patches will need the folder
to be updated *before* AppDisplay updates its own icons.

Update folder icons before chaining up to BaseAppView._redisplay().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
4c2c1297be appDisplay: Move child focus handling to IconGrid
The icon grid is always paginated, so the app grid code doesn't need
to behave differently in the FolderView and AppDisplay.

Move the keyboard handling to IconGrid itself, and remove the now dead
code from AppDisplay.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
c5dbdad5fc iconGrid: Adapt grid layout according to available size
The new icon grid layout operates based on rows and columns, and
doesn't try to dynamically adapt it to fit to the container. In
this case, it is better to have a pre-defined set of well-known,
well-tested rows and columns, and switch between them based on
the aspect ratio of the screen.

Introduce a set of modes to the icon grid, and select the mode
that is closest to the aspect ratio.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
4e05bcd3b6 iconGrid: Use IconGridLayout
Replace the current grid code with IconGridLayout.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
3555550d5e iconGrid: Introduce IconGridLayout
IconGridLayout is a new layout manager that aims to replace the
current paginated layout algorithm implemented by the icon grid.

There are a few outstanding aspects of this new layout manager
that are worth highlighting. IconGridLayout implements all the
mechanisms necessary for a paginated icon grid, but doesn't
implement any policies around it. The reason behind this decision
is that this layout manager will be used by other places (e.g.
the login dialog) that demand different policies to how the
grid should look like.

Another important aspect of this grid is that it does not queue
any relayouts when changing its properties. If a relayout is
required, the actor should manually queue it. This is necessary
to avoid layout loops.

Add the IconGridLayout class. Next commits will do the surgery
to IconGrid and any related code to use this new layout manager.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
8e05fa2728 st: Don't leak st_describe_actor strings
Hopefully this code doesn't get hit much. And it does seem to be the
only user of the function.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1319
2020-06-18 14:10:59 +08:00
d7c3050e2d Update Romanian translation 2020-06-17 15:47:59 +00:00
89ba8562c3 dnd: Set drag actor position immediately after reparenting
For drag actors which get reparented to the uiGroup, we currently wait
until the next input event to set the fixed position of the actor, until
that they will just be allocated their old fixed position, which is 0,
0.

So avoid drag actors flickering at the top left for one frame and
position them correctly right after reparenting.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:47:50 +02:00
82da73baff dnd: Fix size of actors which don't get allocated their preferred size
Properly adjust for drag actors which were allocated using a custom
vfunc_allocate() and might not have gotten allocated their preferred
size. When DND reparents the actor to the uiGroup, the drag actor will
get allocated its preferred size, so we also need to take the difference
between the old allocation size and the preferred size into account
before reparenting to the uiGroup.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:47:47 +02:00
b2eeda9b46 dnd: Don't override fixed position if actor had no fixed position before
Properly handle drag actors which are not allocated using a fixed
position and disable the fixed position we were using to move the actor
around before we reparent it again to its original parent.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:46:46 +02:00
0db41a3773 st/scroll-bar: Fix horizontal bar in RTL locales
As the view now scrolls from right-to-left in RTL locales, the
scroll bar handle should reflect that.

Likewise the event handling needs adjusting as well: Scrolling
left should increase the adjustment value, and clicking the
trough to the left of the handle as well.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-17 01:08:03 +02:00
8d7f7e61dd st/scroll-view: Adjust scroll events in RTL locales
In RTL locales, scrolling left should increase the adjustment value.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-17 01:07:28 +02:00
3f4b253dac st/viewport: Fix horizontal translation in RTL locales
In RTL locales, the lowest value should correspond to the right-most
position and vice-versa.

That this went unnoticed for so long shows how we have avoided horizontal
scrolling so far :-)

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-16 23:57:51 +02:00
e4cbe5126a workspace: Split WindowPreview into a separate file
The workspace.js file is quite large and is a bit confusing when it
comes to the term "window" in there, because it can either refer to a
WindowPreview of a complete window or to an individual window like an
attached dialog.

So try to avoid that confusion and split the new WindowPreview class and
its WindowPreviewLayout layout manager out into a new windowPreview.js
file.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:13:02 +02:00
8357739ef8 workspace: Stop exporting window actor in the WindowPreview
Having a public property exporting the MetaWindow is enough to get the
window actor, too, so remove the public realWindow property and while at
it, rename that property to _windowActor, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
6bef9334b7 workspace: Initialize WindowPreview using a MetaWindow
MetaWindow is Mutters representation of a window and provides all the
APIs about it, MetaWindowActor is just the ClutterActor that's drawing
that window. So use a MetaWindow to create a WindowPreview instead of
the window actor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
8c49f45ac8 workspace: Set overviewHint on MetaWindow
We want to stop using the MetaWindowActor for things which are actually
related to the MetaWindow, one more thing where we can change that is
the overviewHint, which is currently added to the MetaWindowActor.

So move that hint to the MetaWindow and stop calling
get_compositor_private() in a few more places.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
46600740fe workspace: Stop using WindowPreview.realWindow in the overview
We can simply get the MetaWindowActor by calling
MetaWindow.get_compositor_private(), so stop accessing the realWindow
property of WindowPreview. For this we also have to make _isMyWindow()
and _isOverviewWindow() take a MetaWindow as an argument instead of a
MetaWindowActor.

Since the WorkspacesThumbnails are also drop targets for WindowPreviews
and their WindowClones also have the public metaWindow property, switch
to using the metaWindow property there, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
c281e868a0 workspace: Only pass MetaWindow to WindowPreviewLayout
Since the WindowPreview class rarely needs to handle the actual actor
painting the window preview, refactor the WindowPreviewLayout a bit to
only pass a MetaWindow to its addWindow() and removeWindow() functions.

Also make the getWindows() function return an array of MetaWindows,
which makes the getMetaWindow() function obsolete, so remove that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:09:54 +02:00
039431a73f workspace: Stop using clone terminology in WindowPreviewLayout
We're going to remove ClutterClones, so call the parameters to
addWindow() and removeWindow() "actor" instead of "clone". Also make the
destroyIds less confusing and rename the actual actor destroy id to
"destroyId", and rename the window actors destroy id to
"windowActorDestroyId".

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:04:10 +02:00
d4f8ea1c53 workspace: Make some functions in WindowPreview private
Now that the WindowPreview also shows the overlays itself, we can make
some functions private.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
96f5e2b33e workspace: Call _activate() directly when clicking the window preview
We can remove the simply callback function in favour of an anonymous
function here.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
93a542d52c workspace: Set WindowPreview offscreen redirect inside constructor
This can also be moved to constructor, so do it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
f4fcba74ff workspace: Remove slot property of WindowPreview
Since the slot property was only accessed by the old WindowOverlays to
get the position and size of the preview, we can safely stop setting it
and remove that property now.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
cadbf7cd8b workspace: Rename WindowClone to WindowPreview
Since ClutterClones are going to be removed, let's switch the
terminology here to something that's more understandable and rename the
WindowClone class and its layout manager to
WindowPreview/WindowPreviewLayout.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
dd8e1aef51 st-widget: Use clutter_input_device_get_actor() to get pointer actor
Use clutter_input_device_get_actor() since it replaces
clutter_input_device_get_pointer_actor().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1285
2020-06-16 09:33:08 +00:00
15dc37a139 Update Kazakh translation 2020-06-15 13:38:33 +00:00
c23ad83c59 windowManager: Warn when removing old animationInfo
Now that we properly notify mutter about when a size-change animation
has ended, it should never happen that a new size-change animation is
started without the last one being cancelled (ie. 'kill-window-effects'
being emitted).

This means there should also never be an old animationInfo attached to a
window actor, so warn in case we still find one when starting the
animation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
4a6f550acb windowManager: Use new mutter API to freeze window actors ourself
We're currently using the hack of telling mutter that our effect is
completed (even though it isn't) in order to unfreeze updates of the
window actor.

This causes a bug with detecting the wl_outputs a window is
visible on, because the MetaWindowActor emits its "effects-completed"
signal too early, making Mutter update the wl_outputs while we're doing
the animation.

Now since meta_wayland_actor_surface_is_on_logical_monitor() uses the
transformed position and size of the MetaSurfaceActor and is being
called right after we setup the animation (but before it actually
starts, that happens at the next paint cycle) it will use a "very wrong"
rectangle: The transformation has been set to move the actor back to its
old position, and while we did already unfreeze updates and called
clutter_actor_set_position() in meta_window_actor_sync_actor_geometry(),
the actual allocation is not updated yet; this makes
clutter_actor_get_transformed_position() return a position including in
the new transformation, but not including the new allocation, and the
rectangle ends up being moved to the next monitor or completely out of
the stage.

To fix this issue properly, we need to decouple unfreezing actor updates
from emitting the "effects-completed" signal, which is now possible with
the new meta_window_actor_freeze() and meta_window_actor_thaw() APIs. So
use those new methods to freeze and thaw actor updates ourselves and
make sure to call shellwm.completed_size_change() only after the
animation has finished.

Mutter MR: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1250

Fixes https://gitlab.gnome.org/GNOME/mutter/-/issues/513

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
8078d78c30 windowManager: Also clear animationInfo when size-changed wasn't emitted
It might be that we receive a "kill-window-effects" signal between the
emission of the "size-change" and the "size-changed" signal.

In this case we already have the animationInfo attached to the window
actor, so we should also remove it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
d7185d71c6 windowManager: Clean up starting of size-change animations a bit
We can do without having two calls to shellwm.completed_size_change() in
there, so use an early return for all cases.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
522ecba180 workspace: Center overlay close button on border using guide actor
This makes use of the invisible actor introduced in the previous commit
to center the close button on the border.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2899

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1313
2020-06-14 21:58:47 +00:00
9b22f6183f workspace: Use invisible guide actor to center overlay title on border
Using CSS to center the title actor on the border is a bit ugly, because
it requires the CSS to match the calculations used in chromeHeights().
Also it is not possible to use CSS margins for cases where the position
of the actor is determined at run time, such as for the close button.

Instead use an invisible actor that spans between the horizontal and
vertical center lines of the border as guide when aligning the title
actor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1313
2020-06-14 21:58:47 +00:00
b2c35e4fb0 workspace: Unbreak reposition animation
Commit 1ea22a5281 broke the window reposition animation when it
based the ::size-changed signal on the layout manager's bounding box
instead of the MetaWindow::size-changed signal.

That's happening because of the combination of:

  1. we adjust to window size changes immediately without animations
  2. closing a window triggers a change to a 0x0 bounding box which
     is not treated as a size change

Fix this by addressing the 2nd factor, and don't treat a change to
a 0x0 bounding box as size change.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2901
2020-06-14 21:20:36 +00:00
af543daf1c workspacesView: Only animate on show() when geometries are already set
Animating the window clones of the overview requires the fullGeometry
and the actualGeometry to be set, which they won't be when showing the
overview for the first time. So don't even try to animate the window
clones in that case because the geometries will still be null and
accessing them in workspace.js will throw errors.

The workspace views will still get the correct layout as soon as the
allocations happen because syncing the geometries will trigger updating
the window positions. Since animations are disabled for position changes
when syncing the geometry though, we won't get an animation and the
clones will jump into place. That's not a regression though since before
this change we also didn't animate in that case because the geometries
used were simply wrong (the actualGeometry was 0-sized as explained in
the last commit).

If we wanted to fix the initial animation of the overview, we'd have to
always enable animations of the window clones when syncing geometries,
but that would break the animation of the workspace when hovering the
workspaceThumbnail slider, because right now those animations are "glued
together" using the actualGeometry, so they would get out of sync.

The reason there are no errors happening in workspace.js with the
existing code is that due to a bug in Clutter the fullGeometry of
WorkspacesDisplay gets set very early while mapping the WorkspacesViews
(because the overviews ControlsManager gets an allocation during the
resource scale calculation of a ClutterClone, see
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1181), so it
won't be set to null anymore when calling
WorkspacesView.animateToOverview().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1119
2020-06-14 14:44:10 +00:00
baeb4079ee workspacesView: Avoid setting invalid geometries on views
The fullGeometry and the actualGeometry of the WorkspacesDisplay are set
from the allocation of the overviews ControlsManager and the
WorkspacesDisplay, that means they're only valid after those actors got
their allocations during Clutters allocation cycle.

Since WorkspacesDisplay._updateWorkspacesViews() is already called while
showing/mapping the WorkspacesDisplay, that allocation cycle didn't
happen yet and we end up either setting the geometries of the views to
null (in case of the fullGeometry) or to something wrong (a 0-sized
allocation in case of the actualGeometry).

So avoid setting invalid geometries on the views by initializing both
the fullGeometry and the actualGeometry to null, and then only updating
the geometries of the views after they're set to a correct value.

Note that this means we won't correctly animate the overview the first
time we open it since the animation depends on the geometries being set,
but is being started from show(), which means no allocations have
happened yet. In practice this introduces no regression though since
before this change we simply used incorrect geometries (see the 0-sized
allocation mentioned above) on the initial opening and the animation
didn't work either.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1119
2020-06-14 14:44:10 +00:00
f91f9801b4 Update Turkish translation 2020-06-14 07:52:41 +00:00
c5634335b0 workspace: Remove WindowOverlay in favour of new overlays of WindowClone
Start using the new overlays we introduced in the last commit and remove
the WindowOverlay class and the objects for keeping track of them in the
Workspace.

The new layout which doesn't use the -shell-close-overlap CSS property
anymore sligthly changes the position of the close button to be a bit
further away from the actual window.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
2b4317349f workspace: Set maxChromeWidth to window clone width
So far we allowed the titles of window overlays to expand their width to
be larger than the actual WindowClone, they could expand to the full
size of the Workspace.

Since we're now going to implement those titles as part of the
WindowClone itself, having this feature is no longer possible as easily
as it was before. That's because the clones are stacked according to the
stacking of the actual windows, and since the overlay-elements are
attached to those clones, they will also be shown underneath other
clones.

So stop allowing the titles to expand and limit their size to the width
of the clone, which makes sure titles never get shown above or
underneath other clones.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
96bfd1f8be workspace: Adjust for close button side in chromeWidth
When the close button is shown on the left side of the WindowClone, we
also need to return its width in chromeWidth() on the left side instead
of the right side, so do that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
33ab53068e workspace: Add window overlay to WindowClone
Add the window overlays we're currently showing using the WindowOverlay
class to the WindowClone class and implement them using
ClutterConstraints instead of the old fixed position/size layout, which
had to be used because the workspaces were scaled, and the title and app
icon were kept unscaled using a separate layer.

Specifically, this is done by adding the ClutterClones to a static
container owned by the WindowClone and adding the elements of the
overlay as children to the WindowClone itself. That way the
overlay-elements can use the container as a source for their constraints
and we avoid having to make sure the overlays remain visible above the
ClutterClones.

We're not using the new overlays yet, they're hidden by default and
showOverlay() isn't called anywhere yet.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:06 +02:00
40123ae6da workspace: Close windows using new layout manager API
Now that we have a new API to get all the windows and metaWindows from
our layout manager, implement the deleteAll() method of the window clone
using that API instead of looping through the children of the actor and
using the source of the ClutterClone.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
df149524d4 workspace: Add API to get windows and metaWindow to WindowCloneLayout
This will allow us to remove the remaining parts of the WindowClone
looping through children in favour of simply getting an array with the
windows or metaWindows and looping through that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
f0ee9cdcf8 util: Remove unused class CloseButton
This looks like it was used to create the close buttons in the overview
at some point, we're no longer using it nowadays though, so remove it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
a3257e8df5 Update Japanese translation 2020-06-11 10:27:58 +00:00
d2cf13eff4 unlockDialog: Set Switch User Button via _updateUserSwitchVisibility
This commit will set the button invisible when the user's can_switch
is false (e.g. when the session is remote) or user-switch-enabled is
disabled.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2687
2020-06-10 23:02:55 +08:00
8cd352b72b Update Japanese translation 2020-06-10 12:34:12 +00:00
c210052dc6 Update Japanese translation 2020-06-10 12:18:32 +00:00
0561af66e7 overview: Adapt to MetaBackgroundContent
The properties are now defined in MetaBackgroundContent.
Animate the ClutterContent properties.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1309
2020-06-09 20:10:52 +00:00
1e9b170d87 background: Adapt to MetaBackgroundContent
The properties are now part of MetaBackgroundContent, so set
the properties there instead.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1309
2020-06-09 20:10:52 +00:00
be02f76aa7 iconGrid: Trivial comment cleanup
There's no PaginatedIconGrid anymore

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
687928e7b7 appDisplay: Don't fade icons when a folder dialog is open
The folder dialog itself now has a background, there's no
need to fade the icons anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
ffdf3feb04 appDisplay: Fade the dialog background
As a last step towards the better app grid, add a semi-transparent
black background to the folder dialog.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
a60b8b3b50 appDisplay: Set minRows to 3 in folder dialog grid
It gives the folder dialog a better layout overall. This is
going to be replaced in the future by the new icon grid code,
but it's a good improvement to have until there.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
3d6add68c7 appDisplay: Hide folder icon when dialog is open
In such a way that gives the illusion of the icon becoming
the dialog itself.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
85e055ffe3 appDisplay: Don't change search entry's reactive state
The folder dialog eats all events now, there's no need to
disable the search entry anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
1691e422e7 appDisplay: Remove unused variable
As the title says.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
f442c9510e appDisplay: Fix misnamed variable
This should have been renamed to "displayingDialog" by
commit 7781f973f2.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
0de98eb772 appDisplay: Don't connect to 'space-closed'
This signal doesn't exist anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
30172b5625 appDisplay: Popdown folder dialog on DnD
So that we're still able to drag icons out of folders, and to the
Dash. Wait 600ms (MENU_POPUP_TIMEOUT) before popping it down.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:13:30 -03:00
8ae99a6898 appDisplay: Remove event blocker
It is unused now.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
5cfe5bf8c8 appDisplay: Move click action to dialog
Now that the folder dialog covers the whole primary
monitor, it eats all input events, and doesn't allow
the event blocker to detect clicks.

Move the click action to the folder dialog itself, and
popdown the dialog if a click is triggered on the dialog
(but not on any children).

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
c790c01a3b appDisplay: Move adaptToSize call to FolderView
There is absolutely no need to handle this in the dialog
itself.

Move the call to adaptToSize into FolderView.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
d4a947b475 appDisplay: Zoom dialog child in and out
Instead of zooming the dialog itself, zoom its only
child, which is the "actual" user-visible dialog.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
60d7999b6a appDisplay: Make AppFolderDialog subclass St.Bin
It'll simplify things a bit.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
c040d08b97 appDisplay: Make folder dialog cover the whole screen
Future commits will improve input handling of the folder
dialog, and they'll require the dialog to cover the whole
primary monitor.

Add another internal, center-aligned container to the
folder dialog, and make it cover the whole available area.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
3a53b25873 appDisplay: Constrain dialog to primary display
Much like the overview controls themselves are tied to the
primary display, constrain the folder dialog to the primary
display as well.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
d8e6f654a3 appDisplay: Add folder dialog to overview group
Right now, the app folder dialog isn't really a dialog,
since it is actually added to the AppDisplay. Furthermore,
having it added in AppDisplay may mess up with its sizing
calculations, since AppDisplay has a ClutterBinLayout and
the folder dialog has a fairly large minimum size.

Add the folder dialog to the overview group. Next commits
will adjust various actors to be able to better handle it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
fdfcacf1db st/entry: Fix leak when copying or cutting text using shortcuts
clutter_text_get_selection() creates a copy of the selected text which
gets passed to st_clipboard_set_text() which creates its own copy. The
copy returned by clutter_text_get_selection() however never got free'd.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1306
2020-06-08 15:21:17 +00:00
d3efbcce9b Updated Spanish translation 2020-06-08 16:10:16 +02:00
ac34dbe353 Update Catalan translation 2020-06-06 14:56:58 +02:00
e0f3e13456 Update Ukrainian translation 2020-06-06 12:54:13 +00:00
fdd9def922 dateMenu: Add "Events" section
Events have a clear and obvious connection to the calendar, and similar
to the Clocks and Weather sections there's a strong link to a particular
application.

Adding them as another section to the right-hand side of the calendar
therefore presents a viable alternative to the old events section.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
771050f4d7 messageList: Remove setDate() method
Since the events section has been removed and visibility no longer
depends on the date, it's not used by anything anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
8451df977c calendar: Simplify placeholder
Without the events section in the message list, the placeholder can only
reflect whether or not there are notifications.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
ff55cf017e calendar: Don't restrict section visibility by date
The idea behind hiding the notifications and media section on days
other than today was that they represent present activity together
with today's events, in contrast to past and future events from
other days.

After events were moved out of the message list, that behavior is
no longer useful: We just guarantee that the left-hand side of the
calendar will always be empty when browsing the calendar.

Adjust to that by removing the limitation by date.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
d36a180852 calendar: Remove events section from message list
While treating notifications as a type of present event was a neat
concept, there are some issues with it that we never managed to
address (not least the inability to "open" an event).

So remove the current events section from the message list; we'll
bring back events in a different form later.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
12c7f693d0 calendar-server: Notify HasCalendar changes when updating views
The HasCalendar property reflects whether there are any views, and views
change either when clients appear/disappear or when the time range changes.

However we currently only emit the PropertiesChanged signal for the former,
fix that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1300
2020-06-05 22:56:16 +00:00
e0a8cb565e calendar-server: Move method
We'll need to call it from app_update_views(), so move it up to make
it available to that function without a prior declaration.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1300
2020-06-05 22:56:16 +00:00
46547ae027 shell-mime-sniffer: Ignore invalid file content type
The shell mime sniffer goes through all the files in a directory,
however in case a file content type is not recognized, the GIO function
g_file_info_get_content_type() may return NULL, causing a crash when
looking up into the content type tables, as they are supposed to contain
strings only and they use `g_str_hash` has func, which doesn't support
NULL values.

So, in case we get an invalid content type, let's just ignore it,
without adding it to the cache as we do in the nautilus code that was
inspiring the sniffer.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2643
2020-06-05 16:27:29 +02:00
68745328df Update Chinese (China) translation 2020-06-05 09:02:40 +00:00
4582d7a183 workspace: Remove no longer valid comment
This comment is no longer correct, we're not inserting any actors here
to adjust for the window border, but we're modifying the allocation of
the children to adjust for that border.

Since that happens in the layout manager anyway, remove the comment
here.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
cc5ed2fbf5 workspace: Use generic _addWindow function to add new clones
Now that we handle all ClutterClones belonging to the WindowClone pretty
much the same, we can add a generic _addWindow function to WindowClone
which creates the ClutterClone and adds it to the layout manager.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
a2545d186a workspace: Implement windowCenter using bounding box
This isn't quite the same as the allocation, but it's what the workspace
actually wants to use given that we use the bounding box of the
WindowClone for all the layout calculation.

So instead of calculating the windowCenter in the WindowClone, make use
of the bounding-box property of the layout manager and return the center
point of that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
1ea22a5281 workspace: Use bounding-box property from layout manager
Make use of the new bounding-box property we introduced for the
WindowClones layout manager in the last commit.

With this we can remove all the bounding box calculation code from the
WindowClone class and simply use the "notify::bounding-box" signal to
notify changes to our size. To make sure users of the WindowClone don't
break, we now have to convert the layout managers ClutterActorBox in our
getter function to a JS object.

Since we now also don't have to connect to the "destroy" signal of the
attached dialogs anymore, we can remove _disconnectSignals() and only
listen to "destroy" of the toplevel window.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
090057d2df workspace: Track windows in WindowClone layout manager
Move the tracking of the bounding box and all the layout related things
out of the WindowClone class and into the layout manager. This allows
the layout manager to keep track of its windows itself and simply notify
the new bounding-box property in case that box changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:08 +00:00
b3aab7f401 Updated Spanish translation 2020-06-04 09:15:53 +02:00
8154728d09 environment: Add Math.clamp
The good old clamp function, now part of the Math family.
Clamp is happy after so many years of loneliness.

This is a strict implementation of the draft ECMAScript
proposal.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:53 -03:00
5569090d1c viewSelector: Make sure it's invisible when overview is hidden
Instead of overriding the hide() method, use the vfunc to
reset, and hide the workspaces display too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:45 -03:00
fc3bc7678d viewSelector: Rename show to animateToOverview
The same reasoning as the previous commits.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:45 -03:00
8914a46669 workspacesView: Override vfunc_hide
Override the hide vfunc instead of the plain hide() method.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:42 -03:00
e7ec373aee workspacesView: Rename show to animateToOverview
WorkspacesDisplay is a ClutterActor subclass, and overriding
the show and hide methods require chaining up, otherwise the
actor isn't actually shown or hidden.

To avoid clashing with the pre-existing show method, rename
to animateToOverview.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:54:05 -03:00
fe131f926d workspace: Increase window clone fade duration to 200 ms
The current value of 100 ms is barely noticable and looks very abrupt,
use 200 ms instead which make it feel like an actual transition.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1296
2020-06-02 23:43:52 +00:00
35d21c0bca Bump version to 3.37.2
Update NEWS.
2020-06-03 01:29:26 +02:00
b487846c0a notificationDaemon: Try harder to find a matching app
Unlike the desktop-entry hint, the app name is not optional. That
doesn't mean that we'll be able to match it to a .desktop file,
but we can at least try if we fail to match on PID or desktop-entry.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1291
2020-06-02 23:17:24 +00:00
7bbce1d5ad workspace: Position clones using width and height instead of scale
Since we now have a layout manager for the WindowClone that allows
allocating it a size that isn't the absolute size of the window, we can
now give the WindowClone an artificial size and it will get scaled
accordingly.

So make use of that and stop positioning WindowClones using fixed
position and scale and use a fixed position and fixed size instead. This
will make it easier to use a ClutterLayoutManager to allocate the
WindowClones, because layout managers should only set the allocation of
their children, not the scale.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1294
2020-06-02 23:03:06 +00:00
bf40d96a83 workspace: Use boundingBox to get absolute width and height of window
Since we're going to override the fixed width and height of the
ClutterActor the WindowClone is subclassing, remove those confusing
getter methods for width and height and switch to the public boundingBox
for getting that information.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1294
2020-06-02 23:03:06 +00:00
2d650e51a5 workspace: Use boundingBox instead of getOriginalPosition()
The getOriginalPosition() API of WindowClone can easily be replaced by
using the existing boundingBox property, which reflects the windows
bounding box in absolute coordinates. This property is also used
everywhere else in the Workspace object, so we can use it here, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1294
2020-06-02 23:03:06 +00:00
85d2837466 workspace: Allow allocating smaller sizes for window clones
Change the preferred size functions of the layout manager of window
clones to allow allocating smaller sizes, too. Also scale down the
allocation sizes of the ClutterClones our allocate implementation so
the ClutterClones will scale their texture accordingly.

This will enable us to position the window clones using their allocation
size instead of their scale, which is necessary when introducing a new
ClutterLayoutManager that positions the window clones.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1294
2020-06-02 23:03:06 +00:00
25985868e8 Revert "workspace: Animate window clones using translation properties"
We're going to add a ClutterLayoutManager responsible for allocating the
WindowClones. Since layout managers should only set the allocation of
actors, not the translation or scale, we need to position the
WindowClones using their x, y, width and height properties.

The first step for this is to revert this commit, which switched from
setting fixed positions on WindowClones to using the translation
properties.

This reverts commit 8929c89d1f.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1294
2020-06-02 23:03:06 +00:00
393c6c6805 lookingGlass: Add actor tree inspector
Being able to visualize the actor tree is a handy feature
to have, specially when debugging the hierarchy.

Add a new "Actors" tab to the Looking Glass with the actor
tree inspector. The tree is cleared on unmap to not get
heavy on the number of actors.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1292
2020-06-02 12:44:21 -03:00
775d6ec431 Updated Slovenian translation 2020-06-01 22:25:53 +02:00
988f996407 workspace: Also hide attached dialogs in WindowClone from picking
As explained in the comment in _init() of WindowClone, we hide the
actual clone from picking so it doesn't interfere with XDND.

This description applies to the clones of the attached dialogs just as
well though, so hide the clones of attached dialogs from picking, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1293
2020-06-01 14:01:39 +00:00
315c8820ca padOsd: Apply specific CSS to Button/Leader SVG classes
Applying a fill operation on the Leader line path seems to close
it, resulting in filled polygon. Bug or not this is not the intended
result here, we can do less ambiguously by not specifying the fill
CSS property to the Leader class.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2570

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
8a89de04a2 padOsd: Keep label coordinates in image coordinates
Apply the necessary transforms to map those coordinates to actor
positions in the allocate phase. This all fits since it's the place
where we do know the size the actor will have.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
63abfc163d padOsd: Cache label coordinates/arrangements
This is actually static for a given PadDiagram, as it always represents
a single device.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2570

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
f58cb34065 padOsd: Only allocate child labels within allocate vfunc
Make both start/stop edition and label updates queue a relayout, and
only deal with child allocations in the allocate method.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
ece1329145 padOsd: Drop needless call
If we got this far, we are dealing with an already known label.
There's no need for this check.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
989118981b padOsd: Use map to store misc action label data
We'll be adding more stuff here, so it's a bit inconvenient to keep
it an array.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
c511c469fe padOsd: Move all coord/existence checks to _addLabel()
Drops some repetitive code. Also rely completely on the label/leader
elements being found in order to find buttons/rings/strips.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
dac05c7e53 padOsd: Make label coordinates API "private"
This is only called internally, and only needed there.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
c90e7ce258 padOsd: Move button/ring/strip label creation to PadDiagram
It's the natural container of those. We can create all those labels
internally, and only expose the updateLabels() method to update them
wholesome.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
963f96292d padOsd: Fix double styling
We set the StLabel style property, there's no need to re-apply the
large/bold text style via markup. Makes the StLabel text size consistent
across editable state changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
989ee6593b padOsd: Disable ellipsizing in title label
We make the label text large and let it ellipsize. It ends up doing
so instead of allowing the label to expand. This title is important
and we don't want it to be ellipsized, so ensure that won't happen.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2845

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
2a8eea1ff5 padOsd: Fix .allocate() call
This was not updated to the API change in commit 9a8ced9f5b.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1290
2020-05-29 18:06:48 +00:00
55c287280b screenshot: Properly clean up if PickColor() is cancelled
We currently only remove the screenshot operation from the shooter
map if the color pick operation completed successfully, but not if
it was cancelled. As a result, we now reject any further requests
from the same sender because we assume that there is an ongoing
operation.

Fix this by moving the cleanup to a finally clause that runs for
both code paths.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1288
2020-05-29 00:52:33 +02:00
1fdd4ff313 screenshot: Return an error when operation is blocked
Right now _createScreenshot() returns a tuple that indicates failure
when a sender requests a screenshot operation before a previously
started operation finished.

However that doesn't work for the PickColor() method, as it uses a
different return type than the other methods.

Address this by returning an error instead, which works in any case;
arguably trying to start multiple operations in parallel is an error
by the caller more than it is a failed operation anyway.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1288
2020-05-29 00:52:33 +02:00
3522338b3d extensions-tool: Escape '\' and '"' in json string
If user-input string contains '\' and/or '"', extensions-tool
generates invalid json.
This fixes that by escaping '\' and '"'.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1279
2020-05-28 11:23:19 +00:00
61e3349dc7 Update Korean translation
(cherry picked from commit 4099c446da)
2020-05-27 23:50:42 +00:00
dc27db0897 iconGrid: Remove fillParent support
This was only used by the frequent view to display as many children
as fit the available space. Now that the view is gone, there's no
need to keep the support ...

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1286
2020-05-28 00:31:49 +02:00
f09fbb19cf iconGrid: Merge PaginatedIconGrid and IconGrid
Now that the only user of the IconGrid is AppDisplay, and
it only uses the paginated icon grid, there's no point in
having the two classes split anymore.

In addition to that, future commits will introduce a layout
manager that will extend current icon grid features, and
merging PaginatedIconGrid and IconGrid in the same class will
vastly simplify this transition.

Merge PaginatedIconGrid into IconGrid, and adapt AppDisplay
to this change.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1267
2020-05-27 19:23:56 -03:00
846fa77b37 appDisplay: Merge AppDisplay in AllView
Now that AllView is the only actor that AppDisplay creates,
we can actually merge them together.

Merge AllView in AppDisplay, remove what used to be AppDisplay,
and rename AllView to AppDisplay.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/880
2020-05-27 21:06:36 +00:00
b57bcf823f appDisplay: Simplify AppDisplay
Inherit St.Widget and remove the custom layout manager. Instead,
override vfunc_allocate(). Also remove the view stack.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/880
2020-05-27 21:06:36 +00:00
548e19a7cd appDisplay: Remove Frequent view
The Frequent apps grid has a few problems:

 * On a fresh install there would be no history of app usage so the
   applications shown in the grid have no relevance it takes time
   to be useful instead of being useful from the start;

 * The grid has far too many items in it to be relevant; 24 apps is
   well beyond the average use case as most people don't frequently
   use that many, so it gets populated with several apps that are
   single use (hello xterm);

 * The position of items in the grid are always changing based on an
   unknown frequency metric (and not by user-intended input) which
   makes it a poor way to quickly launch apps as one would have to
   constantly learn the positions of the items in the grid;

 * Having two app grids is a bit superfluous and needlessly complicates
   the app launching navigation: you have to spend time checking the
   frequent grid and if it's not there you have to switch over to another
   grid and find the app you need in there it's not straightforward.

Remove the Frequent tab and simplify the related code.

Related: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1425

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/880
2020-05-27 21:06:36 +00:00
4ae04d5aa8 power: Fix icon when discharging at 100%
The special-case for a fill level of 100 introduced in commit 5fd52e99d3
should only apply when charging, for the discharging state there's a
proper battery-level-100-symbolic icon.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/2286
2020-05-26 21:27:42 +02:00
5d5ca80d17 st/box-layout: Fix gtk-doc comments
Commit 9dc421875 added a subtle syntax error: # is used to cross
reference symbols, but must not be used in the definition of the
symbols itself.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1281
2020-05-25 18:43:30 +00:00
d81237b9d6 st/texture-cache: Cancel pending requests on icon-theme changes
As outlined in commit 36b8dcbe07, we can end up with wrong icons
if the icon theme changes right after a GTK theme change to/from
HighContrast triggered a theme reload.

That's because when we reload icons for the new icon theme, there
are already pending requests due to the icon-style change; those
requests are simply re-used for the new icons, with the existing
icon infos from the old theme.

The above commit applied a simple work-around by changing the
icon theme before the GTK theme, but that only works for the
HighContrast switch in our own UI.

It turns out that Settings also uses the "wrong" order, so the
issue still reproduces with the Universal Access panel.

So instead of relying on everything changing the settings in the
order we expect, cancel all ongoing requests on icon-theme changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1277
2020-05-25 12:55:28 +02:00
71b3b03b2f theme: Make world clock times tabular
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2825
2020-05-24 18:27:12 +00:00
8c909e37e9 panel: fix size of battery percentage label
Adjust the label of the (optional) battery percentage in the top
bar to have the same size as all other text in the top bar.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2652
2020-05-24 16:37:57 +00:00
6508fa4349 Update German translation
(cherry picked from commit bc3c1e5a68)
2020-05-24 16:06:35 +00:00
ce8fb83c36 Update Romanian translation 2020-05-24 10:43:48 +00:00
58ec607818 Update Slovak translation
(cherry picked from commit b148a8bc60)
2020-05-24 07:28:07 +00:00
f06223df48 screenshot: Add preview to color picker
With color picking implemented in the compositor, we
can do better than letting the user pick a pixel with
the crosshair cursor, and present them with a preview
of the color that will be selected.

Do this by replacing the cursor with a custom icon and
apply a recoloring effect, where we replace a given color
with the color of the currently hovered pixel (similar
to a green screen).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/451
2020-05-22 16:10:43 +02:00
9a8ced9f5b search: Remove usage of allocation flags
Allocation flags have been removed from Clutter, and commit
400d045a6a accidentally added their
arguments again which causes a warning, so remove those arguments.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1276
2020-05-22 10:18:24 +00:00
67c45e5648 Update Ukrainian translation 2020-05-22 05:44:50 +00:00
b88ed3f251 Use pid_t for meta_window_get_pid()
The return value of meta_window_get_pid() changed again and it now
returns pid_t, which usually just resolves to int on most platforms. We
should still use pid_t now though, so do that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1188
2020-05-21 23:11:21 +00:00
669b0f193a StClipboard: add st_clipboard_get_mimetypes
Since the `MetaSelection` of the global `StClipboard` is private (and
should be), there is no reasonable way for extensions or external code
to query the supported mime-types.

Add `st_clipboard_get_mimetypes()` so this can be queried without
poking around in private code.

closes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2819
2020-05-21 22:24:59 +00:00
9cad7ae975 extensions-app: Indicate extension errors
Currently there is no indication that an extension had an error except
for the sensitivity of the switch (which may have a different cause).

This is useful information to users, so add a small error indicator
alongside the updates icon and show the actual error in the details.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2337
2020-05-21 21:45:04 +00:00
48e6a58250 extensionSystem: Don't log error name
logExtensionError() currently saves the error message by calling
toString() on the passed error. That's convenient as it allows to
pass a string instead of a "proper" error, but the result isn't
great for the common Error case: Its toString() method prefixes
the message with the error name, which usually is just "Error:".

The plain message is more suitable for displaying it to users,
so use that for Error objects.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2337
2020-05-21 21:45:04 +00:00
d2583aa47b extensions-app: Reset switch handle when it becomes insensitive
Currently the switches handle position reflects the requested
extension state (as in: the user (de)activated the switch),
while the actual extension state is reflected by the underlying
state.

That doesn't work well when the switch is insensitive though (for
example on error), because the desaturation neuters the color
that reflects the state.

Address this by resetting the switch handle to the state when
making it insensitive.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1263
2020-05-21 21:29:31 +00:00
0ab34fe21f st: Remove BoxLayout child meta
They were deprecated last cycle in favor of ClutterActor's own
expand/align properties, time to retire them for good.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1274
2020-05-21 21:17:16 +00:00
0f947d4ff9 st/theme: Remove entry from files_by_stylesheet after emitting signal
Since e06109c23c we keep old theme nodes
valid during the emission of the "custom-stylesheets-changed" signal.

It turns out that we might still look up the file of a stylesheet using
the files_by_stylesheet hashtable during the emission of that signal,
causing a crash because the assertion in _st_theme_resolve_url() fails.

So fix that and remove the stylesheet entry from the files_by_stylesheet
hashtable after emitting the "custom-stylesheets-changed" signal. And to
be consistent, also remove the entry from the stylesheets_by_file
hashtable after emitting the signal.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2757
2020-05-21 20:59:35 +00:00
9dc421875b StBoxLayout: Fix up some documentation
`StBoxLayout` has a couple properties (`vertical` and `pack-start`)
improperly referenced as signals, and is somewhat unclear these
properties are wrappers around the underlying `ClutterBoxLayout`
properties.

Fix these up and add references to the underlying properties, rather
than redescribing them.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2816
2020-05-21 22:37:23 +02:00
9c3c9a155e st: Remove deprecated Bin properties
Those were deprecated last cycle in favor of ClutterActor's own
expand/align properties, and don't have any effect anymore.

Time to remove them for good.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1273
2020-05-21 14:36:59 +02:00
faaed642a7 js: Listen to notify::allocation instead of allocation-changed
ClutterActors "allocation-changed" signal was removed since it's no
longer needed now that there are no ClutterAllocationFlags anymore.

See https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1245

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1245
2020-05-20 15:12:36 +02:00
9b99b67fea Remove ClutterAllocationFlags
Those flags were removed from Clutter since they're pretty much unused,
so remove them here, too.

See https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1245

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1245
2020-05-20 15:12:03 +02:00
693dd79d28 iconGrid: Remove dead code
Remove unused methods from IconGrid.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1265
2020-05-19 16:40:49 -03:00
400d045a6a search: Replace IconGrid from grid search results
Replace the usage of IconGrid in the grid search results by
a custom layout manager that only allocates as many children
as the actor can fit.

This new layout manager does not implement changing the icon
size depending on the screen size.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1265
2020-05-19 16:40:49 -03:00
e20cf1ac78 environment: Replace monkey-patched method with Symbol.iterator
This allows using the actor itself as iterator:

  for (let child of container)
      doStuff(child);

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1269
2020-05-19 21:33:31 +02:00
8d4e650a95 environment: Monkey-patch iterate_children() generator
This is a small convenience method for using ClutterActor's iterator API
with javascript's built-in iterator protocol, for example as:

  for (let child of container.iterate_children())
      doStuff(child);

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1268
2020-05-19 21:07:20 +02:00
82fd68b985 notificationDaemon: Fix grouping by PID
For fd.o notifications, we are taking the sender's PID into
account when associating notifications with sources (mainly
to deal with notify-send).

This broke when the implementation under the well-known name
was moved into a separate service, as the implementation in
gnome-shell will now always see the public notification-daemon
as sender.

Restore the old behavior by resolving the sender PID in the
separate service, and pass it as hint to the implementation
in gnome-shell.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2592
2020-05-19 08:24:07 +00:00
6ddd43f361 extensionSystem: Prevent broken updates
Spidermonkey caches imports, which means that uninstalling an
old extension version and installing a new one doesn't work as
expected: If the previous version was loaded, then its code will
be imported instead.

For the last couple of releases this has been a reliable source
of extension bug reports after major GNOME updates. Thankfully
chrome-gnome-shell removed its update support in favor of our
built-in support now, but users may still use older versions
or perform those actions manually, so it still makes sense to
catch this case and set an appropriate error.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1248
2020-05-18 20:41:06 +00:00
4e2ae30a47 dateMenu: Remove unused property
This is a left-over from an earlier iteration where the session's
presence status was used rather than the GSetting.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2796
2020-05-18 17:02:57 +00:00
32bc064d10 calendar: Fix initial do-not-disturb state
The do-not-disturb button and the contained switch are
tied together via a bidirectional property binding.

However it still matters which objects are used as source
and target, as that will determine the initial state: Right
now the (unchecked) button is used as source, which means
that do-not-disturb is turned off on startup.

We want the state to be preserved, so swap source and target
to let the switch (that is bound to the underlying GSetting)
control the initial state.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2804
2020-05-18 18:55:19 +02:00
87606c6a6b status: Pass scroll events to volume and brightness sliders
Sliders can be operated by mouse scroll, but the mouse has to be over
the slider control.  Make the brightness and volume system menu entries
forward scroll events to the sliders they contain so that scrolling
anywhere on the menu item operates the slider.

Closes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2795
2020-05-18 11:30:28 +00:00
955afb8711 Update Serbian translation
(cherry picked from commit db2917479a)
2020-05-17 19:22:51 +00:00
3309031fd1 extensionSystem: Update canChange on error
Whether or not an extension has errors influences the 'canChange'
property, but so far we only update it for errors that occur when
initializing the extension, not when an extension is enabled later.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1249
2020-05-16 16:33:22 +00:00
a2235c269a Update Finnish translation
(cherry picked from commit 5815f9ac0e)
2020-05-16 11:03:11 +00:00
1cf2c9edd0 Update Turkish translation 2020-05-16 09:12:43 +00:00
64a3ecf9b1 dateMenu: Update timezone offsets when timezone changes
Adds a signal handler to update the timezone offsets whenever the
user changes the system timezone.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2209
2020-05-15 20:46:00 +00:00
f144ed6e87 Update Catalan translation 2020-05-15 20:43:22 +02:00
a47e0f9845 extensionDownloader: Replace deprecated Soup.SessionAsync
Soup.SessionAsync by default sets timeout and idle_timeout to 0. This
causes connections to hang around in state CLOSE_WAIT forever after the
remote host has closed the connection.

To fix this, we could set timeout and idle_timeout manually. However,
Soup.SessionAsync is marked as deprecated anyway and should be replaced
by Soup.Session. Doing so also sets a default timeout of 60 seconds.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2774
2020-05-14 19:43:56 +00:00
0737c8f416 dash: Allow adding favorites out of favorites zone
Previously, you could not add favorites outside of the favorites zone.
This change inserts a placeholder at the end of the favorites zone if
you are outside of it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2777
2020-05-14 18:32:57 +00:00
fba350eaad Update Indonesian translation
(cherry picked from commit bc6a3329b4)
2020-05-14 09:43:30 +00:00
6d5e93b00b extensionSystem: Disable extension before unloading stylesheet
Removing a stylesheet from the theme will trigger a style update. There's
little point in updating the extension actors that are about to be destroyed
(hopefully), so call the extension's disable() function first.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2757
2020-05-13 20:10:56 +02:00
f526e592fe mpris: Prevent DBus race when creating media players
Sometimes an MPRIS media player will create and then destroy an object
before the signals that handle the object's destruction can be created.
This verifies that the object still exists after the necessary signals
have been created.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2776
2020-05-13 19:46:24 +02:00
751a94ab5d Update Japanese translation 2020-05-13 15:16:58 +00:00
e0e128e207 Update Japanese translation 2020-05-13 15:08:22 +00:00
137e6c8493 windowManager: Allow xwayland startup to complete without systemd
Since commit 0ecddafc20 gsd-xsettings startup has been made conditional
on the systemd user instance being available at runtime. While that is
correct, it means that completing xwayland startup is also conditional
now.

We always want xwayland startup to go ahead, so wait for the XSettings
plugin to appear on the bus when gsd-xsettings is launched by gnome-session
and complete the task immediately if startup fails.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1252
2020-05-12 18:05:38 +02:00
72751c2d92 Update Persian translation 2020-05-12 14:24:58 +00:00
b84fa852f6 Update French translation
(cherry picked from commit e8e79173d9)
2020-05-12 14:15:08 +00:00
d20961f323 Update Swedish translation
(cherry picked from commit 884a2623a0)
2020-05-11 22:36:14 +00:00
5a01395a2b Update Italian translation
(cherry picked from commit fbdb56eb6d)
2020-05-11 15:53:05 +00:00
e59ca7053b workspacesView: Lower scroll timeout
Looks like 250ms is too high, lower it to 150ms.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2602
2020-05-09 19:27:36 +05:00
6895592a7b appDisplay: Lower scroll timeout
Looks like 250ms is too high, lower it to 150ms.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2602
2020-05-09 19:27:33 +05:00
eed27a2a4c shell: Fix return value if the systemd unit is actually successfully run
This got broken by last minute changes in commit 2d56395921. There's no change
too simple.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1242
2020-05-08 19:21:32 +02:00
43c6afa80f Update Romanian translation 2020-05-08 16:32:22 +00:00
7d60f418e7 systemActions: Use 'system-log-out-symbolic' for logout
Changing the icon to 'system-log-out-symbolic' has no visual
change in a default GNOME setup since both 'system-log-out-symbolic'
and 'application-exit-symbolic' are the same in adwaita-icon-theme
(at the time of writing), however, other icon themes differentiate
between the two icons so pointing to the appropriate icon name
is the right thing to do.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2751
2020-05-07 19:19:32 +00:00
94dca1606f extensions-app: Add permission to talk to gnome-session
This is required for offering a "Logout" option when handling extension
updates.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2735
2020-05-07 15:58:06 +00:00
27774582b6 extensions-app: Fix Logout call
Commit 764527c8c9 adjusted the "call" call to promisification that
never happened (in this bit of code).

We can either add back a callback or properly promisify the call;
this opts for the latter.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2735
2020-05-07 15:58:06 +00:00
7dc08b06b1 Updated Spanish translation 2020-05-07 16:48:35 +02:00
a9d73b1017 panel: Center app icon
Giving the icon extra space may distort it, so center it vertically.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2578
2020-05-07 14:57:12 +02:00
25e4d0ba8b Update British English translation
(cherry picked from commit 6a9ce0f18c)
2020-05-07 10:48:37 +00:00
2d56395921 shell: Check we are in a systemd environment before starting systemd units
Avoid starting/stopping the gsd-xsettings systemd unit if the shell itself
was not started via systemd. In the lack of a user session manager, we
have no means to neatly start/stop services, so should rely on the good
ol' gnome-session to do this for us.

This changes the return value meaning slightly, TRUE means "service did
start", FALSE otherwise. The error is only raised if we ought to start,
but it produced an error somehow.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1238
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2755
2020-05-07 12:16:11 +02:00
0ecddafc20 windowManager: Handle return value/errors from systemd unit calls
These may produce errors, and return a value indicating we should
proceed further. Check for those when starting/stopping gsd-xsettings.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1238
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2755
2020-05-07 12:16:03 +02:00
af34c8d2f4 Update Dutch translation
(cherry picked from commit 473a666cc0)
2020-05-06 11:13:47 +00:00
5223599145 Update Ukrainian translation 2020-05-04 17:21:20 +00:00
c96af776d6 Updated Spanish translation 2020-05-04 16:41:18 +02:00
34da48453e shell-app: Add PrefersNonDefaultGPU support to shell_app_launch()
Read the "PrefersNonDefaultGPU" key in desktop files to figure out
whether the application prefers running on the discrete GPU, or the
default GPU, and apply that.

Update the "Launch..." contextual menu to allow launching on
the default GPU if the application "prefers [the] non default GPU".

See:
https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1804
2020-05-04 16:22:03 +02:00
13dcd78be1 shell-app: Downgrade not finding a discrete GPU to debug
As we'll want to call this unconditionally soon.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1226
2020-05-04 16:22:03 +02:00
3bfa9916da appDisplay: Use global switcheroo-control D-Bus proxy
Rather than creating our own.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1226
2020-05-04 16:22:03 +02:00
b17017679b shell/global: Notify when switcheroo-control prop changes
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1226
2020-05-04 16:22:03 +02:00
9d7832ea44 shell/global: Make switcheroo-control available from JS
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1226
2020-05-04 16:22:03 +02:00
49605c7b00 shell/global: Watch for switcheroo-control appearing
Rather than staticly expecting switcheroo-control to already be running
on the system, wait for it appearing and disappearing.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1226
2020-05-04 16:22:03 +02:00
bf8b9cecf5 Updated Spanish translation 2020-05-04 09:57:45 +02:00
c291291304 Add Ossetian translation 2020-05-03 16:06:23 +00:00
e08a4acd06 ibusManager: Fix the panel after porting to Promises
Commit 764527c8c9 not only ports this file
to Promises but also changes the behavior of _initPanelService method.
Instead of always calling _updateReadiness when _panelService is ready,
it only calls it when get_global_engine_async succeeds.

The only callers of _updateReadiness are _initEngines and
_initPanelService. Assume that _initEngines completes first. Its
_updateReadiness call keeps _ready as false and it is expected for
_initPanelService to change it to true. However, since
get_global_engine_async fails because there is no active engine,
_initPanelService never calls _updateReadiness. Therefore, all setEngine
calls do nothing because _ready is false, and the input method panel
never shows. Users are unable to use any input method even if they can
see that ibus-daemon is already running.

Fix the issue by changing it back to the old behavior.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1235
2020-05-03 23:26:39 +08:00
0397a104ba Update Polish translation
Fixes https://gitlab.gnome.org/Teams/Translation/pl/-/issues/6
2020-05-02 21:45:45 +02:00
a41c1d4fda Update Slovak translation
(cherry picked from commit e4199c71cc)
2020-05-02 14:07:51 +00:00
8ae3ed907a Update Chinese (Taiwan) translation 2020-05-02 08:07:05 +00:00
31cd8f738c appFavorites: Add eog to rename list
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1233
2020-05-02 00:16:28 +02:00
a4cd9e0038 Update Ukrainian translation 2020-05-01 15:57:22 +00:00
e06109c23c st/theme: Unref CRStylesheet after removing old theme nodes
Since we now remove all theme nodes on a stylesheet change (ie.
StTheme's "custom-stylesheets-changed" signal) instead of only
invalidating them, those nodes may not be accessed anymore as soon as
"custom-stylesheets-changed" is emitted.

It turned out though that when comparing them to the newly generated
nodes in `st_widget_recompute_style()` using the
`st_theme_node_paint/geometry_equal()` functions, the properties of the
old nodes will still be accessed, causing a crash since the
CRDeclarations are already freed.

To fix that, keep the reference to the CRStylesheet, which owns the
CRDeclarations used by the theme nodes, around a bit longer, so it's
still possible to access the CRDeclarations inside the
"custom-stylesheets-changed" signal handler. This allows us to compare
the old theme nodes to the new ones since the CSS properties of both are
still valid.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2709
2020-05-01 14:24:16 +00:00
05485fe04c extensions-app: Fix translatable string
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1231
2020-05-01 14:14:35 +02:00
13062af7ef Update Chinese (Taiwan) translation
(cherry picked from commit dff855942e)
2020-04-30 17:32:19 +00:00
5e254666b0 messageTray: Add missing property getter
gjs has gotten less forgiving about missing getters/setters, and
commit 6aa1b817 missed the missing getter in the base policy class.

Most notifications use a policy subclass that already provides a
getter, but at least Main.notify() and friends don't; unbreak them
by fixing the base class.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1229
2020-04-30 07:41:38 +00:00
d29eb8646a Update Friulian translation 2020-04-29 22:34:43 +00:00
148 changed files with 18755 additions and 13361 deletions

76
NEWS
View File

@ -1,3 +1,79 @@
3.37.3
======
* Refactor and clean up window picker
[Jonas D., Florian; !1297, !1298, !1305, !1345, !1353]
* Move calendar events out of notifications list [Florian; !1282]
* Refine app folder dialogs [Georges; !1301]
* Hide switch-user button on lock screen if unsupported [Chingkai; #2687]
* Refactor and clean up app picker pagination [Georges; !1271]
* Add API to retrieve specified mimetypes from clipboards [Carlos; !1321]
* Support prepending workspace with horizontal layouts [Florian; #2916]
* Update microphone icon on input volume changes [fludixx; #2902]
* Cache labels on GPU [Daniel; !1329]
* Fix regressions in redesigned modal dialogs [Florian, Jonas D.; #2491, !1336]
* Use GIcon for all application icons [Florian; !1342]
* Support pre-authenticated logins in vmware environments [yun341; #1983]
* Better support sandboxed apps with multiple .desktop files [Florian; #219]
* Fix on-screen keyboard size in portrait orientation [Florian; #2349]
* Plugged leaks [Sebastian, Daniel, Florian; !1306, !1319, !1341]
* Misc. bug fixes and cleanups [Jonas D., Georges, Marco, Florian, Sebastian,
MOZGIII, Daniel, Mariana, Jonas Å.; !1296, !1295, #2643, !1300, !1309,
!1119, #2901, !1313, !1251, !1285, !1307, !1318, !1310, !1320, !1327, !1315,
!1289, !1331, !1332, !1333, !1334, !1340, !1287, !1308, !1346, !1299, !1343,
!1351, !1352, !1322]
Contributors:
Marco Trevisan (Treviño), Chingkai, Jonas Dreßler, Carlos Garnacho,
Sebastian Keller, MOZGIII, Florian Müllner, Georges Basile Stavracas Neto,
Mariana Picolo, Daniel van Vugt, fludixx, yun341, Jonas Ådahl
Translators:
Daniel Mustieles [es], Boyuan Yang [zh_CN], Yuri Chornoivan [uk],
Jordi Mas [ca], sicklylife [ja], Emin Tufan Çetin [tr],
Baurzhan Muftakhidinov [kk], Florentina Mușat [ro], Aurimas Černius [lt],
Rūdolfs Mazurs [lv]
3.37.2
======
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]
* Only start systemd units when running under systemd
[Carlos, Florian; #2755, !1242, !1252]
* Fix "ghost" media controls [Bryan; #2776]
* Fix zombie sockets from extensions downloader [Michael; #2774]
* Update world clocks offsets when timezone changes [Bryan; #2209]
* Support scrolling anywhere in slider menu items [Peter; #2795]
* Fix "Do Not Disturb" setting getting reset on startup [Florian; #2804]
* Only allow updates for extensions that aren't cached [Florian; !1248]
* Fix matching notifications by PID [Florian; #2592]
* Indicate extension errors in Extensions app [Florian; #2337]
* Add clipboard API for querying supported mimetypes [Andy; #2819]
* Add preview to color picker [Florian; #451]
* Improve world clocks styling [PrOF-kk; #2825]
* Remove Frequent view from app picker [Georges; !880]
* Fix pad OSD glitches [Carlos; !1290]
* Expose actor tree in looking glass [Georges; !1292]
* Fixed crashes [Jonas D., Florian; #2709, #2757]
* Misc. bug fixes and cleanups [Florian, AsciiWolf, Michael, Piotr, Ting-Wei,
Amr, Alexander, Bryan, Georges, Jonas D., Andy, Björn, Koki, Carlos; !1229,
!1231, !1233, !1235, #2578, #2735, #2751, #2602, #2777, !1249, #2796, !1268,
!1269, !1265, !1245, !1273, #2816, !1274, !1263, !1188, !1276, #2652, !1277,
!1281, #2286, !1267, !1286, !1279, !1288, !1293, !1294, !1291]
Contributors:
AsciiWolf, Michael Catanzaro, Björn Daase, Jonas Dreßler, Bryan Dunsmore,
Koki Fukuda, Carlos Garnacho, Andy Holmes, Amr Ibrahim, Soslan Khubulov,
Ting-Wei Lan, Michael Lass, Alexander Mikhaylenko, Florian Müllner,
Georges Basile Stavracas Neto, Bastien Nocera, PrOF-kk, Peter Simonyi
Translators:
Fabio Tomat [fur], Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk],
Dušan Kazik [sk], Piotr Drąg [pl], Soslan Khubulov [os],
Daniel Mustieles [es], Nathan Follens [nl], Bruce Cowan [en_GB],
Florentina Mușat [ro], Milo Casagrande [it], Anders Jonsson [sv],
Charles Monzat [fr], Danial Behzadi [fa], sicklylife [ja], Kukuh Syafaat [id],
Jordi Mas [ca], Emin Tufan Çetin [tr], Jiri Grönroos [fi], Марко Костић [sr],
Christian Kirbach [de], Changwoo Ryu [ko], Matej Urbančič [sl]
3.37.1
======
* Improve bluetooth submenu title [Mariana; #2340]

View File

@ -2,7 +2,6 @@
<gresources>
<gresource prefix="/org/gnome/shell/dbus-interfaces">
<file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file>
<file preprocess="xml-stripblanks">net.hadess.SwitcherooControl.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.Application.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.bolt1.Device.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.bolt1.Manager.xml</file>

View File

@ -6,6 +6,7 @@
<file>checkbox-off-focused.svg</file>
<file>checkbox-off.svg</file>
<file>checkbox.svg</file>
<file alias="icons/color-pick.svg">color-pick.svg</file>
<file>dash-placeholder.svg</file>
<file>gnome-shell.css</file>
<file>gnome-shell-high-contrast.css</file>

94
data/theme/color-pick.svg Normal file
View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="5.4116011mm"
height="5.1374583mm"
viewBox="0 0 5.4116011 5.1374583"
version="1.1"
id="svg5595"
inkscape:version="0.92.4 (unknown)"
sodipodi:docname="color-pick.svg">
<defs
id="defs5589">
<filter
inkscape:collect="always"
x="-0.10291173"
width="1.2058235"
y="-0.065432459"
height="1.1308649"
id="filter5601"
style="color-interpolation-filters:sRGB">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.610872"
id="feGaussianBlur5603" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="39.387731"
inkscape:cy="12.554326"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5592">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-103.12753,-146.26461)">
<circle
r="8.4810486"
cy="9.82623"
cx="10.226647"
id="circle7584"
style="color:#000000;display:inline;overflow:visible;opacity:0.6;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter:url(#filter5601)"
transform="matrix(0.26458333,0,0,0.26458333,103.12753,146.26461)" />
<path
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.26399338;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
d="m 108.07728,148.64122 c 0,1.2393 -1.00465,2.24394 -2.24395,2.24394 -1.23929,0 -2.24716,-1.00465 -2.25221,-2.24394 l -0.009,-2.24458 2.26136,6.4e-4 c 1.2393,3.4e-4 2.24395,1.00464 2.24395,2.24394 z"
id="path7523-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssscss" />
<circle
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#50dbb5;fill-opacity:1;stroke:none;stroke-width:0.36885914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="path7482-1"
cx="105.83707"
cy="148.64352"
r="1.844296" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -1,21 +1,15 @@
/* App Grid */
$app_icon_size: 96px;
$app_icon_padding: 24px;
// app icons
.icon-grid {
-shell-grid-horizontal-item-size: $app_icon_size + $app_icon_padding * 2;
-shell-grid-vertical-item-size: $app_icon_size + $app_icon_padding * 2;
spacing: $base_spacing * 6;
.overview-icon {
icon-size: $app_icon_size;
}
row-spacing: $base_spacing * 6;
column-spacing: $base_spacing * 6;
max-row-spacing: $base_spacing * 12;
max-column-spacing: $base_spacing * 12;
}
//.app-display { spacing: 20px; }
/* App Icons */
$app_grid_fg_color: #fff;
@ -44,8 +38,8 @@ $app_grid_fg_color: #fff;
.app-folder-dialog {
border-radius: $modal_radius * 1.5;
border: 1px solid $osd_outer_borders_color;
spacing: 12px;
background-color: transparentize(darken($osd_bg_color,10%), 0.05);
padding: 12px;
& .folder-name-container {
padding: 24px 36px 0;
@ -54,7 +48,7 @@ $app_grid_fg_color: #fff;
& .folder-name-label,
& .folder-name-entry {
font-size: 18pt;
font-weight: bold;
font-weight: 800;
}
& .folder-name-entry { width: 300px }
@ -73,11 +67,24 @@ $app_grid_fg_color: #fff;
& > StIcon { icon-size: 16px }
}
}
& .icon-grid {
row-spacing: $base_spacing * 2;
column-spacing: $base_spacing * 5;
}
& .page-indicators {
margin-bottom: 18px;
.page-indicator {
padding: 15px 12px;
}
}
}
.app-folder-dialog-container {
padding: 12px;
width: 800px;
height: 600px;
width: 620px;
height: 620px;
}
.app-folder-icon {
@ -123,15 +130,11 @@ $app_grid_fg_color: #fff;
}
// Some hacks I don't even know
.all-apps,
.frequent-apps > StBoxLayout {
.all-apps {
// horizontal padding to make sure scrollbars or dash don't overlap content
padding: 0px 88px 10px 88px;
}
// Label when no frequent apps
.no-frequent-applications-label { @extend %status_text; }
// shutdown and other actions in the grid
.system-action-icon {
background-color: rgba(0,0,0,0.8);
@ -139,44 +142,3 @@ $app_grid_fg_color: #fff;
border-radius: 99px;
icon-size: $app_icon_size * 0.5;
}
/* Frequent | All toggle */
// container
.app-view-controls {
padding-bottom: 32px;
}
// buttons
.app-view-control {
padding: 4px 32px;
margin: 0 4px;
&, &:hover, &:checked {
@include button(undecorated);
color: darken($osd_fg_color, 25%);
}
&:hover {
color: $osd_fg_color;
box-shadow: inset 0 -2px darken($osd_fg_color, 25%);
}
&:active {
box-shadow: inset 0 -2px $osd_fg_color;
}
&:checked {
color: $osd_fg_color;
box-shadow: inset 0 -2px $selected_bg_color;
}
&:first-child {
border-right-width: 0;
border-radius: 0;
}
&:last-child {
border-radius: 0;
}
}

View File

@ -177,6 +177,32 @@
}
}
/* Events */
.events-button {
@include notification_bubble;
padding: $base_padding * 2;
.events-box {
spacing: $base_spacing;
}
.events-list {
spacing: 2 * $base_spacing;
}
.events-title {
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
margin-bottom: $base_margin;
}
.event-time {
color: darken($fg_color,20%);
font-feature-settings: "tnum";
@include fontsize($base_font_size - 1);
}
}
/* World clocks */
.world-clocks-button {
@include notification_bubble;
@ -204,7 +230,7 @@
.world-clocks-time {
font-weight: bold;
color: $fg_color;
font-feature-settings: "lnum";
font-feature-settings: "tnum";
@include fontsize($base_font_size);
text-align: right;
}

View File

@ -1,5 +1,7 @@
/* Looking Glass */
$text_fg_color: #ccc;
// Dialog
#LookingGlassDialog {
background-color: $osd_bg_color;
@ -52,6 +54,11 @@
&:hover { color: lighten($link_color, 10%); }
&:active { color: darken($link_color, 10%); }
}
.actor-link {
color: $text_fg_color;
&:hover { color: lighten($text_fg_color, 20%); }
&:active { color: darken($text_fg_color, 20%); }
}
}
.lg-completions-text {

View File

@ -54,6 +54,10 @@
@extend %status_text;
}
.grid-search-results {
spacing: $base_spacing * 6;
}
// Search results with icons
.grid-search-result {
@extend %app-well-app;

View File

@ -1,19 +1,20 @@
/* Window Picker */
$window_picker_spacing: $base_spacing * 2; // 16px
$window_picker_padding: $base_padding * 2; // 16px
$window_picker_spacing: $base_spacing; // 6px
$window_picker_padding: $base_padding * 2; // 12px
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
$window_close_button_size: 24px;
$window_close_button_padding: 3px;
$window_clone_border_size: 6px;
// Window picker
.window-picker {
// Space between window thumbnails
-horizontal-spacing: $window_picker_spacing;
-vertical-spacing: $window_picker_spacing;
spacing: $window_picker_spacing;
// Padding for container around window thumbnails
padding: $window_picker_padding;
@ -22,7 +23,7 @@ $window_close_button_padding: 3px;
// Borders on window thumbnails
.window-clone-border {
border-width: 6px;
border-width: $window_clone_border_size;
border-style: solid;
border-color: $window_thumbnail_border_color;
border-radius: $base_border_radius + 2;
@ -54,8 +55,6 @@ $window_close_button_padding: 3px;
width: $window_close_button_size;
box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
-shell-close-overlap: $window_close_button_size * 0.5;
&:hover {
background-color: lighten($selected_bg_color, 5%);
}

View File

@ -9,6 +9,8 @@ const { ServiceImplementation } = imports.dbusService;
const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface);
Gio._promisify(Gio.DBusConnection.prototype, 'call', 'call_finish');
var NotificationDaemon = class extends ServiceImplementation {
constructor() {
super(NotificationsIface, '/org/freedesktop/Notifications');
@ -42,7 +44,15 @@ var NotificationDaemon = class extends ServiceImplementation {
null, null);
}
NotifyAsync(params, invocation) {
async NotifyAsync(params, invocation) {
const pid = await this._getSenderPid(invocation.get_sender());
const hints = params[6];
params[6] = {
...hints,
'sender-pid': new GLib.Variant('u', pid),
};
this._proxy.NotifyRemote(...params, (res, error) => {
if (this._handleError(invocation, error))
return;
@ -77,4 +87,19 @@ var NotificationDaemon = class extends ServiceImplementation {
invocation.return_value(new GLib.Variant('(ssss)', res));
});
}
async _getSenderPid(sender) {
const res = await Gio.DBus.session.call(
'org.freedesktop.DBus',
'/',
'org.freedesktop.DBus',
'GetConnectionUnixProcessID',
new GLib.Variant('(s)', [sender]),
new GLib.VariantType('(u)'),
Gio.DBusCallFlags.NONE,
-1,
null);
const [pid] = res.deepUnpack();
return pid;
}
};

View File

@ -71,7 +71,7 @@ var AuthPrompt = GObject.registerClass({
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
this._userVerifier.connect('reset', this._onReset.bind(this));
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
this._userVerifier.connect('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this));
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('destroy', this._onDestroy.bind(this));
@ -242,7 +242,7 @@ var AuthPrompt = GObject.registerClass({
this.emit('prompted');
}
_onOVirtUserAuthenticated() {
_onCredentialManagerAuthenticated() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
}

View File

@ -0,0 +1,24 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported CredentialManager */
class CredentialManager {
constructor(service) {
this._token = null;
this._service = service;
this._authenticatedSignalId = null;
}
get token() {
return this._token;
}
set token(t) {
this._token = t;
if (this._token)
this.emit('user-authenticated', this._token);
}
get service() {
return this._service;
}
}

View File

@ -589,8 +589,8 @@ var LoginDialog = GObject.registerClass({
return actorBox;
}
vfunc_allocate(dialogBox, flags) {
this.set_allocation(dialogBox, flags);
vfunc_allocate(dialogBox) {
this.set_allocation(dialogBox);
let themeNode = this.get_theme_node();
dialogBox = themeNode.get_content_box(dialogBox);
@ -719,19 +719,19 @@ var LoginDialog = GObject.registerClass({
// Finally hand out the allocations
if (bannerAllocation)
this._bannerView.allocate(bannerAllocation, flags);
this._bannerView.allocate(bannerAllocation);
if (authPromptAllocation)
this._authPrompt.allocate(authPromptAllocation, flags);
this._authPrompt.allocate(authPromptAllocation);
if (userSelectionAllocation)
this._userSelectionBox.allocate(userSelectionAllocation, flags);
this._userSelectionBox.allocate(userSelectionAllocation);
if (logoAllocation)
this._logoBin.allocate(logoAllocation, flags);
this._logoBin.allocate(logoAllocation);
if (sessionMenuButtonAllocation)
this._sessionMenuButton.allocate(sessionMenuButtonAllocation, flags);
this._sessionMenuButton.allocate(sessionMenuButtonAllocation);
}
_ensureUserListLoaded() {
@ -810,8 +810,8 @@ var LoginDialog = GObject.registerClass({
return;
this._logoBin.destroy_all_children();
const [valid, resourceScale] = this._logoBin.get_resource_scale();
if (this._logoFile && valid) {
const resourceScale = this._logoBin.get_resource_scale();
if (this._logoFile) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
-1, -1,

View File

@ -3,6 +3,9 @@
const Gio = imports.gi.Gio;
const Signals = imports.signals;
const Credential = imports.gdm.credentialManager;
var SERVICE_NAME = 'gdm-ovirtcred';
const OVirtCredentialsIface = `
<node>
@ -28,30 +31,14 @@ function OVirtCredentials() {
return self;
}
var OVirtCredentialsManager = class {
var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager {
constructor() {
this._token = null;
super(SERVICE_NAME);
this._credentials = new OVirtCredentials();
this._credentials.connectSignal('UserAuthenticated',
this._onUserAuthenticated.bind(this));
}
_onUserAuthenticated(proxy, sender, [token]) {
this._token = token;
this.emit('user-authenticated', token);
}
hasToken() {
return this._token != null;
}
getToken() {
return this._token;
}
resetToken() {
this._token = null;
(proxy, sender, [token]) => {
this.token = token;
});
}
};
Signals.addSignalMethods(OVirtCredentialsManager.prototype);

View File

@ -8,6 +8,7 @@ const Signals = imports.signals;
const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint;
const OVirt = imports.gdm.oVirt;
const Vmware = imports.gdm.vmware;
const Main = imports.ui.main;
const Params = imports.misc.params;
const SmartcardManager = imports.misc.smartcardManager;
@ -24,7 +25,6 @@ Gio._promisify(Gdm.UserVerifierProxy.prototype,
var PASSWORD_SERVICE_NAME = 'gdm-password';
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
var FADE_ANIMATION_TIME = 160;
var CLONE_FADE_ANIMATION_TIME = 250;
@ -160,13 +160,20 @@ var ShellUserVerifier = class {
this._failCounter = 0;
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._credentialManagers = {};
this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager();
this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager();
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
for (let service in this._credentialManagers) {
if (this._credentialManagers[service].token) {
this._onCredentialManagerAuthenticated(this._credentialManagers[service],
this._credentialManagers[service].token);
}
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
this._oVirtUserAuthenticated.bind(this));
this._credentialManagers[service]._authenticatedSignalId =
this._credentialManagers[service].connect('user-authenticated',
this._onCredentialManagerAuthenticated.bind(this));
}
}
begin(userName, hold) {
@ -222,8 +229,11 @@ var ShellUserVerifier = class {
this._smartcardManager.disconnect(this._smartcardRemovedId);
this._smartcardManager = null;
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
this._oVirtCredentialsManager = null;
for (let service in this._credentialManagers) {
let credentialManager = this._credentialManagers[service];
credentialManager.disconnect(credentialManager._authenticatedSignalId);
credentialManager = null;
}
}
answerQuery(serviceName, answer) {
@ -311,9 +321,9 @@ var ShellUserVerifier = class {
});
}
_oVirtUserAuthenticated(_token) {
this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated');
_onCredentialManagerAuthenticated(credentialManager, _token) {
this._preemptingService = credentialManager.service;
this.emit('credential-manager-authenticated');
}
_checkForSmartcard() {
@ -490,9 +500,12 @@ var ShellUserVerifier = class {
if (!this.serviceIsForeground(serviceName))
return;
if (serviceName == OVIRT_SERVICE_NAME) {
// The only question asked by this service is "Token?"
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
let token = null;
if (this._credentialManagers[serviceName])
token = this._credentialManagers[serviceName].token;
if (token) {
this.answerQuery(serviceName, token);
return;
}
@ -560,8 +573,10 @@ var ShellUserVerifier = class {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken();
let foregroundService = Object.keys(this._credentialManagers).find(service =>
this.serviceIsForeground(service));
if (foregroundService) {
this._credentialManagers[foregroundService].token = null;
this._preemptingService = null;
this._verificationFailed(false);
return;

54
js/gdm/vmware.js Normal file
View File

@ -0,0 +1,54 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported getVmwareCredentialsManager */
const Gio = imports.gi.Gio;
const Signals = imports.signals;
const Credential = imports.gdm.credentialManager;
const dbusPath = '/org/vmware/viewagent/Credentials';
const dbusInterface = 'org.vmware.viewagent.Credentials';
var SERVICE_NAME = 'gdm-vmwcred';
const VmwareCredentialsIface = '<node> \
<interface name="' + dbusInterface + '"> \
<signal name="UserAuthenticated"> \
<arg type="s" name="token"/> \
</signal> \
</interface> \
</node>';
const VmwareCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(VmwareCredentialsIface);
let _vmwareCredentialsManager = null;
function VmwareCredentials() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_interface_name: VmwareCredentialsInfo.name,
g_interface_info: VmwareCredentialsInfo,
g_name: dbusInterface,
g_object_path: dbusPath,
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
self.init(null);
return self;
}
var VmwareCredentialsManager = class VmwareCredentialsManager extends Credential.CredentialManager {
constructor() {
super(SERVICE_NAME);
this._credentials = new VmwareCredentials();
this._credentials.connectSignal('UserAuthenticated',
(proxy, sender, [token]) => {
this.token = token;
});
}
};
Signals.addSignalMethods(VmwareCredentialsManager.prototype);
function getVmwareCredentialsManager() {
if (!_vmwareCredentialsManager)
_vmwareCredentialsManager = new VmwareCredentialsManager();
return _vmwareCredentialsManager;
}

View File

@ -6,6 +6,8 @@
<file>gdm/fingerprint.js</file>
<file>gdm/loginDialog.js</file>
<file>gdm/oVirt.js</file>
<file>gdm/credentialManager.js</file>
<file>gdm/vmware.js</file>
<file>gdm/realmd.js</file>
<file>gdm/util.js</file>
@ -108,6 +110,7 @@
<file>ui/windowAttentionHandler.js</file>
<file>ui/windowMenu.js</file>
<file>ui/windowManager.js</file>
<file>ui/windowPreview.js</file>
<file>ui/workspace.js</file>
<file>ui/workspaceSwitcherPopup.js</file>
<file>ui/workspaceThumbnail.js</file>

View File

@ -171,13 +171,13 @@ var IBusManager = class {
this._panelService.connect('set-content-type', this._setContentType.bind(this));
} catch (e) {
}
this._updateReadiness();
try {
// If an engine is already active we need to get its properties
const engine =
await this._ibus.get_global_engine_async(-1, this._cancellable);
this._engineChanged(this._ibus, engine.get_name());
this._updateReadiness();
} catch (e) {
}
}

View File

@ -107,7 +107,7 @@ const SystemActions = GObject.registerClass({
this._actions.set(LOGOUT_ACTION_ID, {
// Translators: The name of the logout action in search
name: C_("search-result", "Log Out"),
iconName: 'application-exit-symbolic',
iconName: 'system-log-out-symbolic',
// Translators: A list of keywords that match the logout action, separated by semicolons
keywords: tokenizeKeywords(_('logout;log out;sign off')),
available: false,

View File

@ -1,9 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
makeCloseButton, ensureActorVisibleInScrollView, wiggle */
ensureActorVisibleInScrollView, wiggle */
const { Clutter, Gio, GLib, GObject, Shell, St, GnomeDesktop } = imports.gi;
const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
const Gettext = imports.gettext;
const Main = imports.ui.main;
@ -363,51 +363,6 @@ function insertSorted(array, val, cmp) {
return pos;
}
var CloseButton = GObject.registerClass(
class CloseButton extends St.Button {
_init(boxpointer) {
super._init({
style_class: 'notification-close',
x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.START,
});
this._boxPointer = boxpointer;
if (boxpointer)
this._boxPointer.connect('arrow-side-changed', this._sync.bind(this));
}
_computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.get_stage())
return 0;
let side = this._boxPointer.arrowSide;
if (side == St.Side.TOP)
return this._boxPointer.getArrowHeight();
else
return 0;
}
_sync() {
let themeNode = this.get_theme_node();
let offY = this._computeBoxPointerOffset();
this.translation_x = themeNode.get_length('-shell-close-overlap-x');
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
}
vfunc_style_changed() {
this._sync();
super.vfunc_style_changed();
}
});
function makeCloseButton(boxpointer) {
return new CloseButton(boxpointer);
}
function ensureActorVisibleInScrollView(scrollView, actor) {
let adjustment = scrollView.vscroll.adjustment;
let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values();

View File

@ -68,8 +68,8 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
this._items = this._switcherList.icons;
}
vfunc_allocate(box, flags) {
super.vfunc_allocate(box, flags);
vfunc_allocate(box) {
super.vfunc_allocate(box);
// Allocate the thumbnails
// We try to avoid overflowing the screen so we base the resulting size on
@ -102,7 +102,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1);
let [, childNaturalHeight] = this._thumbnails.get_preferred_height(-1);
childBox.y2 = childBox.y1 + childNaturalHeight;
this._thumbnails.allocate(childBox, flags);
this._thumbnails.allocate(childBox);
}
}
@ -749,9 +749,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
return super.vfunc_get_preferred_height(forWidth);
}
vfunc_allocate(box, flags) {
vfunc_allocate(box) {
// Allocate the main list items
super.vfunc_allocate(box, flags);
super.vfunc_allocate(box);
let contentBox = this.get_theme_node().get_content_box(box);
@ -766,7 +766,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
childBox.x2 = childBox.x1 + arrowWidth;
childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight;
childBox.y2 = childBox.y1 + arrowHeight;
this._arrows[i].allocate(childBox, flags);
this._arrows[i].allocate(childBox);
}
}
@ -852,6 +852,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
if (index === -1)
return;
this._arrows[index].destroy();
this._arrows.splice(index, 1);
this.icons.splice(index, 1);
this.removeItem(index);
}
@ -1056,7 +1059,7 @@ class WindowSwitcher extends SwitcherPopup.SwitcherList {
return [minHeight, natHeight];
}
vfunc_allocate(box, flags) {
vfunc_allocate(box) {
let themeNode = this.get_theme_node();
let contentBox = themeNode.get_content_box(box);
const labelHeight = this._label.height;
@ -1064,20 +1067,20 @@ class WindowSwitcher extends SwitcherPopup.SwitcherList {
labelHeight + themeNode.get_padding(St.Side.BOTTOM);
box.y2 -= totalLabelHeight;
super.vfunc_allocate(box, flags);
super.vfunc_allocate(box);
// Hooking up the parent vfunc will call this.set_allocation() with
// the height without the label height, so call it again with the
// correct size here.
box.y2 += totalLabelHeight;
this.set_allocation(box, flags);
this.set_allocation(box);
const childBox = new Clutter.ActorBox();
childBox.x1 = contentBox.x1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2;
childBox.y1 = childBox.y2 - labelHeight;
this._label.allocate(childBox, flags);
this._label.allocate(childBox);
}
highlight(index, justOutline) {

View File

@ -60,7 +60,7 @@ class Animation extends St.Bin {
}
_loadFile(file, width, height) {
let [validResourceScale, resourceScale] = this.get_resource_scale();
const resourceScale = this.get_resource_scale();
let wasPlaying = this._isPlaying;
if (this._isPlaying)
@ -69,12 +69,6 @@ class Animation extends St.Bin {
this._isLoaded = false;
this.destroy_all_children();
if (!validResourceScale) {
if (wasPlaying)
this.play();
return;
}
let textureCache = St.TextureCache.get_default();
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._animations = textureCache.load_sliced_image(file, width, height,

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@ const RENAMED_DESKTOP_IDS = {
'cheese.desktop': 'org.gnome.Cheese.desktop',
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
'empathy.desktop': 'org.gnome.Empathy.desktop',
'eog.desktop': 'org.gnome.eog.desktop',
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
'evolution.desktop': 'org.gnome.Evolution.desktop',
'file-roller.desktop': 'org.gnome.FileRoller.desktop',

View File

@ -512,8 +512,8 @@ var SystemBackground = GObject.registerClass({
super._init({
meta_display: global.display,
monitor: 0,
background: _systemBackground,
});
this.content.background = _systemBackground;
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.emit('loaded');
@ -712,13 +712,18 @@ var BackgroundManager = class BackgroundManager {
}
let newBackgroundActor = this._createBackgroundActor();
newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness;
newBackgroundActor.brightness = this.backgroundActor.brightness;
const oldContent = this.backgroundActor.content;
const newContent = newBackgroundActor.content;
newContent.vignette_sharpness = oldContent.vignette_sharpness;
newContent.brightness = oldContent.brightness;
newBackgroundActor.visible = this.backgroundActor.visible;
this._newBackgroundActor = newBackgroundActor;
let background = newBackgroundActor.background;
const { background } = newBackgroundActor.content;
if (background.isLoaded) {
this._swapBackgroundActor();
@ -738,6 +743,8 @@ var BackgroundManager = class BackgroundManager {
let backgroundActor = new Meta.BackgroundActor({
meta_display: global.display,
monitor: this._monitorIndex,
});
backgroundActor.content.set({
background,
vignette: this._vignette,
vignette_sharpness: 0.5,

View File

@ -30,8 +30,8 @@ var BarLevel = GObject.registerClass({
accessible_role: Atk.Role.LEVEL_BAR,
};
super._init(Object.assign(defaultParams, params));
this.connect('allocation-changed', (actor, box) => {
this._barLevelWidth = box.get_width();
this.connect('notify::allocation', () => {
this._barLevelWidth = this.allocation.get_width();
});
this._customAccessible = St.GenericAccessible.new_for_actor(this);

View File

@ -196,13 +196,13 @@ var BoxPointer = GObject.registerClass({
return themeNode.adjust_preferred_height(...height);
}
vfunc_allocate(box, flags) {
vfunc_allocate(box) {
if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box);
this._updateFlip(box);
}
this.set_allocation(box, flags);
this.set_allocation(box);
let themeNode = this.get_theme_node();
let borderWidth = themeNode.get_length('-arrow-border-width');
@ -214,7 +214,7 @@ var BoxPointer = GObject.registerClass({
childBox.y1 = 0;
childBox.x2 = availWidth;
childBox.y2 = availHeight;
this._border.allocate(childBox, flags);
this._border.allocate(childBox);
childBox.x1 = borderWidth;
childBox.y1 = borderWidth;
@ -234,7 +234,7 @@ var BoxPointer = GObject.registerClass({
childBox.x2 -= rise;
break;
}
this.bin.allocate(childBox, flags);
this.bin.allocate(childBox);
}
_drawBorder(area) {

View File

@ -14,7 +14,6 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
var MSECS_IN_DAY = 24 * 60 * 60 * 1000;
var SHOW_WEEKDATE_KEY = 'show-weekdate';
var ELLIPSIS_CHAR = '\u2026';
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
@ -32,10 +31,6 @@ function sameDay(dateA, dateB) {
return sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
}
function isToday(date) {
return sameDay(new Date(), date);
}
function _isWorkDay(date) {
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
let days = C_('calendar-no-work', "06");
@ -723,67 +718,6 @@ var Calendar = GObject.registerClass({
}
});
var EventMessage = GObject.registerClass(
class EventMessage extends MessageList.Message {
_init(event, date) {
super._init('', '');
this._date = date;
this.update(event);
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
this.setIcon(this._icon);
}
vfunc_style_changed() {
let iconVisible = this.get_parent().has_style_pseudo_class('first-child');
this._icon.opacity = iconVisible ? 255 : 0;
super.vfunc_style_changed();
}
update(event) {
this._event = event;
this.setTitle(this._formatEventTime());
this.setBody(event.summary);
}
_formatEventTime() {
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let allDay = this._event.allDay || (this._event.date <= periodBegin &&
this._event.end >= periodEnd);
let title;
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
title = C_("event list time", "All Day");
} else {
let date = this._event.date >= periodBegin
? this._event.date
: this._event.end;
title = Util.formatTime(date, { timeOnly: true });
}
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
if (this._event.date < periodBegin && !this._event.allDay) {
if (rtl)
title = '%s%s'.format(title, ELLIPSIS_CHAR);
else
title = '%s%s'.format(ELLIPSIS_CHAR, title);
}
if (this._event.end > periodEnd && !this._event.allDay) {
if (rtl)
title = '%s%s'.format(ELLIPSIS_CHAR, title);
else
title = '%s%s'.format(title, ELLIPSIS_CHAR);
}
return title;
}
});
var NotificationMessage = GObject.registerClass(
class NotificationMessage extends MessageList.Message {
_init(notification) {
@ -849,149 +783,6 @@ class NotificationMessage extends MessageList.Message {
}
});
var EventsSection = GObject.registerClass(
class EventsSection extends MessageList.MessageListSection {
_init() {
super._init();
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource();
this._messageById = new Map();
this._title = new St.Button({ style_class: 'events-section-title',
label: '',
can_focus: true });
this._title.child.x_align = Clutter.ActorAlign.START;
this.insert_child_below(this._title, null);
this._title.connect('clicked', this._onTitleClicked.bind(this));
this._title.connect('key-focus-in', this._onKeyFocusIn.bind(this));
this._appSys = Shell.AppSystem.get_default();
this._appSys.connect('installed-changed',
this._appInstalledChanged.bind(this));
this._appInstalledChanged();
}
setEventSource(eventSource) {
if (!(eventSource instanceof EventSourceBase))
throw new Error('Event source is not valid type');
this._eventSource = eventSource;
this._eventSource.connect('changed', this._reloadEvents.bind(this));
}
get allowed() {
return Main.sessionMode.showCalendarEvents;
}
_updateTitle() {
this._title.visible = !isToday(this._date);
if (!this._title.visible)
return;
let dayFormat;
let now = new Date();
if (sameYear(this._date, now)) {
/* Translators: Shown on calendar heading when selected day occurs on current year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d"));
} else {
/* Translators: Shown on calendar heading when selected day occurs on different year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d, %Y"));
}
this._title.label = this._date.toLocaleFormat(dayFormat);
}
_reloadEvents() {
if (this._eventSource.isLoading || this._reloading)
return;
this._reloading = true;
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd);
let ids = events.map(e => e.id);
this._messageById.forEach((message, id) => {
if (ids.includes(id))
return;
this._messageById.delete(id);
this.removeMessage(message);
});
for (let i = 0; i < events.length; i++) {
let event = events[i];
let message = this._messageById.get(event.id);
if (!message) {
message = new EventMessage(event, this._date);
this._messageById.set(event.id, message);
this.addMessage(message, false);
} else {
message.update(event);
this.moveMessage(message, i, false);
}
}
this._reloading = false;
this._sync();
}
_appInstalledChanged() {
this._calendarApp = undefined;
this._title.reactive = this._getCalendarApp() != null;
}
_getCalendarApp() {
if (this._calendarApp !== undefined)
return this._calendarApp;
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0)) {
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
let defaultInRecommended = apps.some(a => a.equal(app));
this._calendarApp = defaultInRecommended ? app : apps[0];
} else {
this._calendarApp = null;
}
return this._calendarApp;
}
_onTitleClicked() {
Main.overview.hide();
Main.panel.closeCalendar();
let appInfo = this._getCalendarApp();
if (appInfo.get_id() === 'org.gnome.Evolution.desktop') {
let app = this._appSys.lookup_app('evolution-calendar.desktop');
if (app)
appInfo = app.app_info;
}
appInfo.launch([], global.create_app_launch_context(0, -1));
}
setDate(date) {
super.setDate(date);
this._updateTitle();
this._reloadEvents();
}
_shouldShow() {
return !this.empty || !isToday(this._date);
}
_sync() {
if (this._reloading)
return;
super._sync();
}
});
var TimeLabel = GObject.registerClass(
class NotificationTimeLabel extends St.Label {
_init(datetime) {
@ -1088,10 +879,6 @@ class NotificationSection extends MessageList.MessageListSection {
});
super.vfunc_map();
}
_shouldShow() {
return !this.empty && isToday(this._date);
}
});
var Placeholder = GObject.registerClass(
@ -1100,41 +887,13 @@ class Placeholder extends St.BoxLayout {
super._init({ style_class: 'message-list-placeholder', vertical: true });
this._date = new Date();
let todayFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-notifications.svg');
let otherFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-events.svg');
this._todayIcon = new Gio.FileIcon({ file: todayFile });
this._otherIcon = new Gio.FileIcon({ file: otherFile });
this._icon = new St.Icon();
const file = Gio.File.new_for_uri(
'resource:///org/gnome/shell/theme/no-notifications.svg');
this._icon = new St.Icon({ gicon: new Gio.FileIcon({ file }) });
this.add_actor(this._icon);
this._label = new St.Label();
this._label = new St.Label({ text: _('No Notifications') });
this.add_actor(this._label);
this._sync();
}
setDate(date) {
if (sameDay(this._date, date))
return;
this._date = date;
this._sync();
}
_sync() {
let today = isToday(this._date);
if (today && this._icon.gicon == this._todayIcon)
return;
if (!today && this._icon.gicon == this._otherIcon)
return;
if (today) {
this._icon.gicon = this._todayIcon;
this._label.text = _("No Notifications");
} else {
this._icon.gicon = this._otherIcon;
this._label.text = _("No Events");
}
}
});
@ -1199,8 +958,8 @@ class CalendarMessageList extends St.Widget {
child: this._dndSwitch,
label_actor: dndLabel,
});
this._dndButton.bind_property('checked',
this._dndSwitch, 'state',
this._dndSwitch.bind_property('state',
this._dndButton, 'checked',
GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE);
hbox.add_child(this._dndButton);
@ -1235,9 +994,6 @@ class CalendarMessageList extends St.Widget {
this._notificationSection = new NotificationSection();
this._addSection(this._notificationSection);
this._eventsSection = new EventsSection();
this._addSection(this._eventsSection);
Main.sessionMode.connect('updated', this._sync.bind(this));
}
@ -1273,13 +1029,4 @@ class CalendarMessageList extends St.Widget {
let canClear = sections.some(s => s.canClear && s.visible);
this._clearButton.reactive = canClear;
}
setEventSource(eventSource) {
this._eventsSection.setEventSource(eventSource);
}
setDate(date) {
this._sectionList.get_children().forEach(s => s.setDate(date));
this._placeholder.setDate(date);
}
});

View File

@ -292,11 +292,11 @@ class DashActor extends St.Widget {
});
}
vfunc_allocate(box, flags) {
vfunc_allocate(box) {
let contentBox = this.get_theme_node().get_content_box(box);
let availWidth = contentBox.x2 - contentBox.x1;
this.set_allocation(box, flags);
this.set_allocation(box);
let [appIcons, showAppsButton] = this.get_children();
let [, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth);
@ -306,11 +306,11 @@ class DashActor extends St.Widget {
childBox.y1 = contentBox.y1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2 - showAppsNatHeight;
appIcons.allocate(childBox, flags);
appIcons.allocate(childBox);
childBox.y1 = contentBox.y2 - showAppsNatHeight;
childBox.y2 = contentBox.y2;
showAppsButton.allocate(childBox, flags);
showAppsButton.allocate(childBox);
}
vfunc_get_preferred_height(forWidth) {
@ -815,7 +815,12 @@ var Dash = GObject.registerClass({
else
pos = 0; // always insert at the top when dash is empty
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
// Put the placeholder after the last favorite if we are not
// in the favorites zone
if (pos > numFavorites)
pos = numFavorites;
if (pos !== this._dragPlaceholderPos && this._animatingPlaceholdersCount === 0) {
this._dragPlaceholderPos = pos;
// Don't allow positioning before or after self
@ -843,11 +848,6 @@ var Dash = GObject.registerClass({
this._dragPlaceholder.show(fadeIn);
}
// Remove the drag placeholder if we are not in the
// "favorites zone"
if (pos > numFavorites)
this._clearDragPlaceholder();
if (!this._dragPlaceholder)
return DND.DragMotionResult.NO_DROP;

View File

@ -13,7 +13,11 @@ const System = imports.system;
const { loadInterfaceXML } = imports.misc.fileUtils;
const NC_ = (context, str) => '%s\u0004%s'.format(context, str);
const T_ = Shell.util_translate_time_string;
const MAX_FORECASTS = 5;
const ELLIPSIS_CHAR = '\u2026';
const ClocksIntegrationIface = loadInterfaceXML('org.gnome.Shell.ClocksIntegration');
const ClocksProxy = Gio.DBusProxy.makeProxyWrapper(ClocksIntegrationIface);
@ -84,6 +88,188 @@ class TodayButton extends St.Button {
}
});
var EventsSection = GObject.registerClass(
class EventsSection extends St.Button {
_init() {
super._init({
style_class: 'events-button',
can_focus: true,
x_expand: true,
child: new St.BoxLayout({
style_class: 'events-box',
vertical: true,
x_expand: true,
}),
});
this._startDate = null;
this._endDate = null;
this._eventSource = null;
this._calendarApp = null;
this._title = new St.Label({
style_class: 'events-title',
});
this.child.add_child(this._title);
this._eventsList = new St.BoxLayout({
style_class: 'events-list',
vertical: true,
x_expand: true,
});
this.child.add_child(this._eventsList);
this._appSys = Shell.AppSystem.get_default();
this._appSys.connect('installed-changed',
this._appInstalledChanged.bind(this));
this._appInstalledChanged();
}
setDate(date) {
const day = [date.getFullYear(), date.getMonth(), date.getDate()];
this._startDate = new Date(...day);
this._endDate = new Date(...day, 23, 59, 59, 999);
this._updateTitle();
this._reloadEvents();
}
setEventSource(eventSource) {
if (!(eventSource instanceof Calendar.EventSourceBase))
throw new Error('Event source is not valid type');
this._eventSource = eventSource;
this._eventSource.connect('changed', this._reloadEvents.bind(this));
this._eventSource.connect('notify::has-calendars',
this._sync.bind(this));
this._sync();
}
_updateTitle() {
/* Translators: Shown on calendar heading when selected day occurs on current year */
const sameYearFormat = T_(NC_('calendar heading', '%B %-d'));
/* Translators: Shown on calendar heading when selected day occurs on different year */
const otherYearFormat = T_(NC_('calendar heading', '%B %-d %Y'));
const timeSpanDay = GLib.TIME_SPAN_DAY / 1000;
const now = new Date();
if (this._startDate <= now && now <= this._endDate)
this._title.text = _('Today');
else if (this._endDate < now && now - this._endDate < timeSpanDay)
this._title.text = _('Yesterday');
else if (this._startDate > now && this._startDate - now < timeSpanDay)
this._title.text = _('Tomorrow');
else if (this._startDate.getFullYear() === now.getFullYear())
this._title.text = this._startDate.toLocaleFormat(sameYearFormat);
else
this._title.text = this._startDate.toLocaleFormat(otherYearFormat);
}
_formatEventTime(event) {
const allDay = event.allDay ||
(event.date <= this._startDate && event.end >= this._endDate);
let title;
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
title = C_('event list time', 'All Day');
} else {
let date = event.date >= this._startDate ? event.date : event.end;
title = Util.formatTime(date, { timeOnly: true });
}
const rtl = Clutter.get_default_text_direction() === Clutter.TextDirection.RTL;
if (event.date < this._startDate && !event.allDay) {
if (rtl)
title = '%s%s'.format(title, ELLIPSIS_CHAR);
else
title = '%s%s'.format(ELLIPSIS_CHAR, title);
}
if (event.end > this._endDate && !event.allDay) {
if (rtl)
title = '%s%s'.format(ELLIPSIS_CHAR, title);
else
title = '%s%s'.format(title, ELLIPSIS_CHAR);
}
return title;
}
_reloadEvents() {
if (this._eventSource.isLoading || this._reloading)
return;
this._reloading = true;
[...this._eventsList].forEach(c => c.destroy());
const events =
this._eventSource.getEvents(this._startDate, this._endDate);
for (let event of events) {
const box = new St.BoxLayout({
style_class: 'event-box',
vertical: true,
});
box.add(new St.Label({
text: event.summary,
style_class: 'event-summary',
}));
box.add(new St.Label({
text: this._formatEventTime(event),
style_class: 'event-time',
}));
this._eventsList.add_child(box);
}
if (this._eventsList.get_n_children() === 0) {
const placeholder = new St.Label({
text: _('No Events'),
style_class: 'event-placeholder',
});
this._eventsList.add_child(placeholder);
}
this._reloading = false;
this._sync();
}
vfunc_clicked() {
Main.overview.hide();
Main.panel.closeCalendar();
let appInfo = this._calendarApp;
if (appInfo.get_id() === 'org.gnome.Evolution.desktop') {
const app = this._appSys.lookup_app('evolution-calendar.desktop');
if (app)
appInfo = app.app_info;
}
appInfo.launch([], global.create_app_launch_context(0, -1));
}
_appInstalledChanged() {
const apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0)) {
const app = Gio.AppInfo.get_default_for_type('text/calendar', false);
const defaultInRecommended = apps.some(a => a.equal(app));
this._calendarApp = defaultInRecommended ? app : apps[0];
} else {
this._calendarApp = null;
}
return this._sync();
}
_sync() {
this.visible = this._eventSource && this._eventSource.hasCalendars;
this.reactive = this._calendarApp !== null;
}
});
var WorldClocksSection = GObject.registerClass(
class WorldClocksSection extends St.Button {
_init() {
@ -94,6 +280,7 @@ class WorldClocksSection extends St.Button {
});
this._clock = new GnomeDesktop.WallClock();
this._clockNotifyId = 0;
this._tzNotifyId = 0;
this._locations = [];
@ -166,8 +353,6 @@ class WorldClocksSection extends St.Button {
layout.attach(header, 0, 0, 2, 1);
this.label_actor = header;
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i].location;
@ -180,21 +365,8 @@ class WorldClocksSection extends St.Button {
let time = new St.Label({ style_class: 'world-clocks-time' });
const utcOffset = this._getTimeAtLocation(l).get_utc_offset();
const offsetCurrentTz = utcOffset - localOffset;
const offsetHours = Math.abs(offsetCurrentTz) / GLib.TIME_SPAN_HOUR;
const offsetMinutes =
(Math.abs(offsetCurrentTz) % GLib.TIME_SPAN_HOUR) /
GLib.TIME_SPAN_MINUTE;
const prefix = offsetCurrentTz >= 0 ? '+' : '-';
const text = offsetMinutes === 0
? '%s%d'.format(prefix, offsetHours)
: '%s%d\u2236%d'.format(prefix, offsetHours, offsetMinutes);
const tz = new St.Label({
style_class: 'world-clocks-timezone',
text,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER,
});
@ -212,32 +384,65 @@ class WorldClocksSection extends St.Button {
layout.attach(tz, 2, i + 1, 1, 1);
}
this._locations[i].actor = time;
this._locations[i].timeLabel = time;
this._locations[i].tzLabel = tz;
}
if (this._grid.get_n_children() > 1) {
if (!this._clockNotifyId) {
this._clockNotifyId =
this._clock.connect('notify::clock', this._updateLabels.bind(this));
this._clock.connect('notify::clock', this._updateTimeLabels.bind(this));
}
this._updateLabels();
if (!this._tzNotifyId) {
this._tzNotifyId =
this._clock.connect('notify::timezone', this._updateTimezoneLabels.bind(this));
}
this._updateTimeLabels();
this._updateTimezoneLabels();
} else {
if (this._clockNotifyId)
this._clock.disconnect(this._clockNotifyId);
this._clockNotifyId = 0;
if (this._tzNotifyId)
this._clock.disconnect(this._tzNotifyId);
this._tzNotifyId = 0;
}
}
_getTimezoneOffsetAtLocation(location) {
const localOffset = GLib.DateTime.new_now_local().get_utc_offset();
const utcOffset = this._getTimeAtLocation(location).get_utc_offset();
const offsetCurrentTz = utcOffset - localOffset;
const offsetHours = Math.abs(offsetCurrentTz) / GLib.TIME_SPAN_HOUR;
const offsetMinutes =
(Math.abs(offsetCurrentTz) % GLib.TIME_SPAN_HOUR) /
GLib.TIME_SPAN_MINUTE;
const prefix = offsetCurrentTz >= 0 ? '+' : '-';
const text = offsetMinutes === 0
? '%s%d'.format(prefix, offsetHours)
: '%s%d\u2236%d'.format(prefix, offsetHours, offsetMinutes);
return text;
}
_getTimeAtLocation(location) {
let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
return GLib.DateTime.new_now(tz);
}
_updateLabels() {
_updateTimeLabels() {
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i];
let now = this._getTimeAtLocation(l.location);
l.actor.text = Util.formatTime(now, { timeOnly: true });
l.timeLabel.text = Util.formatTime(now, { timeOnly: true });
}
}
_updateTimezoneLabels() {
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i];
l.tzLabel.text = this._getTimezoneOffsetAtLocation(l.location);
}
}
@ -466,7 +671,6 @@ class MessagesIndicator extends St.Icon {
this._sources = [];
this._count = 0;
this._doNotDisturb = false;
this._settings = new Gio.Settings({
schema_id: 'org.gnome.desktop.notifications',
@ -547,8 +751,8 @@ class FreezableBinLayout extends Clutter.BinLayout {
return this._savedHeight;
}
vfunc_allocate(container, allocation, flags) {
super.vfunc_allocate(container, allocation, flags);
vfunc_allocate(container, allocation) {
super.vfunc_allocate(container, allocation);
let [width, height] = allocation.get_size();
this._savedWidth = [width, width];
@ -580,6 +784,7 @@ class DateMenuButton extends PanelMenu.Button {
this._clockDisplay = new St.Label({ style_class: 'clock' });
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
this._clockDisplay.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._indicator = new MessagesIndicator();
@ -614,7 +819,7 @@ class DateMenuButton extends PanelMenu.Button {
this._calendar.connect('selected-date-changed', (_calendar, datetime) => {
let date = _gDateTimeToDate(datetime);
layout.frozen = !_isToday(date);
this._messageList.setDate(date);
this._eventsItem.setDate(date);
});
this.menu.connect('open-state-changed', (menu, isOpen) => {
@ -623,7 +828,7 @@ class DateMenuButton extends PanelMenu.Button {
let now = new Date();
this._calendar.setDate(now);
this._date.setDate(now);
this._messageList.setDate(now);
this._eventsItem.setDate(now);
}
});
@ -654,6 +859,9 @@ class DateMenuButton extends PanelMenu.Button {
style_class: 'datemenu-displays-box' });
this._displaysSection.add_actor(displaysBox);
this._eventsItem = new EventsSection();
displaysBox.add_child(this._eventsItem);
this._clocksItem = new WorldClocksSection();
displaysBox.add_child(this._clocksItem);
@ -679,7 +887,7 @@ class DateMenuButton extends PanelMenu.Button {
this._eventSource.destroy();
this._calendar.setEventSource(eventSource);
this._messageList.setEventSource(eventSource);
this._eventsItem.setEventSource(eventSource);
this._eventSource = eventSource;
}

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
const { Clutter, GObject, Meta, Pango, St } = imports.gi;
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
function _setLabel(label, value) {
label.set({
@ -221,13 +221,16 @@ var MessageDialogContent = GObject.registerClass({
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._updateTitleStyleLater = 0;
this._title.add_style_class_name('leightweight');
return false;
return GLib.SOURCE_REMOVE;
});
}
}
set title(title) {
if (this._title.text === title)
return;
_setLabel(this._title, title);
this._title.remove_style_class_name('leightweight');
@ -237,6 +240,9 @@ var MessageDialogContent = GObject.registerClass({
}
set description(description) {
if (this._description.text === description)
return;
_setLabel(this._description, description);
this.notify('description');
}

View File

@ -375,19 +375,30 @@ var _Draggable = class _Draggable {
this._dragActorSource = undefined;
this._dragOrigParent = this.actor.get_parent();
this._dragOrigX = this._dragActor.x;
this._dragOrigY = this._dragActor.y;
this._dragActorHadFixedPos = this._dragActor.fixed_position_set;
this._dragOrigX = this._dragActor.allocation.x1;
this._dragOrigY = this._dragActor.allocation.y1;
this._dragOrigWidth = this._dragActor.allocation.get_width();
this._dragOrigHeight = this._dragActor.allocation.get_height();
this._dragOrigScale = this._dragActor.scale_x;
// When the actor gets reparented to the uiGroup, it will be
// allocated its preferred size, so use that size instead of the
// current allocation size.
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
const transformedAllocation =
Shell.util_get_transformed_allocation(this._dragActor);
// Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
this._dragActor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
this._dragActor.set_scale(
transformedAllocation.get_width() / newAllocatedWidth,
transformedAllocation.get_height() / newAllocatedHeight);
let [actorStageX, actorStageY] = this.actor.get_transformed_position();
this._dragOffsetX = actorStageX - this._dragStartX;
this._dragOffsetY = actorStageY - this._dragStartY;
this._dragOffsetX = transformedAllocation.x1 - this._dragStartX;
this._dragOffsetY = transformedAllocation.y1 - this._dragStartY;
this._dragOrigParent.remove_actor(this._dragActor);
Main.uiGroup.add_child(this._dragActor);
@ -417,6 +428,10 @@ var _Draggable = class _Draggable {
this._dragOffsetX -= transX;
this._dragOffsetY -= transY;
this._dragActor.set_position(
this._dragX + this._dragOffsetX,
this._dragY + this._dragOffsetY);
if (this._dragActorMaxSize != undefined) {
let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size();
let currentSize = Math.max(scaledWidth, scaledHeight);
@ -635,9 +650,15 @@ var _Draggable = class _Draggable {
if (parentWidth != 0)
parentScale = parentScaledWidth / parentWidth;
// Also adjust for the difference in the original actor width
// and the width it is now (children of uiGroup always get
// allocated their preferred size)
const childScaleX =
this._dragOrigWidth / this._dragActor.allocation.get_width();
x = parentX + parentScale * this._dragOrigX;
y = parentY + parentScale * this._dragOrigY;
scale = this._dragOrigScale * parentScale;
scale = this._dragOrigScale * parentScale * childScaleX;
} else {
// Snap back actor to its original stage position
x = this._snapBackX;
@ -718,7 +739,10 @@ var _Draggable = class _Draggable {
Main.uiGroup.remove_child(this._dragActor);
this._dragOrigParent.add_actor(this._dragActor);
dragActor.set_scale(this._dragOrigScale, this._dragOrigScale);
dragActor.set_position(this._dragOrigX, this._dragOrigY);
if (this._dragActorHadFixedPos)
dragActor.set_position(this._dragOrigX, this._dragOrigY);
else
dragActor.fixed_position_set = false;
} else {
dragActor.destroy();
}

View File

@ -285,6 +285,11 @@ function init() {
_easeActorProperty(this, 'value', target, params);
};
Clutter.Actor.prototype[Symbol.iterator] = function* () {
for (let c = this.get_first_child(); c; c = c.get_next_sibling())
yield c;
};
Clutter.Actor.prototype.toString = function () {
return St.describe_actor(this);
};
@ -357,6 +362,10 @@ function init() {
const Format = imports.format;
String.prototype.format = Format.format;
Math.clamp = function (x, lower, upper) {
return Math.min(Math.max(x, lower), upper);
};
}
// adjustAnimationTime:

View File

@ -238,7 +238,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
});
function init() {
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
_httpSession = new Soup.Session({ ssl_use_system_ca_file: true });
// See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context.
// _httpSession.add_feature(new Soup.ProxyResolverDefault());

View File

@ -26,6 +26,7 @@ var ExtensionManager = class {
this._updateNotified = false;
this._extensions = new Map();
this._unloadedExtensions = new Map();
this._enabledExtensions = [];
this._extensionOrder = [];
@ -102,18 +103,18 @@ var ExtensionManager = class {
}
}
if (extension.stylesheet) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.unload_stylesheet(extension.stylesheet);
delete extension.stylesheet;
}
try {
extension.stateObj.disable();
} catch (e) {
this.logExtensionError(uuid, e);
}
if (extension.stylesheet) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.unload_stylesheet(extension.stylesheet);
delete extension.stylesheet;
}
for (let i = 0; i < order.length; i++) {
let otherUuid = order[i];
try {
@ -259,7 +260,8 @@ var ExtensionManager = class {
if (!extension)
return;
let message = error.toString();
const message = error instanceof Error
? error.message : error.toString();
extension.error = message;
extension.state = ExtensionState.ERROR;
@ -268,6 +270,7 @@ var ExtensionManager = class {
extension.errors.push(message);
logError(error, 'Extension %s'.format(uuid));
this._updateCanChange(extension);
this.emit('extension-state-changed', extension);
}
@ -317,6 +320,14 @@ var ExtensionManager = class {
return extension;
}
_canLoad(extension) {
if (!this._unloadedExtensions.has(extension.uuid))
return true;
const version = this._unloadedExtensions.get(extension.uuid);
return extension.metadata.version === version;
}
loadExtension(extension) {
// Default to error, we set success as the last step
extension.state = ExtensionState.ERROR;
@ -325,6 +336,9 @@ var ExtensionManager = class {
if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
extension.state = ExtensionState.OUT_OF_DATE;
} else if (!this._canLoad(extension)) {
this.logExtensionError(extension.uuid, new Error(
'A different version was loaded previously. You need to log out for changes to take effect.'));
} else {
let enabled = this._enabledExtensions.includes(extension.uuid);
if (enabled) {
@ -335,6 +349,8 @@ var ExtensionManager = class {
} else {
extension.state = ExtensionState.INITIALIZED;
}
this._unloadedExtensions.delete(extension.uuid);
}
this._updateCanChange(extension);
@ -342,15 +358,22 @@ var ExtensionManager = class {
}
unloadExtension(extension) {
const { uuid, type } = extension;
// 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.
this._callExtensionDisable(extension.uuid);
this._callExtensionDisable(uuid);
extension.state = ExtensionState.UNINSTALLED;
this.emit('extension-state-changed', extension);
this._extensions.delete(extension.uuid);
// If we did install an importer, it is now cached and it's
// impossible to load a different version
if (type === ExtensionType.PER_USER && extension.imports)
this._unloadedExtensions.set(uuid, extension.metadata.version);
this._extensions.delete(uuid);
return true;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* exported InhibitShortcutsDialog */
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog;
@ -90,6 +90,8 @@ var InhibitShortcutsDialog = GObject.registerClass({
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
style_class: 'message-dialog-description',
});
restoreLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
restoreLabel.clutter_text.line_wrap = true;
content.add_child(restoreLabel);
}

View File

@ -61,7 +61,25 @@ class AspectContainer extends St.Widget {
this.queue_relayout();
}
vfunc_allocate(box, flags) {
vfunc_get_preferred_width(forHeight) {
let [min, nat] = super.vfunc_get_preferred_width(forHeight);
if (forHeight > 0)
nat = forHeight * this._ratio;
return [min, nat];
}
vfunc_get_preferred_height(forWidth) {
let [min, nat] = super.vfunc_get_preferred_height(forWidth);
if (forWidth > 0)
nat = forWidth / this._ratio;
return [min, nat];
}
vfunc_allocate(box) {
if (box.get_width() > 0 && box.get_height() > 0) {
let sizeRatio = box.get_width() / box.get_height();
@ -79,7 +97,7 @@ class AspectContainer extends St.Widget {
}
}
super.vfunc_allocate(box, flags);
super.vfunc_allocate(box);
}
});
@ -1608,7 +1626,9 @@ class Keyboard extends St.BoxLayout {
* we allow the OSK being smaller than 1/3rd of the monitor height
* there.
*/
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
const [, natHeight] = this.get_preferred_height(forWidth);
this.height = Math.min(maxHeight, natHeight);
}
}

View File

@ -246,7 +246,7 @@ var LayoutManager = GObject.registerClass({
vertical: true });
this.addChrome(this.panelBox, { affectsStruts: true,
trackFullscreen: true });
this.panelBox.connect('allocation-changed',
this.panelBox.connect('notify::allocation',
this._panelBoxChanged.bind(this));
this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup',
@ -1204,7 +1204,8 @@ class HotCorner extends Clutter.Actor {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
this._corner.set_position(this.width - this._corner.width, 0);
this.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
this.set_pivot_point(1.0, 0.0);
this.translation_x = -this.width;
} else {
this._corner.set_position(0, 0);
}

View File

@ -554,8 +554,8 @@ var Inspector = GObject.registerClass({
this._lookingGlass = lookingGlass;
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
if (!this._eventHandler)
return;
@ -570,7 +570,7 @@ var Inspector = GObject.registerClass({
childBox.x2 = childBox.x1 + natWidth;
childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2);
childBox.y2 = childBox.y1 + natHeight;
this._eventHandler.allocate(childBox, flags);
this._eventHandler.allocate(childBox);
}
_close() {
@ -802,6 +802,191 @@ var Extensions = GObject.registerClass({
}
});
var ActorLink = GObject.registerClass({
Signals: {
'inspect-actor': {},
},
}, class ActorLink extends St.Button {
_init(actor) {
this._arrow = new St.Icon({
icon_name: 'pan-end-symbolic',
icon_size: 8,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
});
const label = new St.Label({
text: actor.toString(),
x_align: Clutter.ActorAlign.START,
});
const inspectButton = new St.Button({
child: new St.Icon({
icon_name: 'insert-object-symbolic',
icon_size: 12,
y_align: Clutter.ActorAlign.CENTER,
}),
reactive: true,
x_expand: true,
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER,
});
inspectButton.connect('clicked', () => this.emit('inspect-actor'));
const box = new St.BoxLayout();
box.add_child(this._arrow);
box.add_child(label);
box.add_child(inspectButton);
super._init({
reactive: true,
track_hover: true,
toggle_mode: true,
style_class: 'actor-link',
child: box,
x_align: Clutter.ActorAlign.START,
});
this._actor = actor;
}
vfunc_clicked() {
this._arrow.ease({
rotation_angle_z: this.checked ? 90 : 0,
duration: 250,
});
}
});
var ActorTreeViewer = GObject.registerClass(
class ActorTreeViewer extends St.BoxLayout {
_init(lookingGlass) {
super._init();
this._lookingGlass = lookingGlass;
this._actorData = new Map();
}
_showActorChildren(actor) {
const data = this._actorData.get(actor);
if (!data || data.visible)
return;
data.visible = true;
data.actorAddedId = actor.connect('actor-added', (container, child) => {
this._addActor(data.children, child);
});
data.actorRemovedId = actor.connect('actor-removed', (container, child) => {
this._removeActor(child);
});
for (let child of actor)
this._addActor(data.children, child);
}
_hideActorChildren(actor) {
const data = this._actorData.get(actor);
if (!data || !data.visible)
return;
for (let child of actor)
this._removeActor(child);
data.visible = false;
if (data.actorAddedId > 0) {
actor.disconnect(data.actorAddedId);
data.actorAddedId = 0;
}
if (data.actorRemovedId > 0) {
actor.disconnect(data.actorRemovedId);
data.actorRemovedId = 0;
}
data.children.remove_all_children();
}
_addActor(container, actor) {
if (this._actorData.has(actor))
return;
if (actor === this._lookingGlass)
return;
const button = new ActorLink(actor);
button.connect('notify::checked', () => {
this._lookingGlass.setBorderPaintTarget(actor);
if (button.checked)
this._showActorChildren(actor);
else
this._hideActorChildren(actor);
});
button.connect('inspect-actor', () => {
this._lookingGlass.inspectObject(actor, button);
});
const mainContainer = new St.BoxLayout({ vertical: true });
const childrenContainer = new St.BoxLayout({
vertical: true,
style: 'padding: 0 0 0 18px',
});
mainContainer.add_child(button);
mainContainer.add_child(childrenContainer);
this._actorData.set(actor, {
button,
container: mainContainer,
children: childrenContainer,
visible: false,
actorAddedId: 0,
actorRemovedId: 0,
actorDestroyedId: actor.connect('destroy', () => this._removeActor(actor)),
});
let belowChild = null;
const nextSibling = actor.get_next_sibling();
if (nextSibling && this._actorData.has(nextSibling))
belowChild = this._actorData.get(nextSibling).container;
container.insert_child_above(mainContainer, belowChild);
}
_removeActor(actor) {
const data = this._actorData.get(actor);
if (!data)
return;
for (let child of actor)
this._removeActor(child);
if (data.actorAddedId > 0) {
actor.disconnect(data.actorAddedId);
data.actorAddedId = 0;
}
if (data.actorRemovedId > 0) {
actor.disconnect(data.actorRemovedId);
data.actorRemovedId = 0;
}
if (data.actorDestroyedId > 0) {
actor.disconnect(data.actorDestroyedId);
data.actorDestroyedId = 0;
}
data.container.destroy();
this._actorData.delete(actor);
}
vfunc_map() {
super.vfunc_map();
this._addActor(this, global.stage);
}
vfunc_unmap() {
super.vfunc_unmap();
this._removeActor(global.stage);
}
});
var LookingGlass = GObject.registerClass(
class LookingGlass extends St.BoxLayout {
_init() {
@ -833,9 +1018,9 @@ class LookingGlass extends St.BoxLayout {
Main.uiGroup.add_actor(this);
Main.uiGroup.set_child_below_sibling(this,
Main.layoutManager.panelBox);
Main.layoutManager.panelBox.connect('allocation-changed',
Main.layoutManager.panelBox.connect('notify::allocation',
this._queueResize.bind(this));
Main.layoutManager.keyboardBox.connect('allocation-changed',
Main.layoutManager.keyboardBox.connect('notify::allocation',
this._queueResize.bind(this));
this._objInspector = new ObjInspector(this);
@ -917,6 +1102,9 @@ class LookingGlass extends St.BoxLayout {
this._extensions = new Extensions(this);
notebook.appendPage('Extensions', this._extensions);
this._actorTreeViewer = new ActorTreeViewer(this);
notebook.appendPage('Actors', this._actorTreeViewer);
this._entry.clutter_text.connect('activate', (o, _e) => {
// Hide any completions we are currently showing
this._hideCompletions();

View File

@ -489,7 +489,10 @@ var Magnifier = class Magnifier {
_updateMouseSprite() {
this._updateSpriteTexture();
let [xHot, yHot] = this._cursorTracker.get_hot();
this._mouseSprite.set_anchor_point(xHot, yHot);
this._mouseSprite.set({
translation_x: -xHot,
translation_y: -yHot,
});
}
_updateSpriteTexture() {

View File

@ -4,7 +4,6 @@ const { Atk, Clutter, Gio, GLib,
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Calendar = imports.ui.calendar;
const Util = imports.misc.util;
var MESSAGE_ANIMATION_TIME = 100;
@ -285,12 +284,12 @@ var LabelExpanderLayout = GObject.registerClass({
return [min, nat];
}
vfunc_allocate(container, box, flags) {
vfunc_allocate(container, box) {
for (let i = 0; i < container.get_n_children(); i++) {
let child = container.get_child_at_index(i);
if (child.visible)
child.allocate(box, flags);
child.allocate(box);
}
}
@ -572,7 +571,6 @@ var MessageListSection = GObject.registerClass({
Main.sessionMode.disconnect(id);
});
this._date = new Date();
this._empty = true;
this._canClear = false;
this._sync();
@ -598,13 +596,6 @@ var MessageListSection = GObject.registerClass({
return true;
}
setDate(date) {
if (Calendar.sameDay(date, this._date))
return;
this._date = date;
this._sync();
}
addMessage(message, animate) {
this.addMessageAtIndex(message, -1, animate);
}

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported NotificationPolicy, NotificationGenericPolicy,
NotificationApplicationPolicy, Source, SourceActor, SourceActorWithLabel,
NotificationApplicationPolicy, Source, SourceActor,
SystemNotificationSource, MessageTray */
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
@ -162,6 +162,10 @@ var NotificationPolicy = GObject.registerClass({
this.run_dispose();
}
get enable() {
return true;
}
get enableSound() {
return true;
}
@ -651,77 +655,6 @@ class SourceActor extends St.Widget {
}
});
var SourceActorWithLabel = GObject.registerClass(
class SourceActorWithLabel extends SourceActor {
_init(source, size) {
super._init(source, size);
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this._counterBin = new St.Bin({ style_class: 'summary-source-counter',
child: this._counterLabel,
layout_manager: new Clutter.BinLayout() });
this._counterBin.hide();
this._counterBin.connect('style-changed', () => {
let themeNode = this._counterBin.get_theme_node();
this._counterBin.translation_x = themeNode.get_length('-shell-counter-overlap-x');
this._counterBin.translation_y = themeNode.get_length('-shell-counter-overlap-y');
});
this.add_actor(this._counterBin);
this._countUpdatedId = this._source.connect('notify::count', this._updateCount.bind(this));
this._updateCount();
this.connect('destroy', () => {
this._source.disconnect(this._countUpdatedId);
});
}
vfunc_allocate(box, flags) {
super.vfunc_allocate(box, flags);
let childBox = new Clutter.ActorBox();
let [, , naturalWidth, naturalHeight] = this._counterBin.get_preferred_size();
let direction = this.get_text_direction();
if (direction == Clutter.TextDirection.LTR) {
// allocate on the right in LTR
childBox.x1 = box.x2 - naturalWidth;
childBox.x2 = box.x2;
} else {
// allocate on the left in RTL
childBox.x1 = 0;
childBox.x2 = naturalWidth;
}
childBox.y1 = box.y2 - naturalHeight;
childBox.y2 = box.y2;
this._counterBin.allocate(childBox, flags);
}
_updateCount() {
if (this._actorDestroyed)
return;
this._counterBin.visible = this._source.countVisible;
let text;
if (this._source.count < 100)
text = this._source.count.toString();
else
text = String.fromCharCode(0x22EF); // midline horizontal ellipsis
this._counterLabel.set_text(text);
}
});
var Source = GObject.registerClass({
Properties: {
'count': GObject.ParamSpec.int(

View File

@ -2,7 +2,6 @@
const { Gio, GObject, Shell, St } = imports.gi;
const Signals = imports.signals;
const Calendar = imports.ui.calendar;
const Main = imports.ui.main;
const MessageList = imports.ui.messageList;
@ -173,6 +172,11 @@ var MprisPlayer = class MprisPlayer {
if (!this._mprisProxy.g_name_owner)
this._close();
});
// It is possible for the bus to disappear before the previous signal
// is connected, so we must ensure that the bus still exists at this
// point.
if (!this._mprisProxy.g_name_owner)
this._close();
}
_onPlayerProxyReady() {
@ -247,10 +251,6 @@ class MediaSection extends MessageList.MessageListSection {
this._onProxyReady.bind(this));
}
_shouldShow() {
return !this.empty && Calendar.isToday(this._date);
}
get allowed() {
return !Main.sessionMode.isGreeter;
}

View File

@ -10,13 +10,6 @@ const Params = imports.misc.params;
const { loadInterfaceXML } = imports.misc.fileUtils;
// Should really be defined in Gio.js
const BusIface = loadInterfaceXML('org.freedesktop.DBus');
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
function Bus() {
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
}
const FdoNotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
var NotificationClosedReason = {
@ -49,9 +42,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this._sources = [];
this._senderToPid = {};
this._notifications = {};
this._busProxy = new Bus();
this._nextNotificationId = 1;
@ -116,12 +107,9 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
//
// If no existing source is found, a new source is created as long as
// pid is provided.
//
// Either a pid or ndata.notification is needed to retrieve or
// create a source.
_getSource(title, pid, ndata, sender) {
if (!pid && !(ndata && ndata.notification))
return null;
throw new Error('Either a pid or ndata.notification is needed');
// We use notification's source for the notifications we still have
// around that are getting replaced because we don't keep sources
@ -218,42 +206,10 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
this._notifications[id] = ndata;
let sender = invocation.get_sender();
let pid = this._senderToPid[sender];
let pid = hints['sender-pid'];
let source = this._getSource(appName, pid, ndata, sender, null);
if (source) {
this._notifyForSource(source, ndata);
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
if (replacesId) {
// There's already a pending call to GetConnectionUnixProcessID,
// which will see the new notification data when it finishes,
// so we don't have to do anything.
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
// The app may have updated or removed the notification
ndata = this._notifications[id];
if (!ndata)
return;
if (excp) {
logError(excp, 'Call to GetConnectionUnixProcessID failed');
return;
}
[pid] = result;
source = this._getSource(appName, pid, ndata, sender, null);
this._senderToPid[sender] = pid;
source.connect('destroy', () => {
delete this._senderToPid[sender];
});
this._notifyForSource(source, ndata);
});
this._notifyForSource(source, ndata);
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
@ -417,12 +373,11 @@ var FdoNotificationDaemonSource = GObject.registerClass(
class FdoNotificationDaemonSource extends MessageTray.Source {
_init(title, pid, sender, appId) {
this.pid = pid;
this.initialTitle = title;
this.app = this._getApp(appId);
super._init(title);
this.initialTitle = title;
if (this.app)
this.title = this.app.get_name();
else
@ -470,19 +425,20 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
}
_getApp(appId) {
const appSys = Shell.AppSystem.get_default();
let app;
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
if (app != null)
return app;
if (appId) {
app = Shell.AppSystem.get_default().lookup_app('%s.desktop'.format(appId));
if (app != null)
return app;
}
if (appId)
app = appSys.lookup_app('%s.desktop'.format(appId));
return null;
if (!app)
app = appSys.lookup_app('%s.desktop'.format(this.initialTitle));
return app;
}
setTitle(title) {

View File

@ -4,6 +4,10 @@
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
const Signals = imports.signals;
// Time for initial animation going into Overview mode;
// this is defined here to make it available in imports.
var ANIMATION_TIME = 250;
const Background = imports.ui.background;
const DND = imports.ui.dnd;
const LayoutManager = imports.ui.layout;
@ -14,9 +18,6 @@ const OverviewControls = imports.ui.overviewControls;
const Params = imports.misc.params;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
// Time for initial animation going into Overview mode
var ANIMATION_TIME = 250;
// Must be less than ANIMATION_TIME, since we switch to
// or from the overview completely after ANIMATION_TIME,
// and don't want the shading animation to get cut off
@ -244,11 +245,11 @@ var Overview = class {
_unshadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
backgrounds[i].ease_property('brightness', 1.0, {
backgrounds[i].ease_property('@content.brightness', 1.0, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('vignette-sharpness', 0.0, {
backgrounds[i].ease_property('@content.vignette-sharpness', 0.0, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
@ -258,14 +259,16 @@ var Overview = class {
_shadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
backgrounds[i].ease_property('brightness', Lightbox.VIGNETTE_BRIGHTNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('vignette-sharpness', Lightbox.VIGNETTE_SHARPNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('@content.brightness',
Lightbox.VIGNETTE_BRIGHTNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('@content.vignette-sharpness',
Lightbox.VIGNETTE_SHARPNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
}
@ -437,19 +440,19 @@ var Overview = class {
this.emit('windows-restacked', stackIndices);
}
beginItemDrag(_source) {
this.emit('item-drag-begin');
beginItemDrag(source) {
this.emit('item-drag-begin', source);
this._inItemDrag = true;
}
cancelledItemDrag(_source) {
this.emit('item-drag-cancelled');
cancelledItemDrag(source) {
this.emit('item-drag-cancelled', source);
}
endItemDrag(_source) {
endItemDrag(source) {
if (!this._inItemDrag)
return;
this.emit('item-drag-end');
this.emit('item-drag-end', source);
this._inItemDrag = false;
}
@ -575,7 +578,7 @@ var Overview = class {
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_display(global.display);
this.viewSelector.show();
this.viewSelector.animateToOverview();
this._overview.opacity = 0;
this._overview.ease({

View File

@ -8,8 +8,9 @@ const Main = imports.ui.main;
const Params = imports.misc.params;
const ViewSelector = imports.ui.viewSelector;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
const Overview = imports.ui.overview;
var SIDE_CONTROLS_ANIMATION_TIME = 160;
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
function getRtlSlideDirection(direction, actor) {
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
@ -51,7 +52,7 @@ var SlideLayout = GObject.registerClass({
return [minWidth, natWidth];
}
vfunc_allocate(container, box, flags) {
vfunc_allocate(container, box) {
let child = container.get_first_child();
let availWidth = Math.round(box.x2 - box.x1);
@ -72,7 +73,7 @@ var SlideLayout = GObject.registerClass({
actorBox.y1 = box.y1;
actorBox.y2 = actorBox.y1 + availHeight;
child.allocate(actorBox, flags);
child.allocate(actorBox);
}
// eslint-disable-next-line camelcase
@ -394,10 +395,10 @@ class DashSpacer extends St.Widget {
});
var ControlsLayout = GObject.registerClass({
Signals: { 'allocation-changed': { flags: GObject.SignalFlags.RUN_LAST } },
Signals: { 'allocation-changed': {} },
}, class ControlsLayout extends Clutter.BinLayout {
vfunc_allocate(container, box, flags) {
super.vfunc_allocate(container, box, flags);
vfunc_allocate(container, box) {
super.vfunc_allocate(container, box);
this.emit('allocation-changed');
}
});
@ -422,6 +423,7 @@ class ControlsManager extends St.Widget {
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
this._workspaceAdjustment = new St.Adjustment({
actor: this,
value: activeWorkspaceIndex,
lower: 0,
page_increment: 1,
@ -453,8 +455,6 @@ class ControlsManager extends St.Widget {
this._group.add_child(this.viewSelector);
this._group.add_actor(this._thumbnailsSlider);
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
@ -477,26 +477,6 @@ class ControlsManager extends St.Widget {
this._workspaceAdjustment.value = activeIndex;
}
_updateWorkspacesGeometry() {
let [x, y] = this.get_transformed_position();
let [width, height] = this.get_transformed_size();
let geometry = { x, y, width, height };
let spacing = this.get_theme_node().get_length('spacing');
let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
geometry.width -= dashWidth;
geometry.width -= thumbnailsWidth;
if (this.get_text_direction() == Clutter.TextDirection.LTR)
geometry.x += dashWidth;
else
geometry.x += thumbnailsWidth;
this.viewSelector.setWorkspacesFullGeometry(geometry);
}
_setVisibility() {
// Ignore the case when we're leaving the overview, since
// actors will be made visible again when entering the overview

View File

@ -2,7 +2,7 @@
/* exported PadOsd, PadOsdService */
const { Atk, Clutter, GDesktopEnums, Gio,
GLib, GObject, Gtk, Meta, Rsvg, St } = imports.gi;
GLib, GObject, Gtk, Meta, Pango, Rsvg, St } = imports.gi;
const Signals = imports.signals;
const Main = imports.ui.main;
@ -329,6 +329,7 @@ var PadDiagram = GObject.registerClass({
this._imagePath = imagePath;
this._handle = this._composeStyledDiagram();
this._initLabels();
}
// eslint-disable-next-line camelcase
@ -343,6 +344,26 @@ var PadDiagram = GObject.registerClass({
this.add_actor(actor);
}
_initLabels() {
let i = 0;
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.BUTTON, i))
break;
}
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.RING, i, CW) ||
!this._addLabel(Meta.PadActionType.RING, i, CCW))
break;
}
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.STRIP, i, UP) ||
!this._addLabel(Meta.PadActionType.STRIP, i, DOWN))
break;
}
}
_wrappingSvgHeader() {
return '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
@ -362,10 +383,8 @@ var PadDiagram = GObject.registerClass({
for (let i = 0; i < this._activeButtons.length; i++) {
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
css += '.%s {'.format(ch);
css += ' stroke: %s !important;'.format(ACTIVE_COLOR);
css += ' fill: %s !important;'.format(ACTIVE_COLOR);
css += '}';
css += '.%s.Leader { stroke: %s !important; }'.format(ch, ACTIVE_COLOR);
css += '.%s.Button { stroke: %s !important; fill: %s !important; }'.format(ch, ACTIVE_COLOR, ACTIVE_COLOR);
}
return css;
@ -390,9 +409,6 @@ var PadDiagram = GObject.registerClass({
}
_updateDiagramScale() {
if (this._handle == null)
return;
[this._actorWidth, this._actorHeight] = this.get_size();
let dimensions = this._handle.get_dimensions();
let scaleX = this._actorWidth / dimensions.width;
@ -405,6 +421,11 @@ var PadDiagram = GObject.registerClass({
let [, natWidth] = child.get_preferred_width(natHeight);
let childBox = new Clutter.ActorBox();
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
if (direction == LTR) {
childBox.x1 = x;
childBox.x2 = x + natWidth;
@ -415,22 +436,23 @@ var PadDiagram = GObject.registerClass({
childBox.y1 = y - natHeight / 2;
childBox.y2 = y + natHeight / 2;
child.allocate(childBox, 0);
child.allocate(childBox);
}
vfunc_allocate(box, flags) {
super.vfunc_allocate(box, flags);
vfunc_allocate(box) {
super.vfunc_allocate(box);
if (this._handle === null)
return;
this._updateDiagramScale();
for (let i = 0; i < this._labels.length; i++) {
let [label, action, idx, dir] = this._labels[i];
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
const { label, x, y, arrangement } = this._labels[i];
this._allocateChild(label, x, y, arrangement);
}
if (this._editorActor && this._curEdited) {
let [label_, action, idx, dir] = this._curEdited;
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
const { x, y, arrangement } = this._curEdited;
this._allocateChild(this._editorActor, x, y, arrangement);
}
}
@ -457,17 +479,6 @@ var PadDiagram = GObject.registerClass({
cr.$dispose();
}
_transformPoint(x, y) {
if (this._handle == null || this._scale == null)
return [x, y];
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
return [Math.round(x), Math.round(y)];
}
_getItemLabelCoords(labelName, leaderName) {
if (this._handle == null)
return [false];
@ -495,44 +506,39 @@ var PadDiagram = GObject.registerClass({
pos.y = this._imageHeight - pos.y;
}
let [x, y] = this._transformPoint(pos.x, pos.y);
return [true, x, y, direction];
return [true, pos.x, pos.y, direction];
}
getButtonLabelCoords(button) {
_getButtonLabels(button) {
let ch = String.fromCharCode('A'.charCodeAt() + button);
let labelName = 'Label%s'.format(ch);
let leaderName = 'Leader%s'.format(ch);
return this._getItemLabelCoords(labelName, leaderName);
return [labelName, leaderName];
}
getRingLabelCoords(number, dir) {
_getRingLabels(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == CW ? 'CW' : 'CCW';
let labelName = 'LabelRing%s%s'.format(numStr, dirStr);
let leaderName = 'LeaderRing%s%s'.format(numStr, dirStr);
return this._getItemLabelCoords(labelName, leaderName);
return [labelName, leaderName];
}
getStripLabelCoords(number, dir) {
_getStripLabels(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == UP ? 'Up' : 'Down';
let labelName = 'LabelStrip%s%s'.format(numStr, dirStr);
let leaderName = 'LeaderStrip%s%s'.format(numStr, dirStr);
return this._getItemLabelCoords(labelName, leaderName);
return [labelName, leaderName];
}
getLabelCoords(action, idx, dir) {
_getLabelCoords(action, idx, dir) {
if (action == Meta.PadActionType.BUTTON)
return this.getButtonLabelCoords(idx);
return this._getItemLabelCoords(...this._getButtonLabels(idx));
else if (action == Meta.PadActionType.RING)
return this.getRingLabelCoords(idx, dir);
return this._getItemLabelCoords(...this._getRingLabels(idx, dir));
else if (action == Meta.PadActionType.STRIP)
return this.getStripLabelCoords(idx, dir);
return this._getItemLabelCoords(...this._getStripLabels(idx, dir));
return [false];
}
@ -557,26 +563,30 @@ var PadDiagram = GObject.registerClass({
this._invalidateSvg();
}
addLabel(label, type, idx, dir) {
this._labels.push([label, type, idx, dir]);
_addLabel(action, idx, dir) {
let [found, x, y, arrangement] = this._getLabelCoords(action, idx, dir);
if (!found)
return false;
let label = new St.Label();
this._labels.push({ label, action, idx, dir, x, y, arrangement });
this.add_actor(label);
return true;
}
updateLabels(getText) {
for (let i = 0; i < this._labels.length; i++) {
let [label, action, idx, dir] = this._labels[i];
const { label, action, idx, dir } = this._labels[i];
let str = getText(action, idx, dir);
label.set_text(str);
}
this.queue_relayout();
}
_applyLabel(label, action, idx, dir, str) {
if (str != null) {
if (str !== null)
label.set_text(str);
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show();
}
@ -584,18 +594,20 @@ var PadDiagram = GObject.registerClass({
this._editorActor.hide();
if (this._prevEdited) {
let [label, action, idx, dir] = this._prevEdited;
const { label, action, idx, dir } = this._prevEdited;
this._applyLabel(label, action, idx, dir, str);
this._prevEdited = null;
}
if (this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
const { label, action, idx, dir } = this._curEdited;
this._applyLabel(label, action, idx, dir, str);
if (continues)
this._prevEdited = this._curEdited;
this._curEdited = null;
}
this.queue_relayout();
}
startEdition(action, idx, dir) {
@ -605,21 +617,19 @@ var PadDiagram = GObject.registerClass({
return;
for (let i = 0; i < this._labels.length; i++) {
let [label, itemAction, itemIdx, itemDir] = this._labels[i];
if (action == itemAction && idx == itemIdx && dir == itemDir) {
if (action == this._labels[i].action &&
idx == this._labels[i].idx && dir == this._labels[i].dir) {
this._curEdited = this._labels[i];
editedLabel = label;
editedLabel = this._curEdited.label;
break;
}
}
if (this._curEdited == null)
return;
let [found] = this.getLabelCoords(action, idx, dir);
if (!found)
return;
this._editorActor.show();
editedLabel.hide();
this.queue_relayout();
}
});
@ -693,6 +703,7 @@ var PadOsd = GObject.registerClass({
this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;',
x_align: Clutter.ActorAlign.CENTER });
this._titleLabel.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE);
this._titleLabel.clutter_text.set_text(padDevice.get_device_name());
labelBox.add_actor(this._titleLabel);
@ -710,31 +721,7 @@ var PadOsd = GObject.registerClass({
x_expand: true,
y_expand: true });
this.add_actor(this._padDiagram);
// FIXME: Fix num buttons.
let i = 0;
for (i = 0; i < 50; i++) {
let [found] = this._padDiagram.getButtonLabelCoords(i);
if (!found)
break;
this._createLabel(Meta.PadActionType.BUTTON, i);
}
for (i = 0; i < padDevice.get_n_rings(); i++) {
let [found] = this._padDiagram.getRingLabelCoords(i, CW);
if (!found)
break;
this._createLabel(Meta.PadActionType.RING, i, CW);
this._createLabel(Meta.PadActionType.RING, i, CCW);
}
for (i = 0; i < padDevice.get_n_strips(); i++) {
let [found] = this._padDiagram.getStripLabelCoords(i, UP);
if (!found)
break;
this._createLabel(Meta.PadActionType.STRIP, i, UP);
this._createLabel(Meta.PadActionType.STRIP, i, DOWN);
}
this._updateActionLabels();
let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true,
@ -787,11 +774,6 @@ var PadOsd = GObject.registerClass({
return str ? str : _("None");
}
_createLabel(type, number, dir) {
let label = new St.Label({ text: this._getActionText(type, number) });
this._padDiagram.addLabel(label, type, number, dir);
}
_updateActionLabels() {
this._padDiagram.updateLabels(this._getActionText.bind(this));
}
@ -867,8 +849,7 @@ var PadOsd = GObject.registerClass({
this._tipLabel.set_text(_("Press any key to exit"));
}
this._titleLabel.clutter_text.set_markup(
'<span size="larger"><b>%s</b></span>'.format(title));
this._titleLabel.set_text(title);
}
_isEditedAction(type, number, dir) {

View File

@ -120,6 +120,10 @@ var PageIndicators = GObject.registerClass({
for (let i = 0; i < children.length; i++)
this._updateIndicator(children[i], i);
}
get nPages() {
return this._nPages;
}
});
var AnimatedPageIndicators = GObject.registerClass(

View File

@ -214,7 +214,10 @@ var AppMenuButton = GObject.registerClass({
this._onIconThemeChanged.bind(this));
let iconEffect = new Clutter.DesaturateEffect();
this._iconBox = new St.Bin({ style_class: 'app-menu-icon' });
this._iconBox = new St.Bin({
style_class: 'app-menu-icon',
y_align: Clutter.ActorAlign.CENTER,
});
this._iconBox.add_effect(iconEffect);
this._container.add_actor(this._iconBox);
@ -672,7 +675,7 @@ class PanelCorner extends St.DrawingArea {
let borderWidth = node.get_length('-panel-corner-border-width');
this.set_size(cornerRadius, borderWidth + cornerRadius);
this.set_anchor_point(0, borderWidth);
this.translation_y = -borderWidth;
}
});
@ -839,8 +842,8 @@ class Panel extends St.Widget {
return [0, 0];
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let allocWidth = box.x2 - box.x1;
let allocHeight = box.y2 - box.y1;
@ -876,13 +879,13 @@ class Panel extends St.Widget {
childBox.x2 = Math.min(Math.floor(sideWidth),
leftNaturalWidth);
}
this._leftBox.allocate(childBox, flags);
this._leftBox.allocate(childBox);
childBox.x1 = Math.ceil(sideWidth);
childBox.y1 = 0;
childBox.x2 = childBox.x1 + centerWidth;
childBox.y2 = allocHeight;
this._centerBox.allocate(childBox, flags);
this._centerBox.allocate(childBox);
childBox.y1 = 0;
childBox.y2 = allocHeight;
@ -896,7 +899,7 @@ class Panel extends St.Widget {
0);
childBox.x2 = allocWidth;
}
this._rightBox.allocate(childBox, flags);
this._rightBox.allocate(childBox);
let cornerWidth, cornerHeight;
@ -906,7 +909,7 @@ class Panel extends St.Widget {
childBox.x2 = cornerWidth;
childBox.y1 = allocHeight;
childBox.y2 = allocHeight + cornerHeight;
this._leftCorner.allocate(childBox, flags);
this._leftCorner.allocate(childBox);
[, cornerWidth] = this._rightCorner.get_preferred_width(-1);
[, cornerHeight] = this._rightCorner.get_preferred_height(-1);
@ -914,7 +917,7 @@ class Panel extends St.Widget {
childBox.x2 = allocWidth;
childBox.y1 = allocHeight;
childBox.y2 = allocHeight + cornerHeight;
this._rightCorner.allocate(childBox, flags);
this._rightCorner.allocate(childBox);
}
_tryDragWindow(event) {

View File

@ -59,8 +59,8 @@ class ButtonBox extends St.Widget {
return [0, 0];
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let child = this.get_first_child();
if (!child)
@ -83,7 +83,7 @@ class ButtonBox extends St.Widget {
childBox.y1 = 0;
childBox.y2 = availHeight;
child.allocate(childBox, flags);
child.allocate(childBox);
}
_onDestroy() {

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported ScreenshotService */
const { Clutter, Graphene, Gio, GObject, GLib, Meta, Shell, St } = imports.gi;
const { Clutter, Gio, GObject, GLib, Meta, Shell, St } = imports.gi;
const GrabHelper = imports.ui.grabHelper;
const Lightbox = imports.ui.lightbox;
@ -37,7 +37,9 @@ var ScreenshotService = class {
let sender = invocation.get_sender();
if (this._screenShooter.has(sender) || lockedDown) {
invocation.return_value(GLib.Variant.new('(bs)', [false, '']));
invocation.return_error_literal(
Gio.IOErrorEnum, Gio.IOErrorEnum.BUSY,
'There is an ongoing operation for this sender');
return null;
}
@ -259,15 +261,13 @@ var ScreenshotService = class {
}
async PickColorAsync(params, invocation) {
let pickPixel = new PickPixel();
const screenshot = this._createScreenshot(invocation, false);
if (!screenshot)
return;
const pickPixel = new PickPixel(screenshot);
try {
const coords = await pickPixel.pickAsync();
let screenshot = this._createScreenshot(invocation, false);
if (!screenshot)
return;
const [color] = await screenshot.pick_color(coords.x, coords.y);
const color = await pickPixel.pickAsync();
const { red, green, blue } = color;
const retval = GLib.Variant.new('(a{sv})', [{
color: GLib.Variant.new('(ddd)', [
@ -276,12 +276,13 @@ var ScreenshotService = class {
blue / 255.0,
]),
}]);
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(retval);
} catch (e) {
invocation.return_error_literal(
Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
'Operation was cancelled');
} finally {
this._removeShooterForSender(invocation.get_sender());
}
}
};
@ -379,12 +380,145 @@ class SelectArea extends St.Widget {
}
});
var RecolorEffect = GObject.registerClass({
Properties: {
color: GObject.ParamSpec.boxed(
'color', 'color', 'replacement color',
GObject.ParamFlags.WRITABLE,
Clutter.Color.$gtype),
chroma: GObject.ParamSpec.boxed(
'chroma', 'chroma', 'color to replace',
GObject.ParamFlags.WRITABLE,
Clutter.Color.$gtype),
threshold: GObject.ParamSpec.float(
'threshold', 'threshold', 'threshold',
GObject.ParamFlags.WRITABLE,
0.0, 1.0, 0.0),
smoothing: GObject.ParamSpec.float(
'smoothing', 'smoothing', 'smoothing',
GObject.ParamFlags.WRITABLE,
0.0, 1.0, 0.0),
},
}, class RecolorEffect extends Shell.GLSLEffect {
_init(params) {
this._color = new Clutter.Color();
this._chroma = new Clutter.Color();
this._threshold = 0;
this._smoothing = 0;
this._colorLocation = null;
this._chromaLocation = null;
this._thresholdLocation = null;
this._smoothingLocation = null;
super._init(params);
this._colorLocation = this.get_uniform_location('recolor_color');
this._chromaLocation = this.get_uniform_location('chroma_color');
this._thresholdLocation = this.get_uniform_location('threshold');
this._smoothingLocation = this.get_uniform_location('smoothing');
this._updateColorUniform(this._colorLocation, this._color);
this._updateColorUniform(this._chromaLocation, this._chroma);
this._updateFloatUniform(this._thresholdLocation, this._threshold);
this._updateFloatUniform(this._smoothingLocation, this._smoothing);
}
_updateColorUniform(location, color) {
if (!location)
return;
this.set_uniform_float(location,
3, [color.red / 255, color.green / 255, color.blue / 255]);
this.queue_repaint();
}
_updateFloatUniform(location, value) {
if (!location)
return;
this.set_uniform_float(location, 1, [value]);
this.queue_repaint();
}
set color(c) {
if (this._color.equal(c))
return;
this._color = c;
this.notify('color');
this._updateColorUniform(this._colorLocation, this._color);
}
set chroma(c) {
if (this._chroma.equal(c))
return;
this._chroma = c;
this.notify('chroma');
this._updateColorUniform(this._chromaLocation, this._chroma);
}
set threshold(value) {
if (this._threshold === value)
return;
this._threshold = value;
this.notify('threshold');
this._updateFloatUniform(this._thresholdLocation, this._threshold);
}
set smoothing(value) {
if (this._smoothing === value)
return;
this._smoothing = value;
this.notify('smoothing');
this._updateFloatUniform(this._smoothingLocation, this._smoothing);
}
vfunc_build_pipeline() {
// Conversion parameters from https://en.wikipedia.org/wiki/YCbCr
const decl = `
vec3 rgb2yCrCb(vec3 c) { \n
float y = 0.299 * c.r + 0.587 * c.g + 0.114 * c.b; \n
float cr = 0.7133 * (c.r - y); \n
float cb = 0.5643 * (c.b - y); \n
return vec3(y, cr, cb); \n
} \n
\n
uniform vec3 chroma_color; \n
uniform vec3 recolor_color; \n
uniform float threshold; \n
uniform float smoothing; \n`;
const src = `
vec3 mask = rgb2yCrCb(chroma_color.rgb); \n
vec3 yCrCb = rgb2yCrCb(cogl_color_out.rgb); \n
float blend = \n
smoothstep(threshold, \n
threshold + smoothing, \n
distance(yCrCb.gb, mask.gb)); \n
cogl_color_out.rgb = \n
mix(recolor_color, cogl_color_out.rgb, blend); \n`;
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, decl, src, false);
}
});
var PickPixel = GObject.registerClass(
class PickPixel extends St.Widget {
_init() {
_init(screenshot) {
super._init({ visible: false, reactive: true });
this._screenshot = screenshot;
this._result = null;
this._color = null;
this._inPick = false;
Main.uiGroup.add_actor(this);
@ -393,16 +527,44 @@ class PickPixel extends St.Widget {
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL });
this.add_constraint(constraint);
const action = new Clutter.ClickAction();
action.connect('clicked', async () => {
await this._pickColor(...action.get_coords());
this._result = this._color;
this._grabHelper.ungrab();
});
this.add_action(action);
this._recolorEffect = new RecolorEffect({
chroma: new Clutter.Color({
red: 80,
green: 219,
blue: 181,
}),
threshold: 0.04,
smoothing: 0.07,
});
this._previewCursor = new St.Icon({
icon_name: 'color-pick',
icon_size: Meta.prefs_get_cursor_size(),
effect: this._recolorEffect,
visible: false,
});
Main.uiGroup.add_actor(this._previewCursor);
}
async pickAsync() {
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
global.display.set_cursor(Meta.Cursor.BLANK);
Main.uiGroup.set_child_above_sibling(this, null);
this.show();
this._pickColor(...global.get_pointer());
await this._grabHelper.grabAsync({ actor: this });
global.display.set_cursor(Meta.Cursor.DEFAULT);
this._previewCursor.destroy();
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.destroy();
@ -412,10 +574,25 @@ class PickPixel extends St.Widget {
return this._result;
}
vfunc_button_release_event(buttonEvent) {
let { x, y } = buttonEvent;
this._result = new Graphene.Point({ x, y });
this._grabHelper.ungrab();
async _pickColor(x, y) {
if (this._inPick)
return;
this._inPick = true;
this._previewCursor.set_position(x, y);
[this._color] = await this._screenshot.pick_color(x, y);
this._inPick = false;
if (!this._color)
return;
this._recolorEffect.color = this._color;
this._previewCursor.show();
}
vfunc_motion_event(motionEvent) {
const { x, y } = motionEvent;
this._pickColor(x, y);
return Clutter.EVENT_PROPAGATE;
}
});

View File

@ -13,11 +13,10 @@ const Util = imports.misc.util;
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
var MAX_LIST_SEARCH_RESULTS_ROWS = 5;
var MAX_GRID_SEARCH_RESULTS_ROWS = 1;
var MaxWidthBox = GObject.registerClass(
class MaxWidthBox extends St.BoxLayout {
vfunc_allocate(box, flags) {
vfunc_allocate(box) {
let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width();
let availWidth = box.x2 - box.x1;
@ -29,7 +28,7 @@ class MaxWidthBox extends St.BoxLayout {
adjustedBox.x2 -= Math.floor(excessWidth / 2);
}
super.vfunc_allocate(adjustedBox, flags);
super.vfunc_allocate(adjustedBox);
}
});
@ -349,18 +348,140 @@ class ListSearchResults extends SearchResultsBase {
}
});
var GridSearchResultsLayout = GObject.registerClass({
Properties: {
'spacing': GObject.ParamSpec.int('spacing', 'Spacing', 'Spacing',
GObject.ParamFlags.READWRITE, 0, GLib.MAXINT32, 0),
},
}, class GridSearchResultsLayout extends Clutter.LayoutManager {
_init() {
super._init();
this._spacing = 0;
}
vfunc_set_container(container) {
this._container = container;
}
vfunc_get_preferred_width(container, forHeight) {
let minWidth = 0;
let natWidth = 0;
let first = true;
for (let child of container) {
if (!child.visible)
continue;
const [childMinWidth, childNatWidth] = child.get_preferred_width(forHeight);
minWidth = Math.max(minWidth, childMinWidth);
natWidth += childNatWidth;
if (first)
first = false;
else
natWidth += this._spacing;
}
return [minWidth, natWidth];
}
vfunc_get_preferred_height(container, forWidth) {
let minHeight = 0;
let natHeight = 0;
for (let child of container) {
if (!child.visible)
continue;
const [childMinHeight, childNatHeight] = child.get_preferred_height(forWidth);
minHeight = Math.max(minHeight, childMinHeight);
natHeight = Math.max(natHeight, childNatHeight);
}
return [minHeight, natHeight];
}
vfunc_allocate(container, box) {
const width = box.get_width();
const childBox = new Clutter.ActorBox();
childBox.x1 = 0;
childBox.y1 = 0;
let first = true;
for (let child of container) {
if (!child.visible)
continue;
if (first)
first = false;
else
childBox.x1 += this._spacing;
const [childWidth] = child.get_preferred_width(-1);
const [childHeight] = child.get_preferred_height(-1);
childBox.set_size(childWidth, childHeight);
if (childBox.x1 + childWidth > width)
return;
child.allocate(childBox);
childBox.x1 += childWidth;
}
}
columnsForWidth(width) {
if (!this._container)
return -1;
const [minWidth] = this.get_preferred_width(this._container, -1);
if (minWidth === 0)
return -1;
let nCols = 0;
while (width > minWidth) {
width -= minWidth;
if (nCols > 0)
width -= this._spacing;
nCols++;
}
return nCols;
}
get spacing() {
return this._spacing;
}
set spacing(v) {
if (this._spacing === v)
return;
this._spacing = v;
this.layout_changed();
}
});
var GridSearchResults = GObject.registerClass(
class GridSearchResults extends SearchResultsBase {
_init(provider, resultsView) {
super._init(provider, resultsView);
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
this._grid = new St.Widget({ style_class: 'grid-search-results' });
this._grid.layout_manager = new GridSearchResultsLayout();
this._bin = new St.Bin({ x_align: Clutter.ActorAlign.CENTER });
this._bin.set_child(this._grid);
this._grid.connect('style-changed', () => {
const node = this._grid.get_theme_node();
this._grid.layout_manager.spacing = node.get_length('spacing');
});
this._resultDisplayBin.set_child(this._bin);
this._resultDisplayBin.set_child(new St.Bin({
child: this._grid,
x_align: Clutter.ActorAlign.CENTER,
}));
}
_onDestroy() {
@ -400,12 +521,11 @@ class GridSearchResults extends SearchResultsBase {
if (width == 0)
return -1;
let nCols = this._grid.columnsForWidth(width);
return nCols * this._grid.getRowLimit();
return this._grid.layout_manager.columnsForWidth(width);
}
_clearResultDisplay() {
this._grid.removeAll();
this._grid.remove_all_children();
}
_createResultDisplay(meta) {
@ -414,14 +534,15 @@ class GridSearchResults extends SearchResultsBase {
}
_addItem(display) {
this._grid.addItem(display);
this._grid.add_child(display);
}
getFirstResult() {
if (this._grid.visibleItemsCount() > 0)
return this._grid.getItemAtIndex(0);
else
return null;
for (let child of this._grid) {
if (child.visible)
return child;
}
return null;
}
});

View File

@ -48,7 +48,9 @@ class Indicator extends PanelMenu.SystemIndicator {
this._item.connect('key-press-event', (actor, event) => {
return this._slider.emit('key-press-event', event);
});
this._item.connect('scroll-event', (actor, event) => {
return this._slider.emit('scroll-event', event);
});
}
_sliderChanged() {

View File

@ -805,8 +805,8 @@ class InputSourceIndicatorContainer extends St.Widget {
}, [0, 0]);
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
// translate box to (0, 0)
box.x2 -= box.x1;
@ -815,7 +815,7 @@ class InputSourceIndicatorContainer extends St.Widget {
box.y1 = 0;
this.get_children().forEach(c => {
c.allocate_align_fill(box, 0.5, 0.5, false, false, flags);
c.allocate_align_fill(box, 0.5, 0.5, false, false);
});
}
});

View File

@ -225,10 +225,6 @@ class Indicator extends PanelMenu.SystemIndicator {
}
});
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
var AppAuthorizer = class {
constructor(desktopId, reqAccuracyLevel, permStoreProxy, maxAccuracyLevel) {
this.desktopId = desktopId;
@ -313,9 +309,8 @@ var AppAuthorizer = class {
_completeAuth() {
if (this._accuracyLevel != GeoclueAccuracyLevel.NONE) {
this._accuracyLevel = clamp(this._accuracyLevel,
0,
this._maxAccuracyLevel);
this._accuracyLevel = Math.clamp(this._accuracyLevel,
0, this._maxAccuracyLevel);
}
this._saveToPermissionStore();

View File

@ -112,12 +112,12 @@ class Indicator extends PanelMenu.SystemIndicator {
let chargingState = this._proxy.State == UPower.DeviceState.CHARGING
? '-charging' : '';
let fillLevel = 10 * Math.floor(this._proxy.Percentage / 10);
let icon;
if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED ||
fillLevel === 100)
icon = 'battery-level-100-charged-symbolic';
else
icon = 'battery-level-%d%s-symbolic'.format(fillLevel, chargingState);
const charged =
this._proxy.State === UPower.DeviceState.FULLY_CHARGED ||
(this._proxy.State === UPower.DeviceState.CHARGING && fillLevel === 100);
const icon = charged
? 'battery-level-100-charged-symbolic'
: 'battery-level-%d%s-symbolic'.format(fillLevel, chargingState);
// Make sure we fall back to fallback-icon-name and not GThemedIcon's
// default fallbacks
@ -139,7 +139,7 @@ class Indicator extends PanelMenu.SystemIndicator {
label = _("%d\u2009%%").format(100);
else
label = _("%d\u2009%%").format(this._proxy.Percentage);
this._percentageLabel.clutter_text.set_markup('<span size="smaller">' + label + '</span>');
this._percentageLabel.text = label;
// The status label
this._item.label.text = this._getStatus();

View File

@ -56,9 +56,13 @@ var StreamSlider = class {
this.item.connect('key-press-event', (actor, event) => {
return this._slider.emit('key-press-event', event);
});
this.item.connect('scroll-event', (actor, event) => {
return this._slider.emit('scroll-event', event);
});
this._stream = null;
this._volumeCancellable = null;
this._icons = [];
}
get stream() {
@ -179,24 +183,15 @@ var StreamSlider = class {
if (!this._stream)
return null;
let icons = ["audio-volume-muted-symbolic",
"audio-volume-low-symbolic",
"audio-volume-medium-symbolic",
"audio-volume-high-symbolic",
"audio-volume-overamplified-symbolic"];
let volume = this._stream.volume;
let n;
if (this._stream.is_muted || volume <= 0) {
n = 0;
} else {
n = Math.ceil(3 * volume / this._control.get_vol_max_norm());
if (n < 1)
n = 1;
else if (n > 3)
n = 4;
n = Math.clamp(n, 1, this._icons.length - 1);
}
return icons[n];
return this._icons[n];
}
getLevel() {
@ -220,6 +215,13 @@ var OutputStreamSlider = class extends StreamSlider {
constructor(control) {
super(control);
this._slider.accessible_name = _("Volume");
this._icons = [
'audio-volume-muted-symbolic',
'audio-volume-low-symbolic',
'audio-volume-medium-symbolic',
'audio-volume-high-symbolic',
'audio-volume-overamplified-symbolic',
];
}
_connectStream(stream) {
@ -271,6 +273,12 @@ var InputStreamSlider = class extends StreamSlider {
this._control.connect('stream-added', this._maybeShowInput.bind(this));
this._control.connect('stream-removed', this._maybeShowInput.bind(this));
this._icon.icon_name = 'audio-input-microphone-symbolic';
this._icons = [
'microphone-sensitivity-muted-symbolic',
'microphone-sensitivity-low-symbolic',
'microphone-sensitivity-medium-symbolic',
'microphone-sensitivity-high-symbolic',
];
}
_connectStream(stream) {
@ -316,7 +324,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._output = new OutputStreamSlider(this._control);
this._output.connect('stream-updated', () => {
this.emit('icon-changed');
this.emit('output-icon-changed');
});
this.addMenuItem(this._output.item);
@ -324,6 +332,9 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._input.item.connect('notify::visible', () => {
this.emit('input-visible-changed');
});
this._input.connect('stream-updated', () => {
this.emit('input-icon-changed');
});
this.addMenuItem(this._input.item);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@ -340,7 +351,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._readInput();
this._readOutput();
} else {
this.emit('icon-changed');
this.emit('output-icon-changed');
}
}
@ -352,10 +363,14 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._input.stream = this._control.get_default_source();
}
getIcon() {
getOutputIcon() {
return this._output.getIcon();
}
getInputIcon() {
return this._input.getIcon();
}
getLevel() {
return this._output.getLevel();
}
@ -379,21 +394,24 @@ class Indicator extends PanelMenu.SystemIndicator {
this._control = getMixerControl();
this._volumeMenu = new VolumeMenu(this._control);
this._volumeMenu.connect('icon-changed', () => {
let icon = this._volumeMenu.getIcon();
this._volumeMenu.connect('output-icon-changed', () => {
let icon = this._volumeMenu.getOutputIcon();
if (icon != null)
this._primaryIndicator.icon_name = icon;
this._primaryIndicator.visible = icon !== null;
});
this._inputIndicator.set({
icon_name: 'audio-input-microphone-symbolic',
visible: this._volumeMenu.getInputVisible(),
});
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
this._volumeMenu.connect('input-visible-changed', () => {
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
});
this._volumeMenu.connect('input-icon-changed', () => {
let icon = this._volumeMenu.getInputIcon();
if (icon !== null)
this._inputIndicator.icon_name = icon;
});
this.menu.addMenuItem(this._volumeMenu);
}
@ -403,7 +421,7 @@ class Indicator extends PanelMenu.SystemIndicator {
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
return result;
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
let level = this._volumeMenu.getLevel();
let maxLevel = this._volumeMenu.getMaxLevel();
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);

View File

@ -28,10 +28,6 @@ const State = {
SCROLLING: 1,
};
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
const TouchpadSwipeGesture = GObject.registerClass({
Properties: {
'enabled': GObject.ParamSpec.boolean(
@ -558,8 +554,8 @@ var SwipeTracker = GObject.registerClass({
let firstPoint = this._snapPoints[0];
let lastPoint = this._snapPoints[this._snapPoints.length - 1];
this._progress = clamp(this._progress, firstPoint, lastPoint);
this._progress = clamp(this._progress,
this._progress = Math.clamp(this._progress, firstPoint, lastPoint);
this._progress = Math.clamp(this._progress,
this._initialProgress - 1, this._initialProgress + 1);
this.emit('update', this._progress);
@ -606,7 +602,7 @@ var SwipeTracker = GObject.registerClass({
let duration = Math.abs((this._progress - endProgress) / velocity * DURATION_MULTIPLIER);
if (duration > 0) {
duration = clamp(duration,
duration = Math.clamp(duration,
MIN_ANIMATION_DURATION, MAX_ANIMATION_DURATION);
}

View File

@ -66,8 +66,8 @@ var SwitcherPopup = GObject.registerClass({
this._disableHover();
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor;
@ -84,7 +84,7 @@ var SwitcherPopup = GObject.registerClass({
childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight;
this._switcherList.allocate(childBox, flags);
this._switcherList.allocate(childBox);
}
_initialSelection(backward, _binding) {
@ -591,8 +591,8 @@ var SwitcherList = GObject.registerClass({
return themeNode.adjust_preferred_height(maxChildMin, maxChildNat);
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let contentBox = this.get_theme_node().get_content_box(box);
let width = contentBox.x2 - contentBox.x1;
@ -606,7 +606,7 @@ var SwitcherList = GObject.registerClass({
let childBox = new Clutter.ActorBox();
let scrollable = minListWidth > width;
this._scrollView.allocate(contentBox, flags);
this._scrollView.allocate(contentBox);
let arrowWidth = Math.floor(leftPadding / 3);
let arrowHeight = arrowWidth * 2;
@ -614,7 +614,7 @@ var SwitcherList = GObject.registerClass({
childBox.y1 = this.height / 2 - arrowWidth;
childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight;
this._leftArrow.allocate(childBox, flags);
this._leftArrow.allocate(childBox);
this._leftArrow.opacity = this._scrollableLeft && scrollable ? 255 : 0;
arrowWidth = Math.floor(rightPadding / 3);
@ -623,7 +623,7 @@ var SwitcherList = GObject.registerClass({
childBox.y1 = this.height / 2 - arrowWidth;
childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight;
this._rightArrow.allocate(childBox, flags);
this._rightArrow.allocate(childBox);
this._rightArrow.opacity = this._scrollableRight && scrollable ? 255 : 0;
}
});

View File

@ -405,7 +405,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
return this._stack.get_preferred_height(forWidth);
}
vfunc_allocate(container, box, flags) {
vfunc_allocate(container, box) {
let [width, height] = box.get_size();
let tenthOfHeight = height / 10.0;
@ -432,7 +432,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = actorBox.y1 + maxNotificationsHeight;
this._notifications.allocate(actorBox, flags);
this._notifications.allocate(actorBox);
// Authentication Box
let stackY = Math.min(
@ -444,7 +444,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = stackY + stackHeight;
this._stack.allocate(actorBox, flags);
this._stack.allocate(actorBox);
// Switch User button
if (this._switchUserButton.visible) {
@ -461,7 +461,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
this._switchUserButton.allocate(actorBox, flags);
this._switchUserButton.allocate(actorBox);
}
}
});
@ -485,6 +485,7 @@ var UnlockDialog = GObject.registerClass({
this._gdmClient = new Gdm.Client();
this._adjustment = new St.Adjustment({
actor: this,
lower: 0,
upper: 2,
page_size: 1,
@ -524,6 +525,10 @@ var UnlockDialog = GObject.registerClass({
this._bgManagers = [];
const themeContext = St.ThemeContext.get_for_stage(global.stage);
this._scaleChangedId = themeContext.connect('notify::scale-factor',
() => this._updateBackgroundEffects());
this._updateBackgrounds();
this._monitorsChangedId =
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
@ -566,9 +571,15 @@ var UnlockDialog = GObject.registerClass({
this._otherUserButton.set_pivot_point(0.5, 0.5);
this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this));
let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
screenSaverSettings.bind('user-switch-enabled',
this._otherUserButton, 'visible', Gio.SettingsBindFlags.GET);
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
this._updateUserSwitchVisibility.bind(this));
this._userLoadedId = this._user.connect('notify::is-loaded',
this._updateUserSwitchVisibility.bind(this));
this._updateUserSwitchVisibility();
// Main Box
let mainBox = new St.Widget();
@ -618,6 +629,7 @@ var UnlockDialog = GObject.registerClass({
y: monitor.y,
width: monitor.width,
height: monitor.height,
effect: new Shell.BlurEffect({ name: 'blur' }),
});
let bgManager = new Background.BackgroundManager({
@ -629,19 +641,17 @@ var UnlockDialog = GObject.registerClass({
this._bgManagers.push(bgManager);
this._backgroundGroup.add_child(widget);
}
_updateBackgroundEffects() {
const themeContext = St.ThemeContext.get_for_stage(global.stage);
let effect = new Shell.BlurEffect({
brightness: BLUR_BRIGHTNESS,
sigma: BLUR_SIGMA * themeContext.scale_factor,
});
this._scaleChangedId = themeContext.connect('notify::scale-factor', () => {
effect.sigma = BLUR_SIGMA * themeContext.scale_factor;
});
widget.add_effect(effect);
for (const widget of this._backgroundGroup) {
widget.get_effect('blur').set({
brightness: BLUR_BRIGHTNESS,
sigma: BLUR_SIGMA * themeContext.scale_factor,
});
}
}
_updateBackgrounds() {
@ -653,6 +663,7 @@ var UnlockDialog = GObject.registerClass({
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i);
this._updateBackgroundEffects();
}
_ensureAuthPrompt() {
@ -828,6 +839,21 @@ var UnlockDialog = GObject.registerClass({
this._gdmClient = null;
delete this._gdmClient;
}
if (this._userLoadedId) {
this._user.disconnect(this._userLoadedId);
this._userLoadedId = 0;
}
if (this._userSwitchEnabledId) {
this._screenSaverSettings.disconnect(this._userSwitchEnabledId);
this._userSwitchEnabledId = 0;
}
}
_updateUserSwitchVisibility() {
this._otherUserButton.visible = this._userManager.can_switch() &&
this._screenSaverSettings.get_boolean('user-switch-enabled');
}
cancel() {

View File

@ -144,8 +144,8 @@ class UserWidgetLabel extends St.Widget {
}
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
@ -164,7 +164,7 @@ class UserWidgetLabel extends St.Widget {
childBox.x2 = availWidth;
childBox.y2 = availHeight;
this._currentLabel.allocate(childBox, flags);
this._currentLabel.allocate(childBox);
}
vfunc_paint(paintContext) {

View File

@ -132,6 +132,7 @@ var ViewSelector = GObject.registerClass({
super._init({
name: 'viewSelector',
x_expand: true,
visible: false,
});
this._showAppsButton = showAppsButton;
@ -271,9 +272,10 @@ var ViewSelector = GObject.registerClass({
Main.overview.show();
}
show() {
animateToOverview() {
this.show();
this.reset();
this._workspacesDisplay.show(this._showAppsButton.checked);
this._workspacesDisplay.animateToOverview(this._showAppsButton.checked);
this._activePage = null;
if (this._showAppsButton.checked)
this._showPage(this._appsPage);
@ -297,13 +299,11 @@ var ViewSelector = GObject.registerClass({
Main.overview.fadeInDesktop();
}
setWorkspacesFullGeometry(geom) {
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
}
hide() {
vfunc_hide() {
this.reset();
this._workspacesDisplay.hide();
super.vfunc_hide();
}
_addPage(actor, name, a11yIcon, params) {

View File

@ -900,35 +900,47 @@ var WindowManager = class {
global.display.connect('init-xserver', (display, task) => {
IBusManager.getIBusManager().restartDaemon(['--xim']);
Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail');
/* Leave this watchdog timeout so don't block indefinitely here */
let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
Gio.DBus.session.unwatch_name(watchId);
log('Warning: Failed to start gsd-xsettings');
task.return_boolean(true);
timeoutId = 0;
return GLib.SOURCE_REMOVE;
});
try {
if (!Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail'))
log('Not starting gsd-xsettings; waiting for gnome-session to do so');
/* When gsd-xsettings daemon is started, we are good to resume */
let watchId = Gio.DBus.session.watch_name(
'org.gnome.SettingsDaemon.XSettings',
Gio.BusNameWatcherFlags.NONE,
() => {
/* Leave this watchdog timeout so don't block indefinitely here */
let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
Gio.DBus.session.unwatch_name(watchId);
if (timeoutId > 0) {
task.return_boolean(true);
GLib.source_remove(timeoutId);
}
},
null);
log('Warning: Failed to start gsd-xsettings');
task.return_boolean(true);
timeoutId = 0;
return GLib.SOURCE_REMOVE;
});
/* When gsd-xsettings daemon is started, we are good to resume */
let watchId = Gio.DBus.session.watch_name(
'org.gnome.SettingsDaemon.XSettings',
Gio.BusNameWatcherFlags.NONE,
() => {
Gio.DBus.session.unwatch_name(watchId);
if (timeoutId > 0) {
task.return_boolean(true);
GLib.source_remove(timeoutId);
}
},
null);
} catch (e) {
log('Error starting gsd-xsettings: %s'.format(e.message));
task.return_boolean(true);
}
return true;
});
global.display.connect('x11-display-closing', () => {
if (!Meta.is_wayland_compositor())
return;
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail');
try {
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail');
} catch (e) {
log('Error stopping gsd-xsettings: %s'.format(e.message));
}
IBusManager.getIBusManager().restartDaemon();
});
@ -1266,13 +1278,13 @@ var WindowManager = class {
}
_sizeChangeWindow(shellwm, actor, whichChange, oldFrameRect, _oldBufferRect) {
let types = [Meta.WindowType.NORMAL];
if (!this._shouldAnimateActor(actor, types)) {
shellwm.completed_size_change(actor);
return;
}
const types = [Meta.WindowType.NORMAL];
const shouldAnimate =
this._shouldAnimateActor(actor, types) &&
oldFrameRect.width > 0 &&
oldFrameRect.height > 0;
if (oldFrameRect.width > 0 && oldFrameRect.height > 0)
if (shouldAnimate)
this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
@ -1287,17 +1299,24 @@ var WindowManager = class {
actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
if (this._clearAnimationInfo(actor))
actor.freeze();
if (this._clearAnimationInfo(actor)) {
log('Old animationInfo removed from actor %s'.format(actor));
this._shellwm.completed_size_change(actor);
}
let destroyId = actor.connect('destroy', () => {
this._clearAnimationInfo(actor);
});
this._resizePending.add(actor);
actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect,
destroyId };
actor.__animationInfo = {
clone: actorClone,
oldRect: oldFrameRect,
frozen: true,
destroyId,
};
}
_sizeChangedWindow(shellwm, actor) {
@ -1350,13 +1369,17 @@ var WindowManager = class {
// Now unfreeze actor updates, to get it to the new size.
// It's important that we don't wait until the animation is completed to
// do this, otherwise our scale will be applied to the old texture size.
shellwm.completed_size_change(actor);
actor.thaw();
actor.__animationInfo.frozen = false;
}
_clearAnimationInfo(actor) {
if (actor.__animationInfo) {
actor.__animationInfo.clone.destroy();
actor.disconnect(actor.__animationInfo.destroyId);
if (actor.__animationInfo.frozen)
actor.thaw();
delete actor.__animationInfo;
return true;
}
@ -1371,10 +1394,13 @@ var WindowManager = class {
actor.translation_x = 0;
actor.translation_y = 0;
this._clearAnimationInfo(actor);
this._shellwm.completed_size_change(actor);
}
if (this._resizePending.delete(actor))
if (this._resizePending.delete(actor)) {
this._clearAnimationInfo(actor);
this._shellwm.completed_size_change(actor);
}
}
_hasAttachedDialogs(window, ignoreWindow) {
@ -1774,8 +1800,7 @@ var WindowManager = class {
w.window.get_parent().remove_child(w.window);
w.parent.add_child(w.window);
if (w.window.get_meta_window().get_workspace() !=
global.workspace_manager.get_active_workspace())
if (!w.window.get_meta_window().get_workspace().active)
w.window.hide();
}
switchData.container.destroy();
@ -1959,7 +1984,7 @@ var WindowManager = class {
duration,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
onComplete: () => {
if (newWs !== activeWorkspace)
if (!newWs.active)
this.actionMoveWorkspace(newWs);
this._finishWorkspaceSwitch(switchData);
},
@ -2089,8 +2114,16 @@ var WindowManager = class {
newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1);
} else if (isNaN(target)) {
// Prepend a new workspace dynamically
if (workspaceManager.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
let prependTarget;
if (vertical)
prependTarget = 'up';
else if (rtl)
prependTarget = 'right';
else
prependTarget = 'left';
if (workspaceManager.get_active_workspace_index() === 0 &&
action === 'move' && target === prependTarget &&
this._isWorkspacePrepended === false) {
this.insertWorkspace(0);
this._isWorkspacePrepended = true;
}
@ -2151,10 +2184,7 @@ var WindowManager = class {
if (!Main.sessionMode.hasWorkspaces)
return;
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace)
if (!workspace.active)
workspace.activate(global.get_current_time());
}
@ -2162,10 +2192,7 @@ var WindowManager = class {
if (!Main.sessionMode.hasWorkspaces)
return;
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) {
if (!workspace.active) {
// This won't have any effect for "always sticky" windows
// (like desktop windows or docks)

771
js/ui/windowPreview.js Normal file
View File

@ -0,0 +1,771 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported WindowPreview */
const { Atk, Clutter, GLib, GObject,
Graphene, Meta, Pango, Shell, St } = imports.gi;
const DND = imports.ui.dnd;
var WINDOW_DND_SIZE = 256;
var WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT = 750;
var WINDOW_OVERLAY_FADE_TIME = 200;
var DRAGGING_WINDOW_OPACITY = 100;
var WindowPreviewLayout = GObject.registerClass({
Properties: {
'bounding-box': GObject.ParamSpec.boxed(
'bounding-box', 'Bounding box', 'Bounding box',
GObject.ParamFlags.READABLE,
Clutter.ActorBox.$gtype),
},
}, class WindowPreviewLayout extends Clutter.LayoutManager {
_init() {
super._init();
this._container = null;
this._boundingBox = new Clutter.ActorBox();
this._windows = new Map();
}
_layoutChanged() {
let frameRect;
for (const windowInfo of this._windows.values()) {
const frame = windowInfo.metaWindow.get_frame_rect();
frameRect = frameRect ? frameRect.union(frame) : frame;
}
if (!frameRect)
frameRect = new Meta.Rectangle();
const oldBox = this._boundingBox.copy();
this._boundingBox.set_origin(frameRect.x, frameRect.y);
this._boundingBox.set_size(frameRect.width, frameRect.height);
if (!this._boundingBox.equal(oldBox))
this.notify('bounding-box');
// Always call layout_changed(), a size or position change of an
// attached dialog might not affect the boundingBox
this.layout_changed();
}
vfunc_set_container(container) {
this._container = container;
}
vfunc_get_preferred_height(_container, _forWidth) {
return [0, this._boundingBox.get_height()];
}
vfunc_get_preferred_width(_container, _forHeight) {
return [0, this._boundingBox.get_width()];
}
vfunc_allocate(container, box) {
// If the scale isn't 1, we weren't allocated our preferred size
// and have to scale the children allocations accordingly.
const scaleX = this._boundingBox.get_width() > 0
? box.get_width() / this._boundingBox.get_width()
: 1;
const scaleY = this._boundingBox.get_height() > 0
? box.get_height() / this._boundingBox.get_height()
: 1;
const childBox = new Clutter.ActorBox();
for (const child of container) {
if (!child.visible)
continue;
const windowInfo = this._windows.get(child);
if (windowInfo) {
const bufferRect = windowInfo.metaWindow.get_buffer_rect();
childBox.set_origin(
bufferRect.x - this._boundingBox.x1,
bufferRect.y - this._boundingBox.y1);
const [, , natWidth, natHeight] = child.get_preferred_size();
childBox.set_size(natWidth, natHeight);
childBox.x1 *= scaleX;
childBox.x2 *= scaleX;
childBox.y1 *= scaleY;
childBox.y2 *= scaleY;
child.allocate(childBox);
} else {
child.allocate_preferred_size(0, 0);
}
}
}
/**
* addWindow:
* @param {Meta.Window} window: the MetaWindow instance
*
* Creates a ClutterActor drawing the texture of @window and adds it
* to the container. If @window is already part of the preview, this
* function will do nothing.
*
* @returns {Clutter.Actor} The newly created actor drawing @window
*/
addWindow(window) {
const index = [...this._windows.values()].findIndex(info =>
info.metaWindow === window);
if (index !== -1)
return null;
const windowActor = window.get_compositor_private();
const actor = new Clutter.Clone({ source: windowActor });
this._windows.set(actor, {
metaWindow: window,
windowActor,
sizeChangedId: window.connect('size-changed', () =>
this._layoutChanged()),
positionChangedId: window.connect('position-changed', () =>
this._layoutChanged()),
windowActorDestroyId: windowActor.connect('destroy', () =>
actor.destroy()),
destroyId: actor.connect('destroy', () =>
this.removeWindow(window)),
});
this._container.add_child(actor);
this._layoutChanged();
return actor;
}
/**
* removeWindow:
* @param {Meta.Window} window: the window to remove from the preview
*
* Removes a MetaWindow @window from the preview which has been added
* previously using addWindow(). If @window is not part of preview,
* this function will do nothing.
*/
removeWindow(window) {
const entry = [...this._windows].find(
([, i]) => i.metaWindow === window);
if (!entry)
return;
const [actor, windowInfo] = entry;
windowInfo.metaWindow.disconnect(windowInfo.sizeChangedId);
windowInfo.metaWindow.disconnect(windowInfo.positionChangedId);
windowInfo.windowActor.disconnect(windowInfo.windowActorDestroyId);
actor.disconnect(windowInfo.destroyId);
this._windows.delete(actor);
this._container.remove_child(actor);
this._layoutChanged();
}
/**
* getWindows:
*
* Gets an array of all MetaWindows that were added to the layout
* using addWindow(), ordered by the insertion order.
*
* @returns {Array} An array including all windows
*/
getWindows() {
return [...this._windows.values()].map(i => i.metaWindow);
}
// eslint-disable-next-line camelcase
get bounding_box() {
return this._boundingBox;
}
});
var WindowPreview = GObject.registerClass({
Properties: {
'overlay-enabled': GObject.ParamSpec.boolean(
'overlay-enabled', 'overlay-enabled', 'overlay-enabled',
GObject.ParamFlags.READWRITE,
true),
},
Signals: {
'drag-begin': {},
'drag-cancelled': {},
'drag-end': {},
'selected': { param_types: [GObject.TYPE_UINT] },
'show-chrome': {},
'size-changed': {},
},
}, class WindowPreview extends St.Widget {
_init(metaWindow, workspace) {
this.metaWindow = metaWindow;
this.metaWindow._delegate = this;
this._windowActor = metaWindow.get_compositor_private();
this._workspace = workspace;
super._init({
reactive: true,
can_focus: true,
accessible_role: Atk.Role.PUSH_BUTTON,
offscreen_redirect: Clutter.OffscreenRedirect.AUTOMATIC_FOR_OPACITY,
});
this._windowContainer = new Clutter.Actor();
// gjs currently can't handle setting an actors layout manager during
// the initialization of the actor if that layout manager keeps track
// of its container, so set the layout manager after creating the
// container
this._windowContainer.layout_manager = new WindowPreviewLayout();
this.add_child(this._windowContainer);
this._addWindow(metaWindow);
this._delegate = this;
this._stackAbove = null;
this._windowContainer.layout_manager.connect(
'notify::bounding-box', layout => {
// A bounding box of 0x0 means all windows were removed
if (layout.bounding_box.get_area() > 0)
this.emit('size-changed');
});
this._windowDestroyId =
this._windowActor.connect('destroy', () => this.destroy());
this._updateAttachedDialogs();
let clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', () => this._activate());
clickAction.connect('long-press', this._onLongPress.bind(this));
this.add_action(clickAction);
this.connect('destroy', this._onDestroy.bind(this));
this._draggable = DND.makeDraggable(this,
{ restoreOnSuccess: true,
manualMode: true,
dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
this._draggable.connect('drag-begin', this._onDragBegin.bind(this));
this._draggable.connect('drag-cancelled', this._onDragCancelled.bind(this));
this._draggable.connect('drag-end', this._onDragEnd.bind(this));
this.inDrag = false;
this._selected = false;
this._overlayEnabled = true;
this._closeRequested = false;
this._idleHideOverlayId = 0;
this._border = new St.Widget({
visible: false,
style_class: 'window-clone-border',
});
this._borderConstraint = new Clutter.BindConstraint({
source: this._windowContainer,
coordinate: Clutter.BindCoordinate.SIZE,
});
this._border.add_constraint(this._borderConstraint);
this._border.add_constraint(new Clutter.AlignConstraint({
source: this._windowContainer,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5,
}));
this._borderCenter = new Clutter.Actor();
this._border.bind_property('visible', this._borderCenter, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._borderCenterConstraint = new Clutter.BindConstraint({
source: this._windowContainer,
coordinate: Clutter.BindCoordinate.SIZE,
});
this._borderCenter.add_constraint(this._borderCenterConstraint);
this._borderCenter.add_constraint(new Clutter.AlignConstraint({
source: this._windowContainer,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5,
}));
this._border.connect('style-changed',
this._onBorderStyleChanged.bind(this));
this._title = new St.Label({
visible: false,
style_class: 'window-caption',
text: this._getCaption(),
reactive: true,
});
this._title.add_constraint(new Clutter.BindConstraint({
source: this._borderCenter,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._title.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.X_AXIS,
factor: 0.5,
}));
this._title.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
factor: 1,
}));
this._title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
this.label_actor = this._title;
this._updateCaptionId = this.metaWindow.connect('notify::title', () => {
this._title.text = this._getCaption();
});
const layout = Meta.prefs_get_button_layout();
this._closeButtonSide =
layout.left_buttons.includes(Meta.ButtonFunction.CLOSE)
? St.Side.LEFT : St.Side.RIGHT;
this._closeButton = new St.Button({
visible: false,
style_class: 'window-close',
child: new St.Icon({ icon_name: 'window-close-symbolic' }),
});
this._closeButton.add_constraint(new Clutter.BindConstraint({
source: this._borderCenter,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._closeButton.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.X_AXIS,
pivot_point: new Graphene.Point({ x: 0.5, y: -1 }),
factor: this._closeButtonSide === St.Side.LEFT ? 0 : 1,
}));
this._closeButton.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
factor: 0,
}));
this._closeButton.connect('clicked', () => this._deleteAll());
this.add_child(this._borderCenter);
this.add_child(this._border);
this.add_child(this._title);
this.add_child(this._closeButton);
this.connect('notify::realized', () => {
if (!this.realized)
return;
this._border.ensure_style();
this._title.ensure_style();
});
}
vfunc_get_preferred_width(forHeight) {
const themeNode = this.get_theme_node();
// Only include window previews in size request, not chrome
const [minWidth, natWidth] =
this._windowContainer.get_preferred_width(
themeNode.adjust_for_height(forHeight));
return themeNode.adjust_preferred_width(minWidth, natWidth);
}
vfunc_get_preferred_height(forWidth) {
const themeNode = this.get_theme_node();
const [minHeight, natHeight] =
this._windowContainer.get_preferred_height(
themeNode.adjust_for_width(forWidth));
return themeNode.adjust_preferred_height(minHeight, natHeight);
}
vfunc_allocate(box) {
this.set_allocation(box);
for (const child of this)
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
}
_onBorderStyleChanged() {
let borderNode = this._border.get_theme_node();
this._borderSize = borderNode.get_border_width(St.Side.TOP);
// Increase the size of the border actor so the border outlines
// the bounding box
this._borderConstraint.offset = this._borderSize * 2;
this._borderCenterConstraint.offset = this._borderSize;
}
_windowCanClose() {
return this.metaWindow.can_close() &&
!this._hasAttachedDialogs();
}
_getCaption() {
if (this.metaWindow.title)
return this.metaWindow.title;
let tracker = Shell.WindowTracker.get_default();
let app = tracker.get_window_app(this.metaWindow);
return app.get_name();
}
chromeHeights() {
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
const [, titleHeight] = this._title.get_preferred_height(-1);
const topOversize = (this._borderSize / 2) + (closeButtonHeight / 2);
const bottomOversize = Math.max(
this._borderSize,
(titleHeight / 2) + (this._borderSize / 2));
return [topOversize, bottomOversize];
}
chromeWidths() {
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
const leftOversize = this._closeButtonSide === St.Side.LEFT
? (this._borderSize / 2) + (closeButtonWidth / 2)
: this._borderSize;
const rightOversize = this._closeButtonSide === St.Side.LEFT
? this._borderSize
: (this._borderSize / 2) + (closeButtonWidth / 2);
return [leftOversize, rightOversize];
}
showOverlay(animate) {
if (!this._overlayEnabled)
return;
const ongoingTransition = this._border.get_transition('opacity');
// Don't do anything if we're fully visible already
if (this._border.visible && !ongoingTransition)
return;
// If we're supposed to animate and an animation in our direction
// is already happening, let that one continue
if (animate &&
ongoingTransition &&
ongoingTransition.get_interval().peek_final_value() === 255)
return;
const toShow = this._windowCanClose()
? [this._border, this._title, this._closeButton]
: [this._border, this._title];
toShow.forEach(a => {
a.opacity = 0;
a.show();
a.ease({
opacity: 255,
duration: animate ? WINDOW_OVERLAY_FADE_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
});
this.emit('show-chrome');
}
hideOverlay(animate) {
const ongoingTransition = this._border.get_transition('opacity');
// Don't do anything if we're fully hidden already
if (!this._border.visible && !ongoingTransition)
return;
// If we're supposed to animate and an animation in our direction
// is already happening, let that one continue
if (animate &&
ongoingTransition &&
ongoingTransition.get_interval().peek_final_value() === 0)
return;
[this._border, this._title, this._closeButton].forEach(a => {
a.opacity = 255;
a.ease({
opacity: 0,
duration: animate ? WINDOW_OVERLAY_FADE_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => a.hide(),
});
});
}
_addWindow(metaWindow) {
const clone = this._windowContainer.layout_manager.addWindow(metaWindow);
// We expect this to be used for all interaction rather than
// the ClutterClone; as the former is reactive and the latter
// is not, this just works for most cases. However, for DND all
// actors are picked, so DND operations would operate on the clone.
// To avoid this, we hide it from pick.
Shell.util_set_hidden_from_pick(clone, true);
}
vfunc_has_overlaps() {
return this._hasAttachedDialogs();
}
_deleteAll() {
const windows = this._windowContainer.layout_manager.getWindows();
// Delete all windows, starting from the bottom-most (most-modal) one
for (const window of windows.reverse())
window.delete(global.get_current_time());
this._closeRequested = true;
}
addDialog(win) {
let parent = win.get_transient_for();
while (parent.is_attached_dialog())
parent = parent.get_transient_for();
// Display dialog if it is attached to our metaWindow
if (win.is_attached_dialog() && parent == this.metaWindow)
this._addWindow(win);
// The dialog popped up after the user tried to close the window,
// assume it's a close confirmation and leave the overview
if (this._closeRequested)
this._activate();
}
_hasAttachedDialogs() {
return this._windowContainer.layout_manager.getWindows().length > 1;
}
_updateAttachedDialogs() {
let iter = win => {
let actor = win.get_compositor_private();
if (!actor)
return false;
if (!win.is_attached_dialog())
return false;
this._addWindow(win);
win.foreach_transient(iter);
return true;
};
this.metaWindow.foreach_transient(iter);
}
get boundingBox() {
const box = this._windowContainer.layout_manager.bounding_box;
return {
x: box.x1,
y: box.y1,
width: box.get_width(),
height: box.get_height(),
};
}
get windowCenter() {
const box = this._windowContainer.layout_manager.bounding_box;
return new Graphene.Point({
x: box.get_x() + box.get_width() / 2,
y: box.get_y() + box.get_height() / 2,
});
}
// eslint-disable-next-line camelcase
get overlay_enabled() {
return this._overlayEnabled;
}
// eslint-disable-next-line camelcase
set overlay_enabled(enabled) {
if (this._overlayEnabled === enabled)
return;
this._overlayEnabled = enabled;
this.notify('overlay-enabled');
if (!enabled)
this.hideOverlay(false);
else if (this['has-pointer'] || global.stage.key_focus === this)
this.showOverlay(true);
}
// Find the actor just below us, respecting reparenting done by DND code
_getActualStackAbove() {
if (this._stackAbove == null)
return null;
if (this.inDrag) {
if (this._stackAbove._delegate)
return this._stackAbove._delegate._getActualStackAbove();
else
return null;
} else {
return this._stackAbove;
}
}
setStackAbove(actor) {
this._stackAbove = actor;
if (this.inDrag)
// We'll fix up the stack after the drag
return;
let parent = this.get_parent();
let actualAbove = this._getActualStackAbove();
if (actualAbove == null)
parent.set_child_below_sibling(this, null);
else
parent.set_child_above_sibling(this, actualAbove);
}
_onDestroy() {
this._windowActor.disconnect(this._windowDestroyId);
this.metaWindow._delegate = null;
this._delegate = null;
this.metaWindow.disconnect(this._updateCaptionId);
if (this._longPressLater) {
Meta.later_remove(this._longPressLater);
delete this._longPressLater;
}
if (this._idleHideOverlayId > 0) {
GLib.source_remove(this._idleHideOverlayId);
this._idleHideOverlayId = 0;
}
if (this.inDrag) {
this.emit('drag-end');
this.inDrag = false;
}
}
_activate() {
this._selected = true;
this.emit('selected', global.get_current_time());
}
vfunc_enter_event(crossingEvent) {
this.showOverlay(true);
return super.vfunc_enter_event(crossingEvent);
}
vfunc_leave_event(crossingEvent) {
if (this._idleHideOverlayId > 0)
GLib.source_remove(this._idleHideOverlayId);
this._idleHideOverlayId = GLib.timeout_add(
GLib.PRIORITY_DEFAULT,
WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT, () => {
if (this._closeButton['has-pointer'] ||
this._title['has-pointer'])
return GLib.SOURCE_CONTINUE;
if (!this['has-pointer'])
this.hideOverlay(true);
this._idleHideOverlayId = 0;
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._idleHideOverlayId, '[gnome-shell] this._idleHideOverlayId');
return super.vfunc_leave_event(crossingEvent);
}
vfunc_key_focus_in() {
super.vfunc_key_focus_in();
this.showOverlay(true);
}
vfunc_key_focus_out() {
super.vfunc_key_focus_out();
this.hideOverlay(true);
}
vfunc_key_press_event(keyEvent) {
let symbol = keyEvent.keyval;
let isEnter = symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter;
if (isEnter) {
this._activate();
return true;
}
return super.vfunc_key_press_event(keyEvent);
}
_onLongPress(action, actor, state) {
// Take advantage of the Clutter policy to consider
// a long-press canceled when the pointer movement
// exceeds dnd-drag-threshold to manually start the drag
if (state == Clutter.LongPressState.CANCEL) {
let event = Clutter.get_current_event();
this._dragTouchSequence = event.get_event_sequence();
if (this._longPressLater)
return true;
// A click cancels a long-press before any click handler is
// run - make sure to not start a drag in that case
this._longPressLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
delete this._longPressLater;
if (this._selected)
return;
let [x, y] = action.get_coords();
action.release();
this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence, event.get_device());
});
} else {
this.showOverlay(true);
}
return true;
}
_onDragBegin(_draggable, _time) {
this.inDrag = true;
this.hideOverlay(false);
this.emit('drag-begin');
}
handleDragOver(source, actor, x, y, time) {
return this._workspace.handleDragOver(source, actor, x, y, time);
}
acceptDrop(source, actor, x, y, time) {
return this._workspace.acceptDrop(source, actor, x, y, time);
}
_onDragCancelled(_draggable, _time) {
this.emit('drag-cancelled');
}
_onDragEnd(_draggable, _time, _snapback) {
this.inDrag = false;
// We may not have a parent if DnD completed successfully, in
// which case our clone will shortly be destroyed and replaced
// with a new one on the target workspace.
let parent = this.get_parent();
if (parent !== null) {
if (this._stackAbove == null)
parent.set_child_below_sibling(this, null);
else
parent.set_child_above_sibling(this, this._stackAbove);
}
if (this['has-pointer'])
this.showOverlay(true);
this.emit('drag-end');
}
});

File diff suppressed because it is too large Load Diff

View File

@ -86,8 +86,8 @@ class WorkspaceSwitcherPopupList extends St.Widget {
return this._getSizeForOppositeOrientation();
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let themeNode = this.get_theme_node();
box = themeNode.get_content_box(box);
@ -111,7 +111,7 @@ class WorkspaceSwitcherPopupList extends St.Widget {
} else {
y += this._childHeight + this._itemSpacing;
}
child.allocate(childBox, flags);
child.allocate(childBox);
}
}
});

View File

@ -549,9 +549,7 @@ var WorkspaceThumbnail = GObject.registerClass({
return;
// a click on the already current workspace should go back to the main view
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace == activeWorkspace)
if (this.metaWorkspace.active)
Main.overview.hide();
else
this.metaWorkspace.activate(time);
@ -567,7 +565,8 @@ var WorkspaceThumbnail = GObject.registerClass({
if (this.state > ThumbnailState.NORMAL)
return DND.DragMotionResult.CONTINUE;
if (source.realWindow && !this._isMyWindow(source.realWindow))
if (source.metaWindow &&
!this._isMyWindow(source.metaWindow.get_compositor_private()))
return DND.DragMotionResult.MOVE_DROP;
if (source.app && source.app.can_open_new_window())
return DND.DragMotionResult.COPY_DROP;
@ -581,8 +580,8 @@ var WorkspaceThumbnail = GObject.registerClass({
if (this.state > ThumbnailState.NORMAL)
return false;
if (source.realWindow) {
let win = source.realWindow;
if (source.metaWindow) {
let win = source.metaWindow.get_compositor_private();
if (this._isMyWindow(win))
return false;
@ -795,7 +794,7 @@ var ThumbnailsBox = GObject.registerClass({
// Draggable target interface
handleDragOver(source, actor, x, y, time) {
if (!source.realWindow &&
if (!source.metaWindow &&
(!source.app || !source.app.can_open_new_window()) &&
(source.app || !source.shellWorkspaceLaunch) &&
source != Main.xdndHandler)
@ -846,7 +845,7 @@ var ThumbnailsBox = GObject.registerClass({
if (this._dropWorkspace != -1)
return this._thumbnails[this._dropWorkspace].handleDragOverInternal(source, actor, time);
else if (this._dropPlaceholderPos != -1)
return source.realWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP;
return source.metaWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP;
else
return DND.DragMotionResult.CONTINUE;
}
@ -855,12 +854,12 @@ var ThumbnailsBox = GObject.registerClass({
if (this._dropWorkspace != -1) {
return this._thumbnails[this._dropWorkspace].acceptDropInternal(source, actor, time);
} else if (this._dropPlaceholderPos != -1) {
if (!source.realWindow &&
if (!source.metaWindow &&
(!source.app || !source.app.can_open_new_window()) &&
(source.app || !source.shellWorkspaceLaunch))
return false;
let isWindow = !!source.realWindow;
let isWindow = !!source.metaWindow;
let newWorkspaceIndex;
[newWorkspaceIndex, this._dropPlaceholderPos] = [this._dropPlaceholderPos, -1];
@ -1204,8 +1203,8 @@ var ThumbnailsBox = GObject.registerClass({
this.queue_relayout();
}
vfunc_allocate(box, flags) {
this.set_allocation(box, flags);
vfunc_allocate(box) {
this.set_allocation(box);
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
@ -1299,7 +1298,7 @@ var ThumbnailsBox = GObject.registerClass({
childBox.x2 = x2;
childBox.y1 = Math.round(y);
childBox.y2 = Math.round(y + placeholderHeight);
this._dropPlaceholder.allocate(childBox, flags);
this._dropPlaceholder.allocate(childBox);
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._dropPlaceholder.show();
});
@ -1331,7 +1330,7 @@ var ThumbnailsBox = GObject.registerClass({
childBox.y2 = y1 + portholeHeight;
thumbnail.set_scale(roundedHScale, roundedVScale);
thumbnail.allocate(childBox, flags);
thumbnail.allocate(childBox);
// We round the collapsing portion so that we don't get thumbnails resizing
// during an animation due to differences in rounded, but leave the uncollapsed
@ -1355,6 +1354,6 @@ var ThumbnailsBox = GObject.registerClass({
childBox.x2 += indicatorRightFullBorder;
childBox.y1 = indicatorY1 - indicatorTopFullBorder;
childBox.y2 = indicatorY2 + indicatorBottomFullBorder;
this._indicator.allocate(childBox, flags);
this._indicator.allocate(childBox);
}
});

View File

@ -7,7 +7,9 @@ const Main = imports.ui.main;
const SwipeTracker = imports.ui.swipeTracker;
const Workspace = imports.ui.workspace;
var { ANIMATION_TIME } = imports.ui.overview;
var WORKSPACE_SWITCH_TIME = 250;
var SCROLL_TIMEOUT_TIME = 150;
var AnimationType = {
ZOOM: 0,
@ -20,18 +22,18 @@ var WorkspacesViewBase = GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT,
}, class WorkspacesViewBase extends St.Widget {
_init(monitorIndex) {
super._init({ style_class: 'workspaces-view', reactive: true });
const { x, y, width, height } =
Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
super._init({
style_class: 'workspaces-view',
x, y, width, height,
});
this.connect('destroy', this._onDestroy.bind(this));
global.focus_manager.add_group(this);
// The actor itself isn't a drop target, so we don't want to pick on its area
this.set_size(0, 0);
this._monitorIndex = monitorIndex;
this._fullGeometry = null;
this._actualGeometry = null;
this._inDrag = false;
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
@ -50,24 +52,19 @@ var WorkspacesViewBase = GObject.registerClass({
}
}
_dragBegin(overview, window) {
_dragBegin() {
this._inDrag = true;
this._setReservedSlot(window);
}
_dragEnd() {
this._inDrag = false;
this._setReservedSlot(null);
}
setFullGeometry(geom) {
this._fullGeometry = geom;
this._syncFullGeometry();
}
vfunc_allocate(box) {
this.set_allocation(box);
setActualGeometry(geom) {
this._actualGeometry = geom;
this._syncActualGeometry();
for (const child of this)
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
}
});
@ -82,9 +79,8 @@ class WorkspacesView extends WorkspacesViewBase {
this._gestureActive = false; // touch(pad) gestures
this._scrollAdjustment = scrollAdjustment;
this._onScrollId =
this._scrollAdjustment.connect('notify::value',
this._onScroll.bind(this));
this._onScrollId = this._scrollAdjustment.connect('notify::value',
this._updateScrollPosition.bind(this));
this._workspaces = [];
this._updateWorkspaces();
@ -96,34 +92,42 @@ class WorkspacesView extends WorkspacesViewBase {
this._workspaces.sort((a, b) => {
return a.metaWorkspace.index() - b.metaWorkspace.index();
});
this._updateWorkspaceActors(false);
this._workspaces.forEach(
(ws, i) => this.set_child_at_index(ws, i));
});
this._overviewShownId =
Main.overview.connect('shown', () => {
this.set_clip(this._fullGeometry.x, this._fullGeometry.y,
this._fullGeometry.width, this._fullGeometry.height);
});
this._overviewShownId = Main.overview.connect('shown', () => {
this.clip_to_allocation = true;
});
this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace',
this._activeWorkspaceChanged.bind(this));
}
_setReservedSlot(window) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(window);
}
vfunc_allocate(box) {
this.set_allocation(box);
_syncFullGeometry() {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setFullGeometry(this._fullGeometry);
}
if (this.get_n_children() === 0)
return;
_syncActualGeometry() {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setActualGeometry(this._actualGeometry);
const { workspaceManager } = global;
const { nWorkspaces } = workspaceManager;
const vertical = workspaceManager.layout_rows === -1;
const rtl = this.text_direction === Clutter.TextDirection.RTL;
this._workspaces.forEach((child, index) => {
if (rtl && !vertical)
index = nWorkspaces - index - 1;
const x = vertical ? 0 : index * this.width;
const y = vertical ? index * this.height : 0;
child.allocate_available_size(x, y, box.get_width(), box.get_height());
});
this._updateScrollPosition();
}
getActiveWorkspace() {
@ -139,11 +143,11 @@ class WorkspacesView extends WorkspacesViewBase {
else
this._workspaces[w].fadeToOverview();
}
this._updateWorkspaceActors(false);
this._updateScrollPosition();
}
animateFromOverview(animationType) {
this.remove_clip();
this.clip_to_allocation = false;
for (let w = 0; w < this._workspaces.length; w++) {
if (animationType == AnimationType.ZOOM)
@ -158,49 +162,22 @@ class WorkspacesView extends WorkspacesViewBase {
this._workspaces[i].syncStacking(stackIndices);
}
// Update workspace actors parameters
// @showAnimation: iff %true, transition between states
_updateWorkspaceActors(showAnimation) {
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
_scrollToActive() {
const { workspaceManager } = global;
const active = workspaceManager.get_active_workspace_index();
this._animating = showAnimation;
this._animating = true;
this._updateVisibility();
for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w];
workspace.remove_all_transitions();
let params = {};
if (workspaceManager.layout_rows == -1)
params.y = (w - active) * this._fullGeometry.height;
else if (this.text_direction == Clutter.TextDirection.RTL)
params.x = (active - w) * this._fullGeometry.width;
else
params.x = (w - active) * this._fullGeometry.width;
if (showAnimation) {
let easeParams = Object.assign(params, {
duration: WORKSPACE_SWITCH_TIME,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
});
// we have to call _updateVisibility() once before the
// animation and once afterwards - it does not really
// matter which tween we use, so we pick the first one ...
if (w == 0) {
this._updateVisibility();
easeParams.onComplete = () => {
this._animating = false;
this._updateVisibility();
};
}
workspace.ease(easeParams);
} else {
workspace.set(params);
if (w == 0)
this._updateVisibility();
}
}
this._scrollAdjustment.remove_transition('value');
this._scrollAdjustment.ease(active, {
duration: WORKSPACE_SWITCH_TIME,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
onComplete: () => {
this._animating = false;
this._updateVisibility();
},
});
}
_updateVisibility() {
@ -241,19 +218,14 @@ class WorkspacesView extends WorkspacesViewBase {
}
}
if (this._fullGeometry) {
this._updateWorkspaceActors(false);
this._syncFullGeometry();
}
if (this._actualGeometry)
this._syncActualGeometry();
this._updateScrollPosition();
}
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
if (this._scrolling)
return;
this._updateWorkspaceActors(true);
this._scrollToActive();
}
_onDestroy() {
@ -275,21 +247,25 @@ class WorkspacesView extends WorkspacesViewBase {
this._gestureActive = false;
// Make sure title captions etc are shown as necessary
this._updateWorkspaceActors(true);
this._scrollToActive();
this._updateVisibility();
}
// sync the workspaces' positions to the value of the scroll adjustment
// and change the active workspace if appropriate
_onScroll(adj) {
if (adj.get_transition('value') !== null && !this._gestureActive)
_updateScrollPosition() {
if (!this.has_allocation())
return;
const adj = this._scrollAdjustment;
const allowSwitch =
adj.get_transition('value') === null && !this._gestureActive;
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value);
if (active != current && !this._gestureActive) {
if (allowSwitch && active !== current) {
if (!this._workspaces[current]) {
// The current workspace was destroyed. This could happen
// when you are on the last empty workspace, and consolidate
@ -306,36 +282,16 @@ class WorkspacesView extends WorkspacesViewBase {
if (adj.upper == 1)
return;
let last = this._workspaces.length - 1;
const vertical = workspaceManager.layout_rows === -1;
const rtl = this.text_direction === Clutter.TextDirection.RTL;
const progress = vertical || !rtl
? adj.value : adj.upper - adj.value;
if (workspaceManager.layout_rows == -1) {
let firstWorkspaceY = this._workspaces[0].y;
let lastWorkspaceY = this._workspaces[last].y;
let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
let currentY = firstWorkspaceY;
let newY = -Math.round(adj.value / (adj.upper - 1) * workspacesHeight);
let dy = newY - currentY;
for (let i = 0; i < this._workspaces.length; i++) {
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
this._workspaces[i].y += dy;
}
} else {
let firstWorkspaceX = this._workspaces[0].x;
let lastWorkspaceX = this._workspaces[last].x;
let workspacesWidth = lastWorkspaceX - firstWorkspaceX;
let currentX = firstWorkspaceX;
let newX = -Math.round(adj.value / (adj.upper - 1) * workspacesWidth);
let dx = newX - currentX;
for (let i = 0; i < this._workspaces.length; i++) {
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
this._workspaces[i].x += dx;
}
for (const ws of this._workspaces) {
if (vertical)
ws.translation_y = -progress * this.height;
else
ws.translation_x = -progress * this.width;
}
}
});
@ -348,18 +304,6 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
this.add_actor(this._workspace);
}
_setReservedSlot(window) {
this._workspace.setReservedSlot(window);
}
_syncFullGeometry() {
this._workspace.setFullGeometry(this._fullGeometry);
}
_syncActualGeometry() {
this._workspace.setActualGeometry(this._actualGeometry);
}
getActiveWorkspace() {
return this._workspace;
}
@ -392,7 +336,10 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
var WorkspacesDisplay = GObject.registerClass(
class WorkspacesDisplay extends St.Widget {
_init(scrollAdjustment) {
super._init({ clip_to_allocation: true });
super._init({
visible: false,
clip_to_allocation: true,
});
this.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this));
let workspaceManager = global.workspace_manager;
@ -434,6 +381,8 @@ class WorkspacesDisplay extends St.Widget {
this._windowDragEndId =
Main.overview.connect('window-drag-begin',
this._windowDragEnd.bind(this));
this._overviewShownId = Main.overview.connect('shown',
this._syncWorkspacesActualGeometry.bind(this));
this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = [];
@ -448,8 +397,9 @@ class WorkspacesDisplay extends St.Widget {
this._scrollEventId = 0;
this._keyPressEventId = 0;
this._scrollTimeoutId = 0;
this._syncActualGeometryLater = 0;
this._fullGeometry = null;
this._actualGeometry = null;
this._inWindowDrag = false;
this._gestureActive = false; // touch(pad) gestures
@ -471,6 +421,11 @@ class WorkspacesDisplay extends St.Widget {
this._parentSetLater = 0;
}
if (this._syncActualGeometryLater) {
Meta.later_remove(this._syncActualGeometryLater);
this._syncActualGeometryLater = 0;
}
if (this._scrollTimeoutId !== 0) {
GLib.source_remove(this._scrollTimeoutId);
this._scrollTimeoutId = 0;
@ -480,6 +435,7 @@ class WorkspacesDisplay extends St.Widget {
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
Main.overview.disconnect(this._windowDragBeginId);
Main.overview.disconnect(this._windowDragEndId);
Main.overview.disconnect(this._overviewShownId);
}
_windowDragBegin() {
@ -503,25 +459,11 @@ class WorkspacesDisplay extends St.Widget {
workspaceManager.get_active_workspace_index();
}
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
_activeWorkspaceChanged(_wm, _from, to, _direction) {
if (this._gestureActive)
return;
this._scrollToActive();
}
_scrollToActive() {
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
this._updateScrollAdjustment(active);
}
_updateScrollAdjustment(index) {
if (this._gestureActive)
return;
this._scrollAdjustment.ease(index, {
this._scrollAdjustment.ease(to, {
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
duration: WORKSPACE_SWITCH_TIME,
});
@ -559,11 +501,8 @@ class WorkspacesDisplay extends St.Widget {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startTouchGesture();
let monitors = Main.layoutManager.monitors;
let geometry = monitor === this._primaryIndex
? this._fullGeometry : monitors[monitor];
let distance = global.workspace_manager.layout_rows === -1
? geometry.height : geometry.width;
? this.height : this.width;
let progress = adjustment.value / adjustment.page_size;
let points = Array.from(
@ -583,14 +522,13 @@ class WorkspacesDisplay extends St.Widget {
this._clickAction.release();
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let newWs = workspaceManager.get_workspace_by_index(endProgress);
this._scrollAdjustment.ease(endProgress, {
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
duration,
onComplete: () => {
if (newWs !== activeWorkspace)
if (!newWs.active)
newWs.activate(global.get_current_time());
this._endTouchGesture();
},
@ -607,15 +545,22 @@ class WorkspacesDisplay extends St.Widget {
return this._getPrimaryView().navigate_focus(from, direction, false);
}
show(fadeOnPrimary) {
animateToOverview(fadeOnPrimary) {
this.show();
this._updateWorkspacesViews();
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
if (this._actualGeometry) {
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
}
if (!fadeOnPrimary)
this._syncWorkspacesActualGeometry();
}
this._restackedNotifyId =
@ -637,9 +582,18 @@ class WorkspacesDisplay extends St.Widget {
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateFromOverview(animationType);
}
const { primaryIndex } = Main.layoutManager;
const { x, y, width, height } =
Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
this._getPrimaryView().ease({
x, y, width, height,
duration: fadeOnPrimary ? 0 : ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
hide() {
vfunc_hide() {
if (this._restackedNotifyId > 0) {
Main.overview.disconnect(this._restackedNotifyId);
this._restackedNotifyId = 0;
@ -655,6 +609,8 @@ class WorkspacesDisplay extends St.Widget {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].destroy();
this._workspacesViews = [];
super.vfunc_hide();
}
_workspacesOnlyOnPrimaryChanged() {
@ -664,6 +620,7 @@ class WorkspacesDisplay extends St.Widget {
return;
this._updateWorkspacesViews();
this._syncWorkspacesActualGeometry();
}
_updateWorkspacesViews() {
@ -680,17 +637,9 @@ class WorkspacesDisplay extends St.Widget {
else
view = new WorkspacesView(i, this._scrollAdjustment);
// HACK: Avoid spurious allocation changes while updating views
view.hide();
this._workspacesViews.push(view);
Main.layoutManager.overviewGroup.add_actor(view);
}
this._workspacesViews.forEach(v => v.show());
this._updateWorkspacesFullGeometry();
this._updateWorkspacesActualGeometry();
}
_getMonitorIndexForEvent(event) {
@ -737,40 +686,35 @@ class WorkspacesDisplay extends St.Widget {
});
}
// This geometry should always be the fullest geometry
// the workspaces switcher can ever be allocated, as if
// the sliding controls were never slid in at all.
setWorkspacesFullGeometry(geom) {
this._fullGeometry = geom;
this._updateWorkspacesFullGeometry();
}
_updateWorkspacesFullGeometry() {
if (!this._workspacesViews.length)
return;
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
let geometry = i == this._primaryIndex ? this._fullGeometry : monitors[i];
this._workspacesViews[i].setFullGeometry(geometry);
}
}
_updateWorkspacesActualGeometry() {
if (!this._workspacesViews.length)
const [x, y] = this.get_transformed_position();
const width = this.allocation.get_width();
const height = this.allocation.get_height();
this._actualGeometry = { x, y, width, height };
if (this._syncActualGeometryLater > 0)
return;
let [x, y] = this.get_transformed_position();
let allocation = this.allocation;
let width = allocation.x2 - allocation.x1;
let height = allocation.y2 - allocation.y1;
let primaryGeometry = { x, y, width, height };
this._syncActualGeometryLater =
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._syncWorkspacesActualGeometry();
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
let geometry = i == this._primaryIndex ? primaryGeometry : monitors[i];
this._workspacesViews[i].setActualGeometry(geometry);
}
this._syncActualGeometryLater = 0;
return GLib.SOURCE_REMOVE;
});
}
_syncWorkspacesActualGeometry() {
const primaryView = this._getPrimaryView();
if (!primaryView)
return;
primaryView.ease({
...this._actualGeometry,
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
_onRestacked(overview, stackIndices) {
@ -815,7 +759,7 @@ class WorkspacesDisplay extends St.Widget {
this._canScroll = false;
this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
WORKSPACE_SWITCH_TIME, () => {
SCROLL_TIMEOUT_TIME, () => {
this._canScroll = true;
this._scrollTimeoutId = 0;
return GLib.SOURCE_REMOVE;

View File

@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.37.1',
version: '3.37.3',
meson_version: '>= 0.53.0',
license: 'GPLv2+'
)
@ -25,7 +25,7 @@ gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.65.1'
gtk_req = '>= 3.15.0'
mutter_req = '>= 3.37.1'
mutter_req = '>= 3.37.3'
polkit_req = '>= 0.100'
schemas_req = '>= 3.33.1'
startup_req = '>= 0.11'

View File

@ -56,6 +56,7 @@ nl
nn
oc
or
os
pa
pl
pt

1418
po/ca.po

File diff suppressed because it is too large Load Diff

439
po/de.po
View File

@ -22,9 +22,9 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-20 06:42+0100\n"
"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"POT-Creation-Date: 2020-05-15 03:04+0000\n"
"PO-Revision-Date: 2020-05-24 00:19+0200\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
@ -409,68 +409,12 @@ msgstr ""
msgid "Network Login"
msgstr "Netzwerkanmeldung"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Erweiterungen"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Ihre GNOME-Erweiterungen verwalten"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME-Erweiterungen dient der Aktualisierung von Erweiterungen, dem "
"Konfigurieren der Voreinstellungen von Erweiterungen und dem Entfernen oder "
"Deaktivieren nicht gewünschter Erweiterungen."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "GNOME-Shell-Erweiterungen einrichten"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "»%s« entfernen?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Wenn Sie die Erweiterung entfernen, müssen Sie sie erneut herunterladen, um "
"sie wieder zu aktivieren"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Abbrechen"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Entfernen"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Tim Sabsch <tim@sabsch.com>\n"
"Christian Kirbach <christian.kirbach@gmail.com>, 2020"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Etwas ist schiefgelaufen"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -480,106 +424,25 @@ msgstr ""
"Erweiterung können nicht angezeigt werden. Wir empfehlen, dass Sie diesen "
"Fehler den Autoren der Erweiterung melden."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Technische Details"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Kopierfehler"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Homepage"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Internetseite der Erweiterung besuchen"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d Erweiterung wird bei der nächsten Anmeldung aktualisiert."
msgstr[1] "%d Erweiterungen werden bei der nächsten Anmeldung aktualisiert."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschreibung"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webseite"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Entfernen …"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hilfe"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Info zu Erweiterungen"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Besuchen Sie <a href=\"https://extensions.gnome.org\">extensions.gnome.org</"
"a>, um Erweiterungen zu finden und hinzuzufügen."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warnung"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Erweiterungen können Probleme am System verursachen, darunter auch "
"Leistungsprobleme. Sollten Sie auf Probleme mit Ihrem System stoßen, wird "
"die Deaktivierung aller Erweiterungen empfohlen."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Manuell installiert"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Mitgeliefert"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Keine installierten Erweiterungen"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Tut uns sehr leid, wir konnten keine Liste der installierten Erweiterungen "
"aufstellen. Stellen Sie sicher, dass Sie in GNOME angemeldet sind und "
"versuchen Sie es dann erneut."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Abmelden …"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Abbrechen"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -631,71 +494,71 @@ msgid "(or swipe finger)"
msgstr "(oder wischen Sie mit einem Finger)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Ausschalten"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "ausschalten;herunterfahren;neustarten;halten;stoppen"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Bildschirm sperren"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "Bildschirm sperren"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Abmelden"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "abmelden;verlassen"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Bereitschaft"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "Bereitschaft;Schlafen"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Benutzer wechseln"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "Benutzer wechseln"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "Hochformat;Querformat;sperren;entsperren;Bildschirm;Drehung;drehen"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Bildschirmdrehung entsperren"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Bildschirmdrehung sperren"
@ -861,54 +724,54 @@ msgstr "Zugriff verhindern"
msgid "Grant Access"
msgstr "Zugriff gewähren"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Unbenannter Ordner"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Häufig genutzte Anwendungen erscheinen hier"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Häufig"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Alle"
# Fensterüberschrift
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Offene Fenster"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Neues Fenster"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Mit dedizierter Grafikkarte starten"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Details anzeigen"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s wurde zu Ihren Favoriten hinzugefügt."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt."
@ -929,7 +792,7 @@ msgstr "Kopfhörer"
msgid "Headset"
msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Mikrofon"
@ -1070,7 +933,7 @@ msgstr "Keine Termine"
msgid "Do Not Disturb"
msgstr "Nicht stören"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Leeren"
@ -1223,7 +1086,7 @@ msgstr ""
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s heißt jetzt %s"
@ -1268,23 +1131,23 @@ msgstr "Weltuhren hinzufügen …"
msgid "World Clocks"
msgstr "Weltuhren"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Wetter"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Ort auswählen …"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Wird geladen …"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Wetterinformationen sind momentan nicht verfügbar"
@ -1425,35 +1288,35 @@ msgid "Other users are logged in"
msgstr "Andere Benutzer sind angemeldet"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (Entfernt)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (Konsole)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Installieren"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Erweiterung installieren"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Aktualisierungen für Erweiterungen verfügbar"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Aktualisierungen für Erweiterungen stehen bereit zur Installation."
@ -1602,11 +1465,11 @@ msgstr "Quelle zeigen"
msgid "Web Page"
msgstr "Webseite"
#: js/ui/main.js:274
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Als privilegierter Benutzer angemeldet"
#: js/ui/main.js:275
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1615,23 +1478,23 @@ msgstr ""
"Sicherheitsgründen unterlassen werden. Falls möglich, melden Sie sich bitte "
"als normaler Benutzer an."
#: js/ui/main.js:281
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Bildschirmsperre deaktiviert"
#: js/ui/main.js:282
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Die Sperrung des Bildschirms erfordert den GNOME Display-Manager."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Systeminformationen"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:204
msgid "Unknown artist"
msgstr "Unbekannter Künstler"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:214
msgid "Unknown title"
msgstr "Unbekannter Titel"
@ -1703,16 +1566,16 @@ msgstr "Beenden"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Aktivitäten"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Oberes Panel"
@ -1743,11 +1606,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert"
@ -1830,13 +1693,13 @@ msgid "The PIM must be a number or empty."
msgstr "Die PIM muss eine Nummer oder leer sein."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "%s konnte nicht gestartet werden"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Die Anwendung %s konnte nicht gefunden werden"
@ -2320,11 +2183,11 @@ msgstr "Thunderbolt-Legitimierungsfehler"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Lautstärke geändert"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Lautstärke"
@ -2358,23 +2221,23 @@ msgstr "Nur eingebaut"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A, %d. %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Nach oben wischen zum Entsperren"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Durch Mausklick oder Tastendruck entsperren"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Fenster entsperren"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Als anderer Benutzer anmelden"
@ -2407,7 +2270,7 @@ msgstr "Zurücksetzen"
msgid "Keep Changes"
msgstr "Beibehalten"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2417,7 +2280,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2512,12 +2375,12 @@ msgstr ""
msgid "List possible modes"
msgstr "Die möglichen Modi auflisten"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Unbekannt"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "»%s« konnte nicht gestartet werden"
@ -2534,6 +2397,143 @@ msgstr "Es muss ein Passwort angegeben werden"
msgid "Authentication dialog was dismissed by the user"
msgstr "Der Dialog zur Anmeldung wurde vom Benutzer geschlossen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Erweiterungen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Ihre GNOME-Erweiterungen verwalten"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME-Erweiterungen dient der Aktualisierung von Erweiterungen, dem "
"Konfigurieren der Voreinstellungen von Erweiterungen und dem Entfernen oder "
"Deaktivieren nicht gewünschter Erweiterungen."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "GNOME-Shell-Erweiterungen einrichten"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "»%s« entfernen?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Wenn Sie die Erweiterung entfernen, müssen Sie sie erneut herunterladen, um "
"sie wieder zu aktivieren"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Entfernen"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Tim Sabsch <tim@sabsch.com>\n"
"Christian Kirbach <christian.kirbach@gmail.com>, 2020"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d Erweiterung wird bei der nächsten Anmeldung aktualisiert."
msgstr[1] "%d Erweiterungen werden bei der nächsten Anmeldung aktualisiert."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschreibung"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webseite"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Entfernen …"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hilfe"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Info zu Erweiterungen"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Besuchen Sie <a href=\"https://extensions.gnome.org\">extensions.gnome.org</"
"a>, um Erweiterungen zu finden und hinzuzufügen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warnung"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Erweiterungen können Probleme am System verursachen, darunter auch "
"Leistungsprobleme. Sollten Sie auf Probleme mit Ihrem System stoßen, wird "
"die Deaktivierung aller Erweiterungen empfohlen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Manuell installiert"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Mitgeliefert"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Keine installierten Erweiterungen"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Tut uns sehr leid, wir konnten keine Liste der installierten Erweiterungen "
"aufstellen. Stellen Sie sicher, dass Sie in GNOME angemeldet sind und "
"versuchen Sie es dann erneut."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Aktualisierungen für Erweiterungen stehen bereit"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Abmelden …"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2872,6 +2872,9 @@ msgstr[1] "%u Eingänge"
msgid "System Sounds"
msgstr "Systemklänge"
#~ msgid "Copy Error"
#~ msgstr "Kopierfehler"
#~ msgid "Username…"
#~ msgstr "Benutzername …"

View File

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-02-21 09:52+0000\n"
"PO-Revision-Date: 2020-02-23 12:49+0000\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-05-06 19:54+0100\n"
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
"Language-Team: English - United Kingdom <en@li.org>\n"
"Language: en_GB\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.34.0\n"
"X-Generator: Gtranslator 3.36.0\n"
"X-Project-Style: gnome\n"
#: data/50-gnome-shell-system.xml:6
@ -46,15 +46,6 @@ msgstr "Show all applications"
msgid "Open the application menu"
msgstr "Open the application menu"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configure GNOME Shell Extensions"
#: data/org.gnome.Shell.desktop.in.in:4
msgid "GNOME Shell"
msgstr "GNOME Shell"
@ -395,49 +386,12 @@ msgstr "Delay focus changes in mouse mode until the pointer stops moving"
msgid "Network Login"
msgstr "Network Login"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remove “%s”?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
#: js/extensionPrefs/main.js:144 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:107 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:165
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913
msgid "Cancel"
msgstr "Cancel"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Remove"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr ""
"Philip Withnall <philip@tecnocode.co.uk>\n"
"Bruce Cowan <bruce@bcowan.me.uk>\n"
"Chris Leonard <cjl@laptop.org>\n"
"David King <amigadave@amigadave.com>\n"
"Zander Brown <zbrown@gnome.org>"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Manage your GNOME Extensions"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong"
msgstr "Somethings gone wrong"
#: js/extensionPrefs/main.js:268
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -447,113 +401,32 @@ msgstr ""
"extension cant be displayed. We recommend that you report the issue to the "
"extension authors."
#: js/extensionPrefs/main.js:275
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Technical Details"
#: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "Copy Error"
#: js/extensionPrefs/main.js:337
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Homepage"
#: js/extensionPrefs/main.js:338
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Visit extension homepage"
#: js/extensionPrefs/main.js:449
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension will be updated on next login."
msgstr[1] "%d extensions will be updated on next login."
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Author"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remove…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Help"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "About Extensions"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warning"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Manually Installed"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Built-In"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "No Installed Extensions"
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Log Out…"
msgstr "Log Out…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Cancel"
#. Cisco LEAP
#: js/gdm/authPrompt.js:236 js/ui/components/networkAgent.js:202
#: js/ui/components/networkAgent.js:218 js/ui/components/networkAgent.js:242
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:283
#: js/ui/components/networkAgent.js:293 js/ui/components/polkitAgent.js:277
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
#: js/ui/components/networkAgent.js:220 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:295 js/ui/components/polkitAgent.js:277
#: js/ui/shellMountOperation.js:326
#| msgid "Password:"
msgid "Password"
msgstr "Password"
@ -575,9 +448,8 @@ msgstr "(e.g., user or %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:238
#: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:279
#| msgid "Username: "
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:240
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username"
msgstr "Username"
@ -758,7 +630,7 @@ msgstr "%A, %H%M"
#: js/misc/util.js:255
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%d %B, %H%M"
msgstr "%-d %B, %H%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
@ -766,7 +638,7 @@ msgstr "%d %B, %H%M"
#: js/misc/util.js:261
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%d %B %Y, %H%M"
msgstr "%-d %B %Y, %H%M"
#. Show only the time if date is on today
#. eslint-disable-line no-lonely-if
@ -795,7 +667,7 @@ msgstr "%A, %l:%M %p"
#: js/misc/util.js:284
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%d %B, %l%M %p"
msgstr "%-d %B, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
@ -803,7 +675,7 @@ msgstr "%d %B, %l%M %p"
#: js/misc/util.js:290
#, no-c-format
msgid "%B %-d %Y, %l%M %p"
msgstr "%d %B %Y, %l%M %p"
msgstr "%-d %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:41
@ -828,44 +700,44 @@ msgstr "Deny Access"
msgid "Grant Access"
msgstr "Grant Access"
#: js/ui/appDisplay.js:906
#: js/ui/appDisplay.js:932
msgid "Unnamed Folder"
msgstr "Unnamed Folder"
#: js/ui/appDisplay.js:929
#: js/ui/appDisplay.js:955
msgid "Frequently used applications will appear here"
msgstr "Frequently used applications will appear here"
#: js/ui/appDisplay.js:1064
#: js/ui/appDisplay.js:1090
msgid "Frequent"
msgstr "Frequent"
#: js/ui/appDisplay.js:1071
#: js/ui/appDisplay.js:1097
msgid "All"
msgstr "All"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2450 js/ui/panel.js:75
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Open Windows"
#: js/ui/appDisplay.js:2470 js/ui/panel.js:82
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
msgid "New Window"
msgstr "New Window"
#: js/ui/appDisplay.js:2481
#: js/ui/appDisplay.js:2504
msgid "Launch using Dedicated Graphics Card"
msgstr "Launch using Dedicated Graphics Card"
#: js/ui/appDisplay.js:2509 js/ui/dash.js:239
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Remove from Favourites"
#: js/ui/appDisplay.js:2515
#: js/ui/appDisplay.js:2538
msgid "Add to Favorites"
msgstr "Add to Favourites"
#: js/ui/appDisplay.js:2525 js/ui/panel.js:93
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
msgid "Show Details"
msgstr "Show Details"
@ -895,7 +767,7 @@ msgstr "Headphones"
msgid "Headset"
msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Microphone"
@ -1013,30 +885,30 @@ msgid "All Day"
msgstr "All Day"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867
#: js/ui/calendar.js:868
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %d %B"
msgstr "%A, %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:870
#: js/ui/calendar.js:871
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %d %B, %Y"
msgstr "%A, %-d %B, %Y"
#: js/ui/calendar.js:1096
#: js/ui/calendar.js:1100
msgid "No Notifications"
msgstr "No Notifications"
#: js/ui/calendar.js:1099
#: js/ui/calendar.js:1103
msgid "No Events"
msgstr "No Events"
#: js/ui/calendar.js:1153
#: js/ui/calendar.js:1157
msgid "Do Not Disturb"
msgstr "Do Not Disturb"
#: js/ui/calendar.js:1167
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Clear"
@ -1083,43 +955,39 @@ msgstr "The installed udisks version does not support the PIM setting"
msgid "Open with %s"
msgstr "Open with %s"
#: js/ui/components/networkAgent.js:89
#: js/ui/components/networkAgent.js:91
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr ""
"Alternatively you can connect by pushing the “WPS” button on your router."
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:103 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:916
msgid "Connect"
msgstr "Connect"
#: js/ui/components/networkAgent.js:208
#| msgid "Key: "
#: js/ui/components/networkAgent.js:210
msgid "Key"
msgstr "Key"
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:269
#| msgid "Private key password: "
#: js/ui/components/networkAgent.js:248 js/ui/components/networkAgent.js:271
msgid "Private key password"
msgstr "Private key password"
#: js/ui/components/networkAgent.js:267
#| msgid "Identity: "
#: js/ui/components/networkAgent.js:269
msgid "Identity"
msgstr "Identity"
#: js/ui/components/networkAgent.js:281
#| msgid "Service: "
#: js/ui/components/networkAgent.js:283
msgid "Service"
msgstr "Service"
#: js/ui/components/networkAgent.js:310 js/ui/components/networkAgent.js:338
#: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:340
#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700
msgid "Authentication required"
msgstr "Authentication required"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:680
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -1128,44 +996,42 @@ msgstr ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
#: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:684
msgid "Wired 802.1X authentication"
msgstr "Wired 802.1X authentication"
#: js/ui/components/networkAgent.js:317
#| msgid "Network name: "
#: js/ui/components/networkAgent.js:319
msgid "Network name"
msgstr "Network name"
#: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:694
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:688
msgid "DSL authentication"
msgstr "DSL authentication"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:699
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:693
msgid "PIN code required"
msgstr "PIN code required"
#: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:700
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:694
msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN code is needed for the mobile broadband device"
#: js/ui/components/networkAgent.js:331
#| msgid "PIN: "
#: js/ui/components/networkAgent.js:333
msgid "PIN"
msgstr "PIN"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:707
#: js/ui/components/networkAgent.js:711
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:685
#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701
#: js/ui/components/networkAgent.js:705
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "A password is required to connect to “%s”."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1691
#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1691
msgid "Network Manager"
msgstr "Network Manager"
#: js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:704
msgid "VPN password"
msgstr "VPN password"
@ -1191,7 +1057,7 @@ msgstr "Sorry, that didnt work. Please try again."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s is now known as %s"
@ -1217,7 +1083,7 @@ msgstr "Dash"
#.
#: js/ui/dateMenu.js:75
msgid "%B %-d %Y"
msgstr "%e %B %Y"
msgstr "%-d %B %Y"
#. Translators: This is the accessible name of the date button shown
#. * below the time in the shell; it should combine the weekday and the
@ -1235,106 +1101,106 @@ msgstr "Add world clocks…"
msgid "World Clocks"
msgstr "World Clocks"
#: js/ui/dateMenu.js:276
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Weather"
#: js/ui/dateMenu.js:391
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Select a location…"
#: js/ui/dateMenu.js:404
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Loading…"
#: js/ui/dateMenu.js:414
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Go online for weather information"
#: js/ui/dateMenu.js:416
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Weather information is currently unavailable"
#: js/ui/endSessionDialog.js:37
#: js/ui/endSessionDialog.js:39
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Log Out %s"
#: js/ui/endSessionDialog.js:38
#: js/ui/endSessionDialog.js:40
msgctxt "title"
msgid "Log Out"
msgstr "Log Out"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:42
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s will be logged out automatically in %d second."
msgstr[1] "%s will be logged out automatically in %d seconds."
#: js/ui/endSessionDialog.js:45
#: js/ui/endSessionDialog.js:47
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "You will be logged out automatically in %d second."
msgstr[1] "You will be logged out automatically in %d seconds."
#: js/ui/endSessionDialog.js:51
#: js/ui/endSessionDialog.js:53
msgctxt "button"
msgid "Log Out"
msgstr "Log Out"
#: js/ui/endSessionDialog.js:56
#: js/ui/endSessionDialog.js:58
msgctxt "title"
msgid "Power Off"
msgstr "Power Off"
#: js/ui/endSessionDialog.js:57
#: js/ui/endSessionDialog.js:59
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Install Updates & Power Off"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:61
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "The system will power off automatically in %d second."
msgstr[1] "The system will power off automatically in %d seconds."
#: js/ui/endSessionDialog.js:63
#: js/ui/endSessionDialog.js:65
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Install pending software updates"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
msgctxt "button"
msgid "Restart"
msgstr "Restart"
#: js/ui/endSessionDialog.js:68
#: js/ui/endSessionDialog.js:70
msgctxt "button"
msgid "Power Off"
msgstr "Power Off"
#: js/ui/endSessionDialog.js:74
#: js/ui/endSessionDialog.js:76
msgctxt "title"
msgid "Restart"
msgstr "Restart"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:78
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "The system will restart automatically in %d second."
msgstr[1] "The system will restart automatically in %d seconds."
#: js/ui/endSessionDialog.js:89
#: js/ui/endSessionDialog.js:91
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Restart & Install Updates"
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:93
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1344,22 +1210,22 @@ msgstr[0] ""
msgstr[1] ""
"The system will automatically restart and install updates in %d seconds."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Restart &amp; Install"
#: js/ui/endSessionDialog.js:98
#: js/ui/endSessionDialog.js:100
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Install &amp; Power Off"
#: js/ui/endSessionDialog.js:99
#: js/ui/endSessionDialog.js:101
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Power off after updates are installed"
#: js/ui/endSessionDialog.js:106
#: js/ui/endSessionDialog.js:108
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Restart & Install Upgrade"
@ -1367,7 +1233,7 @@ msgstr "Restart & Install Upgrade"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111
#: js/ui/endSessionDialog.js:113
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1376,15 +1242,15 @@ msgstr ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
#: js/ui/endSessionDialog.js:259
#: js/ui/endSessionDialog.js:261
msgid "Running on battery power: Please plug in before installing updates."
msgstr "Running on battery power: Please plug in before installing updates."
#: js/ui/endSessionDialog.js:268
#: js/ui/endSessionDialog.js:270
msgid "Some applications are busy or have unsaved work"
msgstr "Some applications are busy or have unsaved work"
#: js/ui/endSessionDialog.js:273
#: js/ui/endSessionDialog.js:275
msgid "Other users are logged in"
msgstr "Other users are logged in"
@ -1400,24 +1266,24 @@ msgstr "%s (remote)"
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:169
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Install"
#: js/ui/extensionDownloader.js:175
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Install Extension"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Download and install “%s” from extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:233
msgid "Extension Updates Available"
msgstr "Extension Updates Available"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:234
msgid "Extension updates are ready to be installed."
msgstr "Extension updates are ready to be installed."
@ -1564,11 +1430,11 @@ msgstr "View Source"
msgid "Web Page"
msgstr "Web Page"
#: js/ui/main.js:269
#: js/ui/main.js:277
msgid "Logged in as a privileged user"
msgstr "Logged in as a privileged user"
#: js/ui/main.js:270
#: js/ui/main.js:278
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1576,15 +1442,15 @@ msgstr ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
#: js/ui/main.js:276
#: js/ui/main.js:317
msgid "Screen Lock disabled"
msgstr "Screen Lock disabled"
#: js/ui/main.js:277
#: js/ui/main.js:318
msgid "Screen Locking requires the GNOME display manager."
msgstr "Screen Locking requires the GNOME display manager."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1551
msgid "System Information"
msgstr "System Information"
@ -1611,7 +1477,6 @@ msgstr "Overview"
#. active; it should not exceed ~30
#. characters.
#: js/ui/overview.js:107
#| msgid "Type to search…"
msgid "Type to search"
msgstr "Type to search"
@ -1669,12 +1534,12 @@ msgstr "Quit"
msgid "Activities"
msgstr "Activities"
#: js/ui/panel.js:707
#: js/ui/panel.js:713
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: js/ui/panel.js:820
#: js/ui/panel.js:826
msgid "Top Bar"
msgstr "Top Bar"
@ -1769,7 +1634,6 @@ msgstr ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
#: js/ui/shellMountOperation.js:306
#| msgid "Enter PIM Number…"
msgid "PIM Number"
msgstr "PIM Number"
@ -1792,13 +1656,13 @@ msgid "The PIM must be a number or empty."
msgstr "The PIM must be a number or empty."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Unable to start %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Couldnt find the %s application"
@ -2271,11 +2135,11 @@ msgstr "Thunderbolt authorisation error"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Could not authorise the Thunderbolt device: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume changed"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2309,24 +2173,26 @@ msgstr "Built-in Only"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:372
#| msgctxt "calendar heading"
#| msgid "%A, %B %-d"
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:378
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Swipe up to unlock"
#: js/ui/unlockDialog.js:379
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Click or press a key to unlock"
#: js/ui/unlockDialog.js:552
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Unlock Window"
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Log in as another user"
#: js/ui/viewSelector.js:181
msgid "Applications"
msgstr "Applications"
@ -2442,19 +2308,19 @@ msgstr "Close"
msgid "Evolution Calendar"
msgstr "Evolution Calendar"
#: src/main.c:460 subprojects/extensions-tool/src/main.c:249
#: src/main.c:458 subprojects/extensions-tool/src/main.c:249
msgid "Print version"
msgstr "Print version"
#: src/main.c:466
#: src/main.c:464
msgid "Mode used by GDM for login screen"
msgstr "Mode used by GDM for login screen"
#: src/main.c:472
#: src/main.c:470
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Use a specific mode, e.g. “gdm” for login screen"
#: src/main.c:478
#: src/main.c:476
msgid "List possible modes"
msgstr "List possible modes"
@ -2480,6 +2346,140 @@ msgstr "Password cannot be blank"
msgid "Authentication dialog was dismissed by the user"
msgstr "Authentication dialogue was dismissed by the user"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Manage your GNOME Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configure GNOME Shell Extensions"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remove “%s”?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Remove"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Philip Withnall <philip@tecnocode.co.uk>\n"
"Bruce Cowan <bruce@bcowan.me.uk>\n"
"Chris Leonard <cjl@laptop.org>\n"
"David King <amigadave@amigadave.com>\n"
"Zander Brown <zbrown@gnome.org>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension will be updated on next login."
msgstr[1] "%d extensions will be updated on next login."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Author"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remove…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Help"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "About Extensions"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warning"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Manually Installed"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Built-In"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "No Installed Extensions"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Log Out…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2627,7 +2627,6 @@ msgid "Show extensions with preferences"
msgstr "Show extensions with preferences"
#: subprojects/extensions-tool/src/command-list.c:140
#| msgid "Show extensions with preferences"
msgid "Show extensions with updates"
msgstr "Show extensions with updates"
@ -2818,6 +2817,9 @@ msgstr[1] "%u Inputs"
msgid "System Sounds"
msgstr "System Sounds"
#~ msgid "Copy Error"
#~ msgstr "Copy Error"
#~ msgid "Next"
#~ msgstr "Next"
@ -2844,9 +2846,6 @@ msgstr "System Sounds"
#~ msgstr[0] "%d new notification"
#~ msgstr[1] "%d new notifications"
#~ msgid "Log in as another user"
#~ msgstr "Log in as another user"
#~| msgid "Shell Extensions"
#~ msgid "org.gnome.Extensions"
#~ msgstr "org.gnome.Extensions"

474
po/es.po

File diff suppressed because it is too large Load Diff

254
po/fa.po
View File

@ -2,15 +2,15 @@
# Copyright (C) 2010-2011 Iranian Free Software Users Group (IFSUG.org)translation team.
# This file is distributed under the same license as the gnome-shell package.
# Mahyar Moghimi <mahyar.moqimi@gmail.com>, 2010.
# Arash Mousavi <mousavi.arash@gmail.com>, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017.
# Danial behzadi <dani.behzi@ubuntu.com>, 2018, 2019, 2020.
# Arash Mousavi <mousavi.arash@gmail.com>, 2010-2017.
# Danial behzadi <dani.behzi@ubuntu.com>, 2018-2020.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-04-09 14:00+0000\n"
"PO-Revision-Date: 2020-04-25 00:31+0430\n"
"POT-Creation-Date: 2020-05-12 14:15+0000\n"
"PO-Revision-Date: 2020-05-12 14:22+0000\n"
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
"Language-Team: Persian <>\n"
"Language: fa\n"
@ -396,7 +396,7 @@ msgstr "مشاهدهٔ صفحهٔ خانگی افزونه"
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:917 subprojects/extensions-app/js/main.js:148
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel"
msgstr "لغو"
@ -419,7 +419,7 @@ msgstr "فهرست نشده؟"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:912
#: js/gdm/loginDialog.js:913
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(برای مثال, کاربر یا %s)"
@ -427,12 +427,12 @@ msgstr "(برای مثال, کاربر یا %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:241
#: js/gdm/loginDialog.js:918 js/ui/components/networkAgent.js:241
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username"
msgstr "نام‌کاربری"
#: js/gdm/loginDialog.js:1253
#: js/gdm/loginDialog.js:1254
msgid "Login Window"
msgstr "پنجرهٔ ورود به سامانه"
@ -450,71 +450,71 @@ msgid "(or swipe finger)"
msgstr "(یا انگشتتان را بکشید)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "خاموش کردن"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "power off;shutdown;reboot;restart;خاموش;توقف"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "صفحهٔ قفل"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "قفل کردن صفحه"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "خروج"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "logout;log out;sign off;خروج;خارج"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "تعلیق"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "suspend;sleep;تعلیق;خواب"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "تعویض کاربر"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "تعویض کاربر"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "lock orientation;screen;rotation;قفل;جهت;چرخش;صفحه"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "قفل‌گشایی چرخش صفحه"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "قفل چرخش صفحه"
@ -679,53 +679,57 @@ msgstr "رد دسترسی"
msgid "Grant Access"
msgstr "پذیرفتن دسترسی"
#: js/ui/appDisplay.js:950
#: js/ui/appDisplay.js:944
msgid "Unnamed Folder"
msgstr "پوشهٔ بی‌نام"
#: js/ui/appDisplay.js:973
#: js/ui/appDisplay.js:967
msgid "Frequently used applications will appear here"
msgstr "برنامه‌های بیشتر استفاده شده در اینجا نمایش داده می‌شود"
#: js/ui/appDisplay.js:1108
#: js/ui/appDisplay.js:1102
msgid "Frequent"
msgstr "پُر استفاده"
#: js/ui/appDisplay.js:1115
#: js/ui/appDisplay.js:1109
msgid "All"
msgstr "همه"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2506 js/ui/panel.js:75
#: js/ui/appDisplay.js:2486 js/ui/panel.js:75
msgid "Open Windows"
msgstr "پنجره‌های باز"
#: js/ui/appDisplay.js:2526 js/ui/panel.js:82
#: js/ui/appDisplay.js:2505 js/ui/panel.js:82
msgid "New Window"
msgstr "پنجرهٔ جدید"
#: js/ui/appDisplay.js:2537
msgid "Launch using Dedicated Graphics Card"
msgstr "اجرا با کارت گرافیک اختصاصی"
#: js/ui/appDisplay.js:2521
msgid "Launch using Integrated Graphics Card"
msgstr "اجرا با کارت گرافیک یکپارچه"
#: js/ui/appDisplay.js:2565 js/ui/dash.js:239
#: js/ui/appDisplay.js:2522
msgid "Launch using Discrete Graphics Card"
msgstr "اجرا با کارت گرافیک جداگانه"
#: js/ui/appDisplay.js:2550 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "حذف از مورد پسندها"
#: js/ui/appDisplay.js:2571
#: js/ui/appDisplay.js:2556
msgid "Add to Favorites"
msgstr "افزودن به مورد پسندها"
#: js/ui/appDisplay.js:2581 js/ui/panel.js:93
#: js/ui/appDisplay.js:2566 js/ui/panel.js:93
msgid "Show Details"
msgstr "نمایش جزییات"
#: js/ui/appFavorites.js:163
#: js/ui/appFavorites.js:164
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s به مورد پسندهایتان اضافه شد."
#: js/ui/appFavorites.js:196
#: js/ui/appFavorites.js:197
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s ازمورد پسندهایتان حذف شد."
@ -820,7 +824,7 @@ msgstr "ش"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:372
#: js/ui/calendar.js:397
msgid "%OB"
msgstr "%OB"
@ -833,61 +837,61 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:382
#: js/ui/calendar.js:407
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:441
#: js/ui/calendar.js:466
msgid "Previous month"
msgstr "ماه پیش"
#: js/ui/calendar.js:456
#: js/ui/calendar.js:481
msgid "Next month"
msgstr "ماه بعد"
#: js/ui/calendar.js:606
#: js/ui/calendar.js:631
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%Od"
#: js/ui/calendar.js:662
#: js/ui/calendar.js:687
msgid "Week %V"
msgstr "هفته %OV"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:731
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "تمام روز"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:869
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A %-Od %OB"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:872
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A %-Od %OB %Y"
#: js/ui/calendar.js:1101
#: js/ui/calendar.js:1133
msgid "No Notifications"
msgstr "بدون آگاهی"
#: js/ui/calendar.js:1104
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "بدون رویداد"
#: js/ui/calendar.js:1158
#: js/ui/calendar.js:1190
msgid "Do Not Disturb"
msgstr "مزاحم نشوید"
#: js/ui/calendar.js:1177
#: js/ui/calendar.js:1209
msgid "Clear"
msgstr "پاک‌سازی"
@ -929,7 +933,7 @@ msgstr "ناتوانی در قفل‌گشایی حجم"
msgid "The installed udisks version does not support the PIM setting"
msgstr "نگارش نصب‌شدهٔ udisk از تنظیمات PIM پشتیبانی نمی‌کند"
#: js/ui/components/autorunManager.js:333
#: js/ui/components/autorunManager.js:332
#, javascript-format
msgid "Open with %s"
msgstr "گشودن با %s"
@ -939,7 +943,7 @@ msgid "Alternatively you can connect by pushing the “WPS” button on your rou
msgstr "به عنوان جایگزین می‌توانید با فشردن دکمهٔ WPS روی مسیریابتان، وصل شوید."
#: js/ui/components/networkAgent.js:104 js/ui/status/network.js:227
#: js/ui/status/network.js:318 js/ui/status/network.js:920
#: js/ui/status/network.js:318 js/ui/status/network.js:919
msgid "Connect"
msgstr "اتّصال"
@ -1001,7 +1005,7 @@ msgstr "پین"
msgid "A password is required to connect to “%s”."
msgstr "برای اتصال به «%s» گذرواژه لازم است."
#: js/ui/components/networkAgent.js:669 js/ui/status/network.js:1695
#: js/ui/components/networkAgent.js:669 js/ui/status/network.js:1694
msgid "Network Manager"
msgstr "مدیر شبکه"
@ -1336,13 +1340,13 @@ msgid "Leave On"
msgstr "روشن گذاشتن"
#: js/ui/kbdA11yDialog.js:55 js/ui/status/bluetooth.js:156
#: js/ui/status/network.js:1292
#: js/ui/status/network.js:1291
msgid "Turn On"
msgstr "روشن کردن"
#: js/ui/kbdA11yDialog.js:63 js/ui/status/bluetooth.js:156
#: js/ui/status/network.js:135 js/ui/status/network.js:319
#: js/ui/status/network.js:1292 js/ui/status/network.js:1404
#: js/ui/status/network.js:1291 js/ui/status/network.js:1403
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
#: js/ui/status/rfkill.js:108
msgid "Turn Off"
@ -1356,59 +1360,59 @@ msgstr "خاموش گذاشتن"
msgid "Region & Language Settings"
msgstr "تنظیمات ناحیه و زبان"
#: js/ui/lookingGlass.js:665
#: js/ui/lookingGlass.js:664
msgid "No extensions installed"
msgstr "هیچ افزونه‌ای نصب نشده است"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:720
#: js/ui/lookingGlass.js:719
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "افزونه %s هیچ خطایی منتشر نکرده است."
#: js/ui/lookingGlass.js:726
#: js/ui/lookingGlass.js:725
msgid "Hide Errors"
msgstr "مخفی کردن خطاها"
#: js/ui/lookingGlass.js:730 js/ui/lookingGlass.js:795
#: js/ui/lookingGlass.js:729 js/ui/lookingGlass.js:794
msgid "Show Errors"
msgstr "نمایش خطاها"
#: js/ui/lookingGlass.js:739
#: js/ui/lookingGlass.js:738
msgid "Enabled"
msgstr "به کار انداختن"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:742 subprojects/gvc/gvc-mixer-control.c:1892
#: js/ui/lookingGlass.js:741 subprojects/gvc/gvc-mixer-control.c:1892
msgid "Disabled"
msgstr "از کار انداختن"
#: js/ui/lookingGlass.js:744
#: js/ui/lookingGlass.js:743
msgid "Error"
msgstr "خطا"
#: js/ui/lookingGlass.js:746
#: js/ui/lookingGlass.js:745
msgid "Out of date"
msgstr "قدیمی"
#: js/ui/lookingGlass.js:748
#: js/ui/lookingGlass.js:747
msgid "Downloading"
msgstr "در حال بارگیری"
#: js/ui/lookingGlass.js:777
#: js/ui/lookingGlass.js:776
msgid "View Source"
msgstr "نمایش منبع"
#: js/ui/lookingGlass.js:786
#: js/ui/lookingGlass.js:785
msgid "Web Page"
msgstr "صفحهٔ وب"
#: js/ui/main.js:284
#: js/ui/main.js:297
msgid "Logged in as a privileged user"
msgstr "واردشده به عنوان کاربری ممتاز"
#: js/ui/main.js:285
#: js/ui/main.js:298
msgid ""
"Running a session as a privileged user should be avoided for security reasons. If "
"possible, you should log in as a normal user."
@ -1416,15 +1420,15 @@ msgstr ""
"به دلایل امنیتی باید از اجرای یک نشست به عنوان کاربری ممتاز خودداری کرد. در صورت "
"امکان، با کاربری عادی وارد شوید."
#: js/ui/main.js:324
#: js/ui/main.js:337
msgid "Screen Lock disabled"
msgstr "قفل صفحه از کار افتاده"
#: js/ui/main.js:325
#: js/ui/main.js:338
msgid "Screen Locking requires the GNOME display manager."
msgstr "قفل صفحه نیاز به مدیر نمایش گنوم دارد."
#: js/ui/messageTray.js:1551
#: js/ui/messageTray.js:1547
msgid "System Information"
msgstr "اطلاعات سامانه"
@ -1504,16 +1508,16 @@ msgstr "خروج"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:432
#: js/ui/panel.js:435
msgid "Activities"
msgstr "فعّالیت‌ها"
#: js/ui/panel.js:711
#: js/ui/panel.js:714
msgctxt "System menu in the top bar"
msgid "System"
msgstr "سامانه"
#: js/ui/panel.js:824
#: js/ui/panel.js:827
msgid "Top Bar"
msgstr "نوار بالا"
@ -1544,23 +1548,23 @@ msgstr "لازم است گنوم صفحه را قفل کند"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
#: js/ui/screenShield.js:244 js/ui/screenShield.js:602
msgid "Unable to lock"
msgstr "نمی‌توان قفل کرد"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
#: js/ui/screenShield.js:245 js/ui/screenShield.js:603
msgid "Lock was blocked by an application"
msgstr "قفل توسط یک برنامه مسدود شده بود"
#: js/ui/search.js:703
#: js/ui/search.js:702
msgid "Searching…"
msgstr "درحال جست‌وجو…"
#: js/ui/search.js:705
#: js/ui/search.js:704
msgid "No results."
msgstr "بدون نتیجه."
#: js/ui/search.js:831
#: js/ui/search.js:830
#, javascript-format
msgid "%d more"
msgid_plural "%d more"
@ -1776,7 +1780,7 @@ msgid "<unknown>"
msgstr "<ناشناخته>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:424 js/ui/status/network.js:1321
#: js/ui/status/network.js:424 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s خاموش است"
@ -1802,7 +1806,7 @@ msgid "%s Disconnecting"
msgstr "درحال قطع ارتباط %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:442 js/ui/status/network.js:1313
#: js/ui/status/network.js:442 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "درحال اتصال %s"
@ -1842,7 +1846,7 @@ msgid "Mobile Broadband Settings"
msgstr "تنظیمات پهن‌باند همراه"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:562 js/ui/status/network.js:1318
#: js/ui/status/network.js:562 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "سخت‌افزار %s از کار افتاده"
@ -1858,121 +1862,121 @@ msgstr "%s از کار افتاده"
msgid "Connect to Internet"
msgstr "وصل شدن به اینترنت"
#: js/ui/status/network.js:812
#: js/ui/status/network.js:811
msgid "Airplane Mode is On"
msgstr "حالت هواپیمایی روشن است"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:812
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "در زمان روشن بودن حالت هواپیمایی، وای‌فای از کار می‌افتد."
#: js/ui/status/network.js:814
#: js/ui/status/network.js:813
msgid "Turn Off Airplane Mode"
msgstr "خاموش کردن حالت هواپیمایی"
#: js/ui/status/network.js:823
#: js/ui/status/network.js:822
msgid "Wi-Fi is Off"
msgstr "وای‌فای خاموش است"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:823
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "برای وصل شدن به شبکه باید وای‌فای روشن شود."
#: js/ui/status/network.js:825
#: js/ui/status/network.js:824
msgid "Turn On Wi-Fi"
msgstr "روشن کردن وای‌فای"
#: js/ui/status/network.js:850
#: js/ui/status/network.js:849
msgid "Wi-Fi Networks"
msgstr "شبکه‌های وای‌فای"
#: js/ui/status/network.js:852
#: js/ui/status/network.js:851
msgid "Select a network"
msgstr "شبکه‌ای برگزینید"
#: js/ui/status/network.js:884
#: js/ui/status/network.js:883
msgid "No Networks"
msgstr "هیچ شبکه‌ای نیست"
#: js/ui/status/network.js:905 js/ui/status/rfkill.js:106
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:106
msgid "Use hardware switch to turn off"
msgstr "برای خاموش کردن از کلید سخت‌افزاری استفاده کنید"
#: js/ui/status/network.js:1182
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "گزینش شبکه"
#: js/ui/status/network.js:1188
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "تنظیمات وای‌فای"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1309
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s نقطهٔ داغ فعال"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1324
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s متصل نشد"
#: js/ui/status/network.js:1421
#: js/ui/status/network.js:1420
msgid "connecting…"
msgstr "درحال اتّصال…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1424
#: js/ui/status/network.js:1423
msgid "authentication required"
msgstr "تایید هویت لازم است"
#: js/ui/status/network.js:1426
#: js/ui/status/network.js:1425
msgid "connection failed"
msgstr "اتصال شکست خورد"
#: js/ui/status/network.js:1477
#: js/ui/status/network.js:1476
msgid "VPN Settings"
msgstr "تنظیمات وی‌پی‌ان"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1493
msgid "VPN"
msgstr "وی‌پی‌ان"
#: js/ui/status/network.js:1504
#: js/ui/status/network.js:1503
msgid "VPN Off"
msgstr "وی‌پی‌ان خاموش است"
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:84
#: js/ui/status/network.js:1564 js/ui/status/rfkill.js:84
msgid "Network Settings"
msgstr "تنظیمات شبکه"
#: js/ui/status/network.js:1594
#: js/ui/status/network.js:1593
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "اتّصال سیمی %s"
msgstr[1] "اتّصال سیمی %s"
#: js/ui/status/network.js:1598
#: js/ui/status/network.js:1597
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "اتّصال وای‌فای %s"
msgstr[1] "اتّصال وای‌فای %s"
#: js/ui/status/network.js:1602
#: js/ui/status/network.js:1601
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "اتّصال مودم %s"
msgstr[1] "اتّصال مودم %s"
#: js/ui/status/network.js:1736
#: js/ui/status/network.js:1735
msgid "Connection failed"
msgstr "اتصال شکست خورد"
#: js/ui/status/network.js:1737
#: js/ui/status/network.js:1736
msgid "Activation of network connection failed"
msgstr "فعاّل‌سازی اتّصال شبکه شکست خورد"
@ -2027,11 +2031,11 @@ msgstr "%Id%I02d تا شارژ کامل (%Id٪)"
msgid "%d%%"
msgstr "%Id٪"
#: js/ui/status/remoteAccess.js:44
#: js/ui/status/remoteAccess.js:43
msgid "Screen is Being Shared"
msgstr "صفحه هم‌رسانی می‌شود"
#: js/ui/status/remoteAccess.js:46
#: js/ui/status/remoteAccess.js:45
msgid "Turn off"
msgstr "خاموش کردن"
@ -2042,27 +2046,27 @@ msgstr "خاموش کردن"
msgid "Airplane Mode On"
msgstr "حالت هواپیمایی روشن است"
#: js/ui/status/system.js:103
#: js/ui/status/system.js:102
msgid "Lock"
msgstr "قفل کردن"
#: js/ui/status/system.js:116
#: js/ui/status/system.js:115
msgid "Power Off / Log Out"
msgstr "خاموش کردن / خروج"
#: js/ui/status/system.js:119
#: js/ui/status/system.js:118
msgid "Log Out"
msgstr "خروج"
#: js/ui/status/system.js:131
#: js/ui/status/system.js:130
msgid "Switch User…"
msgstr "تعویض کاربر…"
#: js/ui/status/system.js:145
#: js/ui/status/system.js:144
msgid "Suspend"
msgstr "تعلیق"
#: js/ui/status/system.js:157
#: js/ui/status/system.js:156
msgid "Power Off…"
msgstr "خاموش کردن…"
@ -2186,7 +2190,7 @@ msgstr "بازنشانی تنظیمات"
msgid "Keep Changes"
msgstr "نگه‌داری تغییرات"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2195,7 +2199,7 @@ msgstr[1] "تغییرات تنظیمات در %Id ثانیه بازنشانی م
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%Id × %Id"
@ -2312,13 +2316,13 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "افزونه‌ها"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/js/main.js:184
msgid "Manage your GNOME Extensions"
msgstr "مدیریت افزونه‌های پوستهٔ گنوم"
@ -2338,26 +2342,26 @@ msgstr ""
msgid "Configure GNOME Shell Extensions"
msgstr "پیکربندی افزونه‌های پوستهٔ گنوم"
#: subprojects/extensions-app/js/main.js:144
#: subprojects/extensions-app/js/main.js:145
#, javascript-format
msgid "Remove “%s”?"
msgstr "برداشتن «%s»؟"
#: subprojects/extensions-app/js/main.js:145
#: subprojects/extensions-app/js/main.js:146
msgid ""
"If you remove the extension, you need to return to download it if you want to "
"enable it again"
msgstr "اگر افزونه را بردارید، باید برای به کار انداختن دوباره‌اش، بارگیریش کنید"
#: subprojects/extensions-app/js/main.js:149
#: subprojects/extensions-app/js/main.js:150
msgid "Remove"
msgstr "حذف"
#: subprojects/extensions-app/js/main.js:181
#: subprojects/extensions-app/js/main.js:182
msgid "translator-credits"
msgstr "دانیال بهزادی <dani.behzi@ubuntu.com>"
#: subprojects/extensions-app/js/main.js:313
#: subprojects/extensions-app/js/main.js:314
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
@ -2435,6 +2439,10 @@ msgstr ""
"متأسّفیم، ولی امکان گرفتن فهرست افزونه‌های نصب‌شده نبود. مطمئن شوید که به گنوم وارد "
"شده‌اید و دوباره تلاش کنید."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "به‌روز رسانی‌های افزونه آماده‌اند"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "خروج…"

150
po/fi.po
View File

@ -25,8 +25,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-04-02 09:45+0000\n"
"PO-Revision-Date: 2020-04-13 18:02+0300\n"
"POT-Creation-Date: 2020-05-15 03:04+0000\n"
"PO-Revision-Date: 2020-05-16 14:02+0300\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n"
@ -421,7 +421,7 @@ msgid "Network Login"
msgstr "Verkkokirjautuminen"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Jokin meni pieleen"
@ -448,7 +448,7 @@ msgstr "Käy laajennuksen verkkosivulla"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
@ -504,74 +504,74 @@ msgid "(or swipe finger)"
msgstr "(tai pyyhkäise sormella)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Sammuta"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr ""
"power off;shutdown;reboot;restart;halt;stop;sammuta;käynnistä uudelleen"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Lukitse näyttö"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "lock screen"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Kirjaudu ulos"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "logout;log out;sign off;kirjaudu ulos;uloskirjautuminen;poistu"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Valmiustila"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "suspend;sleep"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Vaihda käyttäjää"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "switch user"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"lock orientation;unlock orientation;screen;rotation;lukitse kierto;lukitse "
"suunta;suunta;kääntö"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Vapauta näytön kierto"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Lukitse näytön kierto"
@ -736,53 +736,53 @@ msgstr "Estä pääsy"
msgid "Grant Access"
msgstr "Salli pääsy"
#: js/ui/appDisplay.js:937
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Nimetön kansio"
#: js/ui/appDisplay.js:960
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Usein käytetyt sovellukset ilmestyvät tänne"
#: js/ui/appDisplay.js:1095
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Käytetyimmät"
#: js/ui/appDisplay.js:1102
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Kaikki"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2478 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Avoimet ikkunat"
#: js/ui/appDisplay.js:2498 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Uusi ikkuna"
#: js/ui/appDisplay.js:2509
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Käynnistä erillisnäytönohjainta käyttäen"
#: js/ui/appDisplay.js:2537 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Poista suosikeista"
#: js/ui/appDisplay.js:2543
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Lisää suosikkeihin"
#: js/ui/appDisplay.js:2553 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Näytä tiedot"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s on lisätty suosikkeihin."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s on poistettu suosikeista."
@ -1155,74 +1155,74 @@ msgstr "Yhdistä verkkoon saadaksesi säätietoja"
msgid "Weather information is currently unavailable"
msgstr "Säätiedot eivät ole juuri nyt saatavilla"
#: js/ui/endSessionDialog.js:39
#: js/ui/endSessionDialog.js:37
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Kirjaa %s ulos"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:38
msgctxt "title"
msgid "Log Out"
msgstr "Kirjaudu ulos"
#: js/ui/endSessionDialog.js:42
#: js/ui/endSessionDialog.js:40
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua."
msgstr[1] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:47
#: js/ui/endSessionDialog.js:45
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua."
msgstr[1] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:53
#: js/ui/endSessionDialog.js:51
msgctxt "button"
msgid "Log Out"
msgstr "Kirjaudu ulos"
#: js/ui/endSessionDialog.js:58
#: js/ui/endSessionDialog.js:56
msgctxt "title"
msgid "Power Off"
msgstr "Sammuta"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:57
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Asenna päivitykset ja sammuta"
#: js/ui/endSessionDialog.js:61
#: js/ui/endSessionDialog.js:59
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua."
msgstr[1] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:65
#: js/ui/endSessionDialog.js:63
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Asenna odottavat ohjelmistopäivitykset"
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
msgctxt "button"
msgid "Restart"
msgstr "Käynnistä uudelleen"
#: js/ui/endSessionDialog.js:70
#: js/ui/endSessionDialog.js:68
msgctxt "button"
msgid "Power Off"
msgstr "Sammuta"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:74
msgctxt "title"
msgid "Restart"
msgstr "Käynnistä uudelleen"
#: js/ui/endSessionDialog.js:78
#: js/ui/endSessionDialog.js:76
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
@ -1231,12 +1231,12 @@ msgstr[0] ""
msgstr[1] ""
"Järjestelmä käynnistyy automaattisesti uudelleen %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:89
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Käynnistä uudelleen ja asenna päivitykset"
#: js/ui/endSessionDialog.js:93
#: js/ui/endSessionDialog.js:91
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1248,22 +1248,22 @@ msgstr[1] ""
"Järjestelmä käynnistyy automaattisesti uudelleen ja asentaa päivitykset %d "
"sekunnin kuluttua."
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Käynnistä uudelleen ja asenna"
#: js/ui/endSessionDialog.js:100
#: js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Asenna ja sammuta"
#: js/ui/endSessionDialog.js:101
#: js/ui/endSessionDialog.js:99
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Sammuta päivitysten asennuksen jälkeen"
#: js/ui/endSessionDialog.js:108
#: js/ui/endSessionDialog.js:106
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Käynnistä uudelleen ja asenna päivitys"
@ -1271,7 +1271,7 @@ msgstr "Käynnistä uudelleen ja asenna päivitys"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:113
#: js/ui/endSessionDialog.js:111
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1281,27 +1281,27 @@ msgstr ""
"voi kestää kauan: varmista varmuuskopioidesi ajantasaisuus ja toimivuus. "
"Kiinnitä kone myös verkkovirtaan."
#: js/ui/endSessionDialog.js:261
#: js/ui/endSessionDialog.js:259
msgid "Running on battery power: Please plug in before installing updates."
msgstr ""
"Laite käy akkuvirralla: kiinnitä verkkovirtaan ennen päivitysten asennusta."
#: js/ui/endSessionDialog.js:270
#: js/ui/endSessionDialog.js:268
msgid "Some applications are busy or have unsaved work"
msgstr "Jotkin sovellukset ovat kiireisiä tai sisältävät tallentamatonta työtä"
#: js/ui/endSessionDialog.js:275
#: js/ui/endSessionDialog.js:273
msgid "Other users are logged in"
msgstr "Muita käyttäjiä on kirjautuneena"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (etä)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (konsoli)"
@ -1319,11 +1319,11 @@ msgstr "Asenna laajennus"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?"
#: js/ui/extensionSystem.js:233
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Laajennusten päivityksiä saatavilla"
#: js/ui/extensionSystem.js:234
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Laajennusten päivitykset ovat valmiina asennettavaksi."
@ -1492,15 +1492,15 @@ msgstr "Näytön lukitus pois käytöstä"
msgid "Screen Locking requires the GNOME display manager."
msgstr "Näytön lukitus vaatii Gnomen kirjautumishallinnan."
#: js/ui/messageTray.js:1551
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Järjestelmän tiedot"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:204
msgid "Unknown artist"
msgstr "Tuntematon esittäjä"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:214
msgid "Unknown title"
msgstr "Tuntematon kappale"
@ -1574,16 +1574,16 @@ msgstr "Lopeta"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Toiminnot"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Järjestelmä"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Yläpalkki"
@ -1614,11 +1614,11 @@ msgstr "Gnomen täytyy lukita näyttö"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Lukitus epäonnistui"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Lukitus estettiin sovelluksen toimesta"
@ -2266,7 +2266,7 @@ msgstr "Palauta asetukset"
msgid "Keep Changes"
msgstr "Säilytä muutokset"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2275,7 +2275,7 @@ msgstr[1] "Asetusmuutokset palautetaan %d sekunnissa"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2368,12 +2368,12 @@ msgstr "Käytä tiettyä tilaa (esim. “gdm”) kirjautumisnäkymää varten"
msgid "List possible modes"
msgstr "Listaa mahdolliset tilat"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Tuntematon"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Sovelluksen “%s” käynnistäminen epäonnistui"
@ -2496,19 +2496,19 @@ msgstr ""
"Jos kohtaat ongelmia järjestelmän kanssa, on suositeltavaa poistaa kaikki "
"laajennukset käytöstä."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Manuaalisesti asennettu"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Sisäänrakennettu"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Ei asennettuja laajennuksia"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
@ -2516,7 +2516,11 @@ msgstr ""
"Valitettavasti asennettujen laajennusten listaa ei voitu muodostaa. Varmista "
"että olet kirjautunut Gnomeen ja yritä uudelleen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Laajennuspäivitykset valmiina"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Kirjaudu ulos…"

466
po/fr.po
View File

@ -21,16 +21,16 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-19 21:59+0100\n"
"Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"Language: fr_FR\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n"
"PO-Revision-Date: 2020-05-12 15:16+0200\n"
"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
"Language-Team: French <gnomefr@traduc.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.3\n"
"X-Generator: Gtranslator 3.36.0\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -415,80 +415,12 @@ msgstr ""
msgid "Network Login"
msgstr "Identification réseau"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Gérer vos extensions GNOME"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Extensions de GNOME gère la mise à jour des extensions, la configuration des "
"préférences des extensions et la suppression ou la désactivation des "
"extensions non désirées."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurer les extensions Shell de GNOME"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Enlever « %s » ?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Si vous enlevez cette extension, vous devrez recommencer son téléchargement "
"si vous souhaitez la réactiver plus tard"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Annuler"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Enlever"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Mathieu Bridon <bochecha@fedoraproject.org>\n"
"Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
"Bruno Brouard <annoa.b@gmail.com>\n"
"Cyril Arnaud <cyril dot arnaud at gmail dot com>\n"
"Luc Guillemin <luc.guillemin@gmail.com>\n"
"Luc Pionchon <pionchon.luc@gmail.com>\n"
"Pierre Henry <pierrehenry73@yahoo.fr>\n"
"Alexandre Franke <alexandre.franke@gmail.com>\n"
"Mathieu Stumpf <psychoslave@culture-libre.org>\n"
"Alain Lojewski <allomervan@gmail.com>\n"
"Erwan Georget <egeorget@opmbx.org>\n"
"Julien Humbert <julroy67@gmail.com>\n"
"Claude Paroz <claude@2xlibre.net>\n"
"Charles Monzat <charles.monzat@free.fr>"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Quelque chose sest mal passé"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -498,106 +430,25 @@ msgstr ""
"extension ne peuvent être affichés. Nous vous recommandons de signaler ce "
"problème aux auteurs de lextension."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Détails techniques"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Copier lerreur"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Site Web"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Visiter le site Web de lextension"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension sera mise à jour à la prochaine connexion."
msgstr[1] "%d extensions seront mises à jour à la prochaine connexion."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site Web"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Enlever…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aide"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "À propos des extensions"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Avertissement"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Les extensions peuvent poser des problèmes au système, y compris au niveau "
"des performances. Si vous pensez être dans ce cas, il est recommandé de "
"désactiver toutes les extensions."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Installée manuellement"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Intégrée"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Aucune extension installée"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nous sommes désolés, mais il nest pas possible dobtenir la liste des "
"extensions installées. Vérifiez que vous êtes bien connecté à GNOME et "
"essayez encore une fois."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Fermer la session…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Annuler"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -649,71 +500,71 @@ msgid "(or swipe finger)"
msgstr "(ou faites glisser le doigt)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Éteindre"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "éteindre;fermer;débrancher;redémarrer;rallumer;reboot;arrêter;stop"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Verrouillage de lécran"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "verrouillage;écran;"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Fermer la session"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "fermer;session;déconnecter;"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Mettre en veille"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "mettre en veille;sommeil;"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Changer dutilisateur"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "changer;utilisateur;"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "verrouillage;déverrouillage;orientation;écran;rotation"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Déverrouiller la rotation de lécran"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Verrouiller la rotation de lécran"
@ -879,53 +730,53 @@ msgstr "Refuser laccès"
msgid "Grant Access"
msgstr "Accorder laccès"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Dossier sans nom"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Les applications fréquemment utilisées apparaîtront ici"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Fréquemment utilisées"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Toutes"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Fenêtres ouvertes"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Nouvelle fenêtre"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Démarrer en utilisant la carte graphique dédiée"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Enlever des favoris"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Ajouter aux favoris"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Afficher les détails"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s a été ajouté à vos favoris."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris."
@ -946,7 +797,7 @@ msgstr "Casque audio"
msgid "Headset"
msgstr "Micro-casque"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Microphone"
@ -1102,7 +953,7 @@ msgstr "Aucun évènement"
msgid "Do Not Disturb"
msgstr "Ne pas déranger"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Effacer"
@ -1252,7 +1103,7 @@ msgstr "Échec de lauthentification. Essayez à nouveau."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s est maintenant connu sous le nom de %s"
@ -1308,23 +1159,23 @@ msgstr "Ajouter des horloges locales…"
msgid "World Clocks"
msgstr "Horloges locales"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Météo"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Choisir un emplacement…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Chargement…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Chercher les informations météorologiques en ligne"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Les informations météorologiques ne sont pas disponibles actuellement"
@ -1464,35 +1315,35 @@ msgid "Other users are logged in"
msgstr "Dautres utilisateurs sont connectés"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (distant)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Installer"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Installer lextension"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Mises à jour dextensions disponibles"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Des mises à jour dextensions sont prêtes à être installées."
@ -1641,11 +1492,11 @@ msgstr "Afficher la source"
msgid "Web Page"
msgstr "Page Web"
#: js/ui/main.js:274
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Connecté en tant quutilisateur privilégié"
#: js/ui/main.js:275
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1654,16 +1505,16 @@ msgstr ""
"des raisons de sécurité. Si possible, connectez-vous comme utilisateur "
"normal."
#: js/ui/main.js:281
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Verrouillage décran désactivé"
#: js/ui/main.js:282
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr ""
"Le verrouillage de lécran nécessite le gestionnaire daffichage GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Informations du système"
@ -1743,16 +1594,16 @@ msgstr "Quitter"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Activités"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Système"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Barre supérieure"
@ -1783,11 +1634,11 @@ msgstr "GNOME a besoin de verrouiller lécran"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Impossible de verrouiller"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application"
@ -1870,13 +1721,13 @@ msgid "The PIM must be a number or empty."
msgstr "Le numéro PIM doit être un nombre ou être vide."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Impossible de démarrer %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Impossible de trouver lapplication %s"
@ -2352,11 +2203,11 @@ msgstr "Erreur dautorisation Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Impossible dautoriser le périphérique Thunderbolt : %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume modifié"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2390,23 +2241,23 @@ msgstr "Intégré seulement"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Faire glisser vers le haut pour déverrouiller"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Cliquer ou appuyer sur une touche pour déverrouiller"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Fenêtre de déverrouillage"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Se connecter en tant quautre utilisateur"
@ -2439,7 +2290,7 @@ msgstr "Restaurer les paramètres"
msgid "Keep Changes"
msgstr "Conserver les modifications"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2448,7 +2299,7 @@ msgstr[1] "Les paramètres seront restaurés dans %d secondes"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2542,12 +2393,12 @@ msgstr ""
msgid "List possible modes"
msgstr "Lister les modes possibles"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Inconnu"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Impossible de lancer « %s »"
@ -2564,6 +2415,156 @@ msgstr "Le mot de passe ne peut pas être vide"
msgid "Authentication dialog was dismissed by the user"
msgstr "La fenêtre dauthentification a été écartée par lutilisateur"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Gérer vos extensions GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Extensions de GNOME gère la mise à jour des extensions, la configuration des "
"préférences des extensions et la suppression ou la désactivation des "
"extensions non désirées."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurer les extensions Shell de GNOME"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Enlever « %s » ?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Si vous enlevez cette extension, vous devrez recommencer son téléchargement "
"si vous souhaitez la réactiver plus tard"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Enlever"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Mathieu Bridon <bochecha@fedoraproject.org>\n"
"Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
"Bruno Brouard <annoa.b@gmail.com>\n"
"Cyril Arnaud <cyril dot arnaud at gmail dot com>\n"
"Luc Guillemin <luc.guillemin@gmail.com>\n"
"Luc Pionchon <pionchon.luc@gmail.com>\n"
"Pierre Henry <pierrehenry73@yahoo.fr>\n"
"Alexandre Franke <alexandre.franke@gmail.com>\n"
"Mathieu Stumpf <psychoslave@culture-libre.org>\n"
"Alain Lojewski <allomervan@gmail.com>\n"
"Erwan Georget <egeorget@opmbx.org>\n"
"Julien Humbert <julroy67@gmail.com>\n"
"Claude Paroz <claude@2xlibre.net>\n"
"Charles Monzat <charles.monzat@free.fr>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension sera mise à jour à la prochaine connexion."
msgstr[1] "%d extensions seront mises à jour à la prochaine connexion."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site Web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Enlever…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aide"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "À propos des extensions"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Avertissement"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Les extensions peuvent poser des problèmes au système, y compris au niveau "
"des performances. Si vous pensez être dans ce cas, il est recommandé de "
"désactiver toutes les extensions."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Installée manuellement"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Intégrée"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Aucune extension installée"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nous sommes désolés, mais il nest pas possible dobtenir la liste des "
"extensions installées. Vérifiez que vous êtes bien connecté à GNOME et "
"essayez encore une fois."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
#| msgid "Extension Updates Available"
msgid "Extension Updates Ready"
msgstr "Mises à jour dextensions prêtes"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Fermer la session…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2902,6 +2903,9 @@ msgstr[1] "%u entrées"
msgid "System Sounds"
msgstr "Sons système"
#~ msgid "Copy Error"
#~ msgstr "Copier lerreur"
#~| msgid "Username: "
#~ msgid "Username…"
#~ msgstr "Nom dutilisateur…"

597
po/fur.po

File diff suppressed because it is too large Load Diff

437
po/id.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-20 14:13+0700\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n"
"PO-Revision-Date: 2020-05-14 16:29+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.3\n"
"X-Generator: Poedit 2.3.1\n"
"X-DamnedLies-Scope: partial\n"
"X-Poedit-SourceCharset: UTF-8\n"
@ -396,70 +396,12 @@ msgstr ""
msgid "Network Login"
msgstr "Log Masuk Jaringan"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Ekstensi"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Kelola Ekstensi GNOME Anda"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ekstensi GNOME menangani pemutakhiran ekstensi, mengkonfigurasi preferensi "
"ekstensi, dan menghapus atau menonaktifkan ekstensi yang tidak diinginkan."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurasi Ekstensi GNOME Shell"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Hapus \"%s\"?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Jika Anda menghapus ekstensi, Anda harus kembali untuk mengunduhnya jika "
"Anda ingin mengaktifkannya lagi"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Batal"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Hapus"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.\n"
"Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.\n"
"Wibiharto <wibinem@yahoo.com>, 2011.\n"
"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2020.\n"
"Sucipto <sucipto@pm.me>, 2020."
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Ada yang tidak beres"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -469,105 +411,25 @@ msgstr ""
"tidak dapat ditampilkan. Kami menyarankan Anda melaporkan masalah ini kepada "
"penulis ekstensi."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Detail Teknis"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Salin Galat"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Halaman Web"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Kunjungi halaman web ekstensi"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d ekstensi akan diperbarui pada log masuk berikutnya."
msgstr[1] "%d ekstensi akan diperbarui pada log masuk berikutnya."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Deskripsi"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versi"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Penulis"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Situs Web"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Hapus…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Bantuan"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Tentang Ekstensi"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Untuk menemukan dan menambahkan ekstensi, kunjungi <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Peringatan"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Ekstensi dapat menyebabkan masalah sistem, termasuk masalah kinerja. Jika "
"Anda mengalami masalah dengan sistem Anda, disarankan untuk menonaktifkan "
"semua ekstensi."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Dipasang Secara Manual"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Bawaan"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Tidak Ada Ekstensi Terpasang"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Kami sangat menyesal, tetapi tidak mungkin mendapatkan daftar ekstensi yang "
"dipasang. Pastikan Anda masuk ke GNOME dan coba lagi."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Keluar…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Batal"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -619,71 +481,71 @@ msgid "(or swipe finger)"
msgstr "(atau gesekkan jari)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Matikan"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "matikan;nyalakan ulang;berhenti"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Kunci Layar"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "kunci layar"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Keluar"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "keluar;logout;log out;sign off"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Suspensi"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "suspensi;tidur"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Ganti Pengguna"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "ganti pengguna"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "kunci orientasi;buka kunci orientasi;layar;rotasi"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Buka Kunci Rotasi Layar"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Kunci Rotasi Layar"
@ -849,53 +711,53 @@ msgstr "Tolak Akses"
msgid "Grant Access"
msgstr "Beri Akses"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Folder Tanpa Nama"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Aplikasi yang sering dipakai akan muncul di sini"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Sering"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Semua"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Buka Jendela"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Jendela Baru"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Hapus dari Favorit"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Tambah ke Favorit"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Tampilkan Rincian"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s telah ditambahkan ke favorit Anda."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda."
@ -916,7 +778,7 @@ msgstr "Headphone"
msgid "Headset"
msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Mikrofon"
@ -1057,7 +919,7 @@ msgstr "Tak Ada Kejadian"
msgid "Do Not Disturb"
msgstr "Jangan Ganggu"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Bersihkan"
@ -1207,7 +1069,7 @@ msgstr "Maaf, tidak berhasil. Silakan coba lagi."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s sekarang dikenal sebagai %s"
@ -1251,23 +1113,23 @@ msgstr "Tambah jam dunia…"
msgid "World Clocks"
msgstr "Jam Dunia"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Cuaca"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Pilih lokasi…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Memuat…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Pergi daring untuk informasi cuaca"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Informasi cuaca saat ini tidak tersedia"
@ -1409,35 +1271,35 @@ msgid "Other users are logged in"
msgstr "Pengguna lain sedang log masuk"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (jarak jauh)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (konsol)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Pasang"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Pasang Ekstensi"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Pemutakhiran Ekstensi Tersedia"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Pemutakhiran ekstensi siap dipasang."
@ -1584,11 +1446,11 @@ msgstr "Tilik Sumber"
msgid "Web Page"
msgstr "Halaman Web"
#: js/ui/main.js:274
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Masuk sebagai pengguna istimewa"
#: js/ui/main.js:275
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1596,15 +1458,15 @@ msgstr ""
"Menjalankan sesi sebagai pengguna istimewa harus dihindari untuk alasan "
"keamanan. Jika memungkinkan, Anda harus masuk sebagai pengguna biasa."
#: js/ui/main.js:281
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Kunci Layar dinonaktifkan"
#: js/ui/main.js:282
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Penguncian Layar memerlukan manajer tampilan GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Informasi Sistem"
@ -1684,16 +1546,16 @@ msgstr "Keluar"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Aktivitas"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistem"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Bar Atas"
@ -1724,11 +1586,11 @@ msgstr "GNOME perlu mengunci layar"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Tak bisa mengunci"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi"
@ -1811,13 +1673,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM harus berupa angka atau kosong."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Tak bisa memulai %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Tak bisa menemukan aplikasi %s"
@ -2290,11 +2152,11 @@ msgstr "Autorisasi Thunderbolt galat"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Tidak dapat mengautorisasi perangkat Thunderbolt: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume diubah"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2334,23 +2196,23 @@ msgstr "Hanya Bawaan"
# %d: 1
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A, %d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Gesek ke atas untuk membuka kunci"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Klik atau tekan tombol untuk membuka kunci"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Buka Kunci Jendela"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Masuk sebagai pengguna lain"
@ -2383,7 +2245,7 @@ msgstr "Balikkan Tatanan"
msgid "Keep Changes"
msgstr "Simpan Perubahan"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2392,7 +2254,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2485,12 +2347,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
msgid "List possible modes"
msgstr "Menampilkan mode yang mungkin"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Tak dikenal"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Gagal meluncurkan \"%s\""
@ -2507,6 +2369,144 @@ msgstr "Kata sandi tidak boleh kosong"
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialog autentikasi ditolak oleh pengguna"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Ekstensi"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Kelola Ekstensi GNOME Anda"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ekstensi GNOME menangani pemutakhiran ekstensi, mengkonfigurasi preferensi "
"ekstensi, dan menghapus atau menonaktifkan ekstensi yang tidak diinginkan."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurasi Ekstensi GNOME Shell"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Hapus \"%s\"?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Jika Anda menghapus ekstensi, Anda harus kembali untuk mengunduhnya jika "
"Anda ingin mengaktifkannya lagi"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Hapus"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.\n"
"Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.\n"
"Wibiharto <wibinem@yahoo.com>, 2011.\n"
"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2020.\n"
"Sucipto <sucipto@pm.me>, 2020."
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d ekstensi akan diperbarui pada log masuk berikutnya."
msgstr[1] "%d ekstensi akan diperbarui pada log masuk berikutnya."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Deskripsi"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versi"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Penulis"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Situs Web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Hapus…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Bantuan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Tentang Ekstensi"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Untuk menemukan dan menambahkan ekstensi, kunjungi <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Peringatan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Ekstensi dapat menyebabkan masalah sistem, termasuk masalah kinerja. Jika "
"Anda mengalami masalah dengan sistem Anda, disarankan untuk menonaktifkan "
"semua ekstensi."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Dipasang Secara Manual"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Bawaan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Tidak Ada Ekstensi Terpasang"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Kami sangat menyesal, tetapi tidak mungkin mendapatkan daftar ekstensi yang "
"dipasang. Pastikan Anda masuk ke GNOME dan coba lagi."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Pemutakhiran Ekstensi Siap"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Keluar…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2844,6 +2844,9 @@ msgstr[1] "%u Masukan"
msgid "System Sounds"
msgstr "Suara Sistem"
#~ msgid "Copy Error"
#~ msgstr "Salin Galat"
#~ msgid "Username…"
#~ msgstr "Nama pengguna…"

428
po/it.po
View File

@ -4,7 +4,7 @@
# Copyright (C) 2019, 2020 the Free Software Foundation
# This file is distributed under the same license as the gnome-shell package.
#
# Milo Casagrande <milo@milo.name>, 2009, 2010, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019., 2020
# Milo Casagrande <milo@milo.name>, 2009, 2010, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020
# Luca Ferretti <elle.uca@infinito.it>, 2010, 2011, 2012, 2013, 2014.
# Gianvito Cavasoli <gianvito@gmx.it>, 2016.
#
@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-19 16:08+0100\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n"
"PO-Revision-Date: 2020-05-11 17:51+0200\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italiano <gnome-it-list@gnome.org>\n"
"Language: it\n"
@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.4\n"
"X-Generator: Poedit 2.3\n"
"X-DamnedLies-Scope: partial\n"
#: data/50-gnome-shell-system.xml:6
@ -406,66 +406,12 @@ msgstr ""
msgid "Network Login"
msgstr "Accesso di rete"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Estensioni"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Gestione delle Estensioni GNOME"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Estensioni GNOME gestisce l'aggiornamento e la configurazione delle "
"preferenze delle estensioni e la rimozione o la disabilitazione di "
"estensioni indesiderate."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configura le estensioni di GNOME Shell"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Rimuovere «%s»?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Una volta rimossa l'estensione sarà necessario scaricarla nuovamente per "
"abilitarla"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Annulla"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Rimuovi"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr "Milo Casagrande <milo@milo.name>"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Qualcosa è andato storto"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -475,105 +421,25 @@ msgstr ""
"questa estensione. È consigliato segnalare il problema agli autori "
"dell'estensione."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Dettagli tecnici"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Copia errore"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Sito web"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Sito web dell'estensione"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d estensione verrà aggiornata al prossimo accesso."
msgstr[1] "%d estensioni verranno aggiornate al prossimo accesso."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrizione"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versione"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autore"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Sito web"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Rimuovi…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aiuto"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Informazioni su Estensioni"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Per trovare e installare estensioni, visitare il sito web <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Attenzione"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Le estensioni possono causare problemi al sistema, compresi problemi di "
"prestazioni. Nel caso si riscontrino dei problemi, è consigliato di "
"disabilitare tutte le estensioni."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Installata manualmente"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Integrata"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Nessuna estensione installata"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Impossibile recuperare l'elenco delle estensioni installate. Assicurarsi di "
"aver eseguire l'accesso a GNOME e riprovare."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Termina sessione…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Annulla"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -625,71 +491,71 @@ msgid "(or swipe finger)"
msgstr "(o scorrere con il dito)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Spegni"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "spegni;arresta;ferma;stop;riavvia"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Blocca schermo"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "blocca schermo"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Termina sessione"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "esci;logout;termina sessione"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Sospendi"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "sospendi;riposo"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Cambia utente"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "cambia utente"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "blocca orientazione;sblocca orientazione;schermo;rotazione"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Sblocca rotazione schermo"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Blocca rotazione schermo"
@ -854,55 +720,55 @@ msgstr "Nega accesso"
msgid "Grant Access"
msgstr "Consenti accesso"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Cartella senza nome"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Qui saranno mostrate le applicazioni usate frequentemente"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Frequenti"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Tutte"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Finestre aperte"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Nuova finestra"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Lancia utilizzando scheda grafica dedicata"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostra dettagli"
# (ndt) e usare:
# L'elemento %s è stato rimosso... ?
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s è stato aggiunto ai preferiti."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s è stato rimosso dai preferiti."
@ -923,7 +789,7 @@ msgstr "Cuffie"
msgid "Headset"
msgstr "Cuffie con microfono"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Microfono"
@ -1064,7 +930,7 @@ msgstr "Nessun evento"
msgid "Do Not Disturb"
msgstr "Non disturbare"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Pulisci"
@ -1213,7 +1079,7 @@ msgstr "Errore nell'autenticazione. Provare di nuovo."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s ha cambiato nome in %s"
@ -1258,23 +1124,23 @@ msgstr "Aggiungi orologi mondiali…"
msgid "World Clocks"
msgstr "Orologi mondiali"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Meteo"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Seleziona una posizione…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Caricamento…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Collegarsi a Internet per le informazioni meteo"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Le informazioni meteo non sono disponibili"
@ -1417,35 +1283,35 @@ msgid "Other users are logged in"
msgstr "Altri utenti sono collegati"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Installa"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Installa estensione"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Scaricare e installare «%s» da extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Disponibili aggiornamenti estensioni"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "È possibile installare gli aggiornamenti delle estensioni."
@ -1596,11 +1462,11 @@ msgstr "Visualizza sorgente"
msgid "Web Page"
msgstr "Pagina web"
#: js/ui/main.js:274
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Accesso eseguito come utente con privilegi"
#: js/ui/main.js:275
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1608,15 +1474,15 @@ msgstr ""
"Per motivi di sicurezza, non è consigliato avviare una sessione con un "
"utente con privilegi. Se possibile, accedere come utente normale."
#: js/ui/main.js:281
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Blocca scherma disabilitato"
#: js/ui/main.js:282
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Il blocco dello schermo richiede il gestore schermi di GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Informazione di sistema"
@ -1696,16 +1562,16 @@ msgstr "Esci"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Attività"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistema"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Barra superiore"
@ -1736,11 +1602,11 @@ msgstr "GNOME deve bloccare lo schermo"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Impossibile bloccare"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Il blocco è stato impedito da un'applicazione"
@ -1823,13 +1689,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM deve essere un numero o vuoto."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Impossibile avviare %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Impossibile trovare l'applicazione %s"
@ -2311,11 +2177,11 @@ msgstr "Errore autenticazione Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Impossibile autorizzare il dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume modificato"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2349,23 +2215,23 @@ msgstr "Solo integrato"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Scorrere per sbloccare"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Fare clic o premere un tasto per sbloccare"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Sblocca finestra"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Accedi come altro utente"
@ -2399,7 +2265,7 @@ msgstr "Ripristina impostazioni"
msgid "Keep Changes"
msgstr "Mantieni modifiche"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2408,7 +2274,7 @@ msgstr[1] "Le modifiche alle impostazioni saranno ripristinate tra %d secondi"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2501,12 +2367,12 @@ msgstr "Usa una modalità specifica, per es. «gdm» per la schermata d'accesso"
msgid "List possible modes"
msgstr "Elenca le modalità possibili"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Sconosciuto"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Avvio di «%s» non riuscito"
@ -2523,6 +2389,140 @@ msgstr "La password non può essere vuota"
msgid "Authentication dialog was dismissed by the user"
msgstr "La finestra di dialogo di autenticazione è stata annullata dall'utente"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Estensioni"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Gestione delle Estensioni GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Estensioni GNOME gestisce l'aggiornamento e la configurazione delle "
"preferenze delle estensioni e la rimozione o la disabilitazione di "
"estensioni indesiderate."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configura le estensioni di GNOME Shell"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Rimuovere «%s»?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Una volta rimossa l'estensione sarà necessario scaricarla nuovamente per "
"abilitarla"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Rimuovi"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr "Milo Casagrande <milo@milo.name>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d estensione verrà aggiornata al prossimo accesso."
msgstr[1] "%d estensioni verranno aggiornate al prossimo accesso."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrizione"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versione"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autore"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Sito web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Rimuovi…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aiuto"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Informazioni su Estensioni"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Per trovare e installare estensioni, visitare il sito web <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Attenzione"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Le estensioni possono causare problemi al sistema, compresi problemi di "
"prestazioni. Nel caso si riscontrino dei problemi, è consigliato di "
"disabilitare tutte le estensioni."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Installata manualmente"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Integrata"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Nessuna estensione installata"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Impossibile recuperare l'elenco delle estensioni installate. Assicurarsi di "
"aver eseguire l'accesso a GNOME e riprovare."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Disponibili aggiornamenti estensioni"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Termina sessione…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format

1067
po/ja.po

File diff suppressed because it is too large Load Diff

2029
po/kk.po

File diff suppressed because it is too large Load Diff

489
po/ko.po
View File

@ -20,8 +20,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-02-28 07:20+0000\n"
"PO-Revision-Date: 2020-02-28 17:34+0900\n"
"POT-Creation-Date: 2020-05-26 21:26+0000\n"
"PO-Revision-Date: 2020-05-28 08:49+0900\n"
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
"Language: ko\n"
@ -54,15 +54,6 @@ msgstr "모든 프로그램 표시"
msgid "Open the application menu"
msgstr "프로그램 메뉴 열기"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "확장"
#: data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "그놈 셸 확장을 설정합니다"
#: data/org.gnome.Shell.desktop.in.in:4
msgid "GNOME Shell"
msgstr "그놈 셸"
@ -391,45 +382,12 @@ msgstr "마우스 포인터가 움직이지 않을 때까지 포커스 전환을
msgid "Network Login"
msgstr "네트워크 로그인"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "“%s” 확장을 제거하시겠습니까?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr "확장을 제거한 다음 다시 사용하려면 다시 다운로드해야 합니다"
#: js/extensionPrefs/main.js:144 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:107
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:165 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "취소"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "제거"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr ""
"차영호 <ganadist@gmail.com>\n"
"조성호 <darkcircle.0426@gmail.com>\n"
"류창우 <cwryu@debian.org>"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "그놈 확장을 관리합니다"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "무언가 잘못되었습니다"
#: js/extensionPrefs/main.js:268
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -438,110 +396,31 @@ msgstr ""
"죄송하지만 문제가 발생했습니다. 이 확장의 설정을 표시할 수 없습니다. 확장 개"
"발자에게 이 문제를 알려주시기를 추천합니다."
#: js/extensionPrefs/main.js:275
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "기술적 정보"
#: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "오류 메시지 복사"
#: js/extensionPrefs/main.js:337
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "홈페이지"
#: js/extensionPrefs/main.js:338
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "확장 홈페이지 보기"
#: js/extensionPrefs/main.js:449
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "다음 로그인에 확장 %d개를 업데이트할 예정입니다."
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "설명"
# 커맨드라인 옵션 설명
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "버전"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "작성자"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "홈페이지"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "제거…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "도움말"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "확장 정보"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"확장을 찾고 추가하려면, <a href=\"https://extensions.gnome.org\">extensions."
"gnome.org</a> 사이트를 방문하십시오."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "주의"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"확장 때문에 성능 문제 등의 시스템 문제가 발생할 수 있습니다. 시스템에 문제를 "
"발견할 경우, 모든 확장을 꺼 보기를 권합니다."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "수동 설치"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "내장"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "설치한 확장 없음"
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"대단히 죄송합니다. 설치한 확장 기능의 목록을 가져올 수 없습니다. 그놈 데스크"
"톱에 로그인했는지 확인하시고 다시 시도하십시오."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Log Out…"
msgstr "로그아웃…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "취소"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:202
#: js/ui/components/networkAgent.js:218 js/ui/components/networkAgent.js:242
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:283
#: js/ui/components/networkAgent.js:293 js/ui/components/polkitAgent.js:277
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
#: js/ui/components/networkAgent.js:220 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:295 js/ui/components/polkitAgent.js:277
#: js/ui/shellMountOperation.js:326
msgid "Password"
msgstr "암호"
@ -564,8 +443,8 @@ msgstr "(예를 들어, 사용자 또는 %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:238
#: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:279
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:240
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username"
msgstr "사용자 이름"
@ -587,76 +466,76 @@ msgid "(or swipe finger)"
msgstr "(또는 지문을 문지르십시오)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "컴퓨터 끄기"
# 주의: 키워드 번역
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr ""
"power off;shutdown;전원;끄기;셧다운;reboot;restart;재시작;다시;리부팅;halt;"
"stop;중지;"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "화면 잠그기"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "화면 잠그기"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "로그아웃"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "logout;로그아웃;log out;로그 아웃;sign off;나가기"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "절전"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "suspend;sleep;절전;슬립;서스펜드"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "사용자 바꾸기"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "사용자 바꾸기"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"lock orientation;방향 잠금;unlock orientation;방향 잠금 해제;screen;화면;"
"rotation;회전"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "화면 회전 잠금 해제"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "화면 회전 잠금"
@ -815,54 +694,54 @@ msgstr "접근 거부"
msgid "Grant Access"
msgstr "접근 허용"
#: js/ui/appDisplay.js:906
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "이름 없는 폴더"
#: js/ui/appDisplay.js:929
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "자주 사용하는 프로그램이 여기 나타납니다"
#: js/ui/appDisplay.js:1064
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "자주"
#: js/ui/appDisplay.js:1071
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "모두"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2450 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "열린 창"
#: js/ui/appDisplay.js:2470 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "새 창"
#: js/ui/appDisplay.js:2481
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "지정한 그래픽 카드를 사용해 시작"
#: js/ui/appDisplay.js:2509 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "즐겨찾기에서 제거"
#: js/ui/appDisplay.js:2515
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "즐겨찾기에 추가"
# 주의: "Show ..." 형태지만 보이기로 번역하지 않는다
#: js/ui/appDisplay.js:2525 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "자세히 보기"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s 프로그램을 즐겨찾기에 추가했습니다."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s 프로그램을 즐겨찾기에서 제거했습니다."
@ -883,7 +762,7 @@ msgstr "헤드폰"
msgid "Headset"
msgstr "헤드셋"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "마이크"
@ -1001,30 +880,30 @@ msgid "All Day"
msgstr "종일"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867
#: js/ui/calendar.js:868
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%B %-d일 %A"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:870
#: js/ui/calendar.js:871
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%Y년 %B %-d일 %A"
#: js/ui/calendar.js:1096
#: js/ui/calendar.js:1100
msgid "No Notifications"
msgstr "알림 없음"
#: js/ui/calendar.js:1099
#: js/ui/calendar.js:1103
msgid "No Events"
msgstr "행사 없음"
#: js/ui/calendar.js:1153
#: js/ui/calendar.js:1157
msgid "Do Not Disturb"
msgstr "방해 금지"
#: js/ui/calendar.js:1167
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "지우기"
@ -1070,80 +949,80 @@ msgstr "설치한 버전의 udisks는 PIM 설정을 지원하지 않습니다"
msgid "Open with %s"
msgstr "%s 프로그램으로 열기"
#: js/ui/components/networkAgent.js:89
#: js/ui/components/networkAgent.js:91
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "다른 방법으로 라우터의 “WPS” 단추를 눌러서 연결할 수 있습니다."
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:103 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:916
msgid "Connect"
msgstr "연결"
#: js/ui/components/networkAgent.js:208
#: js/ui/components/networkAgent.js:210
msgid "Key"
msgstr "키"
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:269
#: js/ui/components/networkAgent.js:248 js/ui/components/networkAgent.js:271
msgid "Private key password"
msgstr "개인 키 암호"
#: js/ui/components/networkAgent.js:267
#: js/ui/components/networkAgent.js:269
msgid "Identity"
msgstr "신원"
#: js/ui/components/networkAgent.js:281
#: js/ui/components/networkAgent.js:283
msgid "Service"
msgstr "서비스"
#: js/ui/components/networkAgent.js:310 js/ui/components/networkAgent.js:338
#: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:340
#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700
msgid "Authentication required"
msgstr "인증 필요"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:680
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "“%s” 무선 네트워크에 연결하려면 암호 또는 암호화 키가 필요합니다."
#: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:684
msgid "Wired 802.1X authentication"
msgstr "유선 802.1X 인증"
#: js/ui/components/networkAgent.js:317
#: js/ui/components/networkAgent.js:319
msgid "Network name"
msgstr "네트워크 이름"
#: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:694
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:688
msgid "DSL authentication"
msgstr "인증이 필요합니다"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:699
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:693
msgid "PIN code required"
msgstr "PIN 코드가 필요합니다"
#: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:700
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:694
msgid "PIN code is needed for the mobile broadband device"
msgstr "휴대전화 네트워크 장치를 사용하려면 PIN 코드가 필요합니다"
#: js/ui/components/networkAgent.js:331
#: js/ui/components/networkAgent.js:333
msgid "PIN"
msgstr "PIN"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:707
#: js/ui/components/networkAgent.js:711
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:685
#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701
#: js/ui/components/networkAgent.js:705
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "“%s”에 연결하려면 암호가 필요합니다."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1691
#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1691
msgid "Network Manager"
msgstr "네트워크 관리"
#: js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:704
msgid "VPN password"
msgstr "VPN 암호"
@ -1169,7 +1048,7 @@ msgstr "죄송합니다. 동작하지 않았습니다. 다시 시도하십시오
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s의 대화명이 이제 %s입니다"
@ -1205,31 +1084,31 @@ msgstr "%Y년 %B %-d일"
msgid "%A %B %e %Y"
msgstr "%Y년 %B %e일 %A"
#: js/ui/dateMenu.js:161
#: js/ui/dateMenu.js:162
msgid "Add world clocks…"
msgstr "세계 시계 추가…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:163
msgid "World Clocks"
msgstr "세계 시계"
#: js/ui/dateMenu.js:276
#: js/ui/dateMenu.js:308
msgid "Weather"
msgstr "날씨"
#: js/ui/dateMenu.js:391
#: js/ui/dateMenu.js:437
msgid "Select a location…"
msgstr "위치를 선택하십시오…"
#: js/ui/dateMenu.js:404
#: js/ui/dateMenu.js:445
msgid "Loading…"
msgstr "읽어들이는 중…"
#: js/ui/dateMenu.js:414
#: js/ui/dateMenu.js:455
msgid "Go online for weather information"
msgstr "날씨 정보를 온라인으로 가져옵니다"
#: js/ui/dateMenu.js:416
#: js/ui/dateMenu.js:457
msgid "Weather information is currently unavailable"
msgstr "날씨 정보를 현재 사용할 수 없습니다"
@ -1360,36 +1239,36 @@ msgid "Other users are logged in"
msgstr "다른 사용자가 로그인 중입니다"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (원격)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (콘솔)"
#: js/ui/extensionDownloader.js:169
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "설치"
#: js/ui/extensionDownloader.js:175
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "확장 설치"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr ""
"extensions.gnome.org 사이트에서 “%s” 확장을 다운로드해 설치하시겠습니까?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "확장 업데이트가 있습니다"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "확장 업데이트 설치할 준비가 되었습니다."
@ -1535,11 +1414,11 @@ msgstr "소스 보기"
msgid "Web Page"
msgstr "웹페이지"
#: js/ui/main.js:269
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "관리자 권한으로 로그인"
#: js/ui/main.js:270
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1547,24 +1426,24 @@ msgstr ""
"관리자 권한으로 세션을 시작하는 일은 보안 이유로 피해야 합니다. 할 수 있으면 "
"일반 유저로 로그인해야 합니다."
#: js/ui/main.js:276
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "화면 잠금 사용하지 않음"
# GDM
#: js/ui/main.js:277
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "화면 잠금은 그놈 디스플레이 관리자가 필요합니다."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "시스템 정보"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:204
msgid "Unknown artist"
msgstr "알 수 없는 음악가"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:214
msgid "Unknown title"
msgstr "알 수 없는 제목"
@ -1636,16 +1515,16 @@ msgstr "끝내기"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "현재 활동"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "시스템"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "위 막대"
@ -1676,11 +1555,11 @@ msgstr "그놈에서 화면을 잠궈야 합니다"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "잠글 수 없습니다"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "프로그램이 잠금을 막았습니다"
@ -1763,13 +1642,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM은 숫자거나 비어 있어야 합니다."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "%s 프로그램을 시작할 수 없습니다"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "%s 프로그램을 찾을 수 없습니다"
@ -2238,12 +2117,12 @@ msgid "Could not authorize the Thunderbolt device: %s"
msgstr "썬더볼트 장치에 권한을 부여할 수 없습니다: %s"
# 오디오 볼륨
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "볼륨 바꿈"
# 오디오 볼륨
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "볼륨"
@ -2277,23 +2156,23 @@ msgstr "내장만 사용"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%B %-d일 %A"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "잠금을 풀려면 위로 살짝 미십시오"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "잠금을 풀려면 마우스 단추 또는 키를 누르십시오"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "창 잠금 풀기"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "다른 사용자로 로그인"
@ -2326,7 +2205,7 @@ msgstr "설정 되돌리기"
msgid "Keep Changes"
msgstr "바뀐 사항 유지"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2334,7 +2213,7 @@ msgstr[0] "바뀐 설정을 %d초 후에 되돌립니다"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2412,28 +2291,28 @@ msgid "Evolution Calendar"
msgstr "에볼루션 달력"
# 커맨드라인 옵션 설명
#: src/main.c:460 subprojects/extensions-tool/src/main.c:249
#: src/main.c:458 subprojects/extensions-tool/src/main.c:249
msgid "Print version"
msgstr "버전을 표시합니다"
#: src/main.c:466
#: src/main.c:464
msgid "Mode used by GDM for login screen"
msgstr "GDM에서 로그인 화면에 사용할 모드"
#: src/main.c:472
#: src/main.c:470
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "특정 모드 사용. 예를 들어 로그인 화면에 대해 “gdm”"
#: src/main.c:478
#: src/main.c:476
msgid "List possible modes"
msgstr "가능한 모드 목록 표시"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "알 수 없음"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "“%s” 실행에 실패했습니다"
@ -2450,6 +2329,137 @@ msgstr "빈 암호를 쓸 수 없습니다"
msgid "Authentication dialog was dismissed by the user"
msgstr "인증 대화 창을 사용자가 닫았습니다"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "확장"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "그놈 확장을 관리합니다"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr "그놈 확장 관리자에서는 확장 기능의 업데이트, 확장 기능의 설정, 원하지 않는 확장 기능 제거 또는 사용 중지를 처리합니다."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "그놈 셸 확장을 설정합니다"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "“%s” 확장을 제거하시겠습니까?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr "확장을 제거한 다음 다시 사용하려면 다시 다운로드해야 합니다"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "제거"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"차영호 <ganadist@gmail.com>\n"
"조성호 <darkcircle.0426@gmail.com>\n"
"류창우 <cwryu@debian.org>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "다음 로그인에 확장 %d개를 업데이트할 예정입니다."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "설명"
# 커맨드라인 옵션 설명
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "버전"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "작성자"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "홈페이지"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "제거…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "도움말"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "확장 정보"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"확장을 찾고 추가하려면, <a href=\"https://extensions.gnome.org\">extensions."
"gnome.org</a> 사이트를 방문하십시오."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "주의"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"확장 때문에 성능 문제 등의 시스템 문제가 발생할 수 있습니다. 시스템에 문제를 "
"발견할 경우, 모든 확장을 꺼 보기를 권합니다."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "수동 설치"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "내장"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "설치한 확장 없음"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"대단히 죄송합니다. 설치한 확장 기능의 목록을 가져올 수 없습니다. 그놈 데스크"
"톱에 로그인했는지 확인하시고 다시 시도하십시오."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "확장 업데이트가 준비되었습니다"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "로그아웃…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2785,3 +2795,6 @@ msgstr[0] "%u개 입력"
#: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds"
msgstr "시스템 소리"
#~ msgid "Copy Error"
#~ msgstr "오류 메시지 복사"

872
po/lt.po

File diff suppressed because it is too large Load Diff

941
po/lv.po

File diff suppressed because it is too large Load Diff

486
po/nl.po
View File

@ -16,8 +16,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-02-24 12:37+0000\n"
"PO-Revision-Date: 2020-02-24 23:33+0100\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-05-06 13:10+0200\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Nederlands <gnome-nl-list@gnome.org>\n"
"Language: nl\n"
@ -52,15 +52,6 @@ msgstr "Alle toepassingen tonen"
msgid "Open the application menu"
msgstr "Toepassingenmenu openen"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Uitbreidingen"
#: data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Gnome Shell-uitbreidingen configureren"
#: data/org.gnome.Shell.desktop.in.in:4
msgid "GNOME Shell"
msgstr "Gnome Shell"
@ -408,47 +399,12 @@ msgstr "Focus pas wijzigen nadat de muisaanwijzer is gestopt met bewegen"
msgid "Network Login"
msgstr "Netwerkaanmelding"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "%s verwijderen?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Als u een uitbreiding verwijdert, zult u deze opnieuw moeten downloaden om "
"ze opnieuw te gebruiken"
#: js/extensionPrefs/main.js:144 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:107
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:165 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Annuleren"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Verwijderen"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr ""
"Nathan Follens <nthn@unseen.is>\n"
"\n"
"Meer info over Gnome-NL http://nl.gnome.org"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Beheer uw Gnome-uitbreidingen"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong"
msgstr "Er is iets misgegaan"
#: js/extensionPrefs/main.js:268
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -458,111 +414,31 @@ msgstr ""
"uitbreiding kunnen niet worden weergegeven. We raden u aan dit probleem te "
"melden aan de ontwikkelaars van de uitbreiding."
#: js/extensionPrefs/main.js:275
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Technische details"
#: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "Fout kopiëren"
#: js/extensionPrefs/main.js:337
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Startpagina"
#: js/extensionPrefs/main.js:338
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Website van uitbreiding openen"
#: js/extensionPrefs/main.js:449
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d uitbreiding wordt bijgewerkt bij de volgende aanmelding."
msgstr[1] "%d uitbreidingen worden bijgewerkt bij de volgende aanmelding."
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschrijving"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versie"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Verwijderen…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hulp"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Over uitbreidingen"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Bezoek <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> om "
"uitbreidingen te zoeken en installeren."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Waarschuwing"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Uitbreidingen kunnen problemen veroorzaken, inclusief prestatieproblemen. "
"Als u een probleem met uw systeem ondervindt, wordt het aanbevolen eerst "
"alle uitbreidingen uit te schakelen."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Handmatig geïnstalleerd"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Ingebouwd"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "Geen uitbreidingen geïnstalleerd"
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Sorry, we konden de lijst met geïnstalleerde uitbreidingen niet verkrijgen. "
"Zorg dat u bij Gnome aangemeld bent, en probeer het opnieuw."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Log Out…"
msgstr "Afmelden…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Annuleren"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:202
#: js/ui/components/networkAgent.js:218 js/ui/components/networkAgent.js:242
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:283
#: js/ui/components/networkAgent.js:293 js/ui/components/polkitAgent.js:277
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
#: js/ui/components/networkAgent.js:220 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:295 js/ui/components/polkitAgent.js:277
#: js/ui/shellMountOperation.js:326
msgid "Password"
msgstr "Wachtwoord"
@ -585,8 +461,8 @@ msgstr "(bijv. gebruiker of %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:238
#: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:279
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:240
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username"
msgstr "Gebruikersnaam"
@ -842,45 +718,45 @@ msgstr "Toegang weigeren"
msgid "Grant Access"
msgstr "Toegang verlenen"
#: js/ui/appDisplay.js:906
#: js/ui/appDisplay.js:932
msgid "Unnamed Folder"
msgstr "Naamloze map"
#: js/ui/appDisplay.js:929
#: js/ui/appDisplay.js:955
msgid "Frequently used applications will appear here"
msgstr "Vaak gebruikte toepassingen verschijnen hier"
#: js/ui/appDisplay.js:1064
#: js/ui/appDisplay.js:1090
msgid "Frequent"
msgstr "Vaak gebruikt"
#: js/ui/appDisplay.js:1071
#: js/ui/appDisplay.js:1097
msgid "All"
msgstr "Alles"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2450 js/ui/panel.js:75
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Vensters openen"
msgstr "Open vensters"
#: js/ui/appDisplay.js:2470 js/ui/panel.js:82
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
msgid "New Window"
msgstr "Nieuw venster"
# Dedicated niet vertaald
#: js/ui/appDisplay.js:2481
#: js/ui/appDisplay.js:2504
msgid "Launch using Dedicated Graphics Card"
msgstr "Met grafische kaart opstarten"
#: js/ui/appDisplay.js:2509 js/ui/dash.js:239
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Uit favorieten verwijderen"
#: js/ui/appDisplay.js:2515
#: js/ui/appDisplay.js:2538
msgid "Add to Favorites"
msgstr "Aan favorieten toevoegen"
#: js/ui/appDisplay.js:2525 js/ui/panel.js:93
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
msgid "Show Details"
msgstr "Details tonen"
@ -910,7 +786,7 @@ msgstr "Hoofdtelefoon"
msgid "Headset"
msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Microfoon"
@ -1028,30 +904,30 @@ msgid "All Day"
msgstr "Gehele dag"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867
#: js/ui/calendar.js:868
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:870
#: js/ui/calendar.js:871
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A %-d %B %Y"
#: js/ui/calendar.js:1096
#: js/ui/calendar.js:1100
msgid "No Notifications"
msgstr "Geen notificaties"
#: js/ui/calendar.js:1099
#: js/ui/calendar.js:1103
msgid "No Events"
msgstr "Geen gebeurtenissen"
#: js/ui/calendar.js:1153
#: js/ui/calendar.js:1157
msgid "Do Not Disturb"
msgstr "Niet storen"
#: js/ui/calendar.js:1167
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Wissen"
@ -1100,39 +976,39 @@ msgstr ""
msgid "Open with %s"
msgstr "Openen met %s"
#: js/ui/components/networkAgent.js:89
#: js/ui/components/networkAgent.js:91
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr ""
"U kunt ook verbinding maken door op de WPS-knop op uw router te drukken."
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:103 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:916
msgid "Connect"
msgstr "Verbinden"
#: js/ui/components/networkAgent.js:208
#: js/ui/components/networkAgent.js:210
msgid "Key"
msgstr "Sleutel"
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:269
#: js/ui/components/networkAgent.js:248 js/ui/components/networkAgent.js:271
msgid "Private key password"
msgstr "Wachtwoord van privésleutel"
#: js/ui/components/networkAgent.js:267
#: js/ui/components/networkAgent.js:269
msgid "Identity"
msgstr "Identiteit"
#: js/ui/components/networkAgent.js:281
#: js/ui/components/networkAgent.js:283
msgid "Service"
msgstr "Dienst"
#: js/ui/components/networkAgent.js:310 js/ui/components/networkAgent.js:338
#: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:340
#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700
msgid "Authentication required"
msgstr "Aanmelding vereist"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:680
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -1141,42 +1017,42 @@ msgstr ""
"Voor toegang tot het draadloze netwerk %s is een wachtwoord of sleutel "
"benodigd."
#: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:684
msgid "Wired 802.1X authentication"
msgstr "802.1X-authenticatie (bekabeld)"
#: js/ui/components/networkAgent.js:317
#: js/ui/components/networkAgent.js:319
msgid "Network name"
msgstr "Netwerknaam"
#: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:694
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:688
msgid "DSL authentication"
msgstr "DSL-authenticatie"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:699
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:693
msgid "PIN code required"
msgstr "PIN-code vereist"
#: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:700
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:694
msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN-code vereist voor het apparaat voor mobiel breedband"
#: js/ui/components/networkAgent.js:331
#: js/ui/components/networkAgent.js:333
msgid "PIN"
msgstr "Pincode"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:707
#: js/ui/components/networkAgent.js:711
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:685
#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701
#: js/ui/components/networkAgent.js:705
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Er is een wachtwoord nodig om met %s te verbinden."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1691
#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1691
msgid "Network Manager"
msgstr "Netwerk-manager"
#: js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:704
msgid "VPN password"
msgstr "VPN-wachtwoord"
@ -1203,7 +1079,7 @@ msgstr "Helaas, dat werkte niet. Probeer het opnieuw."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s heet vanaf nu %s"
@ -1248,106 +1124,106 @@ msgstr "Wereldklokken toevoegen…"
msgid "World Clocks"
msgstr "Wereldklokken"
#: js/ui/dateMenu.js:276
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Weer"
#: js/ui/dateMenu.js:391
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Selecteer een locatie…"
#: js/ui/dateMenu.js:404
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Laden…"
#: js/ui/dateMenu.js:414
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Ga online voor informatie over het weer"
#: js/ui/dateMenu.js:416
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Informatie over het weer is momenteel niet beschikbaar"
#: js/ui/endSessionDialog.js:37
#: js/ui/endSessionDialog.js:39
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s afmelden"
#: js/ui/endSessionDialog.js:38
#: js/ui/endSessionDialog.js:40
msgctxt "title"
msgid "Log Out"
msgstr "Afmelden"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:42
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s wordt automatisch afgemeld over %d seconde."
msgstr[1] "%s wordt automatisch afgemeld over %d seconden."
#: js/ui/endSessionDialog.js:45
#: js/ui/endSessionDialog.js:47
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "U wordt automatisch afgemeld over %d seconde."
msgstr[1] "U wordt automatisch afgemeld over %d seconden."
#: js/ui/endSessionDialog.js:51
#: js/ui/endSessionDialog.js:53
msgctxt "button"
msgid "Log Out"
msgstr "Afmelden"
#: js/ui/endSessionDialog.js:56
#: js/ui/endSessionDialog.js:58
msgctxt "title"
msgid "Power Off"
msgstr "Uitschakelen"
#: js/ui/endSessionDialog.js:57
#: js/ui/endSessionDialog.js:59
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Updates installeren en uitschakelen"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:61
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "De computer wordt automatisch afgesloten over %d seconde."
msgstr[1] "De computer wordt automatisch afgesloten over %d seconden."
#: js/ui/endSessionDialog.js:63
#: js/ui/endSessionDialog.js:65
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Gereedstaande software-updates installeren"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
msgctxt "button"
msgid "Restart"
msgstr "Opnieuw opstarten"
#: js/ui/endSessionDialog.js:68
#: js/ui/endSessionDialog.js:70
msgctxt "button"
msgid "Power Off"
msgstr "Uitschakelen"
#: js/ui/endSessionDialog.js:74
#: js/ui/endSessionDialog.js:76
msgctxt "title"
msgid "Restart"
msgstr "Opnieuw opstarten"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:78
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "De computer wordt opnieuw opgestart over %d seconde."
msgstr[1] "De computer wordt opnieuw opgestart over %d seconden."
#: js/ui/endSessionDialog.js:89
#: js/ui/endSessionDialog.js:91
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Opnieuw opstarten en updates installeren"
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:93
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1357,22 +1233,22 @@ msgstr[0] ""
msgstr[1] ""
"De computer zal opnieuw opstarten en updates installeren over %d seconden."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Herstarten en installeren"
#: js/ui/endSessionDialog.js:98
#: js/ui/endSessionDialog.js:100
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Installeren en uitschakelen"
#: js/ui/endSessionDialog.js:99
#: js/ui/endSessionDialog.js:101
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Uitschakelen na installatie van updates"
#: js/ui/endSessionDialog.js:106
#: js/ui/endSessionDialog.js:108
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Opnieuw opstarten en upgrades installeren"
@ -1380,7 +1256,7 @@ msgstr "Opnieuw opstarten en upgrades installeren"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111
#: js/ui/endSessionDialog.js:113
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1390,17 +1266,17 @@ msgstr ""
"kan lang duren: zorg ervoor dat u een reservekopie heeft gemaakt en dat de "
"computer is aangesloten op netstroom."
#: js/ui/endSessionDialog.js:259
#: js/ui/endSessionDialog.js:261
msgid "Running on battery power: Please plug in before installing updates."
msgstr ""
"De computer gebruikt accustroom. Sluit de adapter aan alvorens de "
"installatie te starten."
#: js/ui/endSessionDialog.js:268
#: js/ui/endSessionDialog.js:270
msgid "Some applications are busy or have unsaved work"
msgstr "Sommige toepassingen zijn bezig of hebben niet-opgeslagen werk"
#: js/ui/endSessionDialog.js:273
#: js/ui/endSessionDialog.js:275
msgid "Other users are logged in"
msgstr "Er zijn andere gebruikers aangemeld"
@ -1416,24 +1292,24 @@ msgstr "%s (op afstand)"
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:169
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Installeren"
#: js/ui/extensionDownloader.js:175
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Uitbreiding installeren"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "%s downloaden van extensions.gnome.org en daarna installeren?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:233
msgid "Extension Updates Available"
msgstr "Er zijn uitbreidingsupdates beschikbaar"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:234
msgid "Extension updates are ready to be installed."
msgstr "Uitbreidingsupdates zijn klaar voor installatie."
@ -1582,11 +1458,11 @@ msgstr "Broncode weergeven"
msgid "Web Page"
msgstr "Webpagina"
#: js/ui/main.js:269
#: js/ui/main.js:277
msgid "Logged in as a privileged user"
msgstr "Aangemeld als gebruiker met extra rechten"
#: js/ui/main.js:270
#: js/ui/main.js:278
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1595,15 +1471,15 @@ msgstr ""
"als gebruiker met extra rechten vermijdt. Meld u, indien mogelijk, aan als "
"een normale gebruiker."
#: js/ui/main.js:276
#: js/ui/main.js:317
msgid "Screen Lock disabled"
msgstr "Schermvergrendeling uitgeschakeld"
#: js/ui/main.js:277
#: js/ui/main.js:318
msgid "Screen Locking requires the GNOME display manager."
msgstr "Schermvergrendeling vereist de Gnome-displaymanager."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1551
msgid "System Information"
msgstr "Systeeminformatie"
@ -1687,12 +1563,12 @@ msgstr "Afsluiten"
msgid "Activities"
msgstr "Activiteiten"
#: js/ui/panel.js:707
#: js/ui/panel.js:713
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Systeem"
#: js/ui/panel.js:820
#: js/ui/panel.js:826
msgid "Top Bar"
msgstr "Menubalk"
@ -1810,13 +1686,13 @@ msgid "The PIM must be a number or empty."
msgstr "De PIM moet ofwel een getal ofwel leeg zijn."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Kan %s niet starten"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Kon %s niet vinden"
@ -2291,11 +2167,11 @@ msgstr "Thunderbolt-autorisatiefout"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Kon het Thunderbolt-apparaat niet autoriseren: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume gewijzigd"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2329,23 +2205,23 @@ msgstr "Enkel ingebouwd"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Veeg omhoog om te ontgrendelen"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Klik of druk op een toets om te ontgrendelen"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Venster voor ontgrendelen"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Aanmelden als andere gebruiker"
@ -2464,19 +2340,19 @@ msgstr "Sluiten"
msgid "Evolution Calendar"
msgstr "Evolution-agenda"
#: src/main.c:460 subprojects/extensions-tool/src/main.c:249
#: src/main.c:458 subprojects/extensions-tool/src/main.c:249
msgid "Print version"
msgstr "Versie weergeven"
#: src/main.c:466
#: src/main.c:464
msgid "Mode used by GDM for login screen"
msgstr "De modus die door GDM voor het aanmeldscherm gebruikt wordt"
#: src/main.c:472
#: src/main.c:470
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Specifieke modus gebruiken, bijv. gdm voor het aanmeldscherm"
#: src/main.c:478
#: src/main.c:476
msgid "List possible modes"
msgstr "Mogelijke modi tonen"
@ -2502,6 +2378,139 @@ msgstr "Het wachtwoord mag niet leeg blijven"
msgid "Authentication dialog was dismissed by the user"
msgstr "Authenticatievenster is door de gebruiker afgesloten"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Uitbreidingen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Beheer uw Gnome-uitbreidingen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Gnome Uitbreidingen staat in voor het bijwerken van uitbreidingen, hun "
"voorkeuren te configureren of ongewenste uitbreidingen te verwijderen of uit "
"te schakelen."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Gnome Shell-uitbreidingen configureren"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "%s verwijderen?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Als u een uitbreiding verwijdert, zult u deze opnieuw moeten downloaden om "
"ze opnieuw te gebruiken"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Verwijderen"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Nathan Follens <nthn@unseen.is>\n"
"\n"
"Meer info over Gnome-NL http://nl.gnome.org"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d uitbreiding wordt bijgewerkt bij de volgende aanmelding."
msgstr[1] "%d uitbreidingen worden bijgewerkt bij de volgende aanmelding."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschrijving"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versie"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Verwijderen…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hulp"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Over uitbreidingen"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Bezoek <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> om "
"uitbreidingen te zoeken en installeren."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Waarschuwing"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Uitbreidingen kunnen problemen veroorzaken, inclusief prestatieproblemen. "
"Als u een probleem met uw systeem ondervindt, wordt het aanbevolen eerst "
"alle uitbreidingen uit te schakelen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Handmatig geïnstalleerd"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Ingebouwd"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Geen uitbreidingen geïnstalleerd"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Sorry, we konden de lijst met geïnstalleerde uitbreidingen niet verkrijgen. "
"Zorg dat u bij Gnome aangemeld bent, en probeer het opnieuw."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Afmelden…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2839,6 +2848,9 @@ msgstr[1] "%u invoerkanalen"
msgid "System Sounds"
msgstr "Systeemgeluiden"
#~ msgid "Copy Error"
#~ msgstr "Fout kopiëren"
#~ msgid "Browse in Software"
#~ msgstr "Bladeren in Software"

2803
po/os.po Normal file

File diff suppressed because it is too large Load Diff

427
po/pl.po
View File

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-19 15:40+0100\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-05-02 21:42+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n"
@ -394,69 +394,12 @@ msgstr ""
msgid "Network Login"
msgstr "Logowanie do sieci"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Rozszerzenia"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Zarządzanie rozszerzeniami GNOME"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ten program obsługuje aktualizowanie, konfigurowanie preferencji oraz "
"usuwanie i wyłączanie niechcianych rozszerzeń."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfiguracja rozszerzeń powłoki GNOME"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Usunąć rozszerzenie „%s”?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Po usunięciu rozszerzenia jego ponowne włączenie będzie wymagało pobrania od "
"nowa"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Anuluj"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Usuń"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Piotr Drąg <piotrdrag@gmail.com>, 2009-2020\n"
"Tomasz Dominikowski <dominikowski@gmail.com>, 2009\n"
"Wojciech Szczęsny <wszczesny@aviary.pl>, 2013\n"
"Aviary.pl <community-poland@mozilla.org>, 2009-2020"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong"
msgstr "Coś się nie powiodło"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -465,106 +408,25 @@ msgstr ""
"Wystąpił problem: nie można wyświetlić ustawień tego rozszerzenia. Zalecamy "
"zgłoszenie problemu autorom rozszerzenia."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Informacje techniczne"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Skopiuj błąd"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Strona WWW"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Otwiera stronę WWW rozszerzenia"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d rozszerzenie zostanie zaktualizowane po następnym zalogowaniu."
msgstr[1] "%d rozszerzenia zostaną zaktualizowane po następnym zalogowaniu."
msgstr[2] "%d rozszerzeń zostanie zaktualizowanych po następnym zalogowaniu."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Opis"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Wersja"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Witryna"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Usuń…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Pomoc"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "O programie"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Witryna <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> "
"umożliwia wyszukiwanie i dodawanie rozszerzeń."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Ostrzeżenie"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Rozszerzenia mogą powodować problemy z komputerem, w tym związane "
"z wydajnością. W przypadku występowania problemów zalecane jest wyłączenie "
"wszystkich rozszerzeń."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Ręcznie zainstalowane"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Wbudowane"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Brak zainstalowanych rozszerzeń"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nie można wyświetlić listy zainstalowanych rozszerzeń. Proszę się upewnić, "
"że zalogowano w środowisku GNOME i spróbować ponownie."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Wyloguj się…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Anuluj"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -858,44 +720,44 @@ msgstr "Odmów dostępu"
msgid "Grant Access"
msgstr "Udziel dostępu"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:932
msgid "Unnamed Folder"
msgstr "Katalog bez nazwy"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:955
msgid "Frequently used applications will appear here"
msgstr "W tym miejscu pojawią się często używane programy"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1090
msgid "Frequent"
msgstr "Często używane"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1097
msgid "All"
msgstr "Wszystkie"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Otwarte okna"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
msgid "New Window"
msgstr "Nowe okno"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2504
msgid "Launch using Dedicated Graphics Card"
msgstr "Uruchom za pomocą dedykowanej karty graficznej"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Usuń z ulubionych"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2538
msgid "Add to Favorites"
msgstr "Dodaj do ulubionych"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
msgid "Show Details"
msgstr "Wyświetl szczegóły"
@ -925,7 +787,7 @@ msgstr "Słuchawki"
msgid "Headset"
msgstr "Słuchawki z mikrofonem"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Mikrofon"
@ -1066,7 +928,7 @@ msgstr "Brak wydarzeń"
msgid "Do Not Disturb"
msgstr "Nie przeszkadzać"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Wyczyść"
@ -1212,7 +1074,7 @@ msgstr "To nie zadziałało. Proszę spróbować ponownie."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "Użytkownik „%s” jest teraz znany jako „%s”"
@ -1256,38 +1118,38 @@ msgstr "Dodaj zegar światowy…"
msgid "World Clocks"
msgstr "Zegar światowy"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Pogoda"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Wybierz położenie…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Wczytywanie…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Prognoza pogody wymaga połączenia z Internetem"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Prognoza pogody jest obecnie niedostępna"
#: js/ui/endSessionDialog.js:37
#: js/ui/endSessionDialog.js:39
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Wylogowanie użytkownika %s"
#: js/ui/endSessionDialog.js:38
#: js/ui/endSessionDialog.js:40
msgctxt "title"
msgid "Log Out"
msgstr "Wylogowanie"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:42
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
@ -1295,7 +1157,7 @@ msgstr[0] "Użytkownik %s zostanie wylogowany za %d sekundę."
msgstr[1] "Użytkownik %s zostanie wylogowany za %d sekundy."
msgstr[2] "Użytkownik %s zostanie wylogowany za %d sekund."
#: js/ui/endSessionDialog.js:45
#: js/ui/endSessionDialog.js:47
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
@ -1303,22 +1165,22 @@ msgstr[0] "Wylogowanie nastąpi za %d sekundę."
msgstr[1] "Wylogowanie nastąpi za %d sekundy."
msgstr[2] "Wylogowanie nastąpi za %d sekund."
#: js/ui/endSessionDialog.js:51
#: js/ui/endSessionDialog.js:53
msgctxt "button"
msgid "Log Out"
msgstr "Wyloguj się"
#: js/ui/endSessionDialog.js:56
#: js/ui/endSessionDialog.js:58
msgctxt "title"
msgid "Power Off"
msgstr "Wyłączenie komputera"
#: js/ui/endSessionDialog.js:57
#: js/ui/endSessionDialog.js:59
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Instalacja aktualizacji i wyłączenie komputera"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:61
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
@ -1326,27 +1188,27 @@ msgstr[0] "Wyłączenie komputera nastąpi za %d sekundę."
msgstr[1] "Wyłączenie komputera nastąpi za %d sekundy."
msgstr[2] "Wyłączenie komputera nastąpi za %d sekund."
#: js/ui/endSessionDialog.js:63
#: js/ui/endSessionDialog.js:65
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Instalacja oczekujących aktualizacji oprogramowania"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
msgctxt "button"
msgid "Restart"
msgstr "Uruchom ponownie"
#: js/ui/endSessionDialog.js:68
#: js/ui/endSessionDialog.js:70
msgctxt "button"
msgid "Power Off"
msgstr "Wyłącz komputer"
#: js/ui/endSessionDialog.js:74
#: js/ui/endSessionDialog.js:76
msgctxt "title"
msgid "Restart"
msgstr "Ponowne uruchomienie"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:78
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
@ -1354,12 +1216,12 @@ msgstr[0] "Ponowne uruchomienie komputera nastąpi za %d sekundę."
msgstr[1] "Ponowne uruchomienie komputera nastąpi za %d sekundy."
msgstr[2] "Ponowne uruchomienie komputera nastąpi za %d sekund."
#: js/ui/endSessionDialog.js:89
#: js/ui/endSessionDialog.js:91
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Ponowne uruchomienie i instalacja aktualizacji"
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:93
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1374,22 +1236,22 @@ msgstr[2] ""
"Ponowne uruchomienie komputera i instalacja aktualizacji nastąpi za "
"%d sekund."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Uruchom ponownie i zainstaluj"
#: js/ui/endSessionDialog.js:98
#: js/ui/endSessionDialog.js:100
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Zainstaluj i wyłącz komputer"
#: js/ui/endSessionDialog.js:99
#: js/ui/endSessionDialog.js:101
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Wyłączenie komputera po zainstalowaniu aktualizacji"
#: js/ui/endSessionDialog.js:106
#: js/ui/endSessionDialog.js:108
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Ponowne uruchomienie i instalacja aktualizacji"
@ -1397,7 +1259,7 @@ msgstr "Ponowne uruchomienie i instalacja aktualizacji"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111
#: js/ui/endSessionDialog.js:113
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1407,17 +1269,17 @@ msgstr ""
"aktualizacji może zająć dużo czasu. Proszę się upewnić, że wykonano kopię "
"zapasową danych i podłączono komputer do prądu."
#: js/ui/endSessionDialog.js:259
#: js/ui/endSessionDialog.js:261
msgid "Running on battery power: Please plug in before installing updates."
msgstr ""
"Działanie na zasilaniu z akumulatora: proszę podłączyć komputer do prądu "
"przed instalowaniem aktualizacji."
#: js/ui/endSessionDialog.js:268
#: js/ui/endSessionDialog.js:270
msgid "Some applications are busy or have unsaved work"
msgstr "Niektóre programy są używane lub mają niezapisane dane"
#: js/ui/endSessionDialog.js:273
#: js/ui/endSessionDialog.js:275
msgid "Other users are logged in"
msgstr "Inni użytkownicy są zalogowani"
@ -1433,25 +1295,25 @@ msgstr "%s (zdalnie)"
msgid "%s (console)"
msgstr "%s (konsola)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Zainstaluj"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Instalacja rozszerzenia"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr ""
"Pobrać i zainstalować rozszerzenie „%s” z witryny extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:233
msgid "Extension Updates Available"
msgstr "Dostępne są aktualizacje rozszerzeń"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:234
msgid "Extension updates are ready to be installed."
msgstr "Aktualizacje rozszerzeń są gotowe do zainstalowania."
@ -1598,11 +1460,11 @@ msgstr "Wyświetl źródło"
msgid "Web Page"
msgstr "Strona WWW"
#: js/ui/main.js:274
#: js/ui/main.js:277
msgid "Logged in as a privileged user"
msgstr "Zalogowano jako uprawniony użytkownik"
#: js/ui/main.js:275
#: js/ui/main.js:278
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1610,15 +1472,15 @@ msgstr ""
"Należy unikać działania jako uprawniony użytkownik z powodów bezpieczeństwa. "
"Jeśli to możliwe, należy zalogować się jako zwykły użytkownik."
#: js/ui/main.js:281
#: js/ui/main.js:317
msgid "Screen Lock disabled"
msgstr "Blokada ekranu jest wyłączona"
#: js/ui/main.js:282
#: js/ui/main.js:318
msgid "Screen Locking requires the GNOME display manager."
msgstr "Blokowanie ekranu wymaga menedżera wyświetlania GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1551
msgid "System Information"
msgstr "Informacje systemowe"
@ -1826,13 +1688,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM musi być numerem lub być pusty."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Nie można uruchomić programu %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nie można odnaleźć programu %s"
@ -2257,7 +2119,7 @@ msgstr "Zablokuj ekran"
#: js/ui/status/system.js:116
msgid "Power Off / Log Out"
msgstr "Wyłącz komputer/wyloguj się"
msgstr "Wyłącz/wyloguj się"
#: js/ui/status/system.js:119
msgid "Log Out"
@ -2310,11 +2172,11 @@ msgstr "Błąd upoważnienia Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Nie można upoważnić urządzenia Thunderbolt: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Zmieniono głośność"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Głośność"
@ -2348,23 +2210,23 @@ msgstr "Tylko wbudowany"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A, %-d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Przeciągnięcie w górę odblokuje"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Kliknięcie lub naciśnięcie klawisza odblokuje"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Okno odblokowania"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Zaloguj jako inny użytkownik"
@ -2522,6 +2384,140 @@ msgstr "Hasło nie może być puste"
msgid "Authentication dialog was dismissed by the user"
msgstr "Okno uwierzytelniania zostało odrzucone przez użytkownika"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Rozszerzenia"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Zarządzanie rozszerzeniami GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ten program obsługuje aktualizowanie, konfigurowanie preferencji oraz "
"usuwanie i wyłączanie niechcianych rozszerzeń."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfiguracja rozszerzeń powłoki GNOME"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Usunąć rozszerzenie „%s”?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Po usunięciu rozszerzenia jego ponowne włączenie będzie wymagało pobrania od "
"nowa"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Usuń"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Piotr Drąg <piotrdrag@gmail.com>, 2009-2020\n"
"Tomasz Dominikowski <dominikowski@gmail.com>, 2009\n"
"Wojciech Szczęsny <wszczesny@aviary.pl>, 2013\n"
"Aviary.pl <community-poland@mozilla.org>, 2009-2020"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d rozszerzenie zostanie zaktualizowane po następnym zalogowaniu."
msgstr[1] "%d rozszerzenia zostaną zaktualizowane po następnym zalogowaniu."
msgstr[2] "%d rozszerzeń zostanie zaktualizowanych po następnym zalogowaniu."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Opis"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Wersja"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Witryna"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Usuń…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Pomoc"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "O programie"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Witryna <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> "
"umożliwia wyszukiwanie i dodawanie rozszerzeń."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Ostrzeżenie"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Rozszerzenia mogą powodować problemy z komputerem, w tym związane "
"z wydajnością. W przypadku występowania problemów zalecane jest wyłączenie "
"wszystkich rozszerzeń."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Ręcznie zainstalowane"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Wbudowane"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Brak zainstalowanych rozszerzeń"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nie można wyświetlić listy zainstalowanych rozszerzeń. Proszę się upewnić, "
"że zalogowano w środowisku GNOME i spróbować ponownie."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Wyloguj się…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2860,6 +2856,9 @@ msgstr[2] "%u wejść"
msgid "System Sounds"
msgstr "Dźwięki systemowe"
msgid "Extension Updates Ready"
msgstr "Aktualizacje rozszerzeń są gotowe"
msgctxt "button"
msgid "Boot Options"
msgstr "Opcje uruchamiania"

2030
po/ro.po

File diff suppressed because it is too large Load Diff

555
po/sk.po

File diff suppressed because it is too large Load Diff

2002
po/sl.po

File diff suppressed because it is too large Load Diff

161
po/sr.po
View File

@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-04-02 21:42+0200\n"
"POT-Creation-Date: 2020-05-15 03:04+0000\n"
"PO-Revision-Date: 2020-05-17 21:22+0200\n"
"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
"Language-Team: Serbian <gnome-sr@googlegroups.org>\n"
"Language: sr\n"
@ -28,7 +28,7 @@ msgstr ""
#: data/50-gnome-shell-system.xml:6
msgid "System"
msgstr "Упишите тражено"
msgstr "Систем"
#: data/50-gnome-shell-system.xml:9
msgid "Show the notification list"
@ -391,7 +391,7 @@ msgid "Network Login"
msgstr "Мрежна пријава"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Нешто је пошло наопако"
@ -418,7 +418,7 @@ msgstr "Посети матичну страну проширењ"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
@ -474,13 +474,13 @@ msgid "(or swipe finger)"
msgstr "(или превуците прст)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Искључи"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr ""
"power off;shutdown;искључи;угаси;гашење;isključi;ugasi;gašenje;iskljuci;"
@ -488,55 +488,55 @@ msgstr ""
"стоп"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Закључај екран"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "закључај екран"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Одјави ме"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr ""
"изађи;одјави се;одлогуј се;izađi;odjavi se;odloguj se;izadji;logout;log out;"
"sign off"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Обустави"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr ""
"suspend;sleep;обустави;спавај;суспендуј;obustavi;spavaj;suspenduj;suspend;"
"sleep"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Промени корисника"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "switch user;промени корисника;promeni korisnika;switch user"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"lock orientation;screen;rotation;закључај окретање екрана;закључај "
@ -544,12 +544,12 @@ msgstr ""
"okretanje ekrana;екран;ekran;окретање;okretanje;lock orientation;screen;"
"rotation"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Откључај окретање екрана"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Закључај окретање екрана"
@ -726,53 +726,53 @@ msgstr "Забрани приступ"
msgid "Grant Access"
msgstr "Дозволи приступ"
#: js/ui/appDisplay.js:932
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Неименована фасцикла"
#: js/ui/appDisplay.js:955
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Често коришћени програми ће се појавити овде"
#: js/ui/appDisplay.js:1090
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Често"
#: js/ui/appDisplay.js:1097
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Све"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Отвори прозоре"
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Нови прозор"
#: js/ui/appDisplay.js:2504
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Покрени са намењеном графичком картицом"
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Уклони из омиљених"
#: js/ui/appDisplay.js:2538
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Додај у омиљене"
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Прикажи детаље"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "„%s“ је додат међу омиљене."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "„%s“ је уклоњен из омиљених."
@ -1145,18 +1145,18 @@ msgstr "Идите на мрежу за податке о временској
msgid "Weather information is currently unavailable"
msgstr "Подаци о временској прогнози тренутно нису доступни."
#: js/ui/endSessionDialog.js:39
#: js/ui/endSessionDialog.js:37
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Одјави корисника „%s“"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:38
msgctxt "title"
msgid "Log Out"
msgstr "Одјави ме"
#: js/ui/endSessionDialog.js:42
#: js/ui/endSessionDialog.js:40
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
@ -1165,7 +1165,7 @@ msgstr[1] "%s ће бити одјављен за %d секунде."
msgstr[2] "%s ће бити одјављен за %d секунди."
msgstr[3] "%s ће бити одјављен за %d секунду."
#: js/ui/endSessionDialog.js:47
#: js/ui/endSessionDialog.js:45
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
@ -1174,22 +1174,22 @@ msgstr[1] "Бићете одјављени за %d секунде."
msgstr[2] "Бићете одјављени за %d секунди."
msgstr[3] "Бићете одјављени за %d секунду."
#: js/ui/endSessionDialog.js:53
#: js/ui/endSessionDialog.js:51
msgctxt "button"
msgid "Log Out"
msgstr "Одјави"
#: js/ui/endSessionDialog.js:58
#: js/ui/endSessionDialog.js:56
msgctxt "title"
msgid "Power Off"
msgstr "Искључи"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:57
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Инсталирај освежења и искључи"
#: js/ui/endSessionDialog.js:61
#: js/ui/endSessionDialog.js:59
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
@ -1198,27 +1198,27 @@ msgstr[1] "Рачунар ће се искључити за %d секунде."
msgstr[2] "Рачунар ће се искључити за %d секунди."
msgstr[3] "Рачунар ће се искључити за %d секунду."
#: js/ui/endSessionDialog.js:65
#: js/ui/endSessionDialog.js:63
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Инсталирај освежења софтвера на чекању"
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
msgctxt "button"
msgid "Restart"
msgstr "Поново покрени"
#: js/ui/endSessionDialog.js:70
#: js/ui/endSessionDialog.js:68
msgctxt "button"
msgid "Power Off"
msgstr "Искључи"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:74
msgctxt "title"
msgid "Restart"
msgstr "Поново покрени"
#: js/ui/endSessionDialog.js:78
#: js/ui/endSessionDialog.js:76
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
@ -1227,12 +1227,12 @@ msgstr[1] "Систем ће се поново покренути за %d сек
msgstr[2] "Систем ће се поново покренути за %d секунди."
msgstr[3] "Систем ће се поново покренути за %d секунду."
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:89
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Поново покрени и инсталирај ажурирања"
#: js/ui/endSessionDialog.js:93
#: js/ui/endSessionDialog.js:91
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1246,22 +1246,22 @@ msgstr[2] ""
msgstr[3] ""
"Систем ће се сам поново покренути и инсталирати ажурирања за %d секунду."
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Поново покрени и инсталирај"
#: js/ui/endSessionDialog.js:100
#: js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Инсталирај и искључи"
#: js/ui/endSessionDialog.js:101
#: js/ui/endSessionDialog.js:99
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Искључи након инсталирања освежења"
#: js/ui/endSessionDialog.js:108
#: js/ui/endSessionDialog.js:106
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Поново покрени и инсталирај надоградњу"
@ -1269,7 +1269,7 @@ msgstr "Поново покрени и инсталирај надоградњу
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:113
#: js/ui/endSessionDialog.js:111
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1279,26 +1279,26 @@ msgstr ""
"понекад може да потраје: проверите да ли сте направили резерву ваших важних "
"података и да ли је рачунар прикључен на мрежно напајање."
#: js/ui/endSessionDialog.js:261
#: js/ui/endSessionDialog.js:259
msgid "Running on battery power: Please plug in before installing updates."
msgstr "На батерији сте, прикључите мрежно напајање пре инсталирања ажурирања."
#: js/ui/endSessionDialog.js:270
#: js/ui/endSessionDialog.js:268
msgid "Some applications are busy or have unsaved work"
msgstr "Неки програми су заузети или имају несачувани рад"
#: js/ui/endSessionDialog.js:275
#: js/ui/endSessionDialog.js:273
msgid "Other users are logged in"
msgstr "Други корисници су пријављени"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (удаљено)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (љуска)"
@ -1316,11 +1316,11 @@ msgstr "Инсталирај проширење"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Да преузмем и да инсталирам „%s“ са „extensions.gnome.org“-а?"
#: js/ui/extensionSystem.js:233
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Доступна су ажурирања проширења"
#: js/ui/extensionSystem.js:234
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Ажурирања проширења су доступна за инсталирање."
@ -1467,11 +1467,11 @@ msgstr "Прикажи код"
msgid "Web Page"
msgstr "Веб страница"
#: js/ui/main.js:277
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Пријављен као повлашћен корисник"
#: js/ui/main.js:278
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1479,23 +1479,23 @@ msgstr ""
"Покретање сесије под повлашћеним корисничким налогом треба избегавати из "
"безбедносних разлога. Ако је то могуће, пријавите се као обичан корисник."
#: js/ui/main.js:317
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Закључавање екрана онемогућено"
#: js/ui/main.js:318
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Потребан је Гномов управник екрана за могућност закључавања екрана."
#: js/ui/messageTray.js:1551
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Подаци о систему"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:204
msgid "Unknown artist"
msgstr "Непознат извођач"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:214
msgid "Unknown title"
msgstr "Непознат наслов"
@ -1567,16 +1567,16 @@ msgstr "Изађи"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Активности"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Систем"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Горња трака"
@ -1607,11 +1607,11 @@ msgstr "Гном мора да закључа екран"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Не могу да закључам"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Неки програм је блокирао закључавање"
@ -2273,7 +2273,7 @@ msgstr "Врати подешавања"
msgid "Keep Changes"
msgstr "Задржи измене"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2284,7 +2284,7 @@ msgstr[3] "Измене подешавања ће бити враћене за %
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2377,12 +2377,12 @@ msgstr "Користи нарочит режим, нпр. „gdm“ за екр
msgid "List possible modes"
msgstr "Исписује могуће режиме"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Непознат"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Нисам успео да покренем „%s“"
@ -2512,19 +2512,19 @@ msgstr ""
"Уколико приметите проблеме у раду, препоручујемо да онемогућите сва "
"проширења."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Ручно инсталирана"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Уграђена"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Неинсталирана проширења"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
@ -2532,7 +2532,12 @@ msgstr ""
"Нажалост, није било могуће добавити списак инсталираних проширења. Проверите "
"да ли сте пријављени у Гном и пробајте поново."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
#| msgid "Extension Updates Available"
msgid "Extension Updates Ready"
msgstr "Спремна су ажурирања проширења"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Одјава…"

431
po/sv.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-19 21:39+0100\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n"
"PO-Revision-Date: 2020-05-12 00:34+0200\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@ -387,69 +387,12 @@ msgstr "Fördröj fokusändringar i musläge tills pekare slutar röra sig"
msgid "Network Login"
msgstr "Nätverksinloggning"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Tillägg"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Hantera dina GNOME-tillägg"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Tillägg hanterar uppdatering av tillägg, konfiguration av "
"inställningar för tillägg samt att ta bort eller inaktivera oönskade tillägg."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurera tillägg för GNOME-skal"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Ta bort ”%s”?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Om du tar bort tillägget kommer du att behöva återvända för att hämta det om "
"du vill aktivera det igen"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Avbryt"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Ta bort"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"\n"
"Skicka synpunkter på översättningen till\n"
"<tp-sv@listor.tp-sv.se>."
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Något har gått fel"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -459,104 +402,25 @@ msgstr ""
"tillägg kan inte visas. Vi rekommenderar att du rapporterar problemet till "
"tilläggets skapare."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Tekniska detaljer"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Kopiera fel"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Webbsida"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Besök webbsida för tillägg"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d inlägg kommer att uppdateras vid nästa inloggning."
msgstr[1] "%d inlägg kommer att uppdateras vid nästa inloggning."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beskrivning"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Upphovsman"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webbplats"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Ta bort…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hjälp"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Om tillägg"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"För att hitta och lägga till tillägg, besök <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Varning"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Tillägg kan orsaka systemproblem, även prestandaproblem. Om du stöter på "
"problem med ditt system så rekommenderas du att inaktivera alla tillägg."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Manuellt installerade"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Inbyggda"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Inga installerade tillägg"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Vi är ledsna, men det var inte möjligt att erhålla listan över installerade "
"tillägg. Säkerställ att du är inloggad i GNOME och försök igen."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Logga ut…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Avbryt"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -608,73 +472,73 @@ msgid "(or swipe finger)"
msgstr "(eller dra fingret)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Stäng av"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "stäng av;stäng ner;stäng;starta om;omstart;halt;stopp"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Lås skärm"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr "lås skärm"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Logga ut"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "utloggning;logga ut"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Vänteläge"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "vänteläge;vila"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Växla användare"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "växla användare"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"lås orientering;lås riktning;lås upp orientering;lås upp riktning;skärm;"
"rotation"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Lås upp skärmrotation"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Lås skärmrotation"
@ -840,53 +704,53 @@ msgstr "Neka åtkomst"
msgid "Grant Access"
msgstr "Bevilja åtkomst"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Namnlös mapp"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Ofta använda program kommer visas här"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Ofta använda"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Alla"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Öppna fönster"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
msgid "New Window"
msgstr "Nytt fönster"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2511
msgid "Launch using Dedicated Graphics Card"
msgstr "Kör med diskret grafikkort"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Ta bort från favoriter"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2545
msgid "Add to Favorites"
msgstr "Lägg till som favorit"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
msgid "Show Details"
msgstr "Visa detaljer"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s har lagts till i dina favoriter."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s har tagits bort från dina favoriter."
@ -907,7 +771,7 @@ msgstr "Hörlurar"
msgid "Headset"
msgstr "Mikrofonlur"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Mikrofon"
@ -1048,7 +912,7 @@ msgstr "Inga händelser"
msgid "Do Not Disturb"
msgstr "Stör ej"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Töm"
@ -1197,7 +1061,7 @@ msgstr "Tyvärr, det fungerade inte. Försök igen."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s är nu känd som %s"
@ -1241,23 +1105,23 @@ msgstr "Lägg till världsklockor…"
msgid "World Clocks"
msgstr "Världsklockor"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Väder"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Välj en plats…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Läser in…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Anslut till nätet för väderinformation"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Väderinformation är för närvarande inte tillgänglig"
@ -1400,35 +1264,35 @@ msgid "Other users are logged in"
msgstr "Andra användare är inloggade"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (fjärransluten)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (konsol)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Installera"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Installera tillägg"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Hämta och installera ”%s” från extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Uppdateringar för tillägg finns tillgängliga"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Uppdateringar för tillägg är redo att installeras."
@ -1576,11 +1440,11 @@ msgstr "Visa källa"
msgid "Web Page"
msgstr "Webbsida"
#: js/ui/main.js:274
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Inloggad som en privilegierad användare"
#: js/ui/main.js:275
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1588,15 +1452,15 @@ msgstr ""
"Att köra en session som en privilegierad användare bör undvikas av "
"säkerhetsskäl. Om möjligt bör du logga in som en normal användare."
#: js/ui/main.js:281
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Skärmlås inaktiverat"
#: js/ui/main.js:282
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Skärmlås kräver GNOME:s displayhanterare."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Systeminformation"
@ -1676,16 +1540,16 @@ msgstr "Avsluta"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Aktiviteter"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Systemrad"
@ -1716,11 +1580,11 @@ msgstr "GNOME behöver låsa skärmen"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Kunde inte låsa"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Låsning hindrades av ett program"
@ -1803,13 +1667,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM måste vara ett tal eller tomt."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Kunde inte starta %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Kunde inte hitta programmet %s"
@ -2283,11 +2147,11 @@ msgstr "Thunderbolt-auktoriseringsfel"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Kunde inte auktorisera Thunderbolt-enheten: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volymen ändrades"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volym"
@ -2321,23 +2185,23 @@ msgstr "Inbyggd skärm"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Svep uppåt för att låsa upp"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Klicka eller tryck på en tangent för att låsa upp"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Lås upp fönster"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Logga in som en annan användare"
@ -2370,7 +2234,7 @@ msgstr "Återställ inställningar"
msgid "Keep Changes"
msgstr "Behåll ändringar"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2379,7 +2243,7 @@ msgstr[1] "Inställningarna kommer återställas om %d sekunder"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2472,12 +2336,12 @@ msgstr "Använd ett specifikt läge, t.ex. ”gdm” för inloggningsskärm"
msgid "List possible modes"
msgstr "Lista möjliga lägen"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Okänt"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Misslyckades med att starta ”%s”"
@ -2494,6 +2358,142 @@ msgstr "Lösenordet får inte vara blankt"
msgid "Authentication dialog was dismissed by the user"
msgstr "Autentiseringsdialogen stängdes av användaren"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Tillägg"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Hantera dina GNOME-tillägg"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Tillägg hanterar uppdatering av tillägg, konfiguration av "
"inställningar för tillägg samt att ta bort eller inaktivera oönskade tillägg."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurera tillägg för GNOME-skal"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Ta bort ”%s”?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Om du tar bort tillägget kommer du att behöva återvända för att hämta det om "
"du vill aktivera det igen"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Ta bort"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"\n"
"Skicka synpunkter på översättningen till\n"
"<tp-sv@listor.tp-sv.se>."
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d inlägg kommer att uppdateras vid nästa inloggning."
msgstr[1] "%d inlägg kommer att uppdateras vid nästa inloggning."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beskrivning"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Upphovsman"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webbplats"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Ta bort…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hjälp"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Om tillägg"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"För att hitta och lägga till tillägg, besök <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Varning"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Tillägg kan orsaka systemproblem, även prestandaproblem. Om du stöter på "
"problem med ditt system så rekommenderas du att inaktivera alla tillägg."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Manuellt installerade"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Inbyggda"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Inga installerade tillägg"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Vi är ledsna, men det var inte möjligt att erhålla listan över installerade "
"tillägg. Säkerställ att du är inloggad i GNOME och försök igen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Uppdateringar för tillägg är redo"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Logga ut…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2831,6 +2831,9 @@ msgstr[1] "%u ingångar"
msgid "System Sounds"
msgstr "Systemljud"
#~ msgid "Copy Error"
#~ msgstr "Kopiera fel"
#~ msgid "Username…"
#~ msgstr "Användarnamn…"

511
po/tr.po

File diff suppressed because it is too large Load Diff

449
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -695,10 +695,35 @@ app_stop_view (App *app,
g_signal_handlers_disconnect_by_func (view, on_objects_removed, app);
}
static void
app_notify_has_calendars (App *app)
{
GVariantBuilder dict_builder;
g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars",
g_variant_new_boolean (app_has_calendars (app)));
g_dbus_connection_emit_signal (app->connection,
NULL,
"/org/gnome/Shell/CalendarServer",
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
g_variant_new ("(sa{sv}as)",
"org.gnome.Shell.CalendarServer",
&dict_builder,
NULL),
NULL);
g_variant_builder_clear (&dict_builder);
}
static void
app_update_views (App *app)
{
GSList *link, *clients;
gboolean had_views, has_views;
had_views = app->live_views != NULL;
for (link = app->live_views; link; link = g_slist_next (link))
{
@ -723,31 +748,14 @@ app_update_views (App *app)
app->live_views = g_slist_prepend (app->live_views, view);
}
has_views = app->live_views != NULL;
if (has_views != had_views)
app_notify_has_calendars (app);
g_slist_free_full (clients, g_object_unref);
}
static void
app_notify_has_calendars (App *app)
{
GVariantBuilder dict_builder;
g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars",
g_variant_new_boolean (app_has_calendars (app)));
g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
NULL,
"/org/gnome/Shell/CalendarServer",
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
g_variant_new ("(sa{sv}as)",
"org.gnome.Shell.CalendarServer",
&dict_builder,
NULL),
NULL);
g_variant_builder_clear (&dict_builder);
}
static void
on_client_appeared_cb (CalendarSources *sources,
ECalClient *client,

View File

@ -253,7 +253,9 @@ deep_count_one (DeepCountState *state,
else
{
content_type = g_file_info_get_content_type (info);
add_content_type_to_cache (state, content_type);
if (content_type)
add_content_type_to_cache (state, content_type);
}
}

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