Compare commits

...

99 Commits

Author SHA1 Message Date
Mario Sanchez Prada
735ce62e8b shadow: Don't attempt to create a shadow for unallocated actors
Calling clutter_actor_get_allocation_box() can potentially cause a
re-layout, which in _st_create_shadow_pipeline_from_actor() would
mean invalidating the shadow_spec passed as a parameter, which
could crash the shell later on since the value for shadow_spec->blur
passed from _st_create_shadow_pipeline() to blur_pixels() would
not be a valid one.

Thus, whether the ClutterActor has an allocation before calling
clutter_actor_get_allocation_box(), and early return if needed.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/36

Closes: #36
2018-02-09 12:22:58 +00:00
Mario Sanchez Prada
cc028dd55a st-icon: Null-check for shadow_spec before trying to paint a shadow
The value of priv->shadow_spec can be NULL at the time an icon is
going to be paint (e.g. because of a change in style), so we need
to check it's a valid one before using it in st_icon_paint(), as
it's already being done in other parts of the code.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/36

Closes: #36
2018-02-09 12:22:13 +00:00
Fran Dieguez
fc5b1591ad Update Galician translation 2018-02-09 11:16:55 +00:00
Mario Sanchez Prada
d63c0e277c altTab: Add also a shortcut to close windows from the switcher popups
Similar to what has been done for the apps switcher, this allows closing
windows pressing W or F4 while operating the windows switcher popup or
the apps switcher popup while navigating the list of windows for an app.

https://bugzilla.gnome.org/show_bug.cgi?id=620106
2018-02-09 09:26:50 +00:00
Mario Sanchez Prada
06f790d86c switcherPopup: Handle removal of items from SwitcherPopup
This will be mainly useful for closing apps from the applications
switcher, but can be implemented generically enough to select the
nearest existing item after removal if there's any, or destroying
the popup's actor otherwise.

Specifically for the apps switcher, doing this also removes the need
of having to manually either update the current app in AppSwitcher
and highlight it, if there are still any items after the removal, or
simply destroy the AppSwitcher otherwise. Besides, calling _select()
in the handler for item-removed makes sure that the list of thumbnails
in the switcher is always closed, if open, when quitting the app.

https://bugzilla.gnome.org/show_bug.cgi?id=620106
2018-02-09 09:26:50 +00:00
Florian Müllner
a3918d8c38 altTab: Add shortcut to quit application
Allow to quit the currently selected application by hitting Alt-q,
similar to the OS X switcher.

https://bugzilla.gnome.org/show_bug.cgi?id=620106
2018-02-09 09:26:50 +00:00
Florian Müllner
5122b06839 altTab: Update the switcher when apps and/or windows get stopped/closed
Make sure that the items from the applications switcher and the windows
switcher are removed when the related applications get stopped, or some
of the associated windows closed.

https://bugzilla.gnome.org/show_bug.cgi?id=620106
2018-02-09 09:26:49 +00:00
Piotr Drąg
f2d12e22b5 Update Polish translation 2018-02-08 23:59:32 +01:00
Rafal Luzynski
a647445b95 calendar Preparing for genitive/nominative months
glibc 2.27 introduced new format specifiers for the month names.
It's obligatory to use them in several languages already and it's
encouraged to use them for all languages because it is not destructive
for any language. As more languages are expected to follow this
standard it's better to use the "%OB" format specifier now so it will
start working correctly automatically.
See also: https://sourceware.org/bugzilla/show_bug.cgi?id=10871

This standard has been also working in BSD and OS X since 1990s,
if anyone tries to use gnome-shell in these systems.

Note: This will not work correctly with glibc < 2.27, there is no
detection whether the system is old or new.

https://bugzilla.gnome.org/show_bug.cgi?id=780957
2018-02-08 12:48:31 +01:00
Rafal Luzynski
9dbe10889b calendar: Make month and month-year formats translatable
Don't try to figure out the month-year order from gtk+.
Provide the format for the translators.  This is easier
and more versatile.

https://bugzilla.gnome.org/show_bug.cgi?id=781329
2018-02-08 12:39:00 +01:00
Piotr Drąg
5f6aace8aa Update Polish translation 2018-02-08 01:30:27 +01:00
Exalm
f2e2af962d panel: Fix active button style on solid panel
Fix regression from bug 747163

https://bugzilla.gnome.org/show_bug.cgi?id=792616
2018-02-07 17:40:46 +01:00
Florian Zwoch
6f0c187cf4 shell-recorder: save cursor's image hot x/y coordinates
Whenever a new cursor image is loaded also save it's hot x/y
coordinates. The drawing code already respects these values, however
they were never set. This change will place the cursor image at the
correct location as seen on screen. shell-screenshot.c served as
reference.

https://bugzilla.gnome.org/show_bug.cgi?id=792860
2018-02-07 13:16:36 +01:00
Florian Müllner
d3a3b7f514 screenShield: Do not save lock state on wayland
We keep track of the lock state and restore it on startup to prevent
a crash from bypassing the screen lock. However on wayland, a crash
doesn't result in gnome-session restarting gnome-shell, but brings
down the entire session - that is, restoring the lock state does not
actually protect the existing session in that case, but forces the
user to authenticate twice in order to start the next session. This
is clearly not helpful, so avoid this by not saving the state when
running as wayland compositor.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/17
2018-02-07 04:35:57 +00:00
Jiri Grönroos
80ad471812 Update Finnish translation 2018-02-06 21:42:17 +00:00
Fabio Tomat
0206a579c2 Update Friulian translation 2018-02-06 21:38:47 +00:00
Daniel Mustieles
86b853b23a Update Spanish translation 2018-02-06 12:27:31 +00:00
Didier Roche
cd0af33947 panel: center date entry with workarea
Align and center the date entry with the workspace's workarea.
This way, maximized applications have their window aligned with the top date
entry.
This doesn't change anything for desktops with no docks or when left/right
workareas are aligned with the monitor.

The offset is leftOffset - rightOffset:
(workArea.x - monitor.x) - (monitor.width - ((workArea.x - monitor.x) +
                                              workArea.width))

https://bugzilla.gnome.org/show_bug.cgi?id=792354
2018-02-06 11:19:58 +01:00
Piotr Drąg
0b51ead004 Update POTFILES.in 2018-02-06 02:15:20 +01:00
Anders Jonsson
d6107a60e4 Update Swedish translation 2018-02-05 22:42:48 +00:00
Christian Kellner
194040dcb2 thunderbolt: add policy provider and indicator
We will now basically act as "policy provider" for thunderbolt
peripherals by using org.freedesktop.bolt service: when new
devices are connect and session is a unlocked user session
we will automatically enroll (authorize and store in the database)
them.
If new devices are connected but the session is locked a message
will be shown informing the user that the device needs to be
reconnected to properly work.
The org.freedesktop.bolt service is provided by the "bolt" daemon.
2018-02-05 21:38:49 +01:00
Carlos Garnacho
8fdf47ea5b keyboard: Do not create widgetry for all keyboard groups at once
Instead do this on demand based on the current group. It is less
taxing at the time of initially creating the Keyboard object.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
82cecf2e36 keyboard: Add languages selection popup
Currently the language options displayed pretty much mirror those of the
top bar keyboard layout selection popup. It may make sense in the future
to only list languages, and automatically switch to the enabled IMs that
the OSK can benefit from (eg. by filling in suggestions).
2018-02-05 17:46:57 +01:00
Carlos Garnacho
d7f8a39023 keyboard: slide focused window on OSK visibility
The focused window will move up/down together with the OSK if the focus
area happens to be covered by the area to be covered by the OSK. This
state is reverted whenever the window loses focus, given it wasn't
relayout in between.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
083d11a032 misc: Make IBus a mandatory dependency
IBus was initially made optional as gnome-shell depended on too
recent API. This API is now old enough and gnome-shell is committing
further to IBus by implementing a ClutterInputMethod through it.
Let's just make IBus a mandatory dependency, instead of making code
paths trickier to cater for situations where it's missing.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
e0852e5991 keyboard: Remove duplicate code
The same calls happen right at the beginning of the function.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
5cec4ae670 keyboard: Move extended keys pop up/down into the Key object
We do not need the parent Keyboard object to handle those specially, the
code can be self-contained enough. The Key object will simply emit
pressed/released events containing the keycode/string, be it from the
parent key or one contained in the BoxPointer.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
e4ee944d8d viewSelector: Send first printable keystroke to the search entry
StIMText used to handle key events for IM consumption in the capture phase,
this made the search box work automagically with nothing explicitly focusing
it. Since it's no longer the case, it has to be done somewhere.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
70bc94946f keyboard: add a special KeyContainer actor to contain keyboard layers
Instead of manually resizing each key everytime the keyboard needs to
relayout, have a special grid container that will preserve aspect when
resized.

This actor works in two stages though, first the keys need to be added
and then layoutButtons() need to be called for the actors to be
reparented to the container with the right attachment options.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
8c3f5b615f shell: Remove gdk_screen property/getter
It's used nowhere.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
d1bebba77a shell: Remove intricate key event handling code
We no longer need to do contortions with key events, as Clutter
key events will be already handed to IMs through ClutterInputMethod.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
83accce24e st: Remove StIMText
It is entirely unused now.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
d86b62d1b7 st: Make StEntry rely entirely on ClutterInputMethod/Focus
StIMText is no longer needed here.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
a2303c5272 ibusCandidatePopup: Feed OSK suggestions from ibus panel candidates
We don't currently hide the ibus completion panel, and this is done from
within the popup that we are meant to hide itself, so thoroughly sucks.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
e0910c0f7c keyboard: Add visible property
So its visibility can be queried externally.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
5b1e705561 keyboard: Add Suggestions object/actor
This will display completion suggestions, that when clicked will get the
text inserted into the current IM focus.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
d93037c05e keyboard: Lookup minimum number of grid slots for each keymap
Instead of doing max() of all. Results on better used screen space on
every keymap.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
73c7441279 keyboard: Use InputMethod underneath 2018-02-05 17:46:57 +01:00
Carlos Garnacho
5914f225a2 misc: Add InputMethod class
This is a ClutterInputMethod implementation using IBus underneath. The
input method will interact with the currently focused ClutterInputFocus,
be it shell chrome or wayland clients through the text_input protocol.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
774930f1a1 keyboard: Ensure to resize keys after layer change
The keys possibly need resizing after a (new) layer has been set, there's
however calling places that don't. Instead, fold this._redraw() into
setActiveLayer().
2018-02-05 17:46:57 +01:00
Carlos Garnacho
3dd3c1ac34 st: Make st_button_fake_release() work with touch press
The st_button_release() call wouldn't happen because StButton does not
set priv->button_mask on touch events. And if we make it called, we can't
try to unset the device grab at the end of the function, as device/sequence
are unset earlier on.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
40db4a6795 main: Stop acquiring caribou name
This is not necessary anymore.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
7fd8fa3478 keyboard: Rework OSK
Caribou is no longer used to load keyboard layouts,
gnome-shell uses the JSON files extracted from Unicode
CLDR instead.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
33c3ed68fd keyboard: Drop message tray source, and tray focus handling
These are long unused.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
a1ce0da9e7 main: Load OSK layouts resource 2018-02-05 17:46:57 +01:00
Carlos Garnacho
52a779e432 data: Add keyboard layout JSON files
These have been created with the script at
git://repo.or.cz/cldr2json.git to translate the XML android
keymaps at http://www.unicode.org/Public/cldr/latest/keyboards.zip
into JSON, easier to parse from gnome-shell.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
6795fb0bd6 data: Add README and supporting script to update keyboard layouts from CLDR
The README describes the steps in detail, but most of it is abstracted away
by the update-osk-layouts.sh script.
2018-02-05 17:46:57 +01:00
Carlos Garnacho
7544bba0c1 keyboard: Restore intended OSK visibility behavior
Getting the necessary "setting enabled, or input from touchscreen"
conditions to have the OSK shown are not enough on the lack of a
current focus. As we are setting up the caret tracker here, wait for
the focus in event before showing the keyboard.

This fixes 2 issues, with the setting disabled it became really hard
to get the OSK hidden on eg. touchscreen->pointer device switches,
as visibility only depended on the a11y setting here. And secondly,
enabling the setting would always end up with the OSK being shown
regardless of focus, while it should stay hidden if there's no text
edition.

https://bugzilla.gnome.org/show_bug.cgi?id=788188
2018-02-05 17:46:57 +01:00
Florian Müllner
2d79ab6c5c private: Avoid unnecessary conversions in shadow computation
The type was changed from double to float for no apparent reason
when moving code in commit 5060081db5.

https://bugzilla.gnome.org/show_bug.cgi?id=788627
2018-02-05 11:09:01 -05:00
Tong Hui
fd034f3724 Update zh_CN translation 2018-02-05 09:39:38 +08:00
Piotr Drąg
8502be66fa Update Polish translation 2018-02-04 23:37:21 +01:00
Jiri Grönroos
626bbeffbf Update Finnish translation 2018-02-03 12:04:25 +00:00
Kukuh Syafaat
4a3c610d70 Update Indonesian translation 2018-02-01 17:55:15 +00:00
Anders Jonsson
bc9e5a4252 Update Swedish translation 2018-01-31 22:39:24 +00:00
Carlos Garnacho
e09f8c87e8 padOsd: Fixup to the previous commit
Forgot to squash this change before pushing, I will leave something in the
money jar as I close the door.
2018-01-30 16:41:25 +01:00
Carlos Garnacho
9ad7f59cdb padOsd: Ensure to pick pad devices only
If the underlying X11 input driver creates multiple devices from a single
device node, we may end up picking up the wrong device. So, instead of
picking the first device based on node and bailing out if it's not a pad,
pick the first pad that has that device node, and bail out if there is
none.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/10

Closes: #10
2018-01-30 16:19:42 +01:00
Iñigo Martínez
6e74f987ec build: Update gvc to support renamed options
gvc has made some recent changes that rename its user options
following meson guidelines for GNOME packages[0].

The options used in gvc as a subproject have been renamed
accordingly.

[0] https://wiki.gnome.org/Initiatives/GnomeGoals/MesonPorting
2018-01-30 13:37:38 +01:00
Balázs Meskó
8c8a7f089f Update Hungarian translation 2018-01-28 21:49:02 +00:00
Bastien Nocera
9b6a931b43 build: Update gvc to not require ALSA support
ALSA support is only used in gnome-settings-daemon, so always disable
the option, which wouldn't work on non-Linux anyway.
2018-01-26 11:24:03 +01:00
Daniel Mustieles
c31bd67538 Update Spanish translation 2018-01-25 11:51:04 +00:00
Dušan Kazik
5297e86591 Update Slovak translation 2018-01-22 19:41:26 +00:00
Florian Müllner
1d3154a89e networkAgent: Pick up VPN service dir from pkg-config
It turns out that NetworkManager does export the directory as pkg-config
variable after all, so use that instead of building the path ourselves
from the prefix.

https://bugzilla.gnome.org/show_bug.cgi?id=789811
2018-01-22 08:44:19 +01:00
Gil Forcada
fed5657b40 [l10n] Update Catalan translation 2018-01-22 00:22:18 +01:00
Jordi Mas
53f4d12566 Update Catalan translation 2018-01-20 22:10:11 +01:00
Tim Sabsch
5d20516330 Update German translation 2018-01-19 23:04:32 +00:00
Marco Trevisan (Treviño)
69da686fa9 dnd: Declare restore location variables
https://bugzilla.gnome.org/show_bug.cgi?id=791233
2018-01-17 13:04:41 -05:00
Marco Trevisan (Treviño)
35eac697c1 appDisplay: don't try to close the popup menu that is already destroyed
This would lead to a JS error otherwise, as we might end up
in deleting actors that have been already destructed.

https://bugzilla.gnome.org/show_bug.cgi?id=791233
2018-01-17 13:04:41 -05:00
Florian Müllner
705915cd31 keyboard: Don't pop up on touch events
We want touch events to enable the keyboard and focus tracking, but
not to actually show it right away. Implement that behavior by only
changing the visibility of the keyboard when triggered by a GSettings
change.

https://bugzilla.gnome.org/show_bug.cgi?id=788188
2018-01-16 17:41:46 +01:00
Florian Müllner
cf23490c37 keyboard: Split enabled setting from enabled state
We enable the keyboard when it is either enabled explicitly via
a11y settings or when using a touch device. We'll soon want to
special-case changes to the GSettings, so track its value in a
dedicated property.

https://bugzilla.gnome.org/show_bug.cgi?id=788188
2018-01-16 17:41:46 +01:00
Florian Müllner
d5f081a108 keyboard: Minor cleanup
_syncEnabled() will call _setupKeyboard() if necessary, so no need
to call it explicitly before.

https://bugzilla.gnome.org/show_bug.cgi?id=788188
2018-01-16 17:41:46 +01:00
Fabio Tomat
f2917968ea Update Friulian translation 2018-01-15 10:54:48 +00:00
Lubomir Rintel
16a1c35e28 network: unregister the agent when it's disabled
When the agent doesn't work (e.g. when the screen is locked), it shouldn't be
registered with NM. Otherwise it will keep cancelling the requests that
could happily be serviced with system secrets.

https://bugzilla.gnome.org/show_bug.cgi?id=789811
2018-01-12 11:50:49 +01:00
Lubomir Rintel
baacd216dd network: remove the vpn request when it's serviced
The native agent already forgets about the request at the point it's
serviced and the further attempt to use it (e.g. cancel it when the screen
is locked) will trigger an assertion failure:

  ** (gnome-shell:30862): CRITICAL **: shell_network_agent_respond: assertion 'request != NULL' failed

https://bugzilla.gnome.org/show_bug.cgi?id=789811
2018-01-12 11:48:52 +01:00
Lubomir Rintel
d71af5e579 network: port to libnm
The libnm-glib is depreacted for a long time already.

https://bugzilla.gnome.org/show_bug.cgi?id=789811
2018-01-12 11:48:49 +01:00
Olivier Fourdan
bc5be10d78 ui: Add keyboard accessibility dialog
Show a dialog informing the user each time the keyboard accessibility
flags are changed by one of the clutter backends (either from toggle
keys or two-keys-off modifiers).

https://bugzilla.gnome.org/show_bug.cgi?id=788564
2018-01-10 19:10:18 +01:00
Florian Müllner
f91fbd7728 network: Fix visibility of VPN section
Commit f2a9467f91 was too eager to simplify the code, and removed
the bits that hid the section in case no VPNs are set up - add them
back to fix the visibility.

https://bugzilla.gnome.org/show_bug.cgi?id=787845
2018-01-10 10:11:25 +01:00
Jiri Grönroos
f40ad89c9f Update Finnish translation 2018-01-09 18:24:32 +00:00
Florian Müllner
723c49a8b7 location: Use translated reason string
Gio now has API to look up localized strings from desktop files,
so we can display a correctly translated reason where available.

https://bugzilla.gnome.org/show_bug.cgi?id=779413
2018-01-09 00:25:46 +01:00
Florian Müllner
3f3e514ff2 networkAgent: Update VPN config path
The location moved a while ago, so update the path to point to
the non-deprecated location.

https://bugzilla.gnome.org/show_bug.cgi?id=791487
2018-01-09 00:25:46 +01:00
Piotr Drąg
aab7656d88 man: Update project website 2018-01-07 21:39:18 +01:00
Matej Urbančič
45e756f247 Updated Slovenian translation 2017-12-31 11:38:12 +01:00
Anders Jonsson
027a08804a Update Swedish translation 2017-12-26 11:44:38 +00:00
Emin Tufan Çetin
e64a482972 Update Turkish translation 2017-12-20 19:56:13 +00:00
Rūdolfs Mazurs
eb4cd57aa2 Update Latvian translation 2017-12-18 20:16:45 +02:00
Ray Strode
94b96f8d97 background: don't leak wall clock when background changes
The background code allocates a GnomeWallClock when its first created,
but neglects to drop a reference to that clock at destroy time.
The undestroyed clocks lead to a timerfd leak that eventually prevents
the shell from functioning.

https://bugzilla.gnome.org/show_bug.cgi?id=791655
2017-12-15 10:57:14 -05:00
Fabio Tomat
989c7bf27e Update Friulian translation 2017-12-15 12:30:08 +00:00
Daniel Mustieles
77ec6a8ea6 Update Spanish translation 2017-12-13 15:35:10 +00:00
Florian Müllner
fb9db4e171 system: Align submenu labels with parent
All section titles use an icon, while all corresponding submenu items
are plain-text. As a result, labels in submenus aren't aligned with
the labels in the parent, which makes them harder to read and look
unbalanced. Address this by adding additional whitespace to submenu
items to account for the additional elements in the title.

https://bugzilla.gnome.org/show_bug.cgi?id=706191
2017-12-11 16:19:09 +01:00
Khaled Hosny
54013182d4 Update Arabic translation 2017-12-10 11:32:35 +02:00
Jordi Mas
7571f0d59e Update Catalan translation 2017-12-08 10:51:15 +01:00
Sveinn í Felli
90534afc20 Update Icelandic translation
(cherry picked from commit 74f4447b38)
2017-12-08 09:01:25 +00:00
Bastien Nocera
29987ae033 dateMenu: Fix possible crash with unknown locations
If there are locations unknown to the libgweather version gnome-shell is
using, don't crash.

JS ERROR: TypeError: b.location is null
WorldClocksSection<._clocksChanged/<@resource:///org/gnome/shell/ui/dateMenu.js:141:1
WorldClocksSection<._clocksChanged@resource:///org/gnome/shell/ui/dateMenu.js:139:9

https://bugzilla.gnome.org/show_bug.cgi?id=791148
2017-12-06 02:02:48 +01:00
Bastien Nocera
a29ceb31dd dateMenu: Ignore malformed world-clocks settings
Guard against a malformed setting that doesn't contain a
'location' key.

https://bugzilla.gnome.org/show_bug.cgi?id=791148
2017-12-06 02:02:48 +01:00
Marco Trevisan (Treviño)
74683b7ef7 dash: Do not shadow ClutterActor's destroy()
Since commit ef1e27966d turned DashItemContainer into an StWidget,
the destroy() method overrides the ClutterActor method, which is at
the very least bad style. Instead, follow the usual pattern of using
a ::destroy handler.

https://bugzilla.gnome.org/show_bug.cgi?id=791233
2017-12-05 18:07:00 -05:00
Marco Trevisan (Treviño)
6c655a6c71 dash: Make sure item labels are only destroyed once
Labels are currently destroyed from both animateOutAndDestroy()
and destroy(), which now (rightfully) triggers a gjs warning. As
the label is created unconditionally since commit 36e5ae4a25,
mirror that and always release it in destroy() and hide it
elsewhere.

https://bugzilla.gnome.org/show_bug.cgi?id=791233
2017-12-05 18:06:58 -05:00
Kukuh Syafaat
13fdaa80bf Update Indonesian translation 2017-12-05 14:58:58 +00:00
Florian Müllner
6e3178d5b6 build: Remove Build API wrapper
GNOME Continuous gained native meson support, so we don't need the
wrapper script anymore.
2017-12-01 16:04:48 +01:00
Florian Müllner
ca367e4e26 build: Stop detecting features automatically
Auto-detect options add some convenience for platforms where a
particular feature isn't available - systemd on non-Linux OS comes
to mind - but the downside is that it is easy to accidentally build
without a desired feature. We consider the latter much more serious
nowadays, so turn our auto-detect options into regular boolean
options.

https://bugzilla.gnome.org/show_bug.cgi?id=791007
2017-11-30 00:24:53 +01:00
Florian Müllner
10c602fe95 build: Remove 'enable' prefix from option names
Meson options are typed, so the prefix isn't necessary, and indeed
looks odd when used to disable the option:
 -Denable_foo=false

Also replace underscores with dashes, which is the preferred meson
style.

https://bugzilla.gnome.org/show_bug.cgi?id=791007
2017-11-30 00:24:53 +01:00
126 changed files with 33987 additions and 3678 deletions

1
.gitignore vendored
View File

@@ -8,6 +8,7 @@ ChangeLog
INSTALL
aclocal.m4
autom4te.cache
data/.osk-layout-workbench
data/org.gnome.Shell.desktop
data/org.gnome.Shell.desktop.in
data/gnome-shell-extension-prefs.desktop

158
configure vendored
View File

@@ -1,158 +0,0 @@
#!/bin/bash
# configure script adapter for Meson
# Based on build-api: https://github.com/cgwalters/build-api
# Copyright 2010, 2011, 2013 Colin Walters <walters@verbum.org>
# Copyright 2016, 2017 Emmanuele Bassi
# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
# Build API variables:
# Little helper function for reading args from the commandline.
# it automatically handles -a b and -a=b variants, and returns 1 if
# we need to shift $3.
read_arg() {
# $1 = arg name
# $2 = arg value
# $3 = arg parameter
local rematch='^[^=]*=(.*)$'
if [[ $2 =~ $rematch ]]; then
read "$1" <<< "${BASH_REMATCH[1]}"
else
read "$1" <<< "$3"
# There is no way to shift our callers args, so
# return 1 to indicate they should do it instead.
return 1
fi
}
sanitycheck() {
# $1 = arg name
# $1 = arg command
# $2 = arg alternates
local cmd=$( which $2 2>/dev/null )
if [ -x "$cmd" ]; then
read "$1" <<< "$cmd"
return 0
fi
test -z $3 || {
for alt in $3; do
cmd=$( which $alt 2>/dev/null )
if [ -x "$cmd" ]; then
read "$1" <<< "$cmd"
return 0
fi
done
}
echo -e "\e[1;31mERROR\e[0m: Command '$2' not found"
exit 1
}
sanitycheck MESON 'meson'
sanitycheck NINJA 'ninja' 'ninja-build'
enable_docs='-Denable-gtk-doc=false'
enable_man='-Denable-man=false'
enable_introspection=''
while (($# > 0)); do
case "${1%%=*}" in
--prefix) read_arg prefix "$@" || shift;;
--bindir) read_arg bindir "$@" || shift;;
--sbindir) read_arg sbindir "$@" || shift;;
--libexecdir) read_arg libexecdir "$@" || shift;;
--datarootdir) read_arg datarootdir "$@" || shift;;
--datadir) read_arg datadir "$@" || shift;;
--sysconfdir) read_arg sysconfdir "$@" || shift;;
--libdir) read_arg libdir "$@" || shift;;
--mandir) read_arg mandir "$@" || shift;;
--includedir) read_arg includedir "$@" || shift;;
--enable-gtk-doc) enable_docs='-Denable-gtk-doc=true';;
--disable-gtk-doc) enable_docs='-Denable-gtk-doc=false';;
--enable-man) enable_man='-Denable-man=true';;
--disable-man) enable_man='-Denable-man=false';;
--enable-introspection) enable_introspection='';;
--disable-introspection) enable_introspection='-Ddisable_introspection=true';;
*) echo -e "\e[1;33mINFO\e[0m: Ignoring unknown option '$1'";;
esac
shift
done
# Defaults
test -z ${prefix} && prefix="/usr/local"
test -z ${bindir} && bindir=${prefix}/bin
test -z ${sbindir} && sbindir=${prefix}/sbin
test -z ${libexecdir} && libexecdir=${prefix}/bin
test -z ${datarootdir} && datarootdir=${prefix}/share
test -z ${datadir} && datadir=${datarootdir}
test -z ${sysconfdir} && sysconfdir=${prefix}/etc
test -z ${libdir} && libdir=${prefix}/lib
test -z ${mandir} && mandir=${prefix}/share/man
test -z ${includedir} && includedir=${prefix}/include
# The source directory is the location of this file
srcdir=$(dirname $0)
# The build directory is the current location
builddir=`pwd`
# If we're calling this file from the source directory then
# we automatically create a build directory and ensure that
# both Meson and Ninja invocations are relative to that
# location
if [[ -f "${builddir}/meson.build" ]]; then
mkdir -p _build
builddir="${builddir}/_build"
NINJA_OPT="-C ${builddir}"
fi
# Wrapper Makefile for Ninja
cat > Makefile <<END
# Generated by configure; do not edit
all:
CC="\$(CC)" CXX="\$(CXX)" ${NINJA} ${NINJA_OPT}
install:
DESTDIR="\$(DESTDIR)" ${NINJA} ${NINJA_OPT} install
check:
${MESON} test ${NINJA_OPT}
END
echo "Summary:"
echo " meson:....... ${MESON}"
echo " ninja:....... ${NINJA}"
echo " prefix:...... ${prefix}"
echo " bindir:...... ${bindir}"
echo " sbindir:..... ${sbindir}"
echo " libexecdir:.. ${libexecdir}"
echo " datarootdir:. ${datarootdir}"
echo " datadir:..... ${datadir}"
echo " sysconfdir:.. ${sysconfdir}"
echo " libdir:...... ${libdir}"
echo " mandir:...... ${mandir}"
echo " includedir:.. ${includedir}"
echo " additional:.."
echo " - ${enable_docs} ${enable_man} ${enable_introspection}"
exec ${MESON} \
--prefix=${prefix} \
--libdir=${libdir} \
--libexecdir=${libexecdir} \
--datadir=${datadir} \
--sysconfdir=${sysconfdir} \
--bindir=${bindir} \
--includedir=${includedir} \
--mandir=${mandir} \
--default-library shared \
${enable_docs} \
${enable_man} \
${enable_introspection} \
${builddir} \
${srcdir}
# vim: ai ts=8 noet sts=2 ft=sh

33
data/README.osk-layouts Normal file
View File

@@ -0,0 +1,33 @@
Gnome-shell OSK layouts are extracted from CLDR layout definitions:
https://www.unicode.org/cldr/charts/latest/keyboards/layouts/index.html
Updating these involves several steps:
1) Downloading and unzipping the tarball found at:
http://www.unicode.org/Public/cldr/latest/keyboards.zip
This file contains XML files describing the keyboard layouts.
2) Cloning the cldr2json script at:
git://repo.or.cz/cldr2json.git
It will be used to convert the XML files into JSON that can be
directly consumed by gnome-shell.
3) Running the script to produce the files:
./cldr2json <input-directory> <output-directory>
We shall usually use the "android" folder, since that's most
complete, and similar to our UI and target sizes. And the target
directory must be data/osk-layouts in this repository.
4) Modify gnome-shell-osk-layouts.gresource.xml to include the files
5) Do git add on the updated/new files, and git commit.
Or alternatively:
1) Run update-osk-layouts.sh
2) Do git add and git commit

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/shell/osk-layouts">
<file>am.json</file>
<file>ara.json</file>
<file>be.json</file>
<file>bg.json</file>
<file>by.json</file>
<file>cz.json</file>
<file>de.json</file>
<file>dk.json</file>
<file>ee.json</file>
<file>epo.json</file>
<file>es+cat.json</file>
<file>es.json</file>
<file>fi.json</file>
<file>fr.json</file>
<file>ge.json</file>
<file>gr.json</file>
<file>hr.json</file>
<file>hu.json</file>
<file>id.json</file>
<file>il.json</file>
<file>in+bolnagri.json</file>
<file>ir.json</file>
<file>is.json</file>
<file>it.json</file>
<file>ke.json</file>
<file>kg.json</file>
<file>kh.json</file>
<file>la.json</file>
<file>latam.json</file>
<file>lt.json</file>
<file>lv.json</file>
<file>mk.json</file>
<file>mn.json</file>
<file>my.json</file>
<file>nl.json</file>
<file>no.json</file>
<file>ph.json</file>
<file>pl.json</file>
<file>pt.json</file>
<file>ro.json</file>
<file>rs.json</file>
<file>ru.json</file>
<file>se.json</file>
<file>si.json</file>
<file>sk.json</file>
<file>th.json</file>
<file>tr.json</file>
<file>ua.json</file>
<file>uk.json</file>
<file>us.json</file>
<file>vn.json</file>
<file>za.json</file>
</gresource>
</gresources>

View File

@@ -62,6 +62,14 @@ theme_resources = gnome.compile_resources(
install_dir: pkgdatadir
)
osk_layout_resources = gnome.compile_resources(
'gnome-shell-osk-layouts', 'gnome-shell-osk-layouts.gresource.xml',
source_dir: 'osk-layouts',
gresource_bundle: true,
install: true,
install_dir: pkgdatadir
)
perfconf = configuration_data()
perfconf.set('datadir', datadir)
configure_file(

599
data/osk-layouts/am.json Normal file
View File

@@ -0,0 +1,599 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"է"
],
[
"թ"
],
[
"փ"
],
[
"ձ"
],
[
"ջ"
],
[
"ր"
],
[
"չ"
],
[
"ճ"
],
[
"ժ"
],
[
"ծ"
]
],
[
[
"ք"
],
[
"ո"
],
[
"ե",
"և"
],
[
"ռ"
],
[
"տ"
],
[
"ը"
],
[
"ւ"
],
[
"ի"
],
[
"օ"
],
[
"պ"
]
],
[
[
"ա"
],
[
"ս"
],
[
"դ"
],
[
"ֆ"
],
[
"գ"
],
[
"հ"
],
[
"յ"
],
[
"կ"
],
[
"լ"
],
[
"խ"
]
],
[
[
"զ"
],
[
"ղ"
],
[
"ց"
],
[
"վ"
],
[
"բ"
],
[
"ն"
],
[
"մ"
],
[
"շ"
]
],
[
[
","
],
[
" "
],
[
"։"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Է"
],
[
"Թ"
],
[
"Փ"
],
[
"Ձ"
],
[
"Ջ"
],
[
"Ր"
],
[
"Չ"
],
[
"Ճ"
],
[
"Ժ"
],
[
"Ծ"
]
],
[
[
"Ք"
],
[
"Ո"
],
[
"Ե",
"ԵՒ"
],
[
"Ռ"
],
[
"Տ"
],
[
"Ը"
],
[
"Ւ"
],
[
"Ի"
],
[
"Օ"
],
[
"Պ"
]
],
[
[
"Ա"
],
[
"Ս"
],
[
"Դ"
],
[
"Ֆ"
],
[
"Գ"
],
[
"Հ"
],
[
"Յ"
],
[
"Կ"
],
[
"Լ"
],
[
"Խ"
]
],
[
[
"Զ"
],
[
"Ղ"
],
[
"Ց"
],
[
"Վ"
],
[
"Բ"
],
[
"Ն"
],
[
"Մ"
],
[
"Շ"
]
],
[
[
","
],
[
" "
],
[
"։"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"՜",
"¡"
],
[
"?",
"՞",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
"՝"
],
[
"։",
"!",
"?",
",",
".",
"֊",
"՜",
"՝",
"՞",
":",
";",
"@",
"ՙ",
"՚",
"՛",
"՟"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
"՝"
],
[
"։",
"!",
"?",
",",
".",
"֊",
"՜",
"՝",
"՞",
":",
";",
"@",
"ՙ",
"՚",
"՛",
"՟"
]
]
]
}
],
"locale": "hy",
"name": "Armenian"
}

488
data/osk-layouts/ara.json Normal file
View File

@@ -0,0 +1,488 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ض"
],
[
"ص"
],
[
"ث"
],
[
"ق",
"ڨ"
],
[
"ف",
"ڤ",
"ڢ",
"ڥ"
],
[
"غ"
],
[
"ع"
],
[
"ه",
"ه"
],
[
"خ"
],
[
"ح"
],
[
"ج",
"چ"
]
],
[
[
"ش",
"ڜ"
],
[
"س"
],
[
"ي",
"ئ",
"ى"
],
[
"ب",
"پ"
],
[
"ل",
"لا",
"لأ",
"لإ",
"لآ"
],
[
"ا",
"آ",
"ء",
"أ",
"إ",
"ٱ"
],
[
"ت"
],
[
"ن"
],
[
"م"
],
[
"ك",
"گ",
"ک"
],
[
"ط"
]
],
[
[
"ذ"
],
[
"ء"
],
[
"ؤ"
],
[
"ر"
],
[
"ى",
"ئ"
],
[
"ة"
],
[
"و"
],
[
"ز",
"ژ"
],
[
"ظ"
],
[
"د"
]
],
[
[
"،"
],
[
" "
],
[
".",
"\"",
"'",
"#",
"-",
":",
"!",
"،",
"؟",
"@",
"&",
"%",
"+",
"؛",
"/",
")",
"("
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"١",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"٢",
"²",
"⅔"
],
[
"٣",
"³",
"¾",
"⅜"
],
[
"٤",
"⁴"
],
[
"٥",
"⅝"
],
[
"٦"
],
[
"٧",
"⅞"
],
[
"٨"
],
[
"٩"
],
[
"٠",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"٪",
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"﴿",
">",
"}",
"]"
],
[
")",
"",
"<",
"{",
"["
]
],
[
[
"*",
"★",
"٭"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
"؛",
";"
],
[
"!",
"¡"
],
[
"؟",
"?"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
"،",
"؟",
"؛",
"!",
":",
"-",
"/",
"'",
"\""
],
[
".",
"ٕ",
"ٔ",
"ْ",
"ٍ",
"ٌ",
"ً",
"ّ",
"ٖ",
"ٰ",
"ٓ",
"ِ",
"ُ",
"َ",
"ـ"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≥",
"»"
],
[
">",
"",
"≤",
"«"
],
[
" "
],
[
"،",
"؟",
"؛",
"!",
":",
"-",
"/",
"'",
"\""
],
[
".",
"ٕ",
"ٔ",
"ْ",
"ٍ",
"ٌ",
"ً",
"ّ",
"ٖ",
"ٰ",
"ٓ",
"ِ",
"ُ",
"َ",
"ـ"
]
]
]
}
],
"locale": "ar",
"name": "Arabic"
}

584
data/osk-layouts/be.json Normal file
View File

@@ -0,0 +1,584 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ë",
"ê",
"è",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y",
"ij"
],
[
"u",
"ú",
"ü",
"û",
"ù",
"ū"
],
[
"i",
"í",
"ï",
"ì",
"î",
"į",
"ī",
"ij"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"ä",
"â",
"à",
"æ",
"ã",
"å",
"ā"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ë",
"Ê",
"È",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y",
"IJ"
],
[
"U",
"Ú",
"Ü",
"Û",
"Ù",
"Ū"
],
[
"I",
"Í",
"Ï",
"Ì",
"Î",
"Į",
"Ī",
"IJ"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"Ä",
"Â",
"À",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "nl-BE",
"name": "Dutch (Belgium)"
}

533
data/osk-layouts/bg.json Normal file
View File

@@ -0,0 +1,533 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"я"
],
[
"в"
],
[
"е"
],
[
"р"
],
[
"т"
],
[
"ъ"
],
[
"у"
],
[
"и",
"ѝ"
],
[
"о"
],
[
"п"
],
[
"ч"
]
],
[
[
"а"
],
[
"с"
],
[
"д"
],
[
"ф"
],
[
"г"
],
[
"х"
],
[
"й"
],
[
"к"
],
[
"л"
],
[
"ш"
],
[
"щ"
]
],
[
[
"з"
],
[
"ь"
],
[
"ц"
],
[
"ж"
],
[
"б"
],
[
"н"
],
[
"м"
],
[
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Я"
],
[
"В"
],
[
"Е"
],
[
"Р"
],
[
"Т"
],
[
"Ъ"
],
[
"У"
],
[
"И",
"Ѝ"
],
[
"О"
],
[
"П"
],
[
"Ч"
]
],
[
[
"А"
],
[
"С"
],
[
"Д"
],
[
"Ф"
],
[
"Г"
],
[
"Х"
],
[
"Й"
],
[
"К"
],
[
"Л"
],
[
"Ш"
],
[
"Щ"
]
],
[
[
"З"
],
[
"Ь"
],
[
"Ц"
],
[
"Ж"
],
[
"Б"
],
[
"Н"
],
[
"М"
],
[
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "bg",
"name": "Bulgarian"
}

541
data/osk-layouts/by.json Normal file
View File

@@ -0,0 +1,541 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"й"
],
[
"ц"
],
[
"у"
],
[
"к"
],
[
"е",
"ё"
],
[
"н"
],
[
"г"
],
[
"ш"
],
[
"ў"
],
[
"з"
],
[
"х"
]
],
[
[
"ф"
],
[
"ы"
],
[
"в"
],
[
"а"
],
[
"п"
],
[
"р"
],
[
"о"
],
[
"л"
],
[
"д"
],
[
"ж"
],
[
"э"
]
],
[
[
"я"
],
[
"ч"
],
[
"с"
],
[
"м"
],
[
"і"
],
[
"т"
],
[
"ь",
"ъ"
],
[
"б"
],
[
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Й"
],
[
"Ц"
],
[
"У"
],
[
"К"
],
[
"Е",
"Ё"
],
[
"Н"
],
[
"Г"
],
[
"Ш"
],
[
"Ў"
],
[
"З"
],
[
"Х"
]
],
[
[
"Ф"
],
[
"Ы"
],
[
"В"
],
[
"А"
],
[
"П"
],
[
"Р"
],
[
"О"
],
[
"Л"
],
[
"Д"
],
[
"Ж"
],
[
"Э"
]
],
[
[
"Я"
],
[
"Ч"
],
[
"С"
],
[
"М"
],
[
"І"
],
[
"Т"
],
[
"Ь",
"Ъ"
],
[
"Б"
],
[
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "be",
"name": "Belarusian"
}

613
data/osk-layouts/cz.json Normal file
View File

@@ -0,0 +1,613 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ě",
"è",
"ê",
"ë",
"ę",
"ė",
"ē"
],
[
"r",
"ř"
],
[
"t",
"ť"
],
[
"z",
"ž",
"ź",
"ż"
],
[
"u",
"ú",
"ů",
"û",
"ü",
"ù",
"ū"
],
[
"i",
"í",
"î",
"ï",
"ì",
"į",
"ī"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"à",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"š",
"ß",
"ś"
],
[
"d",
"ď"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"y",
"ý",
"ÿ"
],
[
"x"
],
[
"c",
"č",
"ç",
"ć"
],
[
"v"
],
[
"b"
],
[
"n",
"ň",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ě",
"È",
"Ê",
"Ë",
"Ę",
"Ė",
"Ē"
],
[
"R",
"Ř"
],
[
"T",
"Ť"
],
[
"Z",
"Ž",
"Ź",
"Ż"
],
[
"U",
"Ú",
"Ů",
"Û",
"Ü",
"Ù",
"Ū"
],
[
"I",
"Í",
"Î",
"Ï",
"Ì",
"Į",
"Ī"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"À",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"Š",
"SS",
"Ś"
],
[
"D",
"Ď"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Y",
"Ý",
"Ÿ"
],
[
"X"
],
[
"C",
"Č",
"Ç",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N",
"Ň",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "cs",
"name": "Czech"
}

570
data/osk-layouts/de.json Normal file
View File

@@ -0,0 +1,570 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"ė"
],
[
"r"
],
[
"t"
],
[
"z"
],
[
"u",
"ü",
"û",
"ù",
"ú",
"ū"
],
[
"i"
],
[
"o",
"ö",
"ô",
"ò",
"ó",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"ä",
"â",
"à",
"á",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"ß",
"ś",
"š"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"y"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"Ė"
],
[
"R"
],
[
"T"
],
[
"Z"
],
[
"U",
"Ü",
"Û",
"Ù",
"Ú",
"Ū"
],
[
"I"
],
[
"O",
"Ö",
"Ô",
"Ò",
"Ó",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Ä",
"Â",
"À",
"Á",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"SS",
"Ś",
"Š"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Y"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "de",
"name": "German"
}

590
data/osk-layouts/dk.json Normal file
View File

@@ -0,0 +1,590 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ë"
],
[
"r"
],
[
"t"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ú",
"ü",
"û",
"ù",
"ū"
],
[
"i",
"í",
"ï"
],
[
"o",
"ó",
"ô",
"ò",
"õ",
"œ",
"ō"
],
[
"p"
],
[
"å"
]
],
[
[
"a",
"á",
"ä",
"à",
"â",
"ã",
"ā"
],
[
"s",
"ß",
"ś",
"š"
],
[
"d",
"ð"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l",
"ł"
],
[
"æ",
"ä"
],
[
"ø",
"ö"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ë"
],
[
"R"
],
[
"T"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ú",
"Ü",
"Û",
"Ù",
"Ū"
],
[
"I",
"Í",
"Ï"
],
[
"O",
"Ó",
"Ô",
"Ò",
"Õ",
"Œ",
"Ō"
],
[
"P"
],
[
"Å"
]
],
[
[
"A",
"Á",
"Ä",
"À",
"Â",
"Ã",
"Ā"
],
[
"S",
"SS",
"Ś",
"Š"
],
[
"D",
"Ð"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L",
"Ł"
],
[
"Æ",
"Ä"
],
[
"Ø",
"Ö"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "da",
"name": "Danish"
}

666
data/osk-layouts/ee.json Normal file
View File

@@ -0,0 +1,666 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"ē",
"è",
"ė",
"é",
"ê",
"ë",
"ę",
"ě"
],
[
"r",
"ŗ",
"ř",
"ŕ"
],
[
"t",
"ţ",
"ť"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ü",
"ū",
"ų",
"ù",
"ú",
"û",
"ů",
"ű"
],
[
"i",
"ī",
"ì",
"į",
"í",
"î",
"ï",
"ı"
],
[
"o",
"ö",
"õ",
"ò",
"ó",
"ô",
"œ",
"ő",
"ø"
],
[
"p"
],
[
"ü"
]
],
[
[
"a",
"ä",
"ā",
"à",
"á",
"â",
"ã",
"å",
"æ",
"ą"
],
[
"s",
"š",
"ß",
"ś",
"ş"
],
[
"d",
"ď"
],
[
"f"
],
[
"g",
"ģ",
"ğ"
],
[
"h"
],
[
"j"
],
[
"k",
"ķ"
],
[
"l",
"ļ",
"ł",
"ĺ",
"ľ"
],
[
"ö",
"õ"
],
[
"ä"
]
],
[
[
"z",
"ž",
"ż",
"ź"
],
[
"x"
],
[
"c",
"č",
"ç",
"ć"
],
[
"v"
],
[
"b"
],
[
"n",
"ņ",
"ñ",
"ń",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"Ē",
"È",
"Ė",
"É",
"Ê",
"Ë",
"Ę",
"Ě"
],
[
"R",
"Ŗ",
"Ř",
"Ŕ"
],
[
"T",
"Ţ",
"Ť"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ü",
"Ū",
"Ų",
"Ù",
"Ú",
"Û",
"Ů",
"Ű"
],
[
"I",
"Ī",
"Ì",
"Į",
"Í",
"Î",
"Ï",
"I"
],
[
"O",
"Ö",
"Õ",
"Ò",
"Ó",
"Ô",
"Œ",
"Ő",
"Ø"
],
[
"P"
],
[
"Ü"
]
],
[
[
"A",
"Ä",
"Ā",
"À",
"Á",
"Â",
"Ã",
"Å",
"Æ",
"Ą"
],
[
"S",
"Š",
"SS",
"Ś",
"Ş"
],
[
"D",
"Ď"
],
[
"F"
],
[
"G",
"Ģ",
"Ğ"
],
[
"H"
],
[
"J"
],
[
"K",
"Ķ"
],
[
"L",
"Ļ",
"Ł",
"Ĺ",
"Ľ"
],
[
"Ö",
"Õ"
],
[
"Ä"
]
],
[
[
"Z",
"Ž",
"Ż",
"Ź"
],
[
"X"
],
[
"C",
"Č",
"Ç",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N",
"Ņ",
"Ñ",
"Ń",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "et",
"name": "Estonian"
}

711
data/osk-layouts/epo.json Normal file
View File

@@ -0,0 +1,711 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ŝ",
"q"
],
[
"ĝ",
"w",
"ŵ"
],
[
"e",
"é",
"ě",
"è",
"ê",
"ë",
"ę",
"ė",
"ē"
],
[
"r",
"ř",
"ŕ",
"ŗ"
],
[
"t",
"ť",
"ț",
"ţ",
"ŧ"
],
[
"ŭ",
"y",
"ý",
"ŷ",
"ÿ",
"þ"
],
[
"u",
"ú",
"ů",
"û",
"ü",
"ù",
"ū",
"ũ",
"ű",
"ų",
"µ"
],
[
"i",
"í",
"î",
"ï",
"ĩ",
"ì",
"į",
"ī",
"ı",
"ij"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō",
"ő",
"º"
],
[
"p"
]
],
[
[
"a",
"á",
"à",
"â",
"ä",
"æ",
"ã",
"å",
"ā",
"ă",
"ą",
"ª"
],
[
"s",
"ß",
"š",
"ś",
"ș",
"ş"
],
[
"d",
"ð",
"ď",
"đ"
],
[
"f"
],
[
"g",
"ğ",
"ġ",
"ģ"
],
[
"h",
"ĥ",
"ħ"
],
[
"j"
],
[
"k",
"ķ",
"ĸ"
],
[
"l",
"ĺ",
"ļ",
"ľ",
"ŀ",
"ł"
],
[
"ĵ"
]
],
[
[
"z",
"ź",
"ż",
"ž"
],
[
"ĉ",
"x"
],
[
"c",
"ć",
"č",
"ç",
"ċ"
],
[
"v",
"w",
"ŵ"
],
[
"b"
],
[
"n",
"ñ",
"ń",
"ņ",
"ň",
"ʼn",
"ŋ"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Ŝ",
"Q"
],
[
"Ĝ",
"W",
"Ŵ"
],
[
"E",
"É",
"Ě",
"È",
"Ê",
"Ë",
"Ę",
"Ė",
"Ē"
],
[
"R",
"Ř",
"Ŕ",
"Ŗ"
],
[
"T",
"Ť",
"Ț",
"Ţ",
"Ŧ"
],
[
"Ŭ",
"Y",
"Ý",
"Ŷ",
"Ÿ",
"Þ"
],
[
"U",
"Ú",
"Ů",
"Û",
"Ü",
"Ù",
"Ū",
"Ũ",
"Ű",
"Ų",
"Μ"
],
[
"I",
"Í",
"Î",
"Ï",
"Ĩ",
"Ì",
"Į",
"Ī",
"I",
"IJ"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō",
"Ő",
"º"
],
[
"P"
]
],
[
[
"A",
"Á",
"À",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā",
"Ă",
"Ą",
"ª"
],
[
"S",
"SS",
"Š",
"Ś",
"Ș",
"Ş"
],
[
"D",
"Ð",
"Ď",
"Đ"
],
[
"F"
],
[
"G",
"Ğ",
"Ġ",
"Ģ"
],
[
"H",
"Ĥ",
"Ħ"
],
[
"J"
],
[
"K",
"Ķ",
"ĸ"
],
[
"L",
"Ĺ",
"Ļ",
"Ľ",
"Ŀ",
"Ł"
],
[
"Ĵ"
]
],
[
[
"Z",
"Ź",
"Ż",
"Ž"
],
[
"Ĉ",
"X"
],
[
"C",
"Ć",
"Č",
"Ç",
"Ċ"
],
[
"V",
"W",
"Ŵ"
],
[
"B"
],
[
"N",
"Ñ",
"Ń",
"Ņ",
"Ň",
"ʼN",
"Ŋ"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "eo",
"name": "Esperanto"
}

View File

@@ -0,0 +1,602 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ë",
"ê",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ú",
"ü",
"ù",
"û",
"ū"
],
[
"i",
"í",
"ï",
"ì",
"î",
"į",
"ī"
],
[
"o",
"ò",
"ó",
"ö",
"ô",
"õ",
"ø",
"œ",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"ä",
"â",
"ã",
"å",
"ą",
"æ",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l",
"l·l",
"ł"
],
[
"ç"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"·",
"!",
",",
"?",
":",
";",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ë",
"Ê",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ú",
"Ü",
"Ù",
"Û",
"Ū"
],
[
"I",
"Í",
"Ï",
"Ì",
"Î",
"Į",
"Ī"
],
[
"O",
"Ò",
"Ó",
"Ö",
"Ô",
"Õ",
"Ø",
"Œ",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Ä",
"Â",
"Ã",
"Å",
"Ą",
"Æ",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L",
"L·L",
"Ł"
],
[
"Ç"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"·",
"!",
",",
"?",
":",
";",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"?",
"·"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"?",
"·"
]
]
]
}
],
"locale": "ca",
"name": "Catalan"
}

604
data/osk-layouts/es.json Normal file
View File

@@ -0,0 +1,604 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ë",
"ê",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ú",
"ü",
"ù",
"û",
"ū"
],
[
"i",
"í",
"ï",
"ì",
"î",
"į",
"ī"
],
[
"o",
"ó",
"ò",
"ö",
"ô",
"õ",
"ø",
"œ",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"á",
"à",
"ä",
"â",
"ã",
"å",
"ą",
"æ",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
],
[
"ñ"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
";",
"!",
",",
"?",
":",
"¡",
"@",
"¿"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ë",
"Ê",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ú",
"Ü",
"Ù",
"Û",
"Ū"
],
[
"I",
"Í",
"Ï",
"Ì",
"Î",
"Į",
"Ī"
],
[
"O",
"Ó",
"Ò",
"Ö",
"Ô",
"Õ",
"Ø",
"Œ",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"Á",
"À",
"Ä",
"Â",
"Ã",
"Å",
"Ą",
"Æ",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
],
[
"Ñ"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
";",
"!",
",",
"?",
":",
"¡",
"@",
"¿"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
",",
"!",
"¡"
],
[
".",
"?",
"¿"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
",",
"!",
"¡"
],
[
".",
"?",
"¿"
]
]
]
}
],
"locale": "es",
"name": "Spanish"
}

570
data/osk-layouts/fi.json Normal file
View File

@@ -0,0 +1,570 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ü"
],
[
"i"
],
[
"o",
"ø",
"ô",
"ò",
"ó",
"õ",
"œ",
"ō"
],
[
"p"
],
[
"å"
]
],
[
[
"a",
"æ",
"à",
"á",
"â",
"ã",
"ā"
],
[
"s",
"š",
"ß",
"ś"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
],
[
"ö",
"ø"
],
[
"ä",
"æ"
]
],
[
[
"z",
"ž",
"ź",
"ż"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ü"
],
[
"I"
],
[
"O",
"Ø",
"Ô",
"Ò",
"Ó",
"Õ",
"Œ",
"Ō"
],
[
"P"
],
[
"Å"
]
],
[
[
"A",
"Æ",
"À",
"Á",
"Â",
"Ã",
"Ā"
],
[
"S",
"Š",
"SS",
"Ś"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
],
[
"Ö",
"Ø"
],
[
"Ä",
"Æ"
]
],
[
[
"Z",
"Ž",
"Ź",
"Ż"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "fi",
"name": "Finnish"
}

599
data/osk-layouts/fr.json Normal file
View File

@@ -0,0 +1,599 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"%",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y",
"%",
"ÿ"
],
[
"u",
"ù",
"û",
"%",
"ü",
"ú",
"ū"
],
[
"i",
"î",
"%",
"ï",
"ì",
"í",
"į",
"ī"
],
[
"o",
"ô",
"œ",
"%",
"ö",
"ò",
"ó",
"õ",
"ø",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"à",
"â",
"%",
"æ",
"á",
"ä",
"ã",
"å",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"%",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y",
"%",
"Ÿ"
],
[
"U",
"Ù",
"Û",
"%",
"Ü",
"Ú",
"Ū"
],
[
"I",
"Î",
"%",
"Ï",
"Ì",
"Í",
"Į",
"Ī"
],
[
"O",
"Ô",
"Œ",
"%",
"Ö",
"Ò",
"Ó",
"Õ",
"Ø",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"À",
"Â",
"%",
"Æ",
"Á",
"Ä",
"Ã",
"Å",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "fr-CA",
"name": "French Canada"
}

409
data/osk-layouts/ge.json Normal file
View File

@@ -0,0 +1,409 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ქ"
],
[
"წ"
],
[
"ე",
"ჱ"
],
[
"რ"
],
[
"ტ"
],
[
"",
"ჸ"
],
[
"უ"
],
[
"ი",
"ჲ"
],
[
"ო"
],
[
"პ"
]
],
[
[
"ა",
"ჺ"
],
[
"ს"
],
[
"დ"
],
[
"ფ",
"ჶ"
],
[
"გ",
"ჹ"
],
[
"ჰ",
"ჵ"
],
[
"ჯ",
"ჷ"
],
[
"კ"
],
[
"ლ"
]
],
[
[
"ზ"
],
[
"ხ",
"ჴ"
],
[
"ც"
],
[
"ვ",
"ჳ"
],
[
"ბ"
],
[
"ნ",
"ჼ"
],
[
"მ"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "ka",
"name": "Georgian"
}

532
data/osk-layouts/gr.json Normal file
View File

@@ -0,0 +1,532 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
";",
":"
],
[
"ς"
],
[
"ε",
"έ"
],
[
"ρ"
],
[
"τ"
],
[
"υ",
"ύ",
"ϋ",
"ΰ"
],
[
"θ"
],
[
"ι",
"ί",
"ϊ",
"ΐ"
],
[
"ο",
"ό"
],
[
"π"
]
],
[
[
"α",
"ά"
],
[
"σ"
],
[
"δ"
],
[
"φ"
],
[
"γ"
],
[
"η",
"ή"
],
[
"ξ"
],
[
"κ"
],
[
"λ"
]
],
[
[
"ζ"
],
[
"χ"
],
[
"ψ"
],
[
"ω",
"ώ"
],
[
"β"
],
[
"ν"
],
[
"μ"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
";",
":"
],
[
"Σ"
],
[
"Ε",
"Έ"
],
[
"Ρ"
],
[
"Τ"
],
[
"Υ",
"Ύ",
"Ϋ",
"Ϋ́"
],
[
"Θ"
],
[
"Ι",
"Ί",
"Ϊ",
"Ϊ́"
],
[
"Ο",
"Ό"
],
[
"Π"
]
],
[
[
"Α",
"Ά"
],
[
"Σ"
],
[
"Δ"
],
[
"Φ"
],
[
"Γ"
],
[
"Η",
"Ή"
],
[
"Ξ"
],
[
"Κ"
],
[
"Λ"
]
],
[
[
"Ζ"
],
[
"Χ"
],
[
"Ψ"
],
[
"Ω",
"Ώ"
],
[
"Β"
],
[
"Ν"
],
[
"Μ"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "el",
"name": "Greek"
}

531
data/osk-layouts/hr.json Normal file
View File

@@ -0,0 +1,531 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"z",
"ž",
"ź",
"ż"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s",
"š",
"ś",
"ß"
],
[
"d",
"đ"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"y"
],
[
"x"
],
[
"c",
"č",
"ć",
"ç"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Z",
"Ž",
"Ź",
"Ż"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S",
"Š",
"Ś",
"SS"
],
[
"D",
"Đ"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Y"
],
[
"X"
],
[
"C",
"Č",
"Ć",
"Ç"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "hr",
"name": "Croatian"
}

579
data/osk-layouts/hu.json Normal file
View File

@@ -0,0 +1,579 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"z"
],
[
"u",
"ú",
"ü",
"ű",
"û",
"ù",
"ū"
],
[
"i",
"í",
"î",
"ï",
"ì",
"į",
"ī"
],
[
"o",
"ó",
"ö",
"ő",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"à",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"y"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Z"
],
[
"U",
"Ú",
"Ü",
"Ű",
"Û",
"Ù",
"Ū"
],
[
"I",
"Í",
"Î",
"Ï",
"Ì",
"Į",
"Ī"
],
[
"O",
"Ó",
"Ö",
"Ő",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"À",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Y"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "hu",
"name": "Hungarian"
}

507
data/osk-layouts/id.json Normal file
View File

@@ -0,0 +1,507 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "id",
"name": "Indonesian"
}

419
data/osk-layouts/il.json Normal file
View File

@@ -0,0 +1,419 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"'",
"\""
],
[
"-",
"_"
],
[
"ק"
],
[
"ר"
],
[
"א"
],
[
"ט"
],
[
"ו"
],
[
"ן"
],
[
"ם"
],
[
"פ"
]
],
[
[
"ש"
],
[
"ד"
],
[
"ג",
"ג׳"
],
[
"כ"
],
[
"ע"
],
[
"י",
"ײַ"
],
[
"ח",
"ח׳"
],
[
"ל"
],
[
"ך"
],
[
"ף"
]
],
[
[
"ז",
"ז׳"
],
[
"ס"
],
[
"ב"
],
[
"ה"
],
[
"נ"
],
[
"מ"
],
[
"צ",
"צ׳"
],
[
"ת",
"ת׳"
],
[
"ץ",
"ץ׳"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₪",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±",
"﬩"
],
[
"(",
">",
"}",
"]"
],
[
")",
"<",
"{",
"["
]
],
[
[
"*",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
",",
"!"
],
[
".",
"?"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≥",
"»"
],
[
">",
"",
"≤",
"«"
],
[
" "
],
[
",",
"!"
],
[
".",
"?"
]
]
]
}
],
"locale": "he",
"name": "Hebrew"
}

View File

@@ -0,0 +1,439 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"◌ौ"
],
[
"◌ै"
],
[
"◌ा"
],
[
"◌ी"
],
[
"◌ू"
],
[
"ब",
"ब॒",
"%"
],
[
"ह"
],
[
"ग",
"ज्ञ",
"ग़",
"ग॒",
"%"
],
[
"द"
],
[
"ज",
"ज॒",
"ज्ञ",
"ज़",
"%"
],
[
"ड",
"ड॒",
"ड़"
]
],
[
[
"◌ो"
],
[
"◌े"
],
[
"◌्"
],
[
"◌ि"
],
[
"◌ु"
],
[
"प"
],
[
"र",
"ऋ",
"ऱ",
"ॠ"
],
[
"क",
"क़"
],
[
"त",
"त्र"
],
[
"च"
],
[
"ट"
]
],
[
[
"◌ॉ"
],
[
"◌ं"
],
[
"म",
"ॐ"
],
[
"न",
"ञ",
"ङ",
"ऩ"
],
[
"व"
],
[
"ल",
"ऌ",
"ॡ"
],
[
"स"
],
[
"य",
"य़"
],
[
"◌़"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"१",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"२",
"²",
"⅔"
],
[
"३",
"³",
"¾",
"⅜"
],
[
"४",
"⁴"
],
[
"५",
"⅝"
],
[
"६"
],
[
"७",
"⅞"
],
[
"८"
],
[
"९"
],
[
"",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₹",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "hi",
"name": "Hindi"
}

495
data/osk-layouts/ir.json Normal file
View File

@@ -0,0 +1,495 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ض"
],
[
"ص"
],
[
"ث"
],
[
"ق",
"ڨ"
],
[
"ف",
"ڤ",
"ڢ",
"ڥ"
],
[
"غ"
],
[
"ع"
],
[
"ه",
"ه"
],
[
"خ"
],
[
"ح"
],
[
"ج",
"چ"
]
],
[
[
"ش",
"ڜ"
],
[
"س"
],
[
"ي",
"ئ",
"ى"
],
[
"ب",
"پ"
],
[
"ل",
"لا",
"لأ",
"لإ",
"لآ"
],
[
"ا",
"آ",
"ء",
"أ",
"إ",
"ٱ"
],
[
"ت"
],
[
"ن"
],
[
"م"
],
[
"ك",
"گ",
"ک"
],
[
"ط"
]
],
[
[
"ذ"
],
[
"ء"
],
[
"ؤ"
],
[
"ر"
],
[
"ى",
"ئ"
],
[
"ة"
],
[
"و"
],
[
"ز",
"ژ"
],
[
"ظ"
],
[
"د"
]
],
[
[
"،"
],
[
" "
],
[
" "
],
[
".",
"\"",
"'",
"#",
"-",
":",
"!",
"،",
"؟",
"@",
"&",
"%",
"+",
"؛",
"/",
")",
"("
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"۱",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"۲",
"²",
"⅔"
],
[
"۳",
"³",
"¾",
"⅜"
],
[
"۴",
"⁴"
],
[
"۵",
"⅝"
],
[
"۶"
],
[
"۷",
"⅞"
],
[
"۸"
],
[
"۹"
],
[
"۰",
"ⁿ",
"∅"
]
],
[
[
"٬",
"@"
],
[
"٫",
"#"
],
[
"﷼",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"٪",
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"﴿",
">",
"}",
"]"
],
[
")",
"",
"<",
"{",
"["
]
],
[
[
"*",
"★",
"٭"
],
[
"«",
"“",
"”",
"«",
"»"
],
[
"»",
"",
"",
"",
""
],
[
":"
],
[
"؛",
";"
],
[
"!",
"¡"
],
[
"؟",
"?"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
"،",
":",
"!",
"؟",
"؛",
"-",
"/",
"»",
"«"
],
[
".",
"ٕ",
"ٔ",
"ْ",
"ٍ",
"ٌ",
"ً",
"ّ",
"ٖ",
"ٰ",
"ٓ",
"ِ",
"ُ",
"َ",
"ـ"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"«",
"",
"≥",
">"
],
[
"»",
"",
"≤",
"<"
],
[
" "
],
[
"،",
":",
"!",
"؟",
"؛",
"-",
"/",
"»",
"«"
],
[
".",
"ٕ",
"ٔ",
"ْ",
"ٍ",
"ٌ",
"ً",
"ّ",
"ٖ",
"ٰ",
"ٓ",
"ِ",
"ُ",
"َ",
"ـ"
]
]
]
}
],
"locale": "fa",
"name": "Persian"
}

583
data/osk-layouts/is.json Normal file
View File

@@ -0,0 +1,583 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ë",
"è",
"ê",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t",
"þ"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ú",
"ü",
"û",
"ù",
"ū"
],
[
"i",
"í",
"ï",
"î",
"ì",
"į",
"ī"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"ä",
"æ",
"å",
"à",
"â",
"ã",
"ā"
],
[
"s"
],
[
"d",
"ð"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ë",
"È",
"Ê",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T",
"Þ"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ú",
"Ü",
"Û",
"Ù",
"Ū"
],
[
"I",
"Í",
"Ï",
"Î",
"Ì",
"Į",
"Ī"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"Ä",
"Æ",
"Å",
"À",
"Â",
"Ã",
"Ā"
],
[
"S"
],
[
"D",
"Ð"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "is",
"name": "Icelandic"
}

580
data/osk-layouts/it.json Normal file
View File

@@ -0,0 +1,580 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ê",
"ë",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ù",
"ú",
"û",
"ü",
"ū"
],
[
"i",
"ì",
"í",
"î",
"ï",
"į",
"ī"
],
[
"o",
"ò",
"ó",
"ô",
"ö",
"õ",
"œ",
"ø",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"â",
"ä",
"æ",
"ã",
"å",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ê",
"Ë",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ù",
"Ú",
"Û",
"Ü",
"Ū"
],
[
"I",
"Ì",
"Í",
"Î",
"Ï",
"Į",
"Ī"
],
[
"O",
"Ò",
"Ó",
"Ô",
"Ö",
"Õ",
"Œ",
"Ø",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "it",
"name": "Italian"
}

577
data/osk-layouts/ke.json Normal file
View File

@@ -0,0 +1,577 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ê",
"ë",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"û",
"ü",
"ù",
"ú",
"ū"
],
[
"i",
"î",
"ï",
"í",
"ī",
"ì"
],
[
"o",
"ô",
"ö",
"ò",
"ó",
"œ",
"ø",
"ō",
"õ"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"ß"
],
[
"d"
],
[
"f"
],
[
"g",
"g'"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ê",
"Ë",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Û",
"Ü",
"Ù",
"Ú",
"Ū"
],
[
"I",
"Î",
"Ï",
"Í",
"Ī",
"Ì"
],
[
"O",
"Ô",
"Ö",
"Ò",
"Ó",
"Œ",
"Ø",
"Ō",
"Õ"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"SS"
],
[
"D"
],
[
"F"
],
[
"G",
"G'"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "sw",
"name": "Swahili"
}

547
data/osk-layouts/kg.json Normal file
View File

@@ -0,0 +1,547 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"й"
],
[
"ц"
],
[
"у",
"ү"
],
[
"к"
],
[
"е",
"ё"
],
[
"н",
"ң"
],
[
"г"
],
[
"ш"
],
[
"щ"
],
[
"з"
],
[
"х"
]
],
[
[
"ф"
],
[
"ы"
],
[
"в"
],
[
"а"
],
[
"п"
],
[
"р"
],
[
"о",
"ө"
],
[
"л"
],
[
"д"
],
[
"ж"
],
[
"э"
]
],
[
[
"я"
],
[
"ч"
],
[
"с"
],
[
"м"
],
[
"и"
],
[
"т"
],
[
"ь",
"ъ"
],
[
"б"
],
[
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Й"
],
[
"Ц"
],
[
"У",
"Ү"
],
[
"К"
],
[
"Е",
"Ё"
],
[
"Н",
"Ң"
],
[
"Г"
],
[
"Ш"
],
[
"Щ"
],
[
"З"
],
[
"Х"
]
],
[
[
"Ф"
],
[
"Ы"
],
[
"В"
],
[
"А"
],
[
"П"
],
[
"Р"
],
[
"О",
"Ө"
],
[
"Л"
],
[
"Д"
],
[
"Ж"
],
[
"Э"
]
],
[
[
"Я"
],
[
"Ч"
],
[
"С"
],
[
"М"
],
[
"И"
],
[
"Т"
],
[
"Ь",
"Ъ"
],
[
"Б"
],
[
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "ky",
"name": "Kirghiz"
}

481
data/osk-layouts/kh.json Normal file
View File

@@ -0,0 +1,481 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"១",
"៱"
],
[
"២",
"៲"
],
[
"៣",
"៳"
],
[
"៤",
"៴"
],
[
"៥",
"៵"
],
[
"៦",
"៶"
],
[
"៧",
"៷"
],
[
"៨",
"៸"
],
[
"៩",
"៹"
],
[
"០",
"៰"
],
[
"ឥ",
"",
"ឦ"
],
[
"ឲ",
"ឱ"
]
],
[
[
"ឆ"
],
[
"ឹ"
],
[
"េ"
],
[
"រ"
],
[
"ត"
],
[
"យ"
],
[
"ុ"
],
[
"ិ"
],
[
"ោ"
],
[
"ផ"
],
[
"ៀ"
],
[
"ឪ",
"ឧ",
"ឱ",
"ឳ",
"ឩ",
"ឨ"
]
],
[
[
"ា"
],
[
"ស"
],
[
"ដ"
],
[
"ថ"
],
[
"ង"
],
[
"ហ"
],
[
"្"
],
[
"ក"
],
[
"ល"
],
[
"ើ"
],
[
"់"
],
[
"ឮ",
"ឭ",
"ឰ"
]
],
[
[
"ឋ"
],
[
"ខ"
],
[
"ច"
],
[
"វ"
],
[
"ប"
],
[
"ន"
],
[
"ម"
],
[
"ុំ"
],
[
"។"
],
[
"៊"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"៛",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "km",
"name": "Khmer"
}

472
data/osk-layouts/la.json Normal file
View File

@@ -0,0 +1,472 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ຢ",
"໑"
],
[
"ຟ",
"໒"
],
[
"ໂ",
"໓"
],
[
"ຖ",
"໔"
],
[
"ຸ"
],
[
"ູ"
],
[
"ຄ",
"໕"
],
[
"ຕ",
"໖"
],
[
"ຈ",
"໗"
],
[
"ຂ",
"໘"
],
[
"ຊ",
"໙"
],
[
"ໍ"
]
],
[
[
"ົ"
],
[
"ໄ",
""
],
[
"ຳ"
],
[
"ພ"
],
[
"ະ"
],
[
"ິ"
],
[
"ີ"
],
[
"ຮ"
],
[
"ນ"
],
[
"ຍ"
],
[
"ບ"
],
[
"ລ"
]
],
[
[
"ັ"
],
[
"ຫ"
],
[
"ກ"
],
[
"ດ"
],
[
"ເ"
],
[
"້"
],
[
"່"
],
[
"າ"
],
[
"ສ"
],
[
"ວ"
],
[
"ງ"
],
[
"“"
]
],
[
[
"ຜ"
],
[
"ປ"
],
[
"ແ"
],
[
"ອ"
],
[
"ຶ"
],
[
"ື"
],
[
"ທ"
],
[
"ມ"
],
[
"ໃ"
],
[
"ຝ"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₭",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "lo",
"name": "Lao"
}

603
data/osk-layouts/latam.json Normal file
View File

@@ -0,0 +1,603 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ë",
"ê",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ú",
"ü",
"ù",
"û",
"ū"
],
[
"i",
"í",
"ï",
"ì",
"î",
"į",
"ī"
],
[
"o",
"ó",
"ò",
"ö",
"ô",
"õ",
"ø",
"œ",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"á",
"à",
"ä",
"â",
"ã",
"å",
"ą",
"æ",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
],
[
"ñ"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
";",
"!",
",",
"?",
":",
"¡",
"@",
"¿"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ë",
"Ê",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ú",
"Ü",
"Ù",
"Û",
"Ū"
],
[
"I",
"Í",
"Ï",
"Ì",
"Î",
"Į",
"Ī"
],
[
"O",
"Ó",
"Ò",
"Ö",
"Ô",
"Õ",
"Ø",
"Œ",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"Á",
"À",
"Ä",
"Â",
"Ã",
"Å",
"Ą",
"Æ",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
],
[
"Ñ"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
";",
"!",
",",
"?",
":",
"¡",
"@",
"¿"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
",",
"!",
"¡"
],
[
".",
"?",
"¿"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
",",
"!",
"¡"
],
[
".",
"?",
"¿"
]
]
]
}
],
"locale": "es-US",
"name": "Spanish United States"
}

647
data/osk-layouts/lt.json Normal file
View File

@@ -0,0 +1,647 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"ė",
"ę",
"ē",
"è",
"é",
"ê",
"ë",
"ě"
],
[
"r",
"ŗ",
"ř",
"ŕ"
],
[
"t",
"ţ",
"ť"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ū",
"ų",
"ü",
"ū",
"ù",
"ú",
"û",
"ů",
"ű"
],
[
"i",
"į",
"ī",
"ì",
"í",
"î",
"ï",
"ı"
],
[
"o",
"ö",
"õ",
"ò",
"ó",
"ô",
"œ",
"ő",
"ø"
],
[
"p"
]
],
[
[
"a",
"ą",
"ä",
"ā",
"à",
"á",
"â",
"ã",
"å",
"æ"
],
[
"s",
"š",
"ß",
"ś",
"ş"
],
[
"d",
"ď"
],
[
"f"
],
[
"g",
"ģ",
"ğ"
],
[
"h"
],
[
"j"
],
[
"k",
"ķ"
],
[
"l",
"ļ",
"ł",
"ĺ",
"ľ"
]
],
[
[
"z",
"ž",
"ż",
"ź"
],
[
"x"
],
[
"c",
"č",
"ç",
"ć"
],
[
"v"
],
[
"b"
],
[
"n",
"ņ",
"ñ",
"ń",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"Ė",
"Ę",
"Ē",
"È",
"É",
"Ê",
"Ë",
"Ě"
],
[
"R",
"Ŗ",
"Ř",
"Ŕ"
],
[
"T",
"Ţ",
"Ť"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ū",
"Ų",
"Ü",
"Ū",
"Ù",
"Ú",
"Û",
"Ů",
"Ű"
],
[
"I",
"Į",
"Ī",
"Ì",
"Í",
"Î",
"Ï",
"I"
],
[
"O",
"Ö",
"Õ",
"Ò",
"Ó",
"Ô",
"Œ",
"Ő",
"Ø"
],
[
"P"
]
],
[
[
"A",
"Ą",
"Ä",
"Ā",
"À",
"Á",
"Â",
"Ã",
"Å",
"Æ"
],
[
"S",
"Š",
"SS",
"Ś",
"Ş"
],
[
"D",
"Ď"
],
[
"F"
],
[
"G",
"Ģ",
"Ğ"
],
[
"H"
],
[
"J"
],
[
"K",
"Ķ"
],
[
"L",
"Ļ",
"Ł",
"Ĺ",
"Ľ"
]
],
[
[
"Z",
"Ž",
"Ż",
"Ź"
],
[
"X"
],
[
"C",
"Č",
"Ç",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N",
"Ņ",
"Ñ",
"Ń",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "lt",
"name": "Lithuanian"
}

645
data/osk-layouts/lv.json Normal file
View File

@@ -0,0 +1,645 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"ē",
"ė",
"è",
"é",
"ê",
"ë",
"ę",
"ě"
],
[
"r",
"ŗ",
"ř",
"ŕ"
],
[
"t",
"ţ",
"ť"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ū",
"ų",
"ù",
"ú",
"û",
"ü",
"ů",
"ű"
],
[
"i",
"ī",
"į",
"ì",
"í",
"î",
"ï",
"ı"
],
[
"o",
"ò",
"ó",
"ô",
"õ",
"ö",
"œ",
"ő",
"ø"
],
[
"p"
]
],
[
[
"a",
"ā",
"à",
"á",
"â",
"ã",
"ä",
"å",
"æ",
"ą"
],
[
"s",
"š",
"ß",
"ś",
"ş"
],
[
"d",
"ď"
],
[
"f"
],
[
"g",
"ģ",
"ğ"
],
[
"h"
],
[
"j"
],
[
"k",
"ķ"
],
[
"l",
"ļ",
"ł",
"ĺ",
"ľ"
]
],
[
[
"z",
"ž",
"ż",
"ź"
],
[
"x"
],
[
"c",
"č",
"ç",
"ć"
],
[
"v"
],
[
"b"
],
[
"n",
"ņ",
"ñ",
"ń",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"Ē",
"Ė",
"È",
"É",
"Ê",
"Ë",
"Ę",
"Ě"
],
[
"R",
"Ŗ",
"Ř",
"Ŕ"
],
[
"T",
"Ţ",
"Ť"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ū",
"Ų",
"Ù",
"Ú",
"Û",
"Ü",
"Ů",
"Ű"
],
[
"I",
"Ī",
"Į",
"Ì",
"Í",
"Î",
"Ï",
"I"
],
[
"O",
"Ò",
"Ó",
"Ô",
"Õ",
"Ö",
"Œ",
"Ő",
"Ø"
],
[
"P"
]
],
[
[
"A",
"Ā",
"À",
"Á",
"Â",
"Ã",
"Ä",
"Å",
"Æ",
"Ą"
],
[
"S",
"Š",
"SS",
"Ś",
"Ş"
],
[
"D",
"Ď"
],
[
"F"
],
[
"G",
"Ģ",
"Ğ"
],
[
"H"
],
[
"J"
],
[
"K",
"Ķ"
],
[
"L",
"Ļ",
"Ł",
"Ĺ",
"Ľ"
]
],
[
[
"Z",
"Ž",
"Ż",
"Ź"
],
[
"X"
],
[
"C",
"Č",
"Ç",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N",
"Ņ",
"Ñ",
"Ń",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "lv",
"name": "Latvian"
}

541
data/osk-layouts/mk.json Normal file
View File

@@ -0,0 +1,541 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"љ"
],
[
"њ"
],
[
"е",
"ѐ"
],
[
"р"
],
[
"т"
],
[
"ѕ"
],
[
"у"
],
[
"и",
"ѝ"
],
[
"о"
],
[
"п"
],
[
"ш"
]
],
[
[
"а"
],
[
"с"
],
[
"д"
],
[
"ф"
],
[
"г"
],
[
"х"
],
[
"ј"
],
[
"к"
],
[
"л"
],
[
"ч"
],
[
"ќ"
]
],
[
[
"з"
],
[
"џ"
],
[
"ц"
],
[
"в"
],
[
"б"
],
[
"н"
],
[
"м"
],
[
"ѓ"
],
[
"ж"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Љ"
],
[
"Њ"
],
[
"Е",
"Ѐ"
],
[
"Р"
],
[
"Т"
],
[
"Ѕ"
],
[
"У"
],
[
"И",
"Ѝ"
],
[
"О"
],
[
"П"
],
[
"Ш"
]
],
[
[
"А"
],
[
"С"
],
[
"Д"
],
[
"Ф"
],
[
"Г"
],
[
"Х"
],
[
"Ј"
],
[
"К"
],
[
"Л"
],
[
"Ч"
],
[
"Ќ"
]
],
[
[
"З"
],
[
"Џ"
],
[
"Ц"
],
[
"В"
],
[
"Б"
],
[
"Н"
],
[
"М"
],
[
"Ѓ"
],
[
"Ж"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "mk",
"name": "Macedonian"
}

547
data/osk-layouts/mn.json Normal file
View File

@@ -0,0 +1,547 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ф"
],
[
"ц"
],
[
"у"
],
[
"ж"
],
[
"э"
],
[
"н"
],
[
"г"
],
[
"ш",
"щ"
],
[
"ү"
],
[
"з"
],
[
"к"
]
],
[
[
"й"
],
[
"ы"
],
[
"б"
],
[
"ө"
],
[
"а"
],
[
"х"
],
[
"р"
],
[
"о"
],
[
"л"
],
[
"д"
],
[
"п"
]
],
[
[
"я"
],
[
"ч"
],
[
"ё",
"е"
],
[
"с"
],
[
"м"
],
[
"и"
],
[
"т"
],
[
"ь",
"ъ"
],
[
"в",
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Ф"
],
[
"Ц"
],
[
"У"
],
[
"Ж"
],
[
"Э"
],
[
"Н"
],
[
"Г"
],
[
"Ш",
"Щ"
],
[
"Ү"
],
[
"З"
],
[
"К"
]
],
[
[
"Й"
],
[
"Ы"
],
[
"Б"
],
[
"Ө"
],
[
"А"
],
[
"Х"
],
[
"Р"
],
[
"О"
],
[
"Л"
],
[
"Д"
],
[
"П"
]
],
[
[
"Я"
],
[
"Ч"
],
[
"Ё",
"Е"
],
[
"С"
],
[
"М"
],
[
"И"
],
[
"Т"
],
[
"Ь",
"Ъ"
],
[
"В",
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₮",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "mn",
"name": "Mongolian"
}

507
data/osk-layouts/my.json Normal file
View File

@@ -0,0 +1,507 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "ms",
"name": "Malay"
}

584
data/osk-layouts/nl.json Normal file
View File

@@ -0,0 +1,584 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ë",
"ê",
"è",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y",
"ij"
],
[
"u",
"ú",
"ü",
"û",
"ù",
"ū"
],
[
"i",
"í",
"ï",
"ì",
"î",
"į",
"ī",
"ij"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"ä",
"â",
"à",
"æ",
"ã",
"å",
"ā"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ë",
"Ê",
"È",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y",
"IJ"
],
[
"U",
"Ú",
"Ü",
"Û",
"Ù",
"Ū"
],
[
"I",
"Í",
"Ï",
"Ì",
"Î",
"Į",
"Ī",
"IJ"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"Ä",
"Â",
"À",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "nl",
"name": "Dutch"
}

507
data/osk-layouts/no.json Normal file
View File

@@ -0,0 +1,507 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "nb",
"name": "Norwegian Bokmål"
}

507
data/osk-layouts/ph.json Normal file
View File

@@ -0,0 +1,507 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "fil",
"name": "Filipino"
}

579
data/osk-layouts/pl.json Normal file
View File

@@ -0,0 +1,579 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"ę",
"è",
"é",
"ê",
"ë",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o",
"ó",
"ö",
"ô",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"ą",
"á",
"à",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"ś",
"ß",
"š"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l",
"ł"
]
],
[
[
"z",
"ż",
"ź",
"ž"
],
[
"x"
],
[
"c",
"ć",
"ç",
"č"
],
[
"v"
],
[
"b"
],
[
"n",
"ń",
"ñ"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"Ę",
"È",
"É",
"Ê",
"Ë",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O",
"Ó",
"Ö",
"Ô",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Ą",
"Á",
"À",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"Ś",
"SS",
"Š"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L",
"Ł"
]
],
[
[
"Z",
"Ż",
"Ź",
"Ž"
],
[
"X"
],
[
"C",
"Ć",
"Ç",
"Č"
],
[
"V"
],
[
"B"
],
[
"N",
"Ń",
"Ñ"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "pl",
"name": "Polish"
}

584
data/osk-layouts/pt.json Normal file
View File

@@ -0,0 +1,584 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ê",
"è",
"ę",
"ė",
"ē",
"ë"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ú",
"ü",
"ù",
"û",
"ū"
],
[
"i",
"í",
"î",
"ì",
"ï",
"į",
"ī"
],
[
"o",
"ó",
"õ",
"ô",
"ò",
"ö",
"œ",
"ø",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"á",
"ã",
"à",
"â",
"ä",
"å",
"æ",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"č",
"ć"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ê",
"È",
"Ę",
"Ė",
"Ē",
"Ë"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ú",
"Ü",
"Ù",
"Û",
"Ū"
],
[
"I",
"Í",
"Î",
"Ì",
"Ï",
"Į",
"Ī"
],
[
"O",
"Ó",
"Õ",
"Ô",
"Ò",
"Ö",
"Œ",
"Ø",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"Á",
"Ã",
"À",
"Â",
"Ä",
"Å",
"Æ",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Č",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "pt-PT",
"name": "Portuguese Portugal"
}

547
data/osk-layouts/ro.json Normal file
View File

@@ -0,0 +1,547 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t",
"ț"
],
[
"y"
],
[
"u"
],
[
"i",
"î",
"ï",
"ì",
"í",
"į",
"ī"
],
[
"o"
],
[
"p"
]
],
[
[
"a",
"â",
"ã",
"ă",
"à",
"á",
"ä",
"æ",
"å",
"ā"
],
[
"s",
"ș",
"ß",
"ś",
"š"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T",
"Ț"
],
[
"Y"
],
[
"U"
],
[
"I",
"Î",
"Ï",
"Ì",
"Í",
"Į",
"Ī"
],
[
"O"
],
[
"P"
]
],
[
[
"A",
"Â",
"Ã",
"Ă",
"À",
"Á",
"Ä",
"Æ",
"Å",
"Ā"
],
[
"S",
"Ș",
"SS",
"Ś",
"Š"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "ro",
"name": "Romanian"
}

541
data/osk-layouts/rs.json Normal file
View File

@@ -0,0 +1,541 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"љ"
],
[
"њ"
],
[
"е",
"ѐ"
],
[
"р"
],
[
"т"
],
[
"з"
],
[
"у"
],
[
"и",
"ѝ"
],
[
"о"
],
[
"п"
],
[
"ш"
]
],
[
[
"а"
],
[
"с"
],
[
"д"
],
[
"ф"
],
[
"г"
],
[
"х"
],
[
"ј"
],
[
"к"
],
[
"л"
],
[
"ч"
],
[
"ћ"
]
],
[
[
"ѕ"
],
[
"џ"
],
[
"ц"
],
[
"в"
],
[
"б"
],
[
"н"
],
[
"м"
],
[
"ђ"
],
[
"ж"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Љ"
],
[
"Њ"
],
[
"Е",
"Ѐ"
],
[
"Р"
],
[
"Т"
],
[
"З"
],
[
"У"
],
[
"И",
"Ѝ"
],
[
"О"
],
[
"П"
],
[
"Ш"
]
],
[
[
"А"
],
[
"С"
],
[
"Д"
],
[
"Ф"
],
[
"Г"
],
[
"Х"
],
[
"Ј"
],
[
"К"
],
[
"Л"
],
[
"Ч"
],
[
"Ћ"
]
],
[
[
"Ѕ"
],
[
"Џ"
],
[
"Ц"
],
[
"В"
],
[
"Б"
],
[
"Н"
],
[
"М"
],
[
"Ђ"
],
[
"Ж"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "sr",
"name": "Serbian"
}

541
data/osk-layouts/ru.json Normal file
View File

@@ -0,0 +1,541 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"й"
],
[
"ц"
],
[
"у"
],
[
"к"
],
[
"е",
"ё"
],
[
"н"
],
[
"г"
],
[
"ш"
],
[
"щ"
],
[
"з"
],
[
"х"
]
],
[
[
"ф"
],
[
"ы"
],
[
"в"
],
[
"а"
],
[
"п"
],
[
"р"
],
[
"о"
],
[
"л"
],
[
"д"
],
[
"ж"
],
[
"э"
]
],
[
[
"я"
],
[
"ч"
],
[
"с"
],
[
"м"
],
[
"и"
],
[
"т"
],
[
"ь",
"ъ"
],
[
"б"
],
[
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Й"
],
[
"Ц"
],
[
"У"
],
[
"К"
],
[
"Е",
"Ё"
],
[
"Н"
],
[
"Г"
],
[
"Ш"
],
[
"Щ"
],
[
"З"
],
[
"Х"
]
],
[
[
"Ф"
],
[
"Ы"
],
[
"В"
],
[
"А"
],
[
"П"
],
[
"Р"
],
[
"О"
],
[
"Л"
],
[
"Д"
],
[
"Ж"
],
[
"Э"
]
],
[
[
"Я"
],
[
"Ч"
],
[
"С"
],
[
"М"
],
[
"И"
],
[
"Т"
],
[
"Ь",
"Ъ"
],
[
"Б"
],
[
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "ru",
"name": "Russian"
}

624
data/osk-layouts/se.json Normal file
View File

@@ -0,0 +1,624 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"ę"
],
[
"r",
"ř"
],
[
"t",
"ť",
"þ"
],
[
"y",
"ý",
"ÿ",
"ü"
],
[
"u",
"ü",
"ú",
"ù",
"û",
"ū"
],
[
"i",
"í",
"ì",
"î",
"ï"
],
[
"o",
"ó",
"ò",
"ô",
"õ",
"ō"
],
[
"p"
],
[
"å"
]
],
[
[
"a",
"á",
"à",
"â",
"ą",
"ã"
],
[
"s",
"ś",
"š",
"ş",
"ß"
],
[
"d",
"ð",
"ď"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l",
"ł"
],
[
"ö",
"ø",
"œ"
],
[
"ä",
"æ"
]
],
[
[
"z",
"ź",
"ž",
"ż"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n",
"ń",
"ñ",
"ň"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"Ę"
],
[
"R",
"Ř"
],
[
"T",
"Ť",
"Þ"
],
[
"Y",
"Ý",
"Ÿ",
"Ü"
],
[
"U",
"Ü",
"Ú",
"Ù",
"Û",
"Ū"
],
[
"I",
"Í",
"Ì",
"Î",
"Ï"
],
[
"O",
"Ó",
"Ò",
"Ô",
"Õ",
"Ō"
],
[
"P"
],
[
"Å"
]
],
[
[
"A",
"Á",
"À",
"Â",
"Ą",
"Ã"
],
[
"S",
"Ś",
"Š",
"Ş",
"SS"
],
[
"D",
"Ð",
"Ď"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L",
"Ł"
],
[
"Ö",
"Ø",
"Œ"
],
[
"Ä",
"Æ"
]
],
[
[
"Z",
"Ź",
"Ž",
"Ż"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N",
"Ń",
"Ñ",
"Ň"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "sv",
"name": "Swedish"
}

518
data/osk-layouts/si.json Normal file
View File

@@ -0,0 +1,518 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u"
],
[
"i"
],
[
"o"
],
[
"p"
]
],
[
[
"a"
],
[
"s",
"š"
],
[
"d",
"đ"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z",
"ž"
],
[
"x"
],
[
"c",
"č",
"ć"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U"
],
[
"I"
],
[
"O"
],
[
"P"
]
],
[
[
"A"
],
[
"S",
"Š"
],
[
"D",
"Đ"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z",
"Ž"
],
[
"X"
],
[
"C",
"Č",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "sl",
"name": "Slovenian"
}

648
data/osk-layouts/sk.json Normal file
View File

@@ -0,0 +1,648 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"ě",
"ē",
"ė",
"è",
"ê",
"ë",
"ę"
],
[
"r",
"ŕ",
"ř",
"ŗ"
],
[
"t",
"ť",
"ţ"
],
[
"y",
"ý",
"ÿ"
],
[
"u",
"ú",
"ů",
"ü",
"ū",
"ų",
"ù",
"û",
"ű"
],
[
"i",
"í",
"ī",
"į",
"ì",
"î",
"ï",
"ı"
],
[
"o",
"ô",
"ó",
"ö",
"ò",
"õ",
"œ",
"ő",
"ø"
],
[
"p"
]
],
[
[
"a",
"á",
"ä",
"ā",
"à",
"â",
"ã",
"å",
"æ",
"ą"
],
[
"s",
"š",
"ß",
"ś",
"ş"
],
[
"d",
"ď"
],
[
"f"
],
[
"g",
"ģ",
"ğ"
],
[
"h"
],
[
"j"
],
[
"k",
"ķ"
],
[
"l",
"ľ",
"ĺ",
"ļ",
"ł"
]
],
[
[
"z",
"ž",
"ż",
"ź"
],
[
"x"
],
[
"c",
"č",
"ç",
"ć"
],
[
"v"
],
[
"b"
],
[
"n",
"ň",
"ņ",
"ñ",
"ń",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"Ě",
"Ē",
"Ė",
"È",
"Ê",
"Ë",
"Ę"
],
[
"R",
"Ŕ",
"Ř",
"Ŗ"
],
[
"T",
"Ť",
"Ţ"
],
[
"Y",
"Ý",
"Ÿ"
],
[
"U",
"Ú",
"Ů",
"Ü",
"Ū",
"Ų",
"Ù",
"Û",
"Ű"
],
[
"I",
"Í",
"Ī",
"Į",
"Ì",
"Î",
"Ï",
"I"
],
[
"O",
"Ô",
"Ó",
"Ö",
"Ò",
"Õ",
"Œ",
"Ő",
"Ø"
],
[
"P"
]
],
[
[
"A",
"Á",
"Ä",
"Ā",
"À",
"Â",
"Ã",
"Å",
"Æ",
"Ą"
],
[
"S",
"Š",
"SS",
"Ś",
"Ş"
],
[
"D",
"Ď"
],
[
"F"
],
[
"G",
"Ģ",
"Ğ"
],
[
"H"
],
[
"J"
],
[
"K",
"Ķ"
],
[
"L",
"Ľ",
"Ĺ",
"Ļ",
"Ł"
]
],
[
[
"Z",
"Ž",
"Ż",
"Ź"
],
[
"X"
],
[
"C",
"Č",
"Ç",
"Ć"
],
[
"V"
],
[
"B"
],
[
"N",
"Ň",
"Ņ",
"Ñ",
"Ń",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "sk",
"name": "Slovak"
}

472
data/osk-layouts/th.json Normal file
View File

@@ -0,0 +1,472 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"ๅ"
],
[
"/",
"๑"
],
[
"_",
"๒"
],
[
"ภ",
"๓"
],
[
"ถ",
"๔"
],
[
"ุ"
],
[
"ึ"
],
[
"ค",
"๕"
],
[
"ต",
"๖"
],
[
"จ",
"๗"
],
[
"ข",
"๘"
],
[
"ช",
"๙"
]
],
[
[
"ๆ",
""
],
[
"ไ"
],
[
"ำ"
],
[
"พ"
],
[
"ะ"
],
[
"ั"
],
[
"ี"
],
[
"ร"
],
[
"น"
],
[
"ย"
],
[
"บ"
],
[
"ล"
]
],
[
[
"ฟ"
],
[
"ห"
],
[
"ก"
],
[
"ด"
],
[
"เ"
],
[
"้"
],
[
"่"
],
[
"า"
],
[
"ส"
],
[
"ว"
],
[
"ง"
],
[
"ฃ"
]
],
[
[
"ผ"
],
[
"ป"
],
[
"แ"
],
[
"อ"
],
[
"ิ"
],
[
"ื"
],
[
"ท"
],
[
"ม"
],
[
"ใ"
],
[
"ฝ"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"฿",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "th",
"name": "Thai"
}

566
data/osk-layouts/tr.json Normal file
View File

@@ -0,0 +1,566 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"ü",
"û",
"ù",
"ú",
"ū"
],
[
"i",
"ı",
"î",
"ï",
"ì",
"í",
"į",
"ī"
],
[
"o",
"ö",
"ô",
"œ",
"ò",
"ó",
"õ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"â"
],
[
"s",
"ş",
"ß",
"ś",
"š"
],
[
"d"
],
[
"f"
],
[
"g",
"ğ"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Ü",
"Û",
"Ù",
"Ú",
"Ū"
],
[
"İ",
"I",
"Î",
"Ï",
"Ì",
"Í",
"Į",
"Ī"
],
[
"O",
"Ö",
"Ô",
"Œ",
"Ò",
"Ó",
"Õ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Â"
],
[
"S",
"Ş",
"SS",
"Ś",
"Š"
],
[
"D"
],
[
"F"
],
[
"G",
"Ğ"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"€",
"¢",
"£",
"$",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "tr",
"name": "Turkish"
}

545
data/osk-layouts/ua.json Normal file
View File

@@ -0,0 +1,545 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"й"
],
[
"ц"
],
[
"у"
],
[
"к"
],
[
"е"
],
[
"н"
],
[
"г",
"ґ"
],
[
"ш"
],
[
"щ"
],
[
"з"
],
[
"х"
]
],
[
[
"ф"
],
[
"і",
"ї"
],
[
"в"
],
[
"а"
],
[
"п"
],
[
"р"
],
[
"о"
],
[
"л"
],
[
"д"
],
[
"ж"
],
[
"є"
]
],
[
[
"я"
],
[
"ч"
],
[
"с"
],
[
"м"
],
[
"и"
],
[
"т"
],
[
"ь",
"ъ"
],
[
"б"
],
[
"ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Й"
],
[
"Ц"
],
[
"У"
],
[
"К"
],
[
"Е"
],
[
"Н"
],
[
"Г",
"Ґ"
],
[
"Ш"
],
[
"Щ"
],
[
"З"
],
[
"Х"
]
],
[
[
"Ф"
],
[
"І",
"Ї"
],
[
"В"
],
[
"А"
],
[
"П"
],
[
"Р"
],
[
"О"
],
[
"Л"
],
[
"Д"
],
[
"Ж"
],
[
"Є"
]
],
[
[
"Я"
],
[
"Ч"
],
[
"С"
],
[
"М"
],
[
"И"
],
[
"Т"
],
[
"Ь",
"Ъ"
],
[
"Б"
],
[
"Ю"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₴",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "uk",
"name": "Ukrainian"
}

576
data/osk-layouts/uk.json Normal file
View File

@@ -0,0 +1,576 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ê",
"ë",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"û",
"ü",
"ù",
"ú",
"ū"
],
[
"i",
"î",
"ï",
"í",
"ī",
"ì"
],
[
"o",
"ô",
"ö",
"ò",
"ó",
"œ",
"ø",
"ō",
"õ"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"ß"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ê",
"Ë",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Û",
"Ü",
"Ù",
"Ú",
"Ū"
],
[
"I",
"Î",
"Ï",
"Í",
"Ī",
"Ì"
],
[
"O",
"Ô",
"Ö",
"Ò",
"Ó",
"Œ",
"Ø",
"Ō",
"Õ"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"SS"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"£",
"¢",
"$",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"€"
],
[
"¥"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "en-GB",
"name": "English Great Britain"
}

575
data/osk-layouts/us.json Normal file
View File

@@ -0,0 +1,575 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ê",
"ë",
"ē"
],
[
"r"
],
[
"t"
],
[
"y"
],
[
"u",
"û",
"ü",
"ù",
"ú",
"ū"
],
[
"i",
"î",
"ï",
"í",
"ī",
"ì"
],
[
"o",
"ô",
"ö",
"ò",
"ó",
"œ",
"ø",
"ō",
"õ"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"â",
"ä",
"æ",
"ã",
"å",
"ā"
],
[
"s",
"ß"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ê",
"Ë",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y"
],
[
"U",
"Û",
"Ü",
"Ù",
"Ú",
"Ū"
],
[
"I",
"Î",
"Ï",
"Í",
"Ī",
"Ì"
],
[
"O",
"Ô",
"Ö",
"Ò",
"Ó",
"Œ",
"Ø",
"Ō",
"Õ"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Â",
"Ä",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S",
"SS"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "en",
"name": "English United States"
}

643
data/osk-layouts/vn.json Normal file
View File

@@ -0,0 +1,643 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"è",
"é",
"ẻ",
"ẽ",
"ẹ",
"ê",
"ề",
"ế",
"ể",
"ễ",
"ệ"
],
[
"r"
],
[
"t"
],
[
"y",
"ỳ",
"ý",
"ỷ",
"ỹ",
"ỵ"
],
[
"u",
"ù",
"ú",
"ủ",
"ũ",
"ụ",
"ư",
"ừ",
"ứ",
"ử",
"ữ",
"ự"
],
[
"i",
"ì",
"í",
"ỉ",
"ĩ",
"ị"
],
[
"o",
"ò",
"ó",
"ỏ",
"õ",
"ọ",
"ô",
"ồ",
"ố",
"ổ",
"ỗ",
"ộ",
"ơ",
"ờ",
"ớ",
"ở",
"ỡ",
"ợ"
],
[
"p"
]
],
[
[
"a",
"à",
"á",
"ả",
"ã",
"ạ",
"ă",
"ằ",
"ắ",
"ẳ",
"ẵ",
"ặ",
"â",
"ầ",
"ấ",
"ẩ",
"ẫ",
"ậ"
],
[
"s"
],
[
"d",
"đ"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"È",
"É",
"Ẻ",
"Ẽ",
"Ẹ",
"Ê",
"Ề",
"Ế",
"Ể",
"Ễ",
"Ệ"
],
[
"R"
],
[
"T"
],
[
"Y",
"Ỳ",
"Ý",
"Ỷ",
"Ỹ",
"Ỵ"
],
[
"U",
"Ù",
"Ú",
"Ủ",
"Ũ",
"Ụ",
"Ư",
"Ừ",
"Ứ",
"Ử",
"Ữ",
"Ự"
],
[
"I",
"Ì",
"Í",
"Ỉ",
"Ĩ",
"Ị"
],
[
"O",
"Ò",
"Ó",
"Ỏ",
"Õ",
"Ọ",
"Ô",
"Ồ",
"Ố",
"Ổ",
"Ỗ",
"Ộ",
"Ơ",
"Ờ",
"Ớ",
"Ở",
"Ỡ",
"Ợ"
],
[
"P"
]
],
[
[
"A",
"À",
"Á",
"Ả",
"Ã",
"Ạ",
"Ă",
"Ằ",
"Ắ",
"Ẳ",
"Ẵ",
"Ặ",
"Â",
"Ầ",
"Ấ",
"Ẩ",
"Ẫ",
"Ậ"
],
[
"S"
],
[
"D",
"Đ"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"₫",
"$",
"¢",
"€",
"£",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"€"
],
[
"$",
"¢"
],
[
"¢"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "vi",
"name": "Vietnamese"
}

589
data/osk-layouts/za.json Normal file
View File

@@ -0,0 +1,589 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y",
"ý",
"ŷ",
"ÿ",
"ij"
],
[
"u",
"ú",
"û",
"ü",
"ù",
"ū"
],
[
"i",
"í",
"ì",
"ï",
"î",
"į",
"ī",
"ij"
],
[
"o",
"ó",
"ô",
"ö",
"ò",
"õ",
"œ",
"ø",
"ō"
],
[
"p"
]
],
[
[
"a",
"á",
"â",
"ä",
"à",
"æ",
"ã",
"å",
"ā"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c"
],
[
"v"
],
[
"b"
],
[
"n",
"ñ",
"ń"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y",
"Ý",
"Ŷ",
"Ÿ",
"IJ"
],
[
"U",
"Ú",
"Û",
"Ü",
"Ù",
"Ū"
],
[
"I",
"Í",
"Ì",
"Ï",
"Î",
"Į",
"Ī",
"IJ"
],
[
"O",
"Ó",
"Ô",
"Ö",
"Ò",
"Õ",
"Œ",
"Ø",
"Ō"
],
[
"P"
]
],
[
[
"A",
"Á",
"Â",
"Ä",
"À",
"Æ",
"Ã",
"Å",
"Ā"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C"
],
[
"V"
],
[
"B"
],
[
"N",
"Ñ",
"Ń"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "af",
"name": "Afrikaans"
}

View File

@@ -736,7 +736,7 @@ StScrollBar {
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
#panel.solid .panel-button:hover, #panel.solid .panel-button:active, #panel.solid .panel-button:overview, #panel.solid .panel-button:focus, #panel.solid .panel-button:checked {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
@@ -987,6 +987,14 @@ StScrollBar {
min-width: 21em; }
.aggregate-menu .popup-menu-icon {
padding: 0 4px; }
.aggregate-menu .popup-sub-menu .popup-menu-item :first-child:ltr {
/* 12px spacing + 2*4px padding */
padding-left: 20px;
margin-left: 1.09em; }
.aggregate-menu .popup-sub-menu .popup-menu-item :first-child:rtl {
/* 12px spacing + 2*4px padding */
padding-right: 20px;
margin-right: 1.09em; }
.system-menu-action {
color: #fff;
@@ -1495,30 +1503,26 @@ StScrollBar {
border-width: 0; }
/* On-screen Keyboard */
.word-suggestions {
font-size: 14pt;
spacing: 12px;
min-height: 20pt; }
#keyboard {
background-color: rgba(46, 52, 54, 0.7); }
.keyboard-layout {
spacing: 10px;
padding: 10px; }
.keyboard-row {
spacing: 15px; }
.key-container {
padding: 4px;
spacing: 4px; }
.keyboard-key {
color: #eeeeec;
background-color: #2e3436;
border-color: rgba(0, 0, 0, 0.7);
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
background-color: #393f3f;
min-height: 2em;
min-width: 2em;
font-size: 14pt;
font-weight: bold;
border-radius: 5px;
border: 1px solid black;
color: white; }
border-radius: 3px;
border: 1px solid #464d4d;
color: #e5e5e5; }
.keyboard-key:focus {
color: #eeeeec;
text-shadow: 0 1px black;
@@ -1542,6 +1546,12 @@ StScrollBar {
background-color: #2e3436;
color: #eeeeec;
border-color: rgba(0, 0, 0, 0.7); }
.keyboard-key.default-key {
border-color: #2d3232;
background-color: #1d2020; }
.keyboard-key.enter-key {
border-color: #005684;
background-color: #006098; }
.keyboard-subkeys {
color: white;

View File

@@ -736,7 +736,7 @@ StScrollBar {
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
#panel.solid .panel-button:hover, #panel.solid .panel-button:active, #panel.solid .panel-button:overview, #panel.solid .panel-button:focus, #panel.solid .panel-button:checked {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
@@ -987,6 +987,14 @@ StScrollBar {
min-width: 21em; }
.aggregate-menu .popup-menu-icon {
padding: 0 4px; }
.aggregate-menu .popup-sub-menu .popup-menu-item :first-child:ltr {
/* 12px spacing + 2*4px padding */
padding-left: 20px;
margin-left: 1.09em; }
.aggregate-menu .popup-sub-menu .popup-menu-item :first-child:rtl {
/* 12px spacing + 2*4px padding */
padding-right: 20px;
margin-right: 1.09em; }
.system-menu-action {
color: #eeeeec;
@@ -1495,30 +1503,26 @@ StScrollBar {
border-width: 0; }
/* On-screen Keyboard */
.word-suggestions {
font-size: 14pt;
spacing: 12px;
min-height: 20pt; }
#keyboard {
background-color: rgba(46, 52, 54, 0.7); }
.keyboard-layout {
spacing: 10px;
padding: 10px; }
.keyboard-row {
spacing: 15px; }
.key-container {
padding: 4px;
spacing: 4px; }
.keyboard-key {
color: #eeeeec;
background-color: #2e3436;
border-color: rgba(0, 0, 0, 0.7);
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
background-color: #393f3f;
min-height: 2em;
min-width: 2em;
font-size: 14pt;
font-weight: bold;
border-radius: 5px;
border: 1px solid #1c1f1f;
color: white; }
border-radius: 3px;
border: 1px solid #464d4d;
color: #e5e5e5; }
.keyboard-key:focus {
color: #eeeeec;
text-shadow: 0 1px black;
@@ -1542,6 +1546,12 @@ StScrollBar {
background-color: #2e3436;
color: #eeeeec;
border-color: rgba(0, 0, 0, 0.7); }
.keyboard-key.default-key {
border-color: #2d3232;
background-color: #1d2020; }
.keyboard-key.enter-key {
border-color: #005684;
background-color: #006098; }
.keyboard-subkeys {
color: white;

48
data/update-osk-layouts.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/bin/env bash
CLDR_LAYOUTS_TARBALL="http://www.unicode.org/Public/cldr/latest/keyboards.zip"
CLDR2JSON_GIT="git://repo.or.cz/cldr2json.git"
WORKDIR=".osk-layout-workbench"
CLDR2JSON="$WORKDIR/cldr2json/cldr2json.py"
SRCDIR="$WORKDIR/keyboards/android"
DESTDIR="osk-layouts"
GRESOURCE_FILE="gnome-shell-osk-layouts.gresource.xml"
TMP_GRESOURCE_FILE=".$GRESOURCE_FILE.tmp"
cd `dirname $0`
# Ensure work/dest dirs
rm -rf $WORKDIR
mkdir -p $WORKDIR
mkdir -p "osk-layouts"
# Download stuff on the work dir
pushd $WORKDIR
gio copy $CLDR_LAYOUTS_TARBALL .
git clone $CLDR2JSON_GIT
unzip keyboards.zip
popd
# Transform to JSON files
$CLDR2JSON $SRCDIR $DESTDIR
# Generate new gresources xml file
cat >$TMP_GRESOURCE_FILE <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/shell/osk-layouts">
EOF
for f in $DESTDIR/*.json
do
echo " <file>$(basename $f)</file>" >>$TMP_GRESOURCE_FILE
done
cat >>$TMP_GRESOURCE_FILE <<EOF
</gresource>
</gresources>
EOF
# Rewrite old gresources xml
mv $TMP_GRESOURCE_FILE $GRESOURCE_FILE

View File

@@ -17,6 +17,7 @@
<file>misc/gnomeSession.js</file>
<file>misc/history.js</file>
<file>misc/ibusManager.js</file>
<file>misc/inputMethod.js</file>
<file>misc/jsParse.js</file>
<file>misc/keyboardManager.js</file>
<file>misc/loginManager.js</file>
@@ -61,6 +62,7 @@
<file>ui/ibusCandidatePopup.js</file>
<file>ui/iconGrid.js</file>
<file>ui/inhibitShortcutsDialog.js</file>
<file>ui/kbdA11yDialog.js</file>
<file>ui/keyboard.js</file>
<file>ui/layout.js</file>
<file>ui/lightbox.js</file>
@@ -130,5 +132,6 @@
<file>ui/status/bluetooth.js</file>
<file>ui/status/screencast.js</file>
<file>ui/status/system.js</file>
<file>ui/status/thunderbolt.js</file>
</gresource>
</gresources>

View File

@@ -14,6 +14,6 @@ var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
var LOCALEDIR = '@datadir@/locale';
/* other standard directories */
var LIBEXECDIR = '@libexecdir@';
var SYSCONFDIR = '@sysconfdir@';
var VPNDIR = '@vpndir@';
/* g-i package versions */
var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'

View File

@@ -6,15 +6,11 @@ const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
let IBusCandidatePopup;
try {
var IBus = imports.gi.IBus;
_checkIBusVersion(1, 5, 2);
IBusCandidatePopup = imports.ui.ibusCandidatePopup;
} catch (e) {
var IBus = null;
log(e);
}
const IBus = imports.gi.IBus;
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
// Ensure runtime version matches
_checkIBusVersion(1, 5, 2);
let _ibusManager = null;
@@ -45,9 +41,6 @@ var IBusManager = new Lang.Class({
_PRELOAD_ENGINES_DELAY_TIME: 30, // sec
_init: function() {
if (!IBus)
return;
IBus.init();
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
@@ -190,7 +183,7 @@ var IBusManager = new Lang.Class({
},
getEngineDesc: function(id) {
if (!IBus || !this._ready || !this._engines.hasOwnProperty(id))
if (!this._ready || !this._engines.hasOwnProperty(id))
return null;
return this._engines[id];
@@ -200,7 +193,7 @@ var IBusManager = new Lang.Class({
// Send id even if id == this._currentEngineName
// because 'properties-registered' signal can be emitted
// while this._ibusSources == null on a lock screen.
if (!IBus || !this._ready) {
if (!this._ready) {
if (callback)
callback();
return;
@@ -211,7 +204,7 @@ var IBusManager = new Lang.Class({
},
preloadEngines: function(ids) {
if (!IBus || !this._ibus || ids.length == 0)
if (!this._ibus || ids.length == 0)
return;
if (this._preloadEnginesId != 0) {

214
js/misc/inputMethod.js Normal file
View File

@@ -0,0 +1,214 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const IBus = imports.gi.IBus;
const Keyboard = imports.ui.status.keyboard;
const Lang = imports.lang;
const Signals = imports.signals;
var InputMethod = new Lang.Class({
Name: 'InputMethod',
Extends: Clutter.InputMethod,
_init: function() {
this.parent();
this._hints = 0;
this._purpose = 0;
this._enabled = true;
this._currentFocus = null;
this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
this.connect('notify::can-show-preedit', Lang.bind(this, this._updateCapabilities));
this._inputSourceManager = Keyboard.getInputSourceManager();
this._sourceChangedId = this._inputSourceManager.connect('current-source-changed',
Lang.bind(this, this._onSourceChanged));
this._currentSource = this._inputSourceManager.currentSource;
if (this._ibus.is_connected())
this._onConnected();
},
get currentFocus() {
return this._currentFocus;
},
_updateCapabilities: function() {
let caps = 0;
if (this.can_show_preedit)
caps |= IBus.Capabilite.PREEDIT_TEXT;
if (this._currentFocus)
caps |= IBus.Capabilite.FOCUS | IBus.Capabilite.SURROUNDING_TEXT;
else
caps |= IBus.Capabilite.PREEDIT_TEXT | IBus.Capabilite.AUXILIARY_TEXT | IBus.Capabilite.LOOKUP_TABLE | IBus.Capabilite.PROPERTY;
if (this._context)
this._context.set_capabilities(caps);
},
_onSourceChanged: function() {
this._currentSource = this._inputSourceManager.currentSource;
},
_onConnected: function() {
this._ibus.create_input_context_async ('gnome-shell', -1, null,
Lang.bind(this, this._setContext));
},
_setContext: function(bus, res) {
this._context = this._ibus.create_input_context_async_finish(res);
this._context.connect('enabled', Lang.bind(this, function () { this._enabled = true }));
this._context.connect('disabled', Lang.bind(this, function () { this._enabled = false }));
this._context.connect('commit-text', Lang.bind(this, this._onCommitText));
this._context.connect('delete-surrounding-text', Lang.bind(this, this._onDeleteSurroundingText));
this._context.connect('update-preedit-text', Lang.bind(this, this._onUpdatePreeditText));
this._updateCapabilities();
},
_clear: function() {
this._context = null;
this._hints = 0;
this._purpose = 0;
this._enabled = false;
},
_emitRequestSurrounding: function() {
if (this._context.needs_surrounding_text())
this.emit('request-surrounding');
},
_onCommitText: function(context, text) {
this.commit(text.get_text());
},
_onDeleteSurroundingText: function (context) {
this.delete_surrounding();
},
_onUpdatePreeditText: function (context, text, pos, visible) {
let str = null;
if (visible && text != null)
str = text.get_text();
this.set_preedit_text(str, pos);
},
vfunc_focus_in: function(focus) {
this._currentFocus = focus;
if (this._context) {
this._context.focus_in();
this._updateCapabilities();
this._emitRequestSurrounding();
}
},
vfunc_focus_out: function() {
this._currentFocus = null;
if (this._context) {
this._context.focus_out();
this._updateCapabilities();
}
// Unset any preedit text
this.set_preedit_text(null, 0);
},
vfunc_reset: function() {
if (this._context) {
this._context.reset();
this._emitRequestSurrounding();
}
// Unset any preedit text
this.set_preedit_text(null, 0);
},
vfunc_set_cursor_location: function(rect) {
if (this._context) {
this._context.set_cursor_location(rect.get_x(), rect.get_y(),
rect.get_width(), rect.get_height());
this._emitRequestSurrounding();
}
},
vfunc_set_surrounding: function(text, cursor, anchor) {
if (this._context)
this._context.set_surrounding_text(text, cursor, anchor);
},
vfunc_update_content_hints: function(hints) {
let ibusHints = 0;
if (hints & Clutter.InputContentHintFlags.COMPLETION)
ibusHints |= IBus.InputHints.WORD_COMPLETION;
if (hints & Clutter.InputContentHintFlags.SPELLCHECK)
ibusHints |= IBus.InputHints.SPELLCHECK;
if (hints & Clutter.InputContentHintFlags.AUTO_CAPITALIZATION)
ibusHints |= IBus.InputHints.UPPERCASE_SENTENCES;
if (hints & Clutter.InputContentHintFlags.LOWERCASE)
ibusHints |= IBus.InputHints.LOWERCASE;
if (hints & Clutter.InputContentHintFlags.UPPERCASE)
ibusHints |= IBus.InputHints.UPPERCASE_CHARS;
if (hints & Clutter.InputContentHintFlags.TITLECASE)
ibusHints |= IBus.InputHints.UPPERCASE_WORDS;
this._hints = ibusHints;
if (this._context)
this._context.set_content_type(this._purpose, this._hints);
},
vfunc_update_content_purpose: function(purpose) {
let ibusPurpose = 0;
if (purpose == Clutter.InputContentPurpose.NORMAL)
ibusPurpose = IBus.InputPurpose.FREE_FORM;
else if (purpose == Clutter.InputContentPurpose.ALPHA)
ibusPurpose = IBus.InputPurpose.ALPHA;
else if (purpose == Clutter.InputContentPurpose.DIGITS)
ibusPurpose = IBus.InputPurpose.DIGITS;
else if (purpose == Clutter.InputContentPurpose.NUMBER)
ibusPurpose = IBus.InputPurpose.NUMBER;
else if (purpose == Clutter.InputContentPurpose.PHONE)
ibusPurpose = IBus.InputPurpose.PHONE;
else if (purpose == Clutter.InputContentPurpose.URL)
ibusPurpose = IBus.InputPurpose.URL;
else if (purpose == Clutter.InputContentPurpose.EMAIL)
ibusPurpose = IBus.InputPurpose.EMAIL;
else if (purpose == Clutter.InputContentPurpose.NAME)
ibusPurpose = IBus.InputPurpose.NAME;
else if (purpose == Clutter.InputContentPurpose.PASSWORD)
ibusPurpose = IBus.InputPurpose.PASSWORD;
this._purpose = ibusPurpose;
if (this._context)
this._context.set_content_type(this._purpose, this._hints);
},
vfunc_filter_key_event: function(event) {
if (!this._context || !this._enabled)
return false;
if (!this._currentSource ||
this._currentSource.type == Keyboard.INPUT_SOURCE_TYPE_XKB)
return false;
let state = event.get_state();
if (state & IBus.ModifierType.IGNORED_MASK)
return false;
if (event.type() == Clutter.EventType.KEY_RELEASE)
state |= IBus.ModifierType.RELEASE_MASK;
this._context.process_key_event_async(event.get_key_symbol(),
event.get_key_code() - 8, // Convert XKB keycodes to evcodes
state, -1, null,
Lang.bind(this, (context, res) => {
try {
let retval = context.process_key_event_async_finish(res);
this.notify_key_event(event, retval);
} catch (e) {
log('Error processing key on IM: ' + e.message);
}
}));
return true;
},
});

View File

@@ -7,7 +7,7 @@ jsconf.set10('HAVE_BLUETOOTH', bt_dep.found())
jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager)
jsconf.set('datadir', datadir)
jsconf.set('libexecdir', libexecdir)
jsconf.set('sysconfdir', sysconfdir)
jsconf.set('vpndir', vpndir)
config_js = configure_file(
input: 'config.js.in',

View File

@@ -2,7 +2,7 @@
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const NMGtk = imports.gi.NMGtk;
const NMA = imports.gi.NMA;
const Signals = imports.signals;
// _getMobileProvidersDatabase:
@@ -14,7 +14,7 @@ let _mpd;
function _getMobileProvidersDatabase() {
if (_mpd == null) {
try {
_mpd = new NMGtk.MobileProvidersDatabase();
_mpd = new NMA.MobileProvidersDatabase();
_mpd.init(null);
} catch (e) {
log(e.message);

View File

@@ -156,6 +156,26 @@ var AppSwitcherPopup = new Lang.Class({
this._items[this._selectedIndex].cachedWindows.length);
},
_closeAppWindow: function(appIndex, windowIndex) {
let appIcon = this._items[appIndex];
if (!appIcon)
return;
let window = appIcon.cachedWindows[windowIndex];
if (!window)
return;
window.delete(global.get_current_time());
},
_quitApplication: function(appIndex) {
let appIcon = this._items[appIndex];
if (!appIcon)
return;
appIcon.app.request_quit();
},
_keyPressHandler: function(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
if (!this._thumbnailsFocused)
@@ -168,6 +188,8 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._next());
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
this._select(this._previous());
} else if (keysym == Clutter.q) {
this._quitApplication(this._selectedIndex);
} else if (this._thumbnailsFocused) {
if (keysym == Clutter.Left)
this._select(this._selectedIndex, this._previousWindow());
@@ -175,6 +197,8 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, this._nextWindow());
else if (keysym == Clutter.Up)
this._select(this._selectedIndex, null, true);
else if (keysym == Clutter.w || keysym == Clutter.F4)
this._closeAppWindow(this._selectedIndex, this._currentWindow);
else
return Clutter.EVENT_PROPAGATE;
} else {
@@ -248,11 +272,22 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, n);
},
_windowRemoved : function(thumbnailList, n) {
let appIcon = this._items[this._selectedIndex];
if (!appIcon)
return;
if (appIcon.cachedWindows.length > 0) {
let newIndex = Math.min(n, appIcon.cachedWindows.length - 1);
this._select(this._selectedIndex, newIndex);
}
},
_finish : function(timestamp) {
let appIcon = this._items[this._selectedIndex];
if (this._currentWindow < 0)
appIcon.app.activate_window(appIcon.cachedWindows[0], timestamp);
else
else if (appIcon.cachedWindows[this._currentWindow])
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);
this.parent();
@@ -343,13 +378,19 @@ var AppSwitcherPopup = new Lang.Class({
})
});
this._thumbnails = null;
this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED);
if (this._switcherList._items[this._selectedIndex])
this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED);
},
_createThumbnails : function() {
this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows);
this._thumbnails.connect('item-activated', Lang.bind(this, this._windowActivated));
this._thumbnails.connect('item-entered', Lang.bind(this, this._windowEntered));
this._thumbnails.connect('item-removed', Lang.bind(this, this._windowRemoved));
this._thumbnails.actor.connect('destroy', () => {
this._thumbnails = null;
this._thumbnailsFocused = false;
});
this.actor.add_actor(this._thumbnails.actor);
@@ -535,6 +576,14 @@ var WindowSwitcherPopup = new Lang.Class({
return getWindows(workspace);
},
_closeWindow: function(windowIndex) {
let windowIcon = this._items[windowIndex];
if (!windowIcon)
return;
windowIcon.window.delete(global.get_current_time());
},
_keyPressHandler: function(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
this._select(this._next());
@@ -545,6 +594,8 @@ var WindowSwitcherPopup = new Lang.Class({
this._select(this._previous());
else if (keysym == Clutter.Right)
this._select(this._next());
else if (keysym == Clutter.w || keysym == Clutter.F4)
this._closeWindow(this._selectedIndex);
else
return Clutter.EVENT_PROPAGATE;
}
@@ -645,6 +696,10 @@ var AppSwitcher = new Lang.Class({
_onDestroy: function() {
if (this._mouseTimeOutId != 0)
Mainloop.source_remove(this._mouseTimeOutId);
this.icons.forEach(icon => {
icon.app.disconnect(icon._stateChangedId);
});
},
_setIconSize: function() {
@@ -745,7 +800,7 @@ var AppSwitcher = new Lang.Class({
// show a dim arrow, but show a bright arrow when they are
// highlighted.
highlight : function(n, justOutline) {
if (this._curApp != -1) {
if (this.icons[this._curApp]) {
if (this.icons[this._curApp].cachedWindows.length == 1)
this._arrows[this._curApp].hide();
else
@@ -767,6 +822,11 @@ var AppSwitcher = new Lang.Class({
this.icons.push(appIcon);
let item = this.addItem(appIcon.actor, appIcon.label);
appIcon._stateChangedId = appIcon.app.connect('notify::state', app => {
if (app.state != Shell.AppState.RUNNING)
this._removeIcon(app);
});
let n = this._arrows.length;
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
arrow.connect('repaint', function() { SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM); });
@@ -777,7 +837,18 @@ var AppSwitcher = new Lang.Class({
arrow.hide();
else
item.add_accessible_state (Atk.StateType.EXPANDABLE);
}
},
_removeIcon: function(app) {
let index = this.icons.findIndex(icon => {
return icon.app == app;
});
if (index === -1)
return;
this.icons.splice(index, 1);
this.removeItem(index);
},
});
var ThumbnailList = new Lang.Class({
@@ -816,6 +887,8 @@ var ThumbnailList = new Lang.Class({
}
}
this.actor.connect('destroy', this._onDestroy.bind(this));
},
addClones : function (availHeight) {
@@ -840,12 +913,38 @@ var ThumbnailList = new Lang.Class({
let clone = _createWindowClone(mutterWindow, thumbnailSize);
this._thumbnailBins[i].set_height(binHeight);
this._thumbnailBins[i].add_actor(clone);
clone._destroyId = mutterWindow.connect('destroy', Lang.bind(this, this._removeThumbnail, clone));
this._clones.push(clone);
}
// Make sure we only do this once
this._thumbnailBins = new Array();
}
},
_removeThumbnail: function(source, clone) {
let index = this._clones.indexOf(clone);
if (index === -1)
return;
this._clones.splice(index, 1);
this._windows.splice(index, 1);
this._labels.splice(index, 1);
this.removeItem(index);
if (this._clones.length > 0)
this.highlight(SwitcherPopup.mod(index, this._clones.length));
else
this.actor.destroy();
},
_onDestroy: function() {
this._clones.forEach(clone => {
if (clone.source)
clone.source.disconnect(clone._destroyId);
});
},
});
var WindowIcon = new Lang.Class({
@@ -925,7 +1024,19 @@ var WindowList = new Lang.Class({
this.addItem(icon.actor, icon.label);
this.icons.push(icon);
icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
this._removeWindow(window)
});
}
this.actor.connect('destroy', () => { this._onDestroy(); });
},
_onDestroy: function() {
this.icons.forEach(icon => {
icon.window.disconnect(icon._unmanagedSignalId);
});
},
_getPreferredHeight: function(actor, forWidth, alloc) {
@@ -954,5 +1065,16 @@ var WindowList = new Lang.Class({
this.parent(index, justOutline);
this._label.set_text(index == -1 ? '' : this.icons[index].label.text);
},
_removeWindow: function(window) {
let index = this.icons.findIndex(icon => {
return icon.window == window;
});
if (index === -1)
return;
this.icons.splice(index, 1);
this.removeItem(index);
}
});

View File

@@ -1872,11 +1872,14 @@ var AppIconMenu = new Lang.Class({
this.actor.add_style_class_name('app-well-menu');
// Chain our visibility and lifecycle to that of the source
source.actor.connect('notify::mapped', Lang.bind(this, function () {
this._sourceMappedId = source.actor.connect('notify::mapped', () => {
if (!source.actor.mapped)
this.close();
}));
source.actor.connect('destroy', Lang.bind(this, this.destroy));
});
source.actor.connect('destroy', () => {
source.actor.disconnect(this._sourceMappedId);
this.destroy();
});
Main.uiGroup.add_actor(this.actor);
},

View File

@@ -289,6 +289,8 @@ var Background = new Lang.Class({
this._clock.disconnect(this._timezoneChangedId);
this._timezoneChangedId = 0;
this._clock = null;
if (this._prepareForSleepId != 0)
LoginManager.getLoginManager().disconnect(this._prepareForSleepId);
this._prepareForSleepId = 0;

View File

@@ -7,7 +7,6 @@ const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const St = imports.gi.St;
const Signals = imports.signals;
const Gettext_gtk30 = imports.gettext.domain('gtk30');
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
@@ -22,8 +21,6 @@ var ELLIPSIS_CHAR = '\u2026';
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
// alias to prevent xgettext from picking up strings translated in GTK+
const gtk30_ = Gettext_gtk30.gettext;
var NC_ = function(context, str) { return context + '\u0004' + str; };
function sameYear(dateA, dateB) {
@@ -376,20 +373,23 @@ var Calendar = new Lang.Class({
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
// Find the ordering for month/year in the calendar heading
this._headerFormatWithoutYear = '%B';
switch (gtk30_('calendar:MY')) {
case 'calendar:MY':
this._headerFormat = '%B %Y';
break;
case 'calendar:YM':
this._headerFormat = '%Y %B';
break;
default:
log('Translation of "calendar:MY" in GTK+ is not correct');
this._headerFormat = '%B %Y';
break;
}
/**
* Translators: The header displaying just the month name
* standalone, when this is a month of the current year.
* "%OB" is the new format specifier introduced in glibc 2.27,
* in most cases you should not change it.
*/
this._headerFormatWithoutYear = _('%OB');
/**
* Translators: The header displaying the month name and the year
* number, when this is a month of a different year. You can
* reorder the format specifiers or add other modifications
* according to the requirements of your language.
* "%OB" is the new format specifier introduced in glibc 2.27,
* in most cases you should not use the old "%B" here unless you
* absolutely know what you are doing.
*/
this._headerFormat = _('%OB %Y');
// Start off with the current date
this._selectedDate = new Date();

View File

@@ -5,10 +5,10 @@ const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient;
const NM = imports.gi.NM;
const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Config = imports.misc.config;
@@ -173,7 +173,7 @@ var NetworkSecretDialog = new Lang.Class({
_validateStaticWep: function(secret) {
let value = secret.value;
if (secret.wep_key_type == NetworkManager.WepKeyType.KEY) {
if (secret.wep_key_type == NM.WepKeyType.KEY) {
if (value.length == 10 || value.length == 26) {
for (let i = 0; i < value.length; i++) {
if (!((value[i] >= 'a' && value[i] <= 'f')
@@ -189,7 +189,7 @@ var NetworkSecretDialog = new Lang.Class({
}
} else
return false;
} else if (secret.wep_key_type == NetworkManager.WepKeyType.PASSPHRASE) {
} else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
if (value.length < 0 || value.length > 64)
return false;
}
@@ -288,7 +288,7 @@ var NetworkSecretDialog = new Lang.Class({
switch (connectionType) {
case '802-11-wireless':
wirelessSetting = this._connection.get_setting_wireless();
ssid = NetworkManager.utils_ssid_to_utf8(wirelessSetting.get_ssid());
ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
content.title = _("Authentication required by wireless network");
content.message = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
this._getWirelessSecrets(content.secrets, wirelessSetting);
@@ -351,9 +351,9 @@ var VPNRequestHandler = new Lang.Class({
];
if (authHelper.externalUIMode)
argv.push('--external-ui-mode');
if (flags & NMClient.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
argv.push('-i');
if (flags & NMClient.SecretAgentGetSecretsFlags.REQUEST_NEW)
if (flags & NM.SecretAgentGetSecretsFlags.REQUEST_NEW)
argv.push('-r');
if (authHelper.supportsHints) {
for (let i = 0; i < hints.length; i++) {
@@ -414,7 +414,9 @@ var VPNRequestHandler = new Lang.Class({
if (this._destroyed)
return;
GLib.source_remove(this._childWatch);
this.emit('destroy');
if (this._childWatch)
GLib.source_remove(this._childWatch);
this._stdin.close(null);
// Stdout is closed when we finish reading from it
@@ -541,6 +543,7 @@ var VPNRequestHandler = new Lang.Class({
logError(e, 'error while reading VPN plugin output keyfile');
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
this.destroy();
return;
}
}
@@ -551,6 +554,7 @@ var VPNRequestHandler = new Lang.Class({
this._shellDialog.open(global.get_current_time());
} else {
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
this.destroy();
}
},
@@ -571,23 +575,26 @@ var VPNRequestHandler = new Lang.Class({
logError(e, 'internal error while writing connection to helper');
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
this.destroy();
}
},
});
Signals.addSignalMethods(VPNRequestHandler.prototype);
var NetworkAgent = new Lang.Class({
Name: 'NetworkAgent',
_init: function() {
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
capabilities: NMClient.SecretAgentCapabilities.VPN_HINTS
capabilities: NM.SecretAgentCapabilities.VPN_HINTS,
auto_register: false
});
this._dialogs = { };
this._vpnRequests = { };
this._notifications = { };
this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
this._pluginDir = Gio.file_new_for_path(Config.VPNDIR);
try {
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
@@ -597,12 +604,21 @@ var NetworkAgent = new Lang.Class({
this._native.connect('new-request', Lang.bind(this, this._newRequest));
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
this._enabled = false;
try {
this._native.init(null);
} catch(e) {
this._native = null;
logError(e, 'error initializing the NetworkManager Agent');
}
},
enable: function() {
this._enabled = true;
if (!this._native)
return;
this._native.auto_register = true;
if (!this._native.registered)
this._native.register_async(null, null);
},
disable: function() {
@@ -620,7 +636,12 @@ var NetworkAgent = new Lang.Class({
this._notifications[requestId].destroy();
this._notifications = { };
this._enabled = false;
if (!this._native)
return;
this._native.auto_register = false;
if (this._native.registered)
this._native.unregister_async(null, null);
},
_showNotification: function(requestId, connection, settingName, hints, flags) {
@@ -634,7 +655,7 @@ var NetworkAgent = new Lang.Class({
switch (connectionType) {
case '802-11-wireless':
let wirelessSetting = connection.get_setting_wireless();
let ssid = NetworkManager.utils_ssid_to_utf8(wirelessSetting.get_ssid());
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid());
title = _("Authentication required by wireless network");
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
break;
@@ -684,12 +705,7 @@ var NetworkAgent = new Lang.Class({
},
_newRequest: function(agent, requestId, connection, settingName, hints, flags) {
if (!this._enabled) {
agent.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED);
return;
}
if (!(flags & NMClient.SecretAgentGetSecretsFlags.USER_REQUESTED))
if (!(flags & NM.SecretAgentGetSecretsFlags.USER_REQUESTED))
this._showNotification(requestId, connection, settingName, hints, flags);
else
this._handleRequest(requestId, connection, settingName, hints, flags);
@@ -735,7 +751,11 @@ var NetworkAgent = new Lang.Class({
return;
}
this._vpnRequests[requestId] = new VPNRequestHandler(this._native, requestId, binary, serviceType, connection, hints, flags);
let vpnRequest = new VPNRequestHandler(this._native, requestId, binary, serviceType, connection, hints, flags);
vpnRequest.connect('destroy', Lang.bind(this, function() {
delete this._vpnRequests[requestId];
}));
this._vpnRequests[requestId] = vpnRequest;
},
_buildVPNServiceCache: function() {

View File

@@ -50,6 +50,10 @@ var DashItemContainer = new Lang.Class({
this._childScale = 0;
this._childOpacity = 0;
this.animatingOut = false;
this.connect('destroy', () => {
this.label.destroy();
});
},
vfunc_allocate: function(box, flags) {
@@ -177,16 +181,8 @@ var DashItemContainer = new Lang.Class({
});
},
destroy: function() {
if (this.label)
this.label.destroy();
this.parent();
},
animateOutAndDestroy: function() {
if (this.label)
this.label.destroy();
this.label.hide();
if (this.child == null) {
this.destroy();

View File

@@ -132,8 +132,11 @@ var WorldClocksSection = new Lang.Class({
let world = GWeather.Location.get_world();
let clocks = settings.get_value('world-clocks').deep_unpack();
for (let i = 0; i < clocks.length; i++) {
if (!clocks[i].location)
continue;
let l = world.deserialize(clocks[i].location);
this._locations.push({ location: l });
if (l)
this._locations.push({ location: l });
}
this._locations.sort(function(a, b) {

View File

@@ -583,7 +583,7 @@ var _Draggable = new Lang.Class({
_restoreDragActor: function(eventTime) {
this._dragInProgress = false;
[restoreX, restoreY, restoreScale] = this._getRestoreLocation();
let [restoreX, restoreY, restoreScale] = this._getRestoreLocation();
// fade the actor back in at its original location
this._dragActor.set_position(restoreX, restoreY);

View File

@@ -253,10 +253,18 @@ var CandidatePopup = new Lang.Class({
for (let i = 0; indexLabel = lookupTable.get_label(i); ++i)
indexes.push(indexLabel.get_text());
Main.keyboard.resetSuggestions();
let candidates = [];
for (let i = startIndex; i < endIndex; ++i)
for (let i = startIndex; i < endIndex; ++i) {
candidates.push(lookupTable.get_candidate(i).get_text());
Main.keyboard.addSuggestion(lookupTable.get_candidate(i).get_text(), Lang.bind(this, function() {
let index = i;
this._panelService.candidate_clicked(index, 1, 0);
}));
}
this._candidateArea.setCandidates(indexes,
candidates,
cursorPos % pageSize,
@@ -277,6 +285,7 @@ var CandidatePopup = new Lang.Class({
panelService.connect('focus-out',
Lang.bind(this, function(ps) {
this._boxPointer.hide(BoxPointer.PopupAnimation.NONE);
Main.keyboard.resetSuggestions();
}));
},
@@ -287,9 +296,10 @@ var CandidatePopup = new Lang.Class({
},
_updateVisibility: function() {
let isVisible = (this._preeditText.visible ||
this._auxText.visible ||
this._candidateArea.actor.visible);
let isVisible = (!Main.keyboard.visible &&
(this._preeditText.visible ||
this._auxText.visible ||
this._candidateArea.actor.visible));
if (isVisible) {
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);

77
js/ui/kbdA11yDialog.js Normal file
View File

@@ -0,0 +1,77 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog;
const KEYBOARD_A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable';
const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable';
var KbdA11yDialog = new Lang.Class({
Name: 'KbdA11yDialog',
Extends: GObject.Object,
_init: function() {
this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA });
let deviceManager = Clutter.DeviceManager.get_default();
deviceManager.connect('kbd-a11y-flags-changed',
Lang.bind(this, this._showKbdA11yDialog));
},
_showKbdA11yDialog: function(deviceManager, newFlags, whatChanged) {
let dialog = new ModalDialog.ModalDialog();
let title, body;
let key, enabled;
if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
key = KEY_SLOW_KEYS_ENABLED;
enabled = (newFlags & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) ? true : false;
title = enabled ?
_("Slow Keys Turned On") :
_("Slow Keys Turned Off");
body = _("You just held down the Shift key for 8 seconds. This is the shortcut " +
"for the Slow Keys feature, which affects the way your keyboard works.");
} else if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
key = KEY_STICKY_KEYS_ENABLED;
enabled = (newFlags & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) ? true : false;
title = enabled ?
_("Sticky Keys Turned On") :
_("Sticky Keys Turned Off");
body = enabled ?
_("You just pressed the Shift key 5 times in a row. This is the shortcut " +
"for the Sticky Keys feature, which affects the way your keyboard works.") :
_("You just pressed two keys at once, or pressed the Shift key 5 times in a row. " +
"This turns off the Sticky Keys feature, which affects the way your keyboard works.");
} else {
return;
}
let icon = new Gio.ThemedIcon({ name: 'preferences-desktop-accessibility-symbolic' });
let contentParams = { icon, title, body, styleClass: 'access-dialog' };
let content = new Dialog.MessageDialogContent(contentParams);
dialog.contentLayout.add_actor(content);
dialog.addButton({ label: enabled ? _("Leave On") : _("Turn On"),
action: () => {
this._a11ySettings.set_boolean(key, true);
dialog.close();
},
default: enabled,
key: !enabled ? Clutter.Escape : null });
dialog.addButton({ label: enabled ? _("Turn Off") : _("Leave Off"),
action: () => {
this._a11ySettings.set_boolean(key, false);
dialog.close();
},
default: !enabled,
key: enabled ? Clutter.Escape : null });
dialog.open();
}
});

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ const EndSessionDialog = imports.ui.endSessionDialog;
const Environment = imports.ui.environment;
const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionDownloader = imports.ui.extensionDownloader;
const InputMethod = imports.misc.inputMethod;
const Keyboard = imports.ui.keyboard;
const MessageTray = imports.ui.messageTray;
const ModalDialog = imports.ui.modalDialog;
@@ -44,6 +45,7 @@ const WindowManager = imports.ui.windowManager;
const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util;
const KbdA11yDialog = imports.ui.kbdA11yDialog;
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
@@ -78,11 +80,14 @@ var magnifier = null;
var xdndHandler = null;
var keyboard = null;
var layoutManager = null;
var kbdA11yDialog = null;
var inputMethod = null;
let _startDate;
let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _a11ySettings = null;
let _themeResource = null;
let _oskResource = null;
function _sessionUpdated() {
if (sessionMode.isPrimary)
@@ -146,6 +151,7 @@ function _initializeUI() {
Shell.AppUsage.get_default();
reloadThemeResource();
_loadOskLayouts();
_loadDefaultStylesheet();
// Setup the stage hierarchy early
@@ -163,11 +169,15 @@ function _initializeUI() {
osdWindowManager = new OsdWindow.OsdWindowManager();
osdMonitorLabeler = new OsdMonitorLabeler.OsdMonitorLabeler();
overview = new Overview.Overview();
kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
wm = new WindowManager.WindowManager();
magnifier = new Magnifier.Magnifier();
if (LoginManager.canLock())
screenShield = new ScreenShield.ScreenShield();
inputMethod = new InputMethod.InputMethod();
Clutter.get_default_backend().set_input_method(inputMethod);
messageTray = new MessageTray.MessageTray();
panel = new Panel.Panel();
keyboard = new Keyboard.Keyboard();
@@ -306,6 +316,11 @@ function reloadThemeResource() {
_themeResource._register();
}
function _loadOskLayouts() {
_oskResource = Gio.Resource.load(global.datadir + '/gnome-shell-osk-layouts.gresource');
_oskResource._register();
}
/**
* loadTheme:
*

View File

@@ -215,7 +215,7 @@ var ModalDialog = new Lang.Class({
else
this._savedKeyFocus = null;
Main.popModal(this._group, timestamp);
global.gdk_screen.get_display().sync();
Gdk.Display.get_default().sync();
this._hasModal = false;
if (!this._shellReactive)

View File

@@ -977,12 +977,12 @@ var PadOsdService = new Lang.Class({
let padDevice = null;
devices.forEach(Lang.bind(this, function(device) {
if (deviceNode == device.get_device_node())
if (deviceNode == device.get_device_node() &&
device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE)
padDevice = device;
}));
if (padDevice == null ||
padDevice.get_device_type() != Clutter.InputDeviceType.PAD_DEVICE) {
if (padDevice == null) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");

View File

@@ -720,7 +720,9 @@ var AggregateMenu = new Lang.Class({
this._screencast = new imports.ui.status.screencast.Indicator();
this._location = new imports.ui.status.location.Indicator();
this._nightLight = new imports.ui.status.nightLight.Indicator();
this._thunderbolt = new imports.ui.status.thunderbolt.Indicator();
this._indicators.add_child(this._thunderbolt.indicators);
this._indicators.add_child(this._screencast.indicators);
this._indicators.add_child(this._location.indicators);
this._indicators.add_child(this._nightLight.indicators);
@@ -819,6 +821,7 @@ var Panel = new Lang.Class({
global.window_group.connect('actor-removed', Lang.bind(this, this._onWindowActorRemoved));
global.window_manager.connect('switch-workspace', Lang.bind(this, this._updateSolidStyle));
global.screen.connect('workareas-changed', () => { this.actor.queue_relayout(); });
this._updatePanel();
},
@@ -865,7 +868,16 @@ var Panel = new Lang.Class({
let sideWidth, centerWidth;
centerWidth = centerNaturalWidth;
sideWidth = Math.max(0, (allocWidth - centerWidth) / 2);
// get workspace area and center date entry relative to it
let monitor = Main.layoutManager.findMonitorForActor(actor);
let centerOffset = 0;
if (monitor) {
let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index);
centerOffset = 2 * (workArea.x - monitor.x) + workArea.width - monitor.width;
}
sideWidth = Math.max(0, (allocWidth - centerWidth + centerOffset) / 2);
let childBox = new Clutter.ActorBox();

View File

@@ -1283,7 +1283,10 @@ var ScreenShield = new Lang.Class({
this._resetLockScreen({ animateLockScreen: animate,
fadeToBlack: true });
global.set_runtime_state(LOCKED_STATE_STR, GLib.Variant.new('b', true));
// On wayland, a crash brings down the entire session, so we don't
// need to defend against being restarted unlocked
if (!Meta.is_wayland_compositor())
global.set_runtime_state(LOCKED_STATE_STR, GLib.Variant.new('b', true));
// We used to set isActive and emit active-changed here,
// but now we do that from lockScreenShown, which means

View File

@@ -457,7 +457,7 @@ var InputSourceManager = new Lang.Class({
this._changePerWindowSource();
},
_activateInputSource: function(is, interactive) {
activateInputSource: function(is, interactive) {
KeyboardManager.holdKeyboard();
this._keyboardManager.apply(is.xkbId);
@@ -578,7 +578,7 @@ var InputSourceManager = new Lang.Class({
infosList[i].displayName,
infosList[i].shortName,
i);
is.connect('activate', Lang.bind(this, this._activateInputSource));
is.connect('activate', Lang.bind(this, this.activateInputSource));
if (!(is.shortName in inputSourcesByShortName))
inputSourcesByShortName[is.shortName] = [];

View File

@@ -321,7 +321,7 @@ var AppAuthorizer = new Lang.Class({
_userAuthorizeApp: function() {
let name = this._app.get_name();
let appInfo = this._app.get_app_info();
let reason = appInfo.get_string("X-Geoclue-Reason");
let reason = appInfo.get_locale_string("X-Geoclue-Reason");
this._showAppAuthDialog(name, reason);
},

View File

@@ -6,9 +6,7 @@ const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient;
const NMGtk = imports.gi.NMGtk;
const NM = imports.gi.NM;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
@@ -43,9 +41,9 @@ const NMAccessPointSecurity = {
var MAX_DEVICE_ITEMS = 4;
// small optimization, to avoid using [] all the time
const NM80211Mode = NetworkManager['80211Mode'];
const NM80211ApFlags = NetworkManager['80211ApFlags'];
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
const NM80211Mode = NM['80211Mode'];
const NM80211ApFlags = NM['80211ApFlags'];
const NM80211ApSecurityFlags = NM['80211ApSecurityFlags'];
var PortalHelperResult = {
CANCELLED: 0,
@@ -74,18 +72,6 @@ const PortalHelperIface = '<node> \
</node>';
const PortalHelperProxy = Gio.DBusProxy.makeProxyWrapper(PortalHelperIface);
function ssidCompare(one, two) {
if (!one || !two)
return false;
if (one.length != two.length)
return false;
for (let i = 0; i < one.length; i++) {
if (one[i] != two[i])
return false;
}
return true;
}
function signalToIcon(value) {
if (value > 80)
return 'excellent';
@@ -99,16 +85,14 @@ function signalToIcon(value) {
}
function ssidToLabel(ssid) {
let label = NetworkManager.utils_ssid_to_utf8(ssid);
let label = NM.utils_ssid_to_utf8(ssid.get_data());
if (!label)
label = _("<unknown>");
return label;
}
function ensureActiveConnectionProps(active, settings) {
if (!active._connection) {
active._connection = settings.get_connection_by_path(active.connection);
function ensureActiveConnectionProps(active, client) {
if (!active._primaryDevice) {
// This list is guaranteed to have only one device in it.
let device = active.get_devices()[0]._delegate;
active._primaryDevice = device;
@@ -162,7 +146,7 @@ var NMConnectionItem = new Lang.Class({
if (this._activeConnection == null)
return false;
return this._activeConnection.state <= NetworkManager.ActiveConnectionState.ACTIVATED;
return this._activeConnection.state <= NM.ActiveConnectionState.ACTIVATED;
},
_sync: function() {
@@ -346,10 +330,9 @@ var NMConnectionDevice = new Lang.Class({
Extends: NMConnectionSection,
Abstract: true,
_init: function(client, device, settings) {
_init: function(client, device) {
this.parent(client);
this._device = device;
this._settings = settings;
this._description = '';
this._autoConnectItem = this.item.menu.addAction(_("Connect"), Lang.bind(this, this._autoConnect));
@@ -363,12 +346,12 @@ var NMConnectionDevice = new Lang.Class({
if (this._client.primary_connection != this._device.active_connection)
return true;
return this._client.connectivity == NetworkManager.ConnectivityState.FULL;
return this._client.connectivity == NM.ConnectivityState.FULL;
},
_autoConnect: function() {
let connection = new NetworkManager.Connection();
this._client.add_and_activate_connection(connection, this._device, null, null);
let connection = new NM.SimpleConnection();
this._client.add_and_activate_connection_async(connection, this._device, null, null, null);
},
destroy: function() {
@@ -386,17 +369,12 @@ var NMConnectionDevice = new Lang.Class({
_activeConnectionChanged: function() {
if (this._activeConnection) {
let item = this._connectionItems.get(this._activeConnection._connection.get_uuid());
let item = this._connectionItems.get(this._activeConnection.connection.get_uuid());
item.setActiveConnection(null);
this._activeConnection = null;
}
this._activeConnection = this._device.active_connection;
if (this._activeConnection) {
ensureActiveConnectionProps(this._activeConnection, this._settings);
let item = this._connectionItems.get(this._activeConnection._connection.get_uuid());
item.setActiveConnection(this._activeConnection);
}
this._sync();
},
_deviceStateChanged: function(device, newstate, oldstate, reason) {
@@ -408,8 +386,8 @@ var NMConnectionDevice = new Lang.Class({
/* Emit a notification if activation fails, but don't do it
if the reason is no secrets, as that indicates the user
cancelled the agent dialog */
if (newstate == NetworkManager.DeviceState.FAILED &&
reason != NetworkManager.DeviceStateReason.NO_SECRETS) {
if (newstate == NM.DeviceState.FAILED &&
reason != NM.DeviceStateReason.NO_SECRETS) {
this.emit('activation-failed', reason);
}
@@ -421,7 +399,7 @@ var NMConnectionDevice = new Lang.Class({
},
activateConnection: function(connection) {
this._client.activate_connection(connection, this._device, null, null);
this._client.activate_connection_async(connection, this._device, null, null, null);
},
deactivateConnection: function(activeConnection) {
@@ -440,7 +418,18 @@ var NMConnectionDevice = new Lang.Class({
_sync: function() {
let nItems = this._connectionItems.size;
this._autoConnectItem.actor.visible = (nItems == 0);
this._deactivateItem.actor.visible = this._device.state > NetworkManager.DeviceState.DISCONNECTED;
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
if (this._activeConnection == null) {
this._activeConnection = this._device.active_connection;
if (this._activeConnection) {
ensureActiveConnectionProps(this._activeConnection, this._client);
let item = this._connectionItems.get(this._activeConnection.connection.get_uuid());
item.setActiveConnection(this._activeConnection);
}
}
this.parent();
},
@@ -449,31 +438,31 @@ var NMConnectionDevice = new Lang.Class({
return '';
switch(this._device.state) {
case NetworkManager.DeviceState.DISCONNECTED:
case NM.DeviceState.DISCONNECTED:
/* Translators: %s is a network identifier */
return _("%s Off").format(this._getDescription());
case NetworkManager.DeviceState.ACTIVATED:
case NM.DeviceState.ACTIVATED:
/* Translators: %s is a network identifier */
return _("%s Connected").format(this._getDescription());
case NetworkManager.DeviceState.UNMANAGED:
case NM.DeviceState.UNMANAGED:
/* Translators: this is for network devices that are physically present but are not
under NetworkManager's control (and thus cannot be used in the menu);
%s is a network identifier */
return _("%s Unmanaged").format(this._getDescription());
case NetworkManager.DeviceState.DEACTIVATING:
case NM.DeviceState.DEACTIVATING:
/* Translators: %s is a network identifier */
return _("%s Disconnecting").format(this._getDescription());
case NetworkManager.DeviceState.PREPARE:
case NetworkManager.DeviceState.CONFIG:
case NetworkManager.DeviceState.IP_CONFIG:
case NetworkManager.DeviceState.IP_CHECK:
case NetworkManager.DeviceState.SECONDARIES:
case NM.DeviceState.PREPARE:
case NM.DeviceState.CONFIG:
case NM.DeviceState.IP_CONFIG:
case NM.DeviceState.IP_CHECK:
case NM.DeviceState.SECONDARIES:
/* Translators: %s is a network identifier */
return _("%s Connecting").format(this._getDescription());
case NetworkManager.DeviceState.NEED_AUTH:
case NM.DeviceState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password; %s is a network identifier */
return _("%s Requires Authentication").format(this._getDescription());
case NetworkManager.DeviceState.UNAVAILABLE:
case NM.DeviceState.UNAVAILABLE:
// This state is actually a compound of various states (generically unavailable,
// firmware missing), that are exposed by different properties (whose state may
// or may not updated when we receive state-changed).
@@ -485,7 +474,7 @@ var NMConnectionDevice = new Lang.Class({
/* Translators: this is for a network device that cannot be activated (for example it
is disabled by rfkill, or it has no coverage; %s is a network identifier */
return _("%s Unavailable").format(this._getDescription());
case NetworkManager.DeviceState.FAILED:
case NM.DeviceState.FAILED:
/* Translators: %s is a network identifier */
return _("%s Connection Failed").format(this._getDescription());
default:
@@ -500,14 +489,14 @@ var NMDeviceWired = new Lang.Class({
Extends: NMConnectionDevice,
category: NMConnectionCategory.WIRED,
_init: function(client, device, settings) {
this.parent(client, device, settings);
_init: function(client, device) {
this.parent(client, device);
this.item.menu.addSettingsAction(_("Wired Settings"), 'gnome-network-panel.desktop');
},
_hasCarrier: function() {
if (this._device instanceof NMClient.DeviceEthernet)
if (this._device instanceof NM.DeviceEthernet)
return this._device.carrier;
else
return true;
@@ -522,9 +511,9 @@ var NMDeviceWired = new Lang.Class({
if (this._device.active_connection) {
let state = this._device.active_connection.state;
if (state == NetworkManager.ActiveConnectionState.ACTIVATING) {
if (state == NM.ActiveConnectionState.ACTIVATING) {
return 'network-wired-acquiring-symbolic';
} else if (state == NetworkManager.ActiveConnectionState.ACTIVATED) {
} else if (state == NM.ActiveConnectionState.ACTIVATED) {
if (this._canReachInternet())
return 'network-wired-symbolic';
else
@@ -542,8 +531,8 @@ var NMDeviceModem = new Lang.Class({
Extends: NMConnectionDevice,
category: NMConnectionCategory.WWAN,
_init: function(client, device, settings) {
this.parent(client, device, settings);
_init: function(client, device) {
this.parent(client, device);
this.item.menu.addSettingsAction(_("Mobile Broadband Settings"), 'gnome-network-panel.desktop');
@@ -552,11 +541,11 @@ var NMDeviceModem = new Lang.Class({
let capabilities = device.current_capabilities;
if (device.udi.indexOf('/org/freedesktop/ModemManager1/Modem') == 0)
this._mobileDevice = new ModemManager.BroadbandModem(device.udi, capabilities);
else if (capabilities & NetworkManager.DeviceModemCapabilities.GSM_UMTS)
else if (capabilities & NM.DeviceModemCapabilities.GSM_UMTS)
this._mobileDevice = new ModemManager.ModemGsm(device.udi);
else if (capabilities & NetworkManager.DeviceModemCapabilities.CDMA_EVDO)
else if (capabilities & NM.DeviceModemCapabilities.CDMA_EVDO)
this._mobileDevice = new ModemManager.ModemCdma(device.udi);
else if (capabilities & NetworkManager.DeviceModemCapabilities.LTE)
else if (capabilities & NM.DeviceModemCapabilities.LTE)
this._mobileDevice = new ModemManager.ModemGsm(device.udi);
if (this._mobileDevice) {
@@ -593,7 +582,7 @@ var NMDeviceModem = new Lang.Class({
/* Translators: this is for a network device that cannot be activated
because it's disabled by rfkill (airplane mode); %s is a network identifier */
return _("%s Disabled").format(this._getDescription());
else if (this._device.state == NetworkManager.DeviceState.ACTIVATED &&
else if (this._device.state == NM.DeviceState.ACTIVATED &&
this._mobileDevice && this._mobileDevice.operator_name)
return this._mobileDevice.operator_name;
else
@@ -602,7 +591,7 @@ var NMDeviceModem = new Lang.Class({
getIndicatorIcon: function() {
if (this._device.active_connection) {
if (this._device.active_connection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
if (this._device.active_connection.state == NM.ActiveConnectionState.ACTIVATING)
return 'network-cellular-acquiring-symbolic';
return this._getSignalIcon();
@@ -621,8 +610,8 @@ var NMDeviceBluetooth = new Lang.Class({
Extends: NMConnectionDevice,
category: NMConnectionCategory.WWAN,
_init: function(client, device, settings) {
this.parent(client, device, settings);
_init: function(client, device) {
this.parent(client, device);
this.item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-network-panel.desktop');
},
@@ -638,9 +627,9 @@ var NMDeviceBluetooth = new Lang.Class({
getIndicatorIcon: function() {
if (this._device.active_connection) {
let state = this._device.active_connection.state;
if (state == NetworkManager.ActiveConnectionState.ACTIVATING)
if (state == NM.ActiveConnectionState.ACTIVATING)
return 'network-cellular-acquiring-symbolic';
else if (state == NetworkManager.ActiveConnectionState.ACTIVATED)
else if (state == NM.ActiveConnectionState.ACTIVATED)
return 'network-cellular-connected-symbolic';
else
return 'network-cellular-signal-none-symbolic';
@@ -719,7 +708,7 @@ var NMWirelessDialog = new Lang.Class({
Name: 'NMWirelessDialog',
Extends: ModalDialog.ModalDialog,
_init: function(client, device, settings) {
_init: function(client, device) {
this.parent({ styleClass: 'nm-dialog' });
this._client = client;
@@ -735,7 +724,7 @@ var NMWirelessDialog = new Lang.Class({
this._networks = [];
this._buildLayout();
let connections = settings.list_connections();
let connections = client.get_connections();
this._connections = connections.filter(Lang.bind(this, function(connection) {
return device.connection_valid(connection);
}));
@@ -799,7 +788,7 @@ var NMWirelessDialog = new Lang.Class({
},
_onScanTimeout: function() {
this._device.request_scan_simple(null);
this._device.request_scan_async(null, null);
return GLib.SOURCE_CONTINUE;
},
@@ -944,7 +933,7 @@ var NMWirelessDialog = new Lang.Class({
let network = this._selectedNetwork;
if (network.connections.length > 0) {
let connection = network.connections[0];
this._client.activate_connection(connection, this._device, null, null);
this._client.activate_connection_async(connection, this._device, null, null, null);
} else {
let accessPoints = network.accessPoints;
if ((accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT)
@@ -952,10 +941,10 @@ var NMWirelessDialog = new Lang.Class({
// 802.1x-enabled APs require further configuration, so they're
// handled in gnome-control-center
Util.spawn(['gnome-control-center', 'wifi', 'connect-8021x-wifi',
this._device.get_path(), accessPoints[0].dbus_path]);
this._device.get_path(), accessPoints[0].path]);
} else {
let connection = new NetworkManager.Connection();
this._client.add_and_activate_connection(connection, this._device, accessPoints[0].dbus_path, null)
let connection = new NM.SimpleConnection();
this._client.add_and_activate_connection_async(connection, this._device, accessPoints[0].path, null, null)
}
}
@@ -1035,7 +1024,7 @@ var NMWirelessDialog = new Lang.Class({
},
_networkCompare: function(network, accessPoint) {
if (!ssidCompare(network.ssid, accessPoint.get_ssid()))
if (!network.ssid.equal (accessPoint.get_ssid()))
return false;
if (network.mode != accessPoint.mode)
return false;
@@ -1180,10 +1169,9 @@ var NMDeviceWireless = new Lang.Class({
Name: 'NMDeviceWireless',
category: NMConnectionCategory.WIRELESS,
_init: function(client, device, settings) {
_init: function(client, device) {
this._client = client;
this._device = device;
this._settings = settings;
this._description = '';
@@ -1252,8 +1240,8 @@ var NMDeviceWireless = new Lang.Class({
/* Emit a notification if activation fails, but don't do it
if the reason is no secrets, as that indicates the user
cancelled the agent dialog */
if (newstate == NetworkManager.DeviceState.FAILED &&
reason != NetworkManager.DeviceStateReason.NO_SECRETS) {
if (newstate == NM.DeviceState.FAILED &&
reason != NM.DeviceStateReason.NO_SECRETS) {
this.emit('activation-failed', reason);
}
@@ -1265,7 +1253,7 @@ var NMDeviceWireless = new Lang.Class({
},
_showDialog: function() {
this._dialog = new NMWirelessDialog(this._client, this._device, this._settings);
this._dialog = new NMWirelessDialog(this._client, this._device);
this._dialog.connect('closed', Lang.bind(this, this._dialogClosed));
this._dialog.open();
},
@@ -1314,8 +1302,8 @@ var NMDeviceWireless = new Lang.Class({
if (this._isHotSpotMaster())
/* Translators: %s is a network identifier */
return _("%s Hotspot Active").format(this._description);
else if (this._device.state >= NetworkManager.DeviceState.PREPARE &&
this._device.state < NetworkManager.DeviceState.ACTIVATED)
else if (this._device.state >= NM.DeviceState.PREPARE &&
this._device.state < NM.DeviceState.ACTIVATED)
/* Translators: %s is a network identifier */
return _("%s Connecting").format(this._description);
else if (ap)
@@ -1326,7 +1314,7 @@ var NMDeviceWireless = new Lang.Class({
else if (!this._client.wireless_enabled)
/* Translators: %s is a network identifier */
return _("%s Off").format(this._description);
else if (this._device.state == NetworkManager.DeviceState.DISCONNECTED)
else if (this._device.state == NM.DeviceState.DISCONNECTED)
/* Translators: %s is a network identifier */
return _("%s Not Connected").format(this._description);
else
@@ -1344,18 +1332,14 @@ var NMDeviceWireless = new Lang.Class({
if (this._client.primary_connection != this._device.active_connection)
return true;
return this._client.connectivity == NetworkManager.ConnectivityState.FULL;
return this._client.connectivity == NM.ConnectivityState.FULL;
},
_isHotSpotMaster: function() {
if (!this._device.active_connection)
return false;
let connectionPath = this._device.active_connection.connection;
if (!connectionPath)
return false;
let connection = this._settings.get_connection_by_path(connectionPath);
let connection = this._device.active_connection.connection;
if (!connection)
return false;
@@ -1363,13 +1347,13 @@ var NMDeviceWireless = new Lang.Class({
if (!ip4config)
return false;
return ip4config.get_method() == NetworkManager.SETTING_IP4_CONFIG_METHOD_SHARED;
return ip4config.get_method() == NM.SETTING_IP4_CONFIG_METHOD_SHARED;
},
getIndicatorIcon: function() {
if (this._device.state < NetworkManager.DeviceState.PREPARE)
if (this._device.state < NM.DeviceState.PREPARE)
return 'network-wireless-disconnected-symbolic';
if (this._device.state < NetworkManager.DeviceState.ACTIVATED)
if (this._device.state < NM.DeviceState.ACTIVATED)
return 'network-wireless-acquiring-symbolic';
if (this._isHotSpotMaster())
@@ -1394,15 +1378,15 @@ var NMDeviceWireless = new Lang.Class({
});
Signals.addSignalMethods(NMDeviceWireless.prototype);
var NMVPNConnectionItem = new Lang.Class({
Name: 'NMVPNConnectionItem',
var NMVpnConnectionItem = new Lang.Class({
Name: 'NMVpnConnectionItem',
Extends: NMConnectionItem,
isActive: function() {
if (this._activeConnection == null)
return false;
return this._activeConnection.vpn_state != NetworkManager.VPNConnectionState.DISCONNECTED;
return this._activeConnection.vpn_state != NM.VpnConnectionState.DISCONNECTED;
},
_buildUI: function() {
@@ -1426,17 +1410,17 @@ var NMVPNConnectionItem = new Lang.Class({
return null;
switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
case NM.VpnConnectionState.DISCONNECTED:
case NM.VpnConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
case NM.VpnConnectionState.PREPARE:
case NM.VpnConnectionState.CONNECT:
case NM.VpnConnectionState.IP_CONFIG_GET:
return _("connecting…");
case NetworkManager.VPNConnectionState.NEED_AUTH:
case NM.VpnConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
case NM.VpnConnectionState.FAILED:
return _("connection failed");
default:
return 'invalid';
@@ -1444,11 +1428,11 @@ var NMVPNConnectionItem = new Lang.Class({
},
_connectionStateChanged: function(ac, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED &&
reason != NetworkManager.VPNConnectionStateReason.NO_SECRETS) {
if (newstate == NM.VpnConnectionState.FAILED &&
reason != NM.VpnConnectionStateReason.NO_SECRETS) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
// we need to convert from NM.VpnConnectionStateReason
// to NM.DeviceStateReason
this.emit('activation-failed', reason);
}
@@ -1473,7 +1457,7 @@ var NMVPNConnectionItem = new Lang.Class({
getIndicatorIcon: function() {
if (this._activeConnection) {
if (this._activeConnection.vpn_state < NetworkManager.VPNConnectionState.ACTIVATED)
if (this._activeConnection.vpn_state < NM.VpnConnectionState.ACTIVATED)
return 'network-vpn-acquiring-symbolic';
else
return 'network-vpn-symbolic';
@@ -1483,8 +1467,8 @@ var NMVPNConnectionItem = new Lang.Class({
},
});
var NMVPNSection = new Lang.Class({
Name: 'NMVPNSection',
var NMVpnSection = new Lang.Class({
Name: 'NMVpnSection',
Extends: NMConnectionSection,
category: NMConnectionCategory.VPN,
@@ -1492,6 +1476,15 @@ var NMVPNSection = new Lang.Class({
this.parent(client);
this.item.menu.addSettingsAction(_("VPN Settings"), 'gnome-network-panel.desktop');
this._sync();
},
_sync: function() {
let nItems = this._connectionItems.size;
this.item.actor.visible = (nItems > 0);
this.parent();
},
_getDescription: function() {
@@ -1513,11 +1506,11 @@ var NMVPNSection = new Lang.Class({
},
activateConnection: function(connection) {
this._client.activate_connection(connection, null, null, null);
this._client.activate_connection_async(connection, null, null, null, null);
},
deactivateConnection: function(activeConnection) {
this._client.deactivate_connection(activeConnection);
this._client.deactivate_connection(activeConnection, null);
},
setActiveConnections: function(vpnConnections) {
@@ -1526,15 +1519,15 @@ var NMVPNSection = new Lang.Class({
item.setActiveConnection(null);
}
vpnConnections.forEach(Lang.bind(this, function(a) {
if (a._connection) {
let item = this._connectionItems.get(a._connection.get_uuid());
if (a.connection) {
let item = this._connectionItems.get(a.connection.get_uuid());
item.setActiveConnection(a);
}
}));
},
_makeConnectionItem: function(connection) {
return new NMVPNConnectionItem(this, connection);
return new NMVpnConnectionItem(this, connection);
},
getIndicatorIcon: function() {
@@ -1547,7 +1540,7 @@ var NMVPNSection = new Lang.Class({
return '';
},
});
Signals.addSignalMethods(NMVPNSection.prototype);
Signals.addSignalMethods(NMVpnSection.prototype);
var DeviceCategory = new Lang.Class({
Name: 'DeviceCategory',
@@ -1628,40 +1621,25 @@ var NMApplet = new Lang.Class({
// Device types
this._dtypes = { };
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
// TODO: WiMax support
this._dtypes[NM.DeviceType.ETHERNET] = NMDeviceWired;
this._dtypes[NM.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NM.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NM.DeviceType.BT] = NMDeviceBluetooth;
// Connection types
this._ctypes = { };
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
this._ctypes[NM.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NM.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
this._ctypes[NM.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NM.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NM.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NM.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
NMClient.Client.new_async(null, Lang.bind(this, this._clientGot));
NMClient.RemoteSettings.new_async(null, null, Lang.bind(this, this._remoteSettingsGot));
NM.Client.new_async(null, Lang.bind(this, this._clientGot));
},
_clientGot: function(obj, result) {
this._client = NMClient.Client.new_finish(result);
this._tryLateInit();
},
_remoteSettingsGot: function(obj, result) {
this._settings = NMClient.RemoteSettings.new_finish(result);
this._tryLateInit();
},
_tryLateInit: function() {
if (!this._client || !this._settings)
return;
this._client = NM.Client.new_finish(result);
this._activeConnections = [ ];
this._connections = [ ];
@@ -1684,7 +1662,7 @@ var NMApplet = new Lang.Class({
this.menu.addMenuItem(this._devices[category]);
}
this._vpnSection = new NMVPNSection(this._client);
this._vpnSection = new NMVpnSection(this._client);
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
this._vpnSection.connect('icon-changed', Lang.bind(this, this._updateIcon));
this.menu.addMenuItem(this._vpnSection.item);
@@ -1693,18 +1671,19 @@ var NMApplet = new Lang.Class({
this._readDevices();
this._syncNMState();
this._syncMainConnection();
this._syncVPNConnections();
this._syncVpnConnections();
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::nm-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._client.connect('notify::primary-connection', Lang.bind(this, this._syncMainConnection));
this._client.connect('notify::activating-connection', Lang.bind(this, this._syncMainConnection));
this._client.connect('notify::active-connections', Lang.bind(this, this._syncVPNConnections));
this._client.connect('notify::active-connections', Lang.bind(this, this._syncVpnConnections));
this._client.connect('notify::connectivity', Lang.bind(this, this._syncConnectivity));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
this._client.connect('connection-added', Lang.bind(this, this._connectionAdded));
this._client.connect('connection-removed', Lang.bind(this, this._connectionRemoved));
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
@@ -1762,7 +1741,7 @@ var NMApplet = new Lang.Class({
},
_syncDeviceNames: function() {
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
let names = NM.Device.disambiguate_names(this._nmDevices);
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
let description = names[i];
@@ -1779,7 +1758,7 @@ var NMApplet = new Lang.Class({
let wrapperClass = this._dtypes[device.get_device_type()];
if (wrapperClass) {
let wrapper = new wrapperClass(this._client, device, this._settings);
let wrapper = new wrapperClass(this._client, device);
device._delegate = wrapper;
this._addDeviceWrapper(wrapper);
@@ -1836,13 +1815,13 @@ var NMApplet = new Lang.Class({
connection = this._client.get_primary_connection();
if (connection) {
ensureActiveConnectionProps(connection, this._settings);
ensureActiveConnectionProps(connection, this._client);
return connection;
}
connection = this._client.get_activating_connection();
if (connection) {
ensureActiveConnectionProps(connection, this._settings);
ensureActiveConnectionProps(connection, this._client);
return connection;
}
@@ -1873,13 +1852,13 @@ var NMApplet = new Lang.Class({
this._syncConnectivity();
},
_syncVPNConnections: function() {
_syncVpnConnections: function() {
let activeConnections = this._client.get_active_connections() || [];
let vpnConnections = activeConnections.filter(function(a) {
return (a instanceof NMClient.VPNConnection);
return (a instanceof NM.VpnConnection);
});
vpnConnections.forEach(Lang.bind(this, function(a) {
ensureActiveConnectionProps(a, this._settings);
ensureActiveConnectionProps(a, this._client);
}));
this._vpnSection.setActiveConnections(vpnConnections);
@@ -1887,7 +1866,7 @@ var NMApplet = new Lang.Class({
},
_mainConnectionStateChanged: function() {
if (this._mainConnection.state == NetworkManager.ActiveConnectionState.ACTIVATED && this._notification)
if (this._mainConnection.state == NM.ActiveConnectionState.ACTIVATED && this._notification)
this._notification.destroy();
},
@@ -1911,23 +1890,22 @@ var NMApplet = new Lang.Class({
return;
}
connection._removedId = connection.connect('removed', Lang.bind(this, this._connectionRemoved));
connection._updatedId = connection.connect('updated', Lang.bind(this, this._updateConnection));
connection._updatedId = connection.connect('changed', Lang.bind(this, this._updateConnection));
this._updateConnection(connection);
this._connections.push(connection);
},
_readConnections: function() {
let connections = this._settings.list_connections();
let connections = this._client.get_connections();
connections.forEach(Lang.bind(this, this._addConnection));
},
_newConnection: function(settings, connection) {
_connectionAdded: function(client, connection) {
this._addConnection(connection);
},
_connectionRemoved: function(connection) {
_connectionRemoved: function(client, connection) {
let pos = this._connections.indexOf(connection);
if (pos != -1)
this._connections.splice(pos, 1);
@@ -1947,13 +1925,12 @@ var NMApplet = new Lang.Class({
}
}
connection.disconnect(connection._removedId);
connection.disconnect(connection._updatedId);
connection._removedId = connection._updatedId = 0;
connection._updatedId = 0;
},
_updateConnection: function(connection) {
let connectionSettings = connection.get_setting_by_name(NetworkManager.SETTING_CONNECTION_SETTING_NAME);
let connectionSettings = connection.get_setting_by_name(NM.SETTING_CONNECTION_SETTING_NAME);
connection._type = connectionSettings.type;
connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID;
@@ -1974,7 +1951,7 @@ var NMApplet = new Lang.Class({
},
_syncNMState: function() {
this.indicators.visible = this._client.manager_running;
this.indicators.visible = this._client.nm_running;
this.menu.actor.visible = this._client.networking_enabled;
this._syncConnectivity();
@@ -2015,7 +1992,7 @@ var NMApplet = new Lang.Class({
this._client.check_connectivity_async(null, Lang.bind(this, function(client, result) {
try {
let state = client.check_connectivity_finish(result);
if (state >= NetworkManager.ConnectivityState.FULL)
if (state >= NM.ConnectivityState.FULL)
this._closeConnectivityCheck(path);
} catch(e) { }
}));
@@ -2026,19 +2003,19 @@ var NMApplet = new Lang.Class({
_syncConnectivity: function() {
if (this._mainConnection == null ||
this._mainConnection.state != NetworkManager.ActiveConnectionState.ACTIVATED) {
this._mainConnection.state != NM.ActiveConnectionState.ACTIVATED) {
this._flushConnectivityQueue();
return;
}
let isPortal = this._client.connectivity == NetworkManager.ConnectivityState.PORTAL;
let isPortal = this._client.connectivity == NM.ConnectivityState.PORTAL;
// For testing, allow interpreting any value != FULL as PORTAL, because
// LIMITED (no upstream route after the default gateway) is easy to obtain
// with a tethered phone
// NONE is also possible, with a connection configured to force no default route
// (but in general we should only prompt a portal if we know there is a portal)
if (GLib.getenv('GNOME_SHELL_CONNECTIVITY_TEST') != null)
isPortal = isPortal || this._client.connectivity < NetworkManager.ConnectivityState.FULL;
isPortal = isPortal || this._client.connectivity < NM.ConnectivityState.FULL;
if (!isPortal || Main.sessionMode.isGreeter)
return;
@@ -2078,12 +2055,12 @@ var NMApplet = new Lang.Class({
dev = this._mainConnection._primaryDevice;
let state = this._client.get_state();
let connected = state == NetworkManager.State.CONNECTED_GLOBAL;
let connected = state == NM.State.CONNECTED_GLOBAL;
this._primaryIndicator.visible = (dev != null) || connected;
if (dev) {
this._primaryIndicator.icon_name = dev.getIndicatorIcon();
} else if (connected) {
if (this._client.connectivity == NetworkManager.ConnectivityState.FULL)
if (this._client.connectivity == NM.ConnectivityState.FULL)
this._primaryIndicator.icon_name = 'network-wired-symbolic';
else
this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic';

341
js/ui/status/thunderbolt.js Normal file
View File

@@ -0,0 +1,341 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
// the following is a modified version of bolt/contrib/js/client.js
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const PanelMenu = imports.ui.panelMenu;
/* Keep in sync with data/org.freedesktop.bolt.xml */
const BoltClientInterface = '<node> \
<interface name="org.freedesktop.bolt1.Manager"> \
<property name="Probing" type="b" access="read"></property> \
<method name="EnrollDevice"> \
<arg type="s" name="uid" direction="in"> </arg> \
<arg type="u" name="policy" direction="in"> </arg> \
<arg type="u" name="flags" direction="in"> </arg> \
<arg name="device" direction="out" type="o"> </arg> \
</method> \
<signal name="DeviceAdded"> \
<arg name="device" type="o"> </arg> \
</signal> \
</interface> \
</node>';
const BoltDeviceInterface = '<node> \
<interface name="org.freedesktop.bolt1.Device"> \
<property name="Uid" type="s" access="read"></property> \
<property name="Name" type="s" access="read"></property> \
<property name="Vendor" type="s" access="read"></property> \
<property name="Status" type="u" access="read"></property> \
<property name="SysfsPath" type="s" access="read"></property> \
<property name="Security" type="u" access="read"></property> \
<property name="Parent" type="s" access="read"></property> \
<property name="Stored" type="b" access="read"></property> \
<property name="Policy" type="u" access="read"></property> \
<property name="Key" type="u" access="read"></property> \
</interface> \
</node>';
const BoltClientProxy = Gio.DBusProxy.makeProxyWrapper(BoltClientInterface);
const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
/* */
var Status = {
DISCONNECTED: 0,
CONNECTED: 1,
AUTHORIZING: 2,
AUTH_ERROR: 3,
AUTHORIZED: 4,
AUTHORIZED_SECURE: 5,
AUTHORIZED_NEWKY: 6
};
var Policy = {
DEFAULT: 0,
MANUAL: 1,
AUTO:2
};
var AuthFlags = {
NONE: 0,
};
const BOLT_DBUS_NAME = 'org.freedesktop.bolt';
const BOLT_DBUS_PATH = '/org/freedesktop/bolt';
var Client = new Lang.Class({
Name: 'BoltClient',
_init: function() {
this._proxy = null;
new BoltClientProxy(
Gio.DBus.system,
BOLT_DBUS_NAME,
BOLT_DBUS_PATH,
Lang.bind(this, this._onProxyReady)
);
this.probing = false;
},
_onProxyReady: function(proxy, error) {
if (error !== null) {
log('error creating bolt proxy: %s'.format(error.message));
return;
}
this._proxy = proxy;
this._propsChangedId = this._proxy.connect('g-properties-changed', Lang.bind(this, this._onPropertiesChanged));
this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', Lang.bind(this, this._onDeviceAdded), true);
this.probing = this._proxy.Probing;
if (this.probing)
this.emit('probing-changed', this.probing);
},
_onPropertiesChanged: function(proxy, properties) {
let unpacked = properties.deep_unpack();
if (!('Probing' in unpacked))
return;
this.probing = this._proxy.Probing;
this.emit('probing-changed', this.probing);
},
_onDeviceAdded: function(proxy, emitter, params) {
let [path] = params;
let device = new BoltDeviceProxy(Gio.DBus.system,
BOLT_DBUS_NAME,
path);
this.emit('device-added', device);
},
/* public methods */
close: function() {
if (!this._proxy)
return;
this._proxy.disconnectSignal(this._deviceAddedId);
this._proxy.disconnect(this._propsChangedId);
this._proxy = null;
},
enrollDevice: function(id, policy, callback) {
this._proxy.EnrollDeviceRemote(id, policy, AuthFlags.NONE,
Lang.bind(this, function (res, error) {
if (error) {
callback(null, error);
return;
}
let [path] = res;
let device = new BoltDeviceProxy(Gio.DBus.system,
BOLT_DBUS_NAME,
path);
callback(device, null);
}));
}
});
Signals.addSignalMethods(Client.prototype);
/* helper class to automatically authorize new devices */
var AuthRobot = new Lang.Class({
Name: 'BoltAuthRobot',
_init: function(client) {
this._client = client;
this._devicesToEnroll = [];
this._enrolling = false;
this._client.connect('device-added', Lang.bind(this, this._onDeviceAdded));
},
close: function() {
this.disconnectAll();
this._client = null;
},
/* the "device-added" signal will be emitted by boltd for every
* device that is not currently stored in the database. We are
* only interested in those devices, because all known devices
* will be handled by the user himself */
_onDeviceAdded: function(cli, dev) {
if (dev.Status !== Status.CONNECTED)
return;
/* check if we should enroll the device */
let res = [false];
this.emit('enroll-device', dev, res);
if (res[0] !== true)
return;
/* ok, we should authorize the device, add it to the back
* of the list */
this._devicesToEnroll.push(dev);
this._enrollDevices();
},
/* The enrollment queue:
* - new devices will be added to the end of the array.
* - an idle callback will be scheduled that will keep
* calling itself as long as there a devices to be
* enrolled.
*/
_enrollDevices: function() {
if (this._enrolling)
return;
this.enrolling = true;
GLib.idle_add(GLib.PRIORITY_DEFAULT,
Lang.bind(this, this._enrollDevicesIdle));
},
_onEnrollDone: function(device, error) {
if (error)
this.emit('enroll-failed', error, device);
/* TODO: scan the list of devices to be authorized for children
* of this device and remove them (and their children and
* their children and ....) from the device queue
*/
this._enrolling = this._devicesToEnroll.length > 0;
if (this._enrolling)
GLib.idle_add(GLib.PRIORITY_DEFAULT,
Lang.bind(this, this._enrollDevicesIdle));
},
_enrollDevicesIdle: function() {
let devices = this._devicesToEnroll;
let dev = devices.shift();
if (dev === undefined)
return GLib.SOURCE_REMOVE;
this._client.enrollDevice(dev.Uid,
Policy.DEFAULT,
Lang.bind(this, this._onEnrollDone));
return GLib.SOURCE_REMOVE;
}
});
Signals.addSignalMethods(AuthRobot.prototype);
/* eof client.js */
var Indicator = new Lang.Class({
Name: 'ThunderboltIndicator',
Extends: PanelMenu.SystemIndicator,
_init: function() {
this.parent();
this._indicator = this._addIndicator();
this._indicator.icon_name = 'thunderbolt-symbolic';
this._client = new Client();
this._client.connect('probing-changed', Lang.bind(this, this._onProbing));
this._robot = new AuthRobot(this._client);
this._robot.connect('enroll-device', Lang.bind(this, this._onEnrollDevice));
this._robot.connect('enroll-failed', Lang.bind(this, this._onEnrollFailed));
Main.sessionMode.connect('updated', Lang.bind(this, this._sync));
this._sync();
this._source = null;
},
_onDestroy: function() {
this._robot.close();
this._client.close();
},
_ensureSource: function() {
if (!this._source) {
this._source = new MessageTray.Source(_("Thunderbolt"),
'thunderbolt-symbolic');
this._source.connect('destroy', Lang.bind(this, function() {
this._source = null;
}));
Main.messageTray.add(this._source);
}
return this._source;
},
_notify: function(title, body) {
if (this._notification)
this._notification.destroy();
let source = this._ensureSource();
this._notification = new MessageTray.Notification(source, title, body);
this._notification.setUrgency(MessageTray.Urgency.HIGH);
this._notification.connect('destroy', function() {
this._notification = null;
});
this._notification.connect('activated', () => {
let app = Shell.AppSystem.get_default().lookup_app('gnome-thunderbolt-panel.desktop');
if (app)
app.activate();
});
this._source.notify(this._notification);
},
/* Session callbacks */
_sync: function() {
let active = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this._indicator.visible = active && this._client.probing;
},
/* Bolt.Client callbacks */
_onProbing: function(cli, probing) {
if (probing)
this._indicator.icon_name = 'thunderbolt-acquiring-symbolic';
else
this._indicator.icon_name = 'thunderbolt-symbolic';
this._sync();
},
/* AuthRobot callbacks */
_onEnrollDevice: function(obj, device, policy) {
let auth = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
policy[0] = auth;
log("thunderbolt: [%s] auto enrollment: %s".format(device.Name, auth ? 'yes' : 'no'));
if (auth)
return; /* we are done */
const title = _('Unknown Thunderbolt device');
const body = _('New device has been detected while you were away. Please disconnect and reconnect the device to start using it.');
this._notify(title, body);
},
_onEnrollFailed: function (obj, device, error) {
const title = _('Thunderbolt authorization error');
const body = _('Could not authorize the thunderbolt device: %s'.format(error.message));
this._notify(title, body);
}
});

View File

@@ -133,6 +133,7 @@ var SwitcherPopup = new Lang.Class({
this.actor.add_actor(this._switcherList.actor);
this._switcherList.connect('item-activated', Lang.bind(this, this._itemActivated));
this._switcherList.connect('item-entered', Lang.bind(this, this._itemEntered));
this._switcherList.connect('item-removed', Lang.bind(this, this._itemRemoved));
// Need to force an allocation so we can figure out whether we
// need to scroll when selecting
@@ -247,6 +248,19 @@ var SwitcherPopup = new Lang.Class({
this._itemEnteredHandler(n);
},
_itemRemovedHandler: function(n) {
if (this._items.length > 0) {
let newIndex = Math.min(n, this._items.length - 1);
this._select(newIndex);
} else {
this.actor.destroy();
}
},
_itemRemoved: function(switcher, n) {
this._itemRemovedHandler(n);
},
_disableHover: function() {
this.mouseActive = false;
@@ -418,6 +432,12 @@ var SwitcherList = new Lang.Class({
return bbox;
},
removeItem: function(index) {
let item = this._items.splice(index, 1);
item[0].destroy();
this.emit('item-removed', index);
},
_onItemClicked: function (index) {
this._itemActivated(index);
},
@@ -432,20 +452,20 @@ var SwitcherList = new Lang.Class({
},
highlight: function(index, justOutline) {
if (this._highlighted != -1) {
if (this._items[this._highlighted]) {
this._items[this._highlighted].remove_style_pseudo_class('outlined');
this._items[this._highlighted].remove_style_pseudo_class('selected');
}
this._highlighted = index;
if (this._highlighted != -1) {
if (this._items[index]) {
if (justOutline)
this._items[this._highlighted].add_style_pseudo_class('outlined');
this._items[index].add_style_pseudo_class('outlined');
else
this._items[this._highlighted].add_style_pseudo_class('selected');
this._items[index].add_style_pseudo_class('selected');
}
this._highlighted = index;
let adjustment = this._scrollView.hscroll.adjustment;
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
let [absItemX, absItemY] = this._items[index].get_transformed_position();

View File

@@ -606,6 +606,15 @@ var ViewSelector = new Lang.Class({
// - cancel the search
this.reset();
}
} else if (!this._text.has_key_focus() &&
(event.type() == Clutter.EventType.KEY_PRESS ||
event.type() == Clutter.EventType.KEY_RELEASE)) {
let unichar = event.get_key_unicode();
if (GLib.unichar_isprint(unichar)) {
this._text.grab_key_focus();
return this._text.event(event, false);
}
}
return Clutter.EVENT_PROPAGATE;

View File

@@ -159,7 +159,7 @@
<title>Additional Information</title>
<para>For further information, visit the website
<ulink url="http://live.gnome.org/GnomeShell">http://live.gnome.org/GnomeShell</ulink>.</para>
<ulink url="https://wiki.gnome.org/Projects/GnomeShell">https://wiki.gnome.org/Projects/GnomeShell</ulink>.</para>
</refsect1>
</refentry>

View File

@@ -27,6 +27,7 @@ mutter_req = '>= 3.26.0'
polkit_req = '>= 0.100'
schemas_req = '>= 3.21.3'
startup_req = '>= 0.11'
ibus_req = '>= 1.5.2'
bt_req = '>= 3.9.0'
gst_req = '>= 0.11.92'
@@ -43,7 +44,6 @@ datadir = join_paths(prefix, get_option('datadir'))
libdir = join_paths(prefix, get_option('libdir'))
libexecdir = join_paths(prefix, get_option('libexecdir'))
mandir = join_paths(prefix, get_option('mandir'))
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
pkgdatadir = join_paths(datadir, meson.project_name())
pkglibdir = join_paths(libdir, meson.project_name())
@@ -88,6 +88,7 @@ mutter_dep = dependency(libmutter_pc, version: mutter_req)
polkit_dep = dependency('polkit-agent-1', version: polkit_req)
soup_dep = dependency('libsoup-2.4')
startup_dep = dependency('libstartup-notification-1.0', version: startup_req)
ibus_dep = dependency('ibus-1.0', version: ibus_req)
x11_dep = dependency('x11')
schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req)
@@ -102,54 +103,34 @@ if enable_recorder
endif
nm_deps = []
enable_networkmanager = get_option('enable-networkmanager')
if enable_networkmanager != 'no'
want_networkmanager = enable_networkmanager == 'yes'
if get_option('networkmanager')
nm_deps += dependency('libnm', version: nm_req)
nm_deps += dependency('libsecret-1', version: secret_req)
nm_deps += dependency('libnm-glib',
version: nm_req, required: want_networkmanager
)
nm_deps += dependency('libnm-util',
version: nm_req, required: want_networkmanager
)
nm_deps += dependency('libnm-gtk',
version: nm_req, required: want_networkmanager
)
nm_deps += dependency('libsecret-1',
version: secret_req, required: want_networkmanager
)
vpndir = nm_deps[0].get_pkgconfig_variable('vpnservicedir')
have_networkmanager = true
foreach dep : nm_deps
have_networkmanager = have_networkmanager and dep.found()
endforeach
if not have_networkmanager
nm_deps = []
endif
else
vpndir = prefix
have_networkmanager = false
endif
enable_systemd = get_option('enable-systemd')
if enable_systemd != 'no'
want_systemd = enable_systemd == 'yes'
systemd_dep = dependency('libsystemd', required: want_systemd)
if get_option('systemd')
systemd_dep = dependency('libsystemd')
have_systemd = systemd_dep.found()
else
systemd_dep = []
have_systemd = false
endif
enable_plugin = get_option('enable-browser-plugin')
if enable_plugin
if get_option('browser_plugin')
json_glib_dep = dependency('json-glib-1.0', version: json_glib_req)
subdir('browser-plugin')
endif
enable_man = get_option('enable-man')
if enable_man
if get_option('man')
xsltproc = find_program('xsltproc')
subdir('man')
@@ -188,12 +169,13 @@ conf_inc = include_directories('.')
libgvc = subproject('gvc',
default_options: [
'package-name=' + meson.project_name(),
'package-version=' + meson.project_version(),
'package_name=' + meson.project_name(),
'package_version=' + meson.project_version(),
'pkgdatadir=' + pkgdatadir,
'pkglibdir=' + pkglibdir,
'static=false',
'with-introspection=true'
'introspection=true',
'alsa=false'
]
)
libgvc_gir = libgvc.get_variable('libgvc_gir')
@@ -204,6 +186,6 @@ subdir('po')
subdir('data')
subdir('tests')
if get_option('enable-documentation')
if get_option('gtk_doc')
subdir('docs/reference')
endif

View File

@@ -1,31 +1,29 @@
option('enable-browser-plugin',
option('browser_plugin',
type: 'boolean',
value: true,
description: 'Enable extensions.gnome.org browser plugin'
)
option('enable-documentation',
option('gtk_doc',
type: 'boolean',
value: false,
description: 'Build API reference'
)
option('enable-man',
option('man',
type: 'boolean',
value: true,
description: 'Generate man pages'
)
option('enable-networkmanager',
type: 'combo',
choices: ['yes', 'no', 'auto'],
value: 'auto',
option('networkmanager',
type: 'boolean',
value: true,
description: 'Enable NetworkManager support'
)
option('enable-systemd',
type: 'combo',
choices: ['yes', 'no', 'auto'],
value: 'auto',
option('systemd',
type: 'boolean',
value: true,
description: 'Enable systemd integration'
)

View File

@@ -32,6 +32,7 @@ js/ui/endSessionDialog.js
js/ui/extensionDownloader.js
js/ui/extensionSystem.js
js/ui/inhibitShortcutsDialog.js
js/ui/kbdA11yDialog.js
js/ui/keyboard.js
js/ui/lookingGlass.js
js/ui/main.js
@@ -59,6 +60,7 @@ js/ui/status/nightLight.js
js/ui/status/power.js
js/ui/status/rfkill.js
js/ui/status/system.js
js/ui/status/thunderbolt.js
js/ui/status/volume.js
js/ui/switchMonitor.js
js/ui/unlockDialog.js

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-03 10:10+0200\n"
"PO-Revision-Date: 2017-11-03 10:17+0200\n"
"POT-Creation-Date: 2017-12-10 11:28+0200\n"
"PO-Revision-Date: 2017-12-10 11:31+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n"
@@ -88,7 +88,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:26
msgid "Disable user extensions"
msgstr ""
msgstr "عطّل امتدادات المستخدمين"
#: data/org.gnome.shell.gschema.xml.in:27
msgid ""
@@ -119,7 +119,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:51
msgid "App Picker View"
msgstr ""
msgstr "منظور منتقي التطبيقات"
#: data/org.gnome.shell.gschema.xml.in:52
msgid "Index of the currently selected view in the application picker."
@@ -362,18 +362,18 @@ msgstr "(أو مرر إصبع)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "أطفئ"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "أطفئ;أغلق"
msgid "power off;shutdown;reboot;restart"
msgstr "أطفئ;أغلق;أعد التشغيل"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
msgctxt "search-result"
msgid "Lock screen"
msgid "Lock Screen"
msgstr "أوصد الشاشة"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
@@ -384,7 +384,7 @@ msgstr "أوصد الشاشة"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "اخرج"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -406,8 +406,8 @@ msgstr "علّق"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
msgctxt "search-result"
msgid "Switch user"
msgstr "بدّل المستخدم"
msgid "Switch User"
msgstr "غيّر المستخدم"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:130
@@ -417,13 +417,13 @@ msgstr "بدّل المستخدم"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
msgctxt "search-result"
msgid "Lock orientation"
msgid "Lock Orientation"
msgstr "أوصد الاتجاه"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
msgid "lock orientation"
msgstr "أوصد الاتجاه"
msgid "lock orientation;screen;rotation"
msgstr "أوصد الاتجاه;شاشة;تدوير"
#: js/misc/util.js:122
msgid "Command not found"
@@ -627,7 +627,7 @@ msgstr "نافذة جديدة"
msgid "Launch using Dedicated Graphics Card"
msgstr "شغل باستخدام بطاقة الرسوميات المنفصلة"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1956 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة"
@@ -931,13 +931,13 @@ msgstr "غيّر %s اسمه إلى %s"
msgid "Windows"
msgstr "النوافذ"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "أظهر التطبيقات"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "الشريط"
@@ -956,15 +956,15 @@ msgstr "%e %B %Y"
msgid "%A %B %e %Y"
msgstr "%A %e %B %Y"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "أضف ساعات عالمية…"
#: js/ui/dateMenu.js:146
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "ساعات عالمية"
#: js/ui/dateMenu.js:225
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "الطقس"
@@ -972,7 +972,7 @@ msgstr "الطقس"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:289
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s طوال اليوم."
@@ -981,7 +981,7 @@ msgstr "%s طوال اليوم."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:295
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s، ثم %s فيما بعد."
@@ -990,30 +990,30 @@ msgstr "%s، ثم %s فيما بعد."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:301
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s، ثم %s، و بعدها %s."
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "اختر موقعا…"
#: js/ui/dateMenu.js:315
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "يحمّل…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "تبدو مثل %s."
#: js/ui/dateMenu.js:324
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "اتصل بالإنترنت لمعلومات الطقس"
#: js/ui/dateMenu.js:326
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "معلومات الطقس غير متاحة حاليًا"
@@ -1213,7 +1213,7 @@ msgstr "ارفض"
msgid "Allow"
msgstr "اسمح"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "لوحة المفاتيح"
@@ -1564,7 +1564,7 @@ msgstr "أوقف"
msgid "Brightness"
msgstr "السطوع"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "أظهر تخطيط لوحة المفاتيح"
@@ -2128,6 +2128,18 @@ msgstr[5] "%u مدخل"
msgid "System Sounds"
msgstr "أصوات النظام"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "أطفئ"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "اخرج"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "بدّل المستخدم"
#~ msgid "Hide tray"
#~ msgstr "أخفِ الصينية"

328
po/ca.po
View File

@@ -3,7 +3,7 @@
# This file is distributed under the same license as the gnome-shell package.
# Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>, 2009.
# Jordi Serratosa <jordis@softcatala.cat>, 2012, 2017.
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2013, 2014, 2016.
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2013, 2014, 2016, 2018.
# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2017
#
msgid ""
@@ -11,16 +11,16 @@ msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-23 08:01+0000\n"
"PO-Revision-Date: 2017-08-23 09:48+0200\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"POT-Creation-Date: 2018-01-20 21:10+0000\n"
"PO-Revision-Date: 2018-01-22 00:20+0100\n"
"Last-Translator: Gil Forcada Codinachs <gil.gnome@gmail.com>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\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.0.1\n"
"X-Generator: Gtranslator 2.91.6\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@@ -199,10 +199,10 @@ msgid ""
"adapter. This will be reset if the default adapter is ever seen not to have "
"devices associated to it."
msgstr ""
"El Shell només mostrà una entrada de menú Bluetooth si un adaptador Bluetooth "
"està engegat, o si hi ha dispositius configurats associats a l'adaptador "
"predeterminat. Això es reiniciarà si l'adaptador predeterminat "
"dispositius associats."
"El Shell només mostrà una entrada de menú Bluetooth si un adaptador "
"Bluetooth està engegat, o si hi ha dispositius configurats associats a "
"l'adaptador predeterminat. Això es reiniciarà si l'adaptador predeterminat "
"dispositius associats."
#: data/org.gnome.shell.gschema.xml.in:101
msgid "Keybinding to open the application menu"
@@ -318,8 +318,8 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:206
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Habilita la tessel·lització a les vores en deixar anar les finestres a les "
"vores de la pantalla"
"Habilita el mòsaic a les vores en deixar anar les finestres a les vores de "
"la pantalla"
#: data/org.gnome.shell.gschema.xml.in:214
msgid "Workspaces are managed dynamically"
@@ -352,7 +352,7 @@ msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Cancel·la"
@@ -416,18 +416,18 @@ msgstr "(o passeu el dit)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Apaga"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "apaga;atura"
msgid "power off;shutdown;reboot;restart"
msgstr "apaga;atura;reinicia"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
msgctxt "search-result"
msgid "Lock screen"
msgid "Lock Screen"
msgstr "Bloqueja la pantalla"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
@@ -438,8 +438,8 @@ msgstr "bloca la pantalla"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
msgctxt "search-result"
msgid "Log out"
msgstr "Desconnecta"
msgid "Log Out"
msgstr "Surt"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:116
@@ -460,7 +460,7 @@ msgstr "atura temporalment;dorm"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
msgctxt "search-result"
msgid "Switch user"
msgid "Switch User"
msgstr "Canvia d'usuari"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
@@ -471,13 +471,13 @@ msgstr "canvia d'usuari"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
msgctxt "search-result"
msgid "Lock orientation"
msgid "Lock Orientation"
msgstr "Bloqueja l'orientació"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
msgid "lock orientation"
msgstr "bloqueja l'orientació"
msgid "lock orientation;screen;rotation"
msgstr "bloqueja l'orientació;pantalla;rotació"
#: js/misc/util.js:122
msgid "Command not found"
@@ -650,32 +650,32 @@ msgstr "Freqüent"
msgid "All"
msgstr "Totes"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Finestra nova"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Inicia usant una targeta gràfica dedicada"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Afegeix als preferits"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Mostra els detalls"
#: js/ui/appFavorites.js:140
#: js/ui/appFavorites.js:141
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "S'ha afegit %s als preferits."
#: js/ui/appFavorites.js:174
#: js/ui/appFavorites.js:175
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "S'ha suprimit %s dels preferits."
@@ -764,51 +764,51 @@ msgctxt "grid saturday"
msgid "S"
msgstr "Ds"
#: js/ui/calendar.js:442
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Mes anterior"
#: js/ui/calendar.js:452
#: js/ui/calendar.js:459
msgid "Next month"
msgstr "Mes següent"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:612
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:660
#: js/ui/calendar.js:667
msgid "Week %V"
msgstr "Setmana %V"
#. 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:729
#: js/ui/calendar.js:736
msgctxt "event list time"
msgid "All Day"
msgstr "Tot el dia"
#: js/ui/calendar.js:862
#: js/ui/calendar.js:869
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A %d de %B"
#: js/ui/calendar.js:866
#: js/ui/calendar.js:873
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A %d de %B de %Y"
#: js/ui/calendar.js:1086
#: js/ui/calendar.js:1093
msgid "No Notifications"
msgstr "Cap notificació"
#: js/ui/calendar.js:1089
#: js/ui/calendar.js:1096
msgid "No Events"
msgstr "Cap cita"
#: js/ui/calendar.js:1117
#: js/ui/calendar.js:1124
msgid "Clear All"
msgstr "Neteja-ho tot"
@@ -842,7 +842,7 @@ msgstr "S'ha connectat un dispositiu extern"
msgid "External drive disconnected"
msgstr "S'ha desconnectat un dispositiu extern"
#: js/ui/components/autorunManager.js:354
#: js/ui/components/autorunManager.js:358
#, javascript-format
msgid "Open with %s"
msgstr "Obre amb %s"
@@ -855,8 +855,8 @@ msgstr "Contrasenya:"
msgid "Type again:"
msgstr "Torneu a escriure-la:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Connecta"
@@ -884,11 +884,11 @@ msgstr "Contrasenya de la clau privada:"
msgid "Service: "
msgstr "Servei:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "La xarxa sense fil requereix autenticació"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -897,7 +897,7 @@ msgstr ""
"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
"d'encriptació."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Autenticació 802.1X amb fil"
@@ -905,15 +905,15 @@ msgstr "Autenticació 802.1X amb fil"
msgid "Network name: "
msgstr "Nom de la xarxa: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "Autenticació DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "Cal que introduïu el codi PIN"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil"
@@ -921,17 +921,17 @@ msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Contrasenya de la xarxa de banda ampla mòbil"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Cal introduir una contrasenya per connectar-vos a «%s»."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Gestor de connexions de xarxa"
@@ -966,20 +966,20 @@ msgstr "En/na %s ara es diu %s"
msgid "Windows"
msgstr "Finestres"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Mostra les aplicacions"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Quadre d'aplicacions"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:76
msgid "%B %e %Y"
msgstr "%e de %B de %Y"
@@ -987,19 +987,19 @@ msgstr "%e de %B de %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:83
msgid "%A %B %e %Y"
msgstr "%A, %e de %B de %Y"
#: js/ui/dateMenu.js:144
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Afegeix rellotges del món…"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Rellotges del món"
#: js/ui/dateMenu.js:224
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "El temps"
@@ -1007,7 +1007,7 @@ msgstr "El temps"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:286
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s tot el dia."
@@ -1016,7 +1016,7 @@ msgstr "%s tot el dia."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:292
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, llavors %s més tard."
@@ -1025,30 +1025,30 @@ msgstr "%s, llavors %s més tard."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:298
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, llavors %s, seguit per %s més tard."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Trieu una ubicació…"
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "S'està carregant…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:318
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Sensació tèrmica de %s."
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Vés en línia per a informació sobre el temps"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "La informació sobre el temps no està disponible"
@@ -1237,7 +1237,72 @@ msgstr "Denega"
msgid "Allow"
msgstr "Permet"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
#: js/ui/kbdA11yDialog.js:33
msgid "Slow Keys Turned On"
msgstr "Tecles lentes actives"
#: js/ui/kbdA11yDialog.js:34
msgid "Slow Keys Turned Off"
msgstr "Tecles lentes inactives"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Heu mantingut premuda la tecla de majúscules durant 8 segons. Aquesta és la "
"drecera per a la funcionalitat «tecles lentes», que afecta la forma de "
"funcionar del teclat."
#: js/ui/kbdA11yDialog.js:42
msgid "Sticky Keys Turned On"
msgstr "Tecles enganxoses actives"
#: js/ui/kbdA11yDialog.js:43
msgid "Sticky Keys Turned Off"
msgstr "Tecles enganxoses inactives"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Heu premut la tecla de majúscules 5 cops seguides. Aquesta és la drecera per "
"la funcionalitat de les tecles enganxoses, que afecta la manera en què "
"funciona el teclat."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"Heu premut dos tecles juntes, o la tecla de majúscules 5 cops seguides. Això "
"desactiva la funcionalitat de les tecles enganxoses, que afecta la manera en "
"què funciona el teclat."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Deixa-ho actiu"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Activa"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Desactiva"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Deixa-ho desactivat"
#: js/ui/keyboard.js:739 js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Teclat"
@@ -1289,7 +1354,7 @@ msgstr "Mostra el codi font"
msgid "Web Page"
msgstr "Pàgina web"
#: js/ui/messageTray.js:1493
#: js/ui/messageTray.js:1494
msgid "System Information"
msgstr "Informació de l'ordinador"
@@ -1533,46 +1598,35 @@ msgstr "Alt contrast"
msgid "Large Text"
msgstr "Text gran"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Paràmetres del Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d connectat"
msgstr[1] "%d connectats"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Desactivat"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "Activat"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Activa"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Desactiva"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Brillantor"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Mostra la disposició del teclat"
@@ -1612,19 +1666,19 @@ msgstr ""
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
"des de la configuració de la privacitat."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<desconegut>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s apagat"
# N.T.: p. ex. Connectat amb fil
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "Connectat %s"
@@ -1632,189 +1686,189 @@ msgstr "Connectat %s"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s no gestionat"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s s'està desconnectant"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "%s s'està connectant"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s requereix autenticació"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Manca el microprogramari per %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s no disponible"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s ha fallat la connexió"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "Paràmetres de la xarxa amb fil"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Configuració de la xarxa de banda ampla mòbil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s maquinari inhabilitat"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s Inhabilitat"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Connecta a Internet"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "El mode d'avió és actiu"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Quan el mode d'avió és actiu es desactiva la xarxa sense fil."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Desactiva el mode d'avió"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "La xarxa sense fil està desactivada"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "S'ha d'activar la xarxa sense fil per poder-se connectar a una xarxa."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Activa la xarxa sense fil"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Xarxes sense fil"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Trieu una xarxa"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "Cap xarxa"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Utilitza l'interruptor de maquinari per desactivar-la"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Trieu una xarxa"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Paràmetres de la xarxa sense fil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hostpot %s actiu"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s no està connectat"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "s'està connectant..."
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "cal autenticació"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "ha fallat la connexió"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "Paràmetres de la VPN"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN apagada"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Paràmetres de xarxa"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s connexió amb fil"
msgstr[1] "%s connexions amb fil"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s connexió Wifi"
msgstr[1] "%s connexions Wifi"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s connexió mòdem"
msgstr[1] "%s connexions mòdem"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Ha fallat la connexió"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Ha fallat l'activació de la connexió de xarxa"
@@ -2055,19 +2109,19 @@ msgstr "Calendari de l'Evolution"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:437
msgid "Print version"
msgstr "Mostra la versió"
#: src/main.c:386
#: src/main.c:443
msgid "Mode used by GDM for login screen"
msgstr "El mode que utilitzarà el GDM per a la pantalla d'entrada"
#: src/main.c:392
#: src/main.c:449
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
#: src/main.c:398
#: src/main.c:455
msgid "List possible modes"
msgstr "Llista els modes possibles"
@@ -2115,6 +2169,18 @@ msgstr[1] "%u entrades"
msgid "System Sounds"
msgstr "Sons del sistema"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "Apaga"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "Desconnecta"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "Canvia d'usuari"
#~ msgid "Hide tray"
#~ msgstr "Oculta la Safata"

303
po/de.po
View File

@@ -6,7 +6,7 @@
#
# Hendrik Brandt <heb@gnome-de.org>, 2009.
# Hendrik Richter <hendrikr@gnome.org>, 2009-2011.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2009-2013, 2015-2017.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2009-2013, 2015-2018.
# Mario Klug <mario@klug.me>, 2010.
# Jakob Kramer <jakob.kramer@gmx.de>, 2010.
# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010-2011.
@@ -16,22 +16,23 @@
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
# Bernd Homuth <dev@hmt.im>, 2014-2015, 2016.
# Franco Della-Monica <franco.della.monica@gmail.com>, 2016.
# Tim Sabsch <tim@sabsch.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-26 17:18+0000\n"
"PO-Revision-Date: 2017-08-30 16:48+0200\n"
"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"POT-Creation-Date: 2018-01-17 18:05+0000\n"
"PO-Revision-Date: 2018-01-19 22:18+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.3\n"
"X-Generator: Poedit 2.0.5\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@@ -355,7 +356,7 @@ msgstr "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Abbrechen"
@@ -419,18 +420,18 @@ msgstr "(oder wischen Sie mit einem Finger)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Ausschalten"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "ausschalten;herunterfahren"
msgid "power off;shutdown;reboot;restart"
msgstr "ausschalten;herunterfahren;neustarten"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
msgctxt "search-result"
msgid "Lock screen"
msgid "Lock Screen"
msgstr "Bildschirm sperren"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
@@ -441,7 +442,7 @@ msgstr "Bildschirm sperren"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "Abmelden"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -463,7 +464,7 @@ msgstr "Bereitschaft;Schlafen"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
msgctxt "search-result"
msgid "Switch user"
msgid "Switch User"
msgstr "Benutzer wechseln"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
@@ -474,13 +475,13 @@ msgstr "Benutzer wechseln"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
msgctxt "search-result"
msgid "Lock orientation"
msgid "Lock Orientation"
msgstr "Hoch-/Querformats-Fixierung"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
msgid "lock orientation"
msgstr "Hochformat;Querformat;sperren"
msgid "lock orientation;screen;rotation"
msgstr "Hochformat;Querformat;sperren;Bildschirm;Drehung;drehen"
#: js/misc/util.js:122
msgid "Command not found"
@@ -654,32 +655,32 @@ msgstr "Häufig"
msgid "All"
msgstr "Alle"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Neues Fenster"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Mit dedizierter Grafikkarte starten"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Details anzeigen"
#: js/ui/appFavorites.js:140
#: js/ui/appFavorites.js:141
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
#: js/ui/appFavorites.js:174
#: js/ui/appFavorites.js:175
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt"
@@ -768,51 +769,51 @@ msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: js/ui/calendar.js:442
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Vorheriger Monat"
#: js/ui/calendar.js:452
#: js/ui/calendar.js:459
msgid "Next month"
msgstr "Nächster Monat"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:612
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:660
#: js/ui/calendar.js:667
msgid "Week %V"
msgstr "Woche %V"
#. 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:729
#: js/ui/calendar.js:736
msgctxt "event list time"
msgid "All Day"
msgstr "Ganztägig"
#: js/ui/calendar.js:862
#: js/ui/calendar.js:869
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: js/ui/calendar.js:866
#: js/ui/calendar.js:873
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%a, %d. %B %Y"
#: js/ui/calendar.js:1086
#: js/ui/calendar.js:1093
msgid "No Notifications"
msgstr "Keine Benachrichtigungen"
#: js/ui/calendar.js:1089
#: js/ui/calendar.js:1096
msgid "No Events"
msgstr "Keine Termine"
#: js/ui/calendar.js:1117
#: js/ui/calendar.js:1124
msgid "Clear All"
msgstr "Alles leeren"
@@ -846,7 +847,7 @@ msgstr "Externes Laufwerk verbunden"
msgid "External drive disconnected"
msgstr "Externes Laufwerk getrennt"
#: js/ui/components/autorunManager.js:354
#: js/ui/components/autorunManager.js:358
#, javascript-format
msgid "Open with %s"
msgstr "Öffnen mit %s"
@@ -859,8 +860,8 @@ msgstr "Passwort:"
msgid "Type again:"
msgstr "Erneut eingeben:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Verbinden"
@@ -888,11 +889,11 @@ msgstr "Passwort für geheimen Schlüssel: "
msgid "Service: "
msgstr "Dienst: "
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "Anmeldung für Drahtlosnetzwerk wird benötigt"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -901,7 +902,7 @@ msgstr ""
"Passwörter oder Schlüssel sind erforderlich, um auf das Drahtlosnetzwerk "
"»%s« zuzugreifen."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Kabelgebundene 802.1X-Anmeldung"
@@ -909,15 +910,15 @@ msgstr "Kabelgebundene 802.1X-Anmeldung"
msgid "Network name: "
msgstr "Netzwerkname: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "DSL-Anmeldung"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "PIN-Code ist erforderlich"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "Für das mobile Breitbandgerät wird ein PIN-Code benötigt."
@@ -925,17 +926,17 @@ msgstr "Für das mobile Breitbandgerät wird ein PIN-Code benötigt."
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Passwort der mobilen Breitbandverbindung"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Netzwerk-Verwaltung"
@@ -971,21 +972,21 @@ msgstr "%s heißt jetzt %s"
msgid "Windows"
msgstr "Fenster"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Anwendungen anzeigen"
# Würde ich so übernehmen, oder evtl. »Dock«.
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Dash"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:76
msgid "%B %e %Y"
msgstr "%e. %B %Y"
@@ -993,19 +994,19 @@ msgstr "%e. %B %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:83
msgid "%A %B %e %Y"
msgstr "%A, %e. %B %Y"
#: js/ui/dateMenu.js:144
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Weltuhren hinzufügen …"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Weltuhren"
#: js/ui/dateMenu.js:224
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Wetter"
@@ -1013,7 +1014,7 @@ msgstr "Wetter"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:286
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "Ganztägig %s."
@@ -1022,7 +1023,7 @@ msgstr "Ganztägig %s."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:292
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, später %s."
@@ -1031,30 +1032,30 @@ msgstr "%s, später %s."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:298
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, später %s, gefolgt von %s."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Ort auswählen …"
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "Wird geladen …"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:318
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Gefühlt wie %s."
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "Wetterinformationen sind momentan nicht verfügbar"
@@ -1240,7 +1241,72 @@ msgstr "Ablehnen"
msgid "Allow"
msgstr "Zulassen"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
#: js/ui/kbdA11yDialog.js:33
msgid "Slow Keys Turned On"
msgstr "Tastenverzögerung eingeschaltet"
#: js/ui/kbdA11yDialog.js:34
msgid "Slow Keys Turned Off"
msgstr "Tastenverzögerung ausgeschaltet"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Sie haben die Umschalttaste 8 Sekunden lang gedrückt gehalten. Dies ist die "
"Tastenkombination für die Tastenverzögerung, welche beeinflusst, wie Ihre "
"Tastatur funktioniert."
#: js/ui/kbdA11yDialog.js:42
msgid "Sticky Keys Turned On"
msgstr "Einrastfunktion eingeschaltet"
#: js/ui/kbdA11yDialog.js:43
msgid "Sticky Keys Turned Off"
msgstr "Einrastfunktion ausgeschaltet"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Sie haben die Umschalttaste 5 Mal hintereinander gedrückt. Dies ist die "
"Tastenkombination für die Einrastfunktion, welche beeinflusst, wie Ihre "
"Tastatur funktioniert."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"Sie haben zwei Tasten gleichzeitig oder die Umschalttaste 5 Mal "
"hintereinander gedrückt. Dies ist die Tastenkombination für die "
"Einrastfunktion, welche beeinflusst, wie Ihre Tastatur funktioniert."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Eingeschaltet lassen"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Einschalten"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Ausschalten"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Ausgeschaltet lassen"
#: js/ui/keyboard.js:739 js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Tastatur"
@@ -1292,7 +1358,7 @@ msgstr "Quelle zeigen"
msgid "Web Page"
msgstr "Webseite"
#: js/ui/messageTray.js:1493
#: js/ui/messageTray.js:1494
msgid "System Information"
msgstr "Systeminformationen"
@@ -1539,46 +1605,35 @@ msgstr "Hoher Kontrast"
msgid "Large Text"
msgstr "Große Schrift"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Bluetooth-Einstellungen"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d verbunden"
msgstr[1] "%d verbunden"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Aus"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "An"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Einschalten"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Ausschalten"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Helligkeit"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Tastaturbelegung anzeigen"
@@ -1618,18 +1673,18 @@ msgstr ""
"Standortzugriff kann in den Einstellungen zur Privatsphäre jederzeit "
"geändert werden."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<Unbekannt>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s ausgeschaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "%s verbunden"
@@ -1637,93 +1692,93 @@ msgstr "%s verbunden"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s nicht verwaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s wird getrennt"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "%s wird verbunden"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s erfordert eine Anmeldung"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Firmware fehlt für %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s nicht verfügbar"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "Verbindung von %s gescheitert"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "LAN-Einstellungen"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Einstellungen der mobilen Breitbandverbindung"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s-Hardware ausgeschaltet"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s ausgeschaltet"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Mit dem Internet verbinden"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "Flugmodus ist eingeschaltet"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr ""
"Drahtlosnetzwerk ist ausgeschaltet, wenn sich Ihr Gerät im Flugmodus "
"befindet."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Flugmodus ausschalten"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "Drahtlosnetzwerk ist ausgeschaltet"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr ""
"Drahtlosnetzwerk muss eingeschaltet werden, um eine Netzwerkverbindung "
@@ -1732,101 +1787,101 @@ msgstr ""
# Wi-Fi einschalten
# oder
# Schalten sie Wi-Fi ein
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Drahtlosnetzwerk einschalten"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Drahtlosnetzwerke"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Wählen Sie ein Netzwerk"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "Keine Netzwerke"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Benutzen Sie zum Ausschalten den Gehäuseschalter"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Wählen Sie ein Netzwerk aus"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Drahtlosnetzwerk-Einstellungen"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s eingeschaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nicht verbunden"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "Verbindungsaufbau …"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "Anmeldung erforderlich"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "VPN-Einstellungen"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN ausgeschaltet"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Netzwerkeinstellungen"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kabelverbindung"
msgstr[1] "%s Kabelverbindungen"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Funknetzwerkverbindung"
msgstr[1] "%s Funknetzwerkverbindungen"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem-Verbindung"
msgstr[1] "%s Modem-Verbindungen"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
@@ -2068,21 +2123,21 @@ msgstr "Evolution-Kalender"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:437
msgid "Print version"
msgstr "Version ausgeben"
#: src/main.c:386
#: src/main.c:443
msgid "Mode used by GDM for login screen"
msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
#: src/main.c:392
#: src/main.c:449
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr ""
"Verwenden Sie einen spezifischen Modus wie z.B. »gdm« für den "
"Anmeldebildschirm"
#: src/main.c:398
#: src/main.c:455
msgid "List possible modes"
msgstr "Die möglichen Modi auflisten"

370
po/es.po
View File

@@ -3,15 +3,14 @@
# This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010-2017, 2017.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010-2017, 2017, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-22 11:17+0000\n"
"PO-Revision-Date: 2017-08-22 13:38+0200\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-06 01:15+0000\n"
"PO-Revision-Date: 2018-02-06 13:22+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n"
"Language: es\n"
@@ -349,7 +348,7 @@ msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Cancelar"
@@ -412,34 +411,30 @@ msgstr "(o pase el dedo)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
#| msgid "Power Off"
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Apagar"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "apagar;apagado"
msgid "power off;shutdown;reboot;restart"
msgstr "apagar;apagado;reinicio;reiniciar"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
#| msgid "Lock Screen"
msgctxt "search-result"
msgid "Lock screen"
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:109
#| msgid "Lock Screen"
msgid "lock screen"
msgstr "bloquear;pantalla"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
#| msgid "Log Out"
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "Cerrar la sesión"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -449,42 +444,36 @@ msgstr "cerrar;sesión;salir"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:120
#| msgid "Suspend"
msgctxt "search-result"
msgid "Suspend"
msgstr "Suspender"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:123
#| msgid "Suspend"
msgid "suspend;sleep"
msgstr "suspender;dormir"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
#| msgid "Switch User"
msgctxt "search-result"
msgid "Switch user"
msgid "Switch User"
msgstr "Cambiar de usuario"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:130
#| msgid "Switch User"
msgid "switch user"
msgstr "cambiar;usuario"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
#| msgid "Orientation Lock"
msgctxt "search-result"
msgid "Lock orientation"
msgstr "Bloqueo de orientación"
msgid "Lock Orientation"
msgstr "Bloquear la orientación"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
#| msgid "Clock Format"
msgid "lock orientation"
msgstr "bloqueo;orientación"
msgid "lock orientation;screen;rotation"
msgstr "bloqueo;orientación;pantalla"
#: js/misc/util.js:122
msgid "Command not found"
@@ -656,32 +645,32 @@ msgstr "Frecuentes"
msgid "All"
msgstr "Todas"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Ventana nueva"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica dedicada"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Mostrar detalles"
#: js/ui/appFavorites.js:140
#: js/ui/appFavorites.js:141
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "Se ha añadido %s a sus favoritos."
#: js/ui/appFavorites.js:174
#: js/ui/appFavorites.js:175
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos."
@@ -770,51 +759,51 @@ msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: js/ui/calendar.js:442
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Mes anterior"
#: js/ui/calendar.js:452
#: js/ui/calendar.js:459
msgid "Next month"
msgstr "Siguiente mes"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:612
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:660
#: js/ui/calendar.js:667
msgid "Week %V"
msgstr "Semana %V"
#. 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:729
#: js/ui/calendar.js:736
msgctxt "event list time"
msgid "All Day"
msgstr "Todo el día"
#: js/ui/calendar.js:862
#: js/ui/calendar.js:869
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#: js/ui/calendar.js:866
#: js/ui/calendar.js:873
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: js/ui/calendar.js:1086
#: js/ui/calendar.js:1093
msgid "No Notifications"
msgstr "No hay notificaciones"
#: js/ui/calendar.js:1089
#: js/ui/calendar.js:1096
msgid "No Events"
msgstr "No hay eventos"
#: js/ui/calendar.js:1117
#: js/ui/calendar.js:1124
msgid "Clear All"
msgstr "Limpiar todo"
@@ -848,7 +837,7 @@ msgstr "Dispositivo externo conectado"
msgid "External drive disconnected"
msgstr "Dispositivo externo desconectado"
#: js/ui/components/autorunManager.js:354
#: js/ui/components/autorunManager.js:358
#, javascript-format
msgid "Open with %s"
msgstr "Abrir con %s"
@@ -861,8 +850,8 @@ msgstr "Contraseña:"
msgid "Type again:"
msgstr "Escriba de nuevo:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Conectar"
@@ -890,11 +879,11 @@ msgstr "Contraseña de la clave privada:"
msgid "Service: "
msgstr "Servicio:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -903,7 +892,7 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada"
@@ -911,15 +900,15 @@ msgstr "Autenticación 802.1X cableada"
msgid "Network name: "
msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
@@ -927,17 +916,17 @@ msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Gestor de la red"
@@ -972,20 +961,20 @@ msgstr "Ahora %s se llama %s"
msgid "Windows"
msgstr "Ventanas"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Mostrar aplicaciones"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Tablero"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:76
msgid "%B %e %Y"
msgstr "%B %e %Y"
@@ -993,19 +982,19 @@ msgstr "%B %e %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:83
msgid "%A %B %e %Y"
msgstr "%A %e de %B de %Y"
#: js/ui/dateMenu.js:144
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Añadir relojes del mundo…"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Relojes del mundo"
#: js/ui/dateMenu.js:224
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Meteorología"
@@ -1013,7 +1002,7 @@ msgstr "Meteorología"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:286
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s todo el día."
@@ -1022,7 +1011,7 @@ msgstr "%s todo el día."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:292
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, luego %s."
@@ -1031,30 +1020,30 @@ msgstr "%s, luego %s."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:298
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, luego %s seguido de %s."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Seleccionar ubicación…"
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "Cargando…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:318
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Sensación térmica de %s."
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Conectarse para obtener la información meteorológica"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "La información meteorológica no está disponible actualmente."
@@ -1240,9 +1229,74 @@ msgstr "Denegar"
msgid "Allow"
msgstr "Permitir"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Teclado"
#: js/ui/kbdA11yDialog.js:33
msgid "Slow Keys Turned On"
msgstr "Teclas lentas activadas"
#: js/ui/kbdA11yDialog.js:34
msgid "Slow Keys Turned Off"
msgstr "Teclas lentas desactivadas"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Acaba de pulsar la tecla «Mayúsculas» durante 8 segundos. Ésta es la "
"combinación de teclas para la característica «Teclas lentas», que afecta la "
"forma en que funciona el teclado."
#: js/ui/kbdA11yDialog.js:42
msgid "Sticky Keys Turned On"
msgstr "Teclas persistentes activadas"
#: js/ui/kbdA11yDialog.js:43
msgid "Sticky Keys Turned Off"
msgstr "Teclas persistentes desactivadas"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Acaba de pulsar la tecla «Mayúsculas» 5 veces. Este es el acceso rápido para "
"la característica «Teclas persistentes», que afecta la manera en que "
"funciona el teclado."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"Acaba de pulsar dos teclas a la vez, o ha pulsado la tecla «Mayúsculas» 5 "
"veces seguidas. Esto desactiva la característica de «Teclas persistentes», "
"lo cual afecta a la forma en que funciona su teclado."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Dejar activada"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Encender"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Apagar"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Dejar desactivada"
#: js/ui/keyboard.js:198
msgid "Region & Language Settings"
msgstr "Configuración de región e idioma"
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
@@ -1292,7 +1346,7 @@ msgstr "Ver fuente"
msgid "Web Page"
msgstr "Página web"
#: js/ui/messageTray.js:1493
#: js/ui/messageTray.js:1494
msgid "System Information"
msgstr "Información del sistema"
@@ -1381,7 +1435,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistema"
#: js/ui/panel.js:812
#: js/ui/panel.js:814
msgid "Top Bar"
msgstr "Barra superior"
@@ -1463,7 +1517,6 @@ msgstr "No se encontraron resultados."
#: js/ui/search.js:777
#, javascript-format
#| msgid "%d more"
msgid "%d more"
msgid_plural "%d more"
msgstr[0] "%d más"
@@ -1537,46 +1590,39 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "Texto grande"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d conectado"
msgstr[1] "%d conectados"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Desconectado"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "Encender"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Encender"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Apagar"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Brillo"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Teclado"
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado"
@@ -1616,18 +1662,18 @@ msgstr ""
"Los servicios de ubicación se pueden cambiar en cualquier momento desde la "
"configuración de privacidad."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<desconocido>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s apagada"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "%s conectada"
@@ -1635,189 +1681,189 @@ msgstr "%s conectada"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s sin gestionar"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "Desconectando %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "Conectando %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s requiere autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Falta el «firmware» para %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s no disponible"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "Falló la conexión %s"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "Configuración de red cableada"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Configuración de banda ancha móvil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Hardware %s desactivado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s desactivado"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Conectar a Internet"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "El modo avión está activado"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Apagar el modo avión"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "La Wi-Fi está desactivada"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Activar la Wi-Fi"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Seleccionar una red"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "No hay redes"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Usar el interruptor hardware para apagar"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Seleccionar red"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Configuración de Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Punto de acceso %s activo"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s no conectado"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "se necesita autenticación"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "falló la conexión"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "Configuración de VPN"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN apagada"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Configuración de la red"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s conexión cableada"
msgstr[1] "%s conexiones cableadas"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s conexión inalámbrica"
msgstr[1] "%s conexiones inalámbricas"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s conexión por módem"
msgstr[1] "%s conexiones por módem"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Falló la conexión"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red"
@@ -1899,6 +1945,32 @@ msgstr "Suspender"
msgid "Power Off"
msgstr "Apagar"
#: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt"
msgstr "Thunderbolt"
#. we are done
#: js/ui/status/thunderbolt.js:330
msgid "Unknown Thunderbolt device"
msgstr "Dispositivo Thunderbolt desconocido"
#: js/ui/status/thunderbolt.js:331
msgid ""
"New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it."
msgstr ""
"Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y "
"vuélvalo a conectar para empezar a usarlo."
#: js/ui/status/thunderbolt.js:336
msgid "Thunderbolt authorization error"
msgstr "Error de autorización de Thunderbolt"
#: js/ui/status/thunderbolt.js:337
#, javascript-format
msgid "Could not authorize the thunderbolt device: %s"
msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:128
msgid "Volume changed"
msgstr "Volumen modificado"
@@ -1911,7 +1983,6 @@ msgstr "Volumen"
#. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:21
#| msgid "Error"
msgid "Mirror"
msgstr "Espejo"
@@ -1919,7 +1990,6 @@ msgstr "Espejo"
#. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:26
#| msgid "Panel Display"
msgid "Join Displays"
msgstr "Unir pantallas"
@@ -2060,21 +2130,21 @@ msgstr "Calendario de Evolution"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:432
msgid "Print version"
msgstr "Imprimir versión"
#: src/main.c:386
#: src/main.c:438
msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para la pantalla de inicio"
#: src/main.c:392
#: src/main.c:444
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr ""
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
"sesión"
#: src/main.c:398
#: src/main.c:450
msgid "List possible modes"
msgstr "Listar los modos posibles"
@@ -2122,6 +2192,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#~| msgid "Power Off"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "Apagar"
#~| msgid "Log Out"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "Cerrar la sesión"
#~| msgid "Switch User"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "Cambiar de usuario"
#~ msgid "Hide tray"
#~ msgstr "Ocultar bandeja"
@@ -2658,9 +2743,6 @@ msgstr "Sonidos del sistema"
#~ msgid "Mouse Settings"
#~ msgstr "Configuración del ratón…"
#~ msgid "Region & Language Settings"
#~ msgstr "Configuración de región e idioma"
#~ msgid "%d hour remaining"
#~ msgid_plural "%d hours remaining"
#~ msgstr[0] "Queda %d hora"

368
po/fi.po
View File

@@ -24,10 +24,9 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-22 11:17+0000\n"
"PO-Revision-Date: 2017-08-29 11:23+0300\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-06 01:15+0000\n"
"PO-Revision-Date: 2018-02-06 23:41+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n"
@@ -35,7 +34,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 2.91.7\n"
"X-Generator: Poedit 1.8.7.1\n"
"X-DamnedLies-Scope: partial\n"
"X-Project-Style: gnome\n"
"X-POT-Import-Date: 2012-03-05 15:06:10+0000\n"
@@ -359,7 +358,7 @@ msgstr "Kohteen %s asetusikkunaa ladataessa tapahtui virhe:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Peru"
@@ -422,34 +421,30 @@ msgstr "(tai pyyhkäise sormella)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
#| msgid "Power Off"
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Sammuta"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "power off;shutdown;sammuta;sammutus;lopeta;"
msgid "power off;shutdown;reboot;restart"
msgstr "power off;shutdown;reboot;restart;sammuta;käynnistä uudelleen;"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
#| msgid "Lock Screen"
msgctxt "search-result"
msgid "Lock screen"
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:109
#| msgid "Lock Screen"
msgid "lock screen"
msgstr "lock screen"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
#| msgid "Log Out"
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "Kirjaudu ulos"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -459,42 +454,36 @@ msgstr "logout;sign off;kirjaudu ulos;uloskirjautuminen;poistu;"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:120
#| msgid "Suspend"
msgctxt "search-result"
msgid "Suspend"
msgstr "Valmiustila"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:123
#| msgid "Suspend"
msgid "suspend;sleep"
msgstr "suspend;sleep"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
#| msgid "Switch User"
msgctxt "search-result"
msgid "Switch user"
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:130
#| msgid "Switch User"
msgid "switch user"
msgstr "switch user"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
#| msgid "Orientation Lock"
msgctxt "search-result"
msgid "Lock orientation"
msgid "Lock Orientation"
msgstr "Lukitse näytön kierto"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
#| msgid "Orientation Lock"
msgid "lock orientation"
msgstr "lock orientation"
msgid "lock orientation;screen;rotation"
msgstr "lock orientation;screen;rotation;lukitse kierto;lukitse suunta;suunta;"
#: js/misc/util.js:122
msgid "Command not found"
@@ -666,32 +655,32 @@ msgstr "Käytetyimmät"
msgid "All"
msgstr "Kaikki"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Uusi ikkuna"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Käynnistä erillisnäytönohjainta käyttäen"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Poista suosikeista"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Lisää suosikkeihin"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Näytä tiedot"
#: js/ui/appFavorites.js:140
#: js/ui/appFavorites.js:141
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s on lisätty suosikkeihin."
#: js/ui/appFavorites.js:174
#: js/ui/appFavorites.js:175
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s on poistettu suosikeista."
@@ -780,58 +769,57 @@ msgctxt "grid saturday"
msgid "S"
msgstr "L"
#: js/ui/calendar.js:442
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Edellinen kuukausi"
#: js/ui/calendar.js:452
#: js/ui/calendar.js:459
msgid "Next month"
msgstr "Seuraava kuukausi"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:612
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:660
#: js/ui/calendar.js:667
msgid "Week %V"
msgstr "Viikko %V"
#. 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:729
#: js/ui/calendar.js:736
msgctxt "event list time"
msgid "All Day"
msgstr "Koko päivä"
#: js/ui/calendar.js:862
#: js/ui/calendar.js:869
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %Bta"
#: js/ui/calendar.js:866
#: js/ui/calendar.js:873
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %Bta %Y"
#: js/ui/calendar.js:1086
#: js/ui/calendar.js:1093
msgid "No Notifications"
msgstr "Ei ilmoituksia"
#: js/ui/calendar.js:1089
#: js/ui/calendar.js:1096
msgid "No Events"
msgstr "Ei tapahtumia"
#: js/ui/calendar.js:1117
#: js/ui/calendar.js:1124
msgid "Clear All"
msgstr "Tyhjennä kaikki"
#. Translators: %s is an application name
#: js/ui/closeDialog.js:44
#, javascript-format
#| msgid "“%s” is ready"
msgid "“%s” is not responding."
msgstr "“%s” ei vastaa"
@@ -859,7 +847,7 @@ msgstr "Erillinen asema yhdistetty"
msgid "External drive disconnected"
msgstr "Erillinen asema irrotettu"
#: js/ui/components/autorunManager.js:354
#: js/ui/components/autorunManager.js:358
#, javascript-format
msgid "Open with %s"
msgstr "Avaa käyttäen sovellusta %s"
@@ -872,8 +860,8 @@ msgstr "Salasana:"
msgid "Type again:"
msgstr "Uudelleen:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Yhdistä"
@@ -901,18 +889,18 @@ msgstr "Salaisen avaimen salasana: "
msgid "Service: "
msgstr "Palvelu: "
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "Langaton verkko vaatii tunnistautumisen"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "Langaton verkko \"%s\" vaatii salasanan tai salausavaimia."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Kiinteän 802.1X-yhteyden tunnistautuminen"
@@ -920,15 +908,15 @@ msgstr "Kiinteän 802.1X-yhteyden tunnistautuminen"
msgid "Network name: "
msgstr "Verkon nimi: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "DSL-tunnistautuminen"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "PIN-koodi vaaditaan"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "Mobiililaajakaista vaatii PIN-koodin"
@@ -936,17 +924,17 @@ msgstr "Mobiililaajakaista vaatii PIN-koodin"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Mobiililaajakaistan verkkosalasana"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Salasana vaaditaan kohteeseen \"%s\" yhdistämiseksi."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Verkon hallinta"
@@ -981,20 +969,20 @@ msgstr "%s on nyt nimeltään %s"
msgid "Windows"
msgstr "Ikkunat"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Näytä sovellukset"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Pikavalikko"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:76
msgid "%B %e %Y"
msgstr "%e. %b %Y"
@@ -1002,19 +990,19 @@ msgstr "%e. %b %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:83
msgid "%A %B %e %Y"
msgstr "%A, %e. %Bta %Y"
#: js/ui/dateMenu.js:144
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Lisää maailmankelloja…"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Maailmankellot"
#: js/ui/dateMenu.js:224
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Sää"
@@ -1022,7 +1010,7 @@ msgstr "Sää"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:286
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s koko päivän."
@@ -1031,7 +1019,7 @@ msgstr "%s koko päivän."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:292
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s. %s myöhemmin."
@@ -1040,30 +1028,30 @@ msgstr "%s. %s myöhemmin."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:298
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s. Sen jälkeen %s. Myöhemmin %s."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Valitse sijainti…"
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "Ladataan…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:318
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Tuntuu kuin %s."
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Yhdistä verkkoon saadaksesi säätietoja"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "Säätiedot eivät ole juuri nyt saatavilla"
@@ -1252,9 +1240,74 @@ msgstr "Kiellä"
msgid "Allow"
msgstr "Salli"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Näppäimistö"
#: js/ui/kbdA11yDialog.js:33
msgid "Slow Keys Turned On"
msgstr "Hitaat näppäimet otettu käyttöön"
#: js/ui/kbdA11yDialog.js:34
msgid "Slow Keys Turned Off"
msgstr "Hitaat näppäimet poistettu käytöstä"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Pidit juuri Shift-näppäintä pohjassa kahdeksan sekuntia. Se toimii "
"pikanäppäimenä hitaiden näppäinten ominaisuudelle, joka taasen vaikuttaa "
"näppäimistön toimintatapaan."
#: js/ui/kbdA11yDialog.js:42
msgid "Sticky Keys Turned On"
msgstr "Pohjaan jäävät näppäimet otettu käyttöön"
#: js/ui/kbdA11yDialog.js:43
msgid "Sticky Keys Turned Off"
msgstr "Pohjaan jäävät näppäimet poistettu käytöstä"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Painoit juuri Shift-näppäintä viisi kertaa peräkkäin. Se toimii "
"pikanäppäimenä pohjaan jäävien näppäinten ominaisuudelle, joka taasen "
"vaikuttaa näppäimistön toimintatapaan."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"Painoit juuri kahta näppäintä samanaikaisesti, tai painoit Shift-näppäintä "
"viisi kertaa peräkkäin. Tämä kytkee pohjaan jäävien näppäinten ominaisuuden "
"pois käytöstä, joka taasen vaikuttaa näppäimistön toimintatapaan."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Jätä käyttöön"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Ota käyttöön"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Sammuta"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Poista käytöstä"
#: js/ui/keyboard.js:198
msgid "Region & Language Settings"
msgstr "Kielen & alueen asetukset"
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
@@ -1304,7 +1357,7 @@ msgstr "Näytä lähde"
msgid "Web Page"
msgstr "Verkkosivusto"
#: js/ui/messageTray.js:1493
#: js/ui/messageTray.js:1494
msgid "System Information"
msgstr "Järjestelmän tiedot"
@@ -1395,7 +1448,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "Järjestelmä"
#: js/ui/panel.js:812
#: js/ui/panel.js:814
msgid "Top Bar"
msgstr "Yläpalkki"
@@ -1550,46 +1603,39 @@ msgstr "Korkea kontrasti"
msgid "Large Text"
msgstr "Suuri tekstin koko"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Bluetooth-asetukset"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d yhdistetty"
msgstr[1] "%d yhdistetty"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Pois"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "Päällä"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Ota käyttöön"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Sammuta"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Kirkkaus"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Näppäimistö"
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Näytä näppäimistön asettelu"
@@ -1629,18 +1675,18 @@ msgstr ""
"Sijaintitiedon käyttöoikeuksia voi muuttaa milloin tahansa "
"yksityisyysasetuksista."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<tuntematon>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s pois"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "%s - Yhdistetty"
@@ -1648,189 +1694,189 @@ msgstr "%s - Yhdistetty"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s - Ei hallinnassa"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s - Katkaistaan yhteyttä"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "%s - Yhdistetään"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s vaatii tunnistautumisen"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "%s - Laiteohjelmisto puuttuu"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s - Ei saatavilla"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s - Yhteys epäonnistui"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "Kiinteän yhteyden asetukset"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Mobiililaajakaistan asetukset"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s - Laite poistettu käytöstä"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s - Poistettu käytöstä"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Yhdistä internetiin"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "Lentokonetila on päällä"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Wifi on pois päältä lentokonetilan ollessa päällä."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Käytä lentokonetilaa"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "Wifi on pois"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Wifin tulee olla päällä, jotta yhteys verkkoon on mahdollinen."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Ota wifi käyttöön"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Wifi-verkot"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Valitse verkko"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "Ei verkkoja"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Käytä laitepainiketta sammuttaaksesi"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Valitse verkko"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Wifin asetukset"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s - Yhteyspiste aktiivisena"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s - Ei yhdistetty"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "yhdistetään…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "tunnistautuminen vaaditaan"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "yhteys katkesi"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "VPN-asetukset"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN pois"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Verkkoasetukset"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s kiinteä yhteys"
msgstr[1] "%s kiinteää yhteyttä"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s wifi-yhteys"
msgstr[1] "%s wifi-yhteyttä"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s modeemiyhteys"
msgstr[1] "%s modeemiyhteyttä"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Yhteys epäonnistui"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Verkkoyhteyden aktivointi epäonnistui"
@@ -1912,6 +1958,32 @@ msgstr "Valmiustila"
msgid "Power Off"
msgstr "Sammuta"
#: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt"
msgstr "Thunderbolt"
#. we are done
#: js/ui/status/thunderbolt.js:330
msgid "Unknown Thunderbolt device"
msgstr "Tuntematon Thunderbolt-laite"
#: js/ui/status/thunderbolt.js:331
msgid ""
"New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it."
msgstr ""
"Uusi laite havaittiin, kun olit pois. Katkaise laitteen yhteys ja yhdistä se "
"uudelleen, jotta voit aloittaa sen käyttämisen."
#: js/ui/status/thunderbolt.js:336
msgid "Thunderbolt authorization error"
msgstr "Thunderbolt-valtuutusvirhe"
#: js/ui/status/thunderbolt.js:337
#, javascript-format
msgid "Could not authorize the thunderbolt device: %s"
msgstr "Ei voitu valtuuttaa thunderbolt-laitetta: %s"
#: js/ui/status/volume.js:128
msgid "Volume changed"
msgstr "Äänenvoimakkuutta muutettu"
@@ -1924,7 +1996,6 @@ msgstr "Äänenvoimakkuus"
#. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:21
#| msgid "Error"
msgid "Mirror"
msgstr "Peili"
@@ -2072,19 +2143,19 @@ msgstr "Evolution-kalenteri"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:432
msgid "Print version"
msgstr "Tulosta versio"
#: src/main.c:386
#: src/main.c:438
msgid "Mode used by GDM for login screen"
msgstr "GDM:n kirjautumisruudussa käyttämä tila"
#: src/main.c:392
#: src/main.c:444
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Käytä tiettyä tilaa (esim. “gdm”) kirjautumisnäkymää varten"
#: src/main.c:398
#: src/main.c:450
msgid "List possible modes"
msgstr "Listaa mahdolliset tilat"
@@ -2132,6 +2203,21 @@ msgstr[1] "%u sisääntuloa"
msgid "System Sounds"
msgstr "Järjestelmän äänet"
#~| msgid "Power Off"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "Sammuta"
#~| msgid "Log Out"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "Kirjaudu ulos"
#~| msgid "Switch User"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "Vaihda käyttäjää"
#~ msgid "Hide tray"
#~ msgstr "Piilota palkki"
@@ -2631,10 +2717,6 @@ msgstr "Järjestelmän äänet"
#~ msgid "Mouse Settings"
#~ msgstr "Hiiren asetukset"
#~| msgid "Region and Language Settings"
#~ msgid "Region & Language Settings"
#~ msgstr "Kielen & alueen asetukset"
#~ msgid "Volume, network, battery"
#~ msgstr "Äänenvoimakkuus, verkko, akku"

350
po/fur.po
View File

@@ -6,10 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: video-subtitles master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-10-04 18:03+0000\n"
"PO-Revision-Date: 2017-10-11 08:34+0200\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-06 01:15+0000\n"
"PO-Revision-Date: 2018-02-06 22:38+0100\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n"
@@ -341,7 +340,7 @@ msgstr ""
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Anule"
@@ -405,29 +404,29 @@ msgstr "(o passe cul dêt)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:99
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Distudâ"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "distudâ;studâ"
msgid "power off;shutdown;reboot;restart"
msgstr "distudâ;studâ;tornâ a inviâ"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
msgctxt "search-result"
msgid "Lock screen"
msgstr "Blocâ il schermi"
msgid "Lock Screen"
msgstr "Bloc schermi"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:109
msgid "lock screen"
msgstr "blocâ schermi;blocâ"
msgstr "bloc schermi"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:113
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "Jessî"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -449,8 +448,8 @@ msgstr "sospindi;polse"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:127
msgctxt "search-result"
msgid "Switch user"
msgstr "Cambiâ utent"
msgid "Switch User"
msgstr "Cambi Utent"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:130
@@ -460,13 +459,13 @@ msgstr "cambiâ utent"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
msgctxt "search-result"
msgid "Lock orientation"
msgstr "Blocâ orientament"
msgid "Lock Orientation"
msgstr "Bloc orientament"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
msgid "lock orientation"
msgstr "blocâ orientament"
msgid "lock orientation;screen;rotation"
msgstr "bloc orientament;schermi;rotazion"
#: js/misc/util.js:122
msgid "Command not found"
@@ -639,23 +638,23 @@ msgstr "Dispès"
msgid "All"
msgstr "Dutis"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Gnûf barcon"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Invie doprant une schede grafiche dedicade"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Gjave dai preferîts"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Zonte tai preferîts"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Mostre Detais"
@@ -691,7 +690,7 @@ msgstr "Microfon"
#: js/ui/backgroundMenu.js:19
msgid "Change Background…"
msgstr "Cambie sfont..."
msgstr "Cambie sfont"
#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51
msgid "Display Settings"
@@ -844,8 +843,8 @@ msgstr "Password:"
msgid "Type again:"
msgstr "Scîf di gnûf:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Conet"
@@ -873,11 +872,11 @@ msgstr "Password di clâf privade:"
msgid "Service: "
msgstr "Servizi:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "La rêt cence fîl e domande autenticazion"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -886,7 +885,7 @@ msgstr ""
"Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence "
"fîl \"%s\"."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Autenticazion vie fîl 802.1X"
@@ -894,15 +893,15 @@ msgstr "Autenticazion vie fîl 802.1X"
msgid "Network name: "
msgstr "Non rêt:"
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "Autenticazion DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "Si pretint un codiç PIN"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil"
@@ -910,17 +909,17 @@ msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Passowrd rêt mobil a bande largje"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "A covente une password par tacâsi a '%s'."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Ministradôr di rêt"
@@ -955,13 +954,13 @@ msgstr "L'utent %s al è cognossût cumò come %s"
msgid "Windows"
msgstr "Barcons"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Mostre Aplicazions"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Dash"
@@ -980,15 +979,15 @@ msgstr "%e di %B dal %Y"
msgid "%A %B %e %Y"
msgstr "%A %e di %B dal %Y"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Zonte orlois mondiâi..."
msgstr "Zonte orlois mondiâi"
#: js/ui/dateMenu.js:146
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Orlois mondiâi"
#: js/ui/dateMenu.js:225
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Timp"
@@ -996,7 +995,7 @@ msgstr "Timp"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:289
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s dut il dì."
@@ -1005,7 +1004,7 @@ msgstr "%s dut il dì."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:295
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, plui tart %s."
@@ -1014,30 +1013,30 @@ msgstr "%s, plui tart %s."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:301
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, chi di un pôc %s, e plui tart %s."
#: js/ui/dateMenu.js:312
msgid "Select a location…"
msgstr "Selezione une posizion..."
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Selezione une posizion…"
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "Daûr a cjariâ..."
msgstr "Daûr a cjariâ"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Si sint %s."
#: js/ui/dateMenu.js:324
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Va in rêt pes informazions sul timp"
#: js/ui/dateMenu.js:326
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "Lis informazions sul timp al moment no son disponibilis"
@@ -1224,9 +1223,73 @@ msgstr "Dinee"
msgid "Allow"
msgstr "Pemet"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Tastiere"
#: js/ui/kbdA11yDialog.js:33
msgid "Slow Keys Turned On"
msgstr "Tascj lents ativâts"
#: js/ui/kbdA11yDialog.js:34
msgid "Slow Keys Turned Off"
msgstr "Tascj lents disativâts"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Si à apene tignût fracât par 8 seconts il tast Maiusc. Chê e je la scurte pe "
"funzion tascj lents, che e determine il mût di lavorâ de tastiere."
#: js/ui/kbdA11yDialog.js:42
msgid "Sticky Keys Turned On"
msgstr "Tascj tacadiçs ativâts"
#: js/ui/kbdA11yDialog.js:43
msgid "Sticky Keys Turned Off"
msgstr "Tascj tacadiçs disativâts"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Si à apene fracât par 5 voltis, une daûr di chê altre, il tast Maiusc. Chê e "
"je la scurte pe funzion Tascj singui/tacadiçs, che e determine il mût di "
"lavorâ de tastiere."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"A son stâts fracâts doi tascj adun o cinc voltis in file il tast Maiusc. "
"Chest al disative la funzion tascj singui/tacadiçs, che al determine il mût "
"di lavorâ de tastiere."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Lasse ativât"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Impie"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Distude"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Lasse disativât"
#: js/ui/keyboard.js:198
msgid "Region & Language Settings"
msgstr "Impostazions regjon e lenghe"
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
@@ -1304,11 +1367,11 @@ msgstr "Panoramiche"
#. characters.
#: js/ui/overview.js:240
msgid "Type to search…"
msgstr "Scrîf par cirî..."
msgstr "Scrîf par cirî"
#: js/ui/padOsd.js:103
msgid "New shortcut…"
msgstr "Gnove scurte..."
msgstr "Gnove scurte"
#: js/ui/padOsd.js:152
msgid "Application defined"
@@ -1332,7 +1395,7 @@ msgstr "Fat"
#: js/ui/padOsd.js:734
msgid "Edit…"
msgstr "Modifiche..."
msgstr "Modifiche"
# masculin o feminin
#: js/ui/padOsd.js:774 js/ui/padOsd.js:879
@@ -1366,7 +1429,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sisteme"
#: js/ui/panel.js:812
#: js/ui/panel.js:814
msgid "Top Bar"
msgstr "Sbare parsore"
@@ -1394,7 +1457,7 @@ msgstr "Il tornâ a tacâ nol è disponibil in Wayland"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Daûr a tornâ a inviâ..."
msgstr "Daûr a tornâ a inviâ"
#. Translators: This is a time format for a date in
#. long format
@@ -1422,7 +1485,7 @@ msgstr "Bloche"
#: js/ui/screenShield.js:715
msgid "GNOME needs to lock the screen"
msgstr "GNOME al scugne blocâ il visôr"
msgstr "GNOME al à di blocâ il visôr"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
@@ -1441,7 +1504,7 @@ msgstr "Il bloc al è stât dineât di une aplicazion"
#: js/ui/search.js:651
msgid "Searching…"
msgstr "Daûr a cirî..."
msgstr "Daûr a cirî"
#: js/ui/search.js:653
msgid "No results."
@@ -1523,46 +1586,39 @@ msgstr "Contrast elevât"
msgid "Large Text"
msgstr "Test Larc"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Impostazions Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d tacât"
msgstr[1] "%d tacâts"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Distudât"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "Impiât"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Impie"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Distude"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Luminositât"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Tastiere"
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Mostre la disposizion de tastiere"
@@ -1602,18 +1658,18 @@ msgstr ""
"L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions "
"privacy."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<no cognossût>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s distudât"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "%s tacât"
@@ -1621,189 +1677,189 @@ msgstr "%s tacât"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s no ministrât"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s daûr a disconeti"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "%s in conession"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s al à dibisugne di autenticazion"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Al mancje il firmware par %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s no disponibil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "Conession falide su %s"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "Impostazions rêt vie fîl"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Impostazions bande largje mobil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s disabilitât vie hardware "
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s disabilitât"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Conet a internet"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "Modalitât avion piade"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Il Wi-Fi al è disabilitât cuant che la modalitât avion e je impiade."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Distude modalitât avion"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "Il Wi-Fi al è distudât"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Il Wi-Fi al scugne jessi impiât par podêsi tacâ a une rêt."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Impie il Wi-Fi"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Rêts Wi-Fi"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Selezione une rêt"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "Nissune rêt"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Dopre interutôr fisic par distudâ"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Selezione rêt"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Impostazions Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s atîf"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s distacât"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "daûr a coneti…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "autenticazion necessarie"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "conession falide"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "Impostazions VPN"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN distudât"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Impostazions rêt"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s conession cablade"
msgstr[1] "%s conessions cabladis"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s conession cence fîi"
msgstr[1] "%s conessions cence fîi"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s conession modem"
msgstr[1] "%s conessions modem"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Conession falide"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Ativazion de conession di rêt falide"
@@ -1835,7 +1891,7 @@ msgstr "Cjarie"
#. to estimate battery life
#: js/ui/status/power.js:84 js/ui/status/power.js:90
msgid "Estimating…"
msgstr "In stime..."
msgstr "In stime"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: js/ui/status/power.js:98
@@ -1875,7 +1931,7 @@ msgstr "Impostazions account"
#: js/ui/status/system.js:269
msgid "Orientation Lock"
msgstr "Bloche Orientament"
msgstr "Bloc Orientament"
#: js/ui/status/system.js:295
msgid "Suspend"
@@ -1885,6 +1941,32 @@ msgstr "Sospindi"
msgid "Power Off"
msgstr "Distude"
#: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt"
msgstr "Thunderbolt"
#. we are done
#: js/ui/status/thunderbolt.js:330
msgid "Unknown Thunderbolt device"
msgstr "Dispositîf Thunderbolt no cognossût"
#: js/ui/status/thunderbolt.js:331
msgid ""
"New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it."
msgstr ""
"Un gnûf dispositîf al è stât rilevât intant che tu jeris vie. Par plasê "
"disconet e torne conet il dispositîf par tacâ a doprâlu."
#: js/ui/status/thunderbolt.js:336
msgid "Thunderbolt authorization error"
msgstr "Erôr di autorizazion di Thunderbolt"
#: js/ui/status/thunderbolt.js:337
#, javascript-format
msgid "Could not authorize the thunderbolt device: %s"
msgstr "Impussibil autorizâ il dispositîf thunderbolt: %s"
#: js/ui/status/volume.js:128
msgid "Volume changed"
msgstr "Volum modificât"
@@ -1940,7 +2022,7 @@ msgstr "Cîr"
#: js/ui/windowAttentionHandler.js:20
#, javascript-format
msgid "“%s” is ready"
msgstr "'%s' al è pront"
msgstr "%s al è pront"
#: js/ui/windowManager.js:72
msgid "Do you want to keep these display settings?"
@@ -2046,19 +2128,19 @@ msgstr "Calendari di Evolution"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:432
msgid "Print version"
msgstr "Stampe version"
#: src/main.c:386
#: src/main.c:438
msgid "Mode used by GDM for login screen"
msgstr "Modalitât doprade da GDM pe videade di acès"
#: src/main.c:392
#: src/main.c:444
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Dopre une modalitât specifiche, par esempli “gdm” pe videade di acès"
#: src/main.c:398
#: src/main.c:450
msgid "List possible modes"
msgstr "Liste modalitâts pussibilis"
@@ -2106,6 +2188,18 @@ msgstr[1] "%u jentradis"
msgid "System Sounds"
msgstr "Suns di sisteme"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "Distudâ"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "Jessî"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "Cambiâ utent"
#~ msgid "Hide tray"
#~ msgstr "Plate casset"

417
po/gl.po
View File

@@ -6,14 +6,13 @@
# Antón Méixome <meixome@certima.net>, 2009.
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017.
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017, 2018.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-22 11:17+0000\n"
"PO-Revision-Date: 2017-08-22 15:09+0200\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-08 16:48+0000\n"
"PO-Revision-Date: 2018-02-09 12:15+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician\n"
"Language: gl\n"
@@ -341,7 +340,7 @@ msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:936
#: js/ui/shellMountOperation.js:344 js/ui/status/network.js:925
msgid "Cancel"
msgstr "Cancelar"
@@ -406,24 +405,25 @@ msgstr "(ou pase o dedo)"
#: js/misc/systemActions.js:99
#| msgid "Power Off"
msgctxt "search-result"
msgid "Power off"
msgid "Power Off"
msgstr "Apagar"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:102
msgid "power off;shutdown"
msgstr "apagar;"
#| msgid "power off;shutdown"
msgid "power off;shutdown;reboot;restart"
msgstr "apagar;reiniciar;"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:106
#| msgid "Lock Screen"
#| msgctxt "search-result"
#| msgid "Lock screen"
msgctxt "search-result"
msgid "Lock screen"
msgid "Lock Screen"
msgstr "Bloquear a pantalla"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:109
#| msgid "Lock Screen"
msgid "lock screen"
msgstr "bloquear pantalla;bloquear"
@@ -431,7 +431,7 @@ msgstr "bloquear pantalla;bloquear"
#: js/misc/systemActions.js:113
#| msgid "Log Out"
msgctxt "search-result"
msgid "Log out"
msgid "Log Out"
msgstr "Saír da sesión"
#. Translators: A list of keywords that match the logout action, separated by semicolons
@@ -441,14 +441,12 @@ msgstr "pechar a sesión;desloguearse;saír da sesión"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:120
#| msgid "Suspend"
msgctxt "search-result"
msgid "Suspend"
msgstr "Suspender"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:123
#| msgid "Suspend"
msgid "suspend;sleep"
msgstr "Suspender;durmir"
@@ -456,27 +454,27 @@ msgstr "Suspender;durmir"
#: js/misc/systemActions.js:127
#| msgid "Switch User"
msgctxt "search-result"
msgid "Switch user"
msgid "Switch User"
msgstr "Cambiar de usuario"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:130
#| msgid "Switch User"
msgid "switch user"
msgstr "cambiar de usuario"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:134
#| msgid "Orientation Lock"
#| msgctxt "search-result"
#| msgid "Lock orientation"
msgctxt "search-result"
msgid "Lock orientation"
msgid "Lock Orientation"
msgstr "Bloquear orientación"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:137
#| msgid "Clock Format"
msgid "lock orientation"
msgstr "bloquear orientación"
#| msgid "lock orientation"
msgid "lock orientation;screen;rotation"
msgstr "bloquear orientación;pantalla;rotación"
#: js/misc/util.js:122
msgid "Command not found"
@@ -649,32 +647,32 @@ msgstr "Frecuentes"
msgid "All"
msgstr "Todos"
#: js/ui/appDisplay.js:1915
#: js/ui/appDisplay.js:1918
msgid "New Window"
msgstr "Xanela nova"
#: js/ui/appDisplay.js:1929
#: js/ui/appDisplay.js:1932
msgid "Launch using Dedicated Graphics Card"
msgstr "Iniciar usando a Tarxeta Gráfica Adicada"
#: js/ui/appDisplay.js:1956 js/ui/dash.js:289
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Retirar dos marcadores"
#: js/ui/appDisplay.js:1962
#: js/ui/appDisplay.js:1965
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
#: js/ui/appDisplay.js:1972
#: js/ui/appDisplay.js:1975
msgid "Show Details"
msgstr "Mostrar detalles"
#: js/ui/appFavorites.js:140
#: js/ui/appFavorites.js:141
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s foi engadido aos seus favoritos."
#: js/ui/appFavorites.js:174
#: js/ui/appFavorites.js:175
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s retirouse dos seus marcadores."
@@ -712,7 +710,7 @@ msgid "Settings"
msgstr "Preferencias"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:47
#: js/ui/calendar.js:44
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@@ -722,92 +720,115 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:76
#: js/ui/calendar.js:73
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:75
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:77
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:79
msgctxt "grid wednesday"
msgid "W"
msgstr "W"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:84
#: js/ui/calendar.js:81
msgctxt "grid thursday"
msgid "T"
msgstr "X"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:86
#: js/ui/calendar.js:83
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:88
#: js/ui/calendar.js:85
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: js/ui/calendar.js:442
#. *
#. * Translators: The header displaying just the month name
#. * standalone, when this is a month of the current year.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:382
msgid "%OB"
msgstr "%OB"
#. *
#. * Translators: The header displaying the month name and the year
#. * number, when this is a month of a different year. You can
#. * reorder the format specifiers or add other modifications
#. * according to the requirements of your language.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:392
msgid "%OB %Y"
msgstr "%B de %Y"
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Anterior mes"
#: js/ui/calendar.js:452
#: js/ui/calendar.js:459
msgid "Next month"
msgstr "Seguinte mes"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:612
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:660
#: js/ui/calendar.js:667
msgid "Week %V"
msgstr "Semana %V"
#. 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:729
#: js/ui/calendar.js:736
msgctxt "event list time"
msgid "All Day"
msgstr "Todo o día"
#: js/ui/calendar.js:862
#: js/ui/calendar.js:869
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#: js/ui/calendar.js:866
#: js/ui/calendar.js:873
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: js/ui/calendar.js:1086
#: js/ui/calendar.js:1093
msgid "No Notifications"
msgstr "Non hai notificacións"
#: js/ui/calendar.js:1089
#: js/ui/calendar.js:1096
msgid "No Events"
msgstr "Non hai eventos"
#: js/ui/calendar.js:1117
#: js/ui/calendar.js:1124
msgid "Clear All"
msgstr "Limpar todo"
@@ -841,7 +862,7 @@ msgstr "Unidade externa conectada"
msgid "External drive disconnected"
msgstr "Unidade externa desconectada"
#: js/ui/components/autorunManager.js:354
#: js/ui/components/autorunManager.js:358
#, javascript-format
msgid "Open with %s"
msgstr "Abrir con %s"
@@ -854,8 +875,8 @@ msgstr "Contrasinal:"
msgid "Type again:"
msgstr "Escriba de novo:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261
#: js/ui/status/network.js:355 js/ui/status/network.js:939
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:338 js/ui/status/network.js:928
msgid "Connect"
msgstr "Conectar"
@@ -883,11 +904,11 @@ msgstr "Contrasinal da chave privada: "
msgid "Service: "
msgstr "Servizo: "
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network"
msgstr "A rede sen fíos require autenticación"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -896,7 +917,7 @@ msgstr ""
"Requírense contrasinais ou chaves de cifrado para acceder á rede sen fíos "
"«%s»."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication"
msgstr "Autenticación con fíos 802.1X"
@@ -904,15 +925,15 @@ msgstr "Autenticación con fíos 802.1X"
msgid "Network name: "
msgstr "Nome da rede:"
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication"
msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required"
msgstr "Requírese un código PIN"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device"
msgstr "É necesario un código PIN para o dispositivo de banda larga móbil"
@@ -920,17 +941,17 @@ msgstr "É necesario un código PIN para o dispositivo de banda larga móbil"
msgid "PIN: "
msgstr "PIN:"
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password"
msgstr "Contrasinal da rede de banda larga móbil"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643
#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Requírese un contrasinal para conectarse a «%s»."
#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699
msgid "Network Manager"
msgstr "Xestor da rede"
@@ -965,20 +986,20 @@ msgstr "Agora %s chámase %s"
msgid "Windows"
msgstr "Xanelas"
#: js/ui/dash.js:250 js/ui/dash.js:291
#: js/ui/dash.js:246 js/ui/dash.js:287
msgid "Show Applications"
msgstr "Mostrar aplicativos"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: js/ui/dash.js:449
#: js/ui/dash.js:445
msgid "Dash"
msgstr "Taboleiro"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:76
msgid "%B %e %Y"
msgstr "%e de %B de %Y"
@@ -986,19 +1007,19 @@ msgstr "%e de %B de %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:83
msgid "%A %B %e %Y"
msgstr "%A, %e de %B de %Y"
#: js/ui/dateMenu.js:144
#: js/ui/dateMenu.js:148
msgid "Add world clocks…"
msgstr "Engadir reloxos do mundo…"
#: js/ui/dateMenu.js:145
#: js/ui/dateMenu.js:149
msgid "World Clocks"
msgstr "Reloxos do mundo"
#: js/ui/dateMenu.js:224
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Tempo"
@@ -1006,7 +1027,7 @@ msgstr "Tempo"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:286
#: js/ui/dateMenu.js:292
#, javascript-format
msgid "%s all day."
msgstr "%s todo o día"
@@ -1015,7 +1036,7 @@ msgstr "%s todo o día"
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:292
#: js/ui/dateMenu.js:298
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, entón %s máis tarde."
@@ -1024,30 +1045,30 @@ msgstr "%s, entón %s máis tarde."
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:298
#: js/ui/dateMenu.js:304
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, entón %s, seguido de %s máis tarde."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:315
msgid "Select a location…"
msgstr "Seleccione unha localizacion…"
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:318
msgid "Loading…"
msgstr "Cargando…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:318
#: js/ui/dateMenu.js:324
#, javascript-format
msgid "Feels like %s."
msgstr "Sensación de %s."
#: js/ui/dateMenu.js:321
#: js/ui/dateMenu.js:327
msgid "Go online for weather information"
msgstr "Conectarse para var a información do tempo"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Weather information is currently unavailable"
msgstr "A información do tempo non está dispoñíbel actualmente"
@@ -1232,9 +1253,78 @@ msgstr "Denegar"
msgid "Allow"
msgstr "Permitir"
#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Teclado"
#: js/ui/kbdA11yDialog.js:33
#| msgid "Slow Keys"
msgid "Slow Keys Turned On"
msgstr "Teclas lentas activadas"
#: js/ui/kbdA11yDialog.js:34
#| msgid "Slow Keys"
msgid "Slow Keys Turned Off"
msgstr "Teclas lentas desactivadas"
#: js/ui/kbdA11yDialog.js:35
msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the "
"Slow Keys feature, which affects the way your keyboard works."
msgstr ""
"Acabas de manter a tecla Maiús durante 8 segundos. Isto é un atallo para a "
"característica de Teclas lentas, o cal afecta á forma na que funciona o "
"teclado."
#: js/ui/kbdA11yDialog.js:42
#| msgid "Sticky Keys"
msgid "Sticky Keys Turned On"
msgstr "Teclas persistentes activadas"
#: js/ui/kbdA11yDialog.js:43
#| msgid "Sticky Keys"
msgid "Sticky Keys Turned Off"
msgstr "Teclas persistentes desactivadas"
#: js/ui/kbdA11yDialog.js:45
msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works."
msgstr ""
"Acabas de manter a tecla Maiús durante 5 segundos. Isto é un atallo para a "
"característica de Teclas persistentes, o cal afecta á forma na que funciona "
"o teclado."
#: js/ui/kbdA11yDialog.js:47
msgid ""
"You just pressed two keys at once, or pressed the Shift key 5 times in a "
"row. This turns off the Sticky Keys feature, which affects the way your "
"keyboard works."
msgstr ""
"Acabas de premer dúas teclas á vez, ou presionado a tecla Maiús 5 veces "
"seguidas. Isto é un atallo para a característica de Teclas persistentes, o "
"cal afecta á forma na que funciona o teclado."
#: js/ui/kbdA11yDialog.js:59
msgid "Leave On"
msgstr "Deixar activado"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1287
msgid "Turn On"
msgstr "Activar"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:339
#: js/ui/status/network.js:1287 js/ui/status/network.js:1402
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Apagar"
#: js/ui/kbdA11yDialog.js:67
msgid "Leave Off"
msgstr "Deixar desactivado"
#: js/ui/keyboard.js:198
msgid "Region & Language Settings"
msgstr "Preferencias de rexión e idioma"
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
@@ -1284,7 +1374,7 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Páxina web"
#: js/ui/messageTray.js:1493
#: js/ui/messageTray.js:1494
msgid "System Information"
msgstr "Información do sistema"
@@ -1373,7 +1463,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistema"
#: js/ui/panel.js:812
#: js/ui/panel.js:814
msgid "Top Bar"
msgstr "Barra superior"
@@ -1437,11 +1527,11 @@ msgstr "GNOME precisa bloquear a pantalla"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1311
msgid "Unable to lock"
msgstr "Non foi posíbel bloquear"
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1312
msgid "Lock was blocked by an application"
msgstr "Un aplicativo impediu o bloqueo"
@@ -1528,46 +1618,39 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "Texto grande"
#: js/ui/status/bluetooth.js:47
#: js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616
msgid "Bluetooth Settings"
msgstr "Preferencias do Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: js/ui/status/bluetooth.js:136
#: js/ui/status/bluetooth.js:137
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d conectado"
msgstr[1] "%d conectados"
#: js/ui/status/bluetooth.js:138
#: js/ui/status/bluetooth.js:139
msgid "Off"
msgstr "Desactivar"
#: js/ui/status/bluetooth.js:140
#: js/ui/status/bluetooth.js:141
msgid "On"
msgstr "Activado"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299
msgid "Turn On"
msgstr "Activar"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:170
#: js/ui/status/network.js:356 js/ui/status/network.js:1299
#: js/ui/status/network.js:1418 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Apagar"
#: js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Brillo"
#: js/ui/status/keyboard.js:805
#: js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Teclado"
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Mostrar a distribución do teclado"
@@ -1607,18 +1690,18 @@ msgstr ""
"Pode cambiar o acceso á localización en calquera momento desde as "
"preferencias de privacidade."
#: js/ui/status/network.js:104
#: js/ui/status/network.js:90
msgid "<unknown>"
msgstr "<descoñecido>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454 js/ui/status/network.js:1328
#: js/ui/status/network.js:443 js/ui/status/network.js:1316
#, javascript-format
msgid "%s Off"
msgstr "%s apagado"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:457
#: js/ui/status/network.js:446
#, javascript-format
msgid "%s Connected"
msgstr "%s conectado"
@@ -1626,189 +1709,189 @@ msgstr "%s conectado"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:451
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s sen xestionar"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465
#: js/ui/status/network.js:454
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s desconectando"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:472 js/ui/status/network.js:1320
#: js/ui/status/network.js:461 js/ui/status/network.js:1308
#, javascript-format
msgid "%s Connecting"
msgstr "%s conectando"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:475
#: js/ui/status/network.js:464
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s require autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:483
#: js/ui/status/network.js:472
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Falta o firmware para %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:476
#, javascript-format
msgid "%s Unavailable"
msgstr "%s non dispoñíbel"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:490
#: js/ui/status/network.js:479
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s conexión fallada"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:495
msgid "Wired Settings"
msgstr "Preferencias da rede con fíos"
#: js/ui/status/network.js:548
#: js/ui/status/network.js:537
msgid "Mobile Broadband Settings"
msgstr "Preferencias da banda larga móbil"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:591 js/ui/status/network.js:1325
#: js/ui/status/network.js:580 js/ui/status/network.js:1313
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s hardware desactivado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:595
#: js/ui/status/network.js:584
#, javascript-format
msgid "%s Disabled"
msgstr "%s desactivado"
#: js/ui/status/network.js:635
#: js/ui/status/network.js:624
msgid "Connect to Internet"
msgstr "Conectarse a internet"
#: js/ui/status/network.js:833
#: js/ui/status/network.js:822
msgid "Airplane Mode is On"
msgstr "Modo avión activado"
#: js/ui/status/network.js:834
#: js/ui/status/network.js:823
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "A Wifi está desactivada cando o modo avión está activo."
#: js/ui/status/network.js:835
#: js/ui/status/network.js:824
msgid "Turn Off Airplane Mode"
msgstr "Desactivar o modo avión"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:833
msgid "Wi-Fi is Off"
msgstr "Wifi desactivada"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:834
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "A Wifi precisa activarse para poder conectarse á rede."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:835
msgid "Turn On Wi-Fi"
msgstr "Activar Wifi"
#: js/ui/status/network.js:871
#: js/ui/status/network.js:860
msgid "Wi-Fi Networks"
msgstr "Redes WiFi"
#: js/ui/status/network.js:873
#: js/ui/status/network.js:862
msgid "Select a network"
msgstr "Seleccione unha rede"
#: js/ui/status/network.js:903
#: js/ui/status/network.js:892
msgid "No Networks"
msgstr "Sen redes"
#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Usar interruptor hardware para apagar"
#: js/ui/status/network.js:1191
#: js/ui/status/network.js:1179
msgid "Select Network"
msgstr "Seleccione unha rede"
#: js/ui/status/network.js:1197
#: js/ui/status/network.js:1185
msgid "Wi-Fi Settings"
msgstr "Preferencias da WiFi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1316
#: js/ui/status/network.js:1304
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s punto wifi activo"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1331
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Not Connected"
msgstr "%s non conectado"
#: js/ui/status/network.js:1435
#: js/ui/status/network.js:1419
msgid "connecting…"
msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1438
#: js/ui/status/network.js:1422
msgid "authentication required"
msgstr "requírese autenticación"
#: js/ui/status/network.js:1440
#: js/ui/status/network.js:1424
msgid "connection failed"
msgstr "conexión fallada"
#: js/ui/status/network.js:1494
#: js/ui/status/network.js:1478
msgid "VPN Settings"
msgstr "Preferencias de VPN"
#: js/ui/status/network.js:1498
#: js/ui/status/network.js:1491
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1508
#: js/ui/status/network.js:1501
msgid "VPN Off"
msgstr "VPN desactivada"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Preferencias da rede"
#: js/ui/status/network.js:1603
#: js/ui/status/network.js:1596
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s conectando con fíos"
msgstr[1] "%s conectando con fíos"
#: js/ui/status/network.js:1607
#: js/ui/status/network.js:1600
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s conectando sen fíos"
msgstr[1] "%s con fíos conectando"
#: js/ui/status/network.js:1611
#: js/ui/status/network.js:1604
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s con módem conectando"
msgstr[1] "%s conectando sen fíos"
#: js/ui/status/network.js:1759
#: js/ui/status/network.js:1738
msgid "Connection failed"
msgstr "Produciuse un fallo na conexión"
#: js/ui/status/network.js:1760
#: js/ui/status/network.js:1739
msgid "Activation of network connection failed"
msgstr "Produciuse un fallo na activación da conexión de rede"
@@ -1890,6 +1973,32 @@ msgstr "Suspender"
msgid "Power Off"
msgstr "Apagar"
#: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt"
msgstr "Thunderbolt"
#. we are done
#: js/ui/status/thunderbolt.js:330
msgid "Unknown Thunderbolt device"
msgstr "Dispositivo Thunderbolt descoñecido"
#: js/ui/status/thunderbolt.js:331
msgid ""
"New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it."
msgstr ""
"Detectouse un novo dispositivo mentres non estabas. Por favor desconecte e "
"reconecte o dispositivo para comezar a usalo."
#: js/ui/status/thunderbolt.js:336
msgid "Thunderbolt authorization error"
msgstr "Erro de autorización de Thunderbolt"
#: js/ui/status/thunderbolt.js:337
#, javascript-format
msgid "Could not authorize the thunderbolt device: %s"
msgstr "Non foi posíbel autorizar o dispositivo thunderbolt: %s"
#: js/ui/status/volume.js:128
msgid "Volume changed"
msgstr "Volume cambiado"
@@ -1902,7 +2011,6 @@ msgstr "Volume"
#. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:21
#| msgid "Error"
msgid "Mirror"
msgstr "Espello"
@@ -1910,7 +2018,6 @@ msgstr "Espello"
#. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:26
#| msgid "Panel Display"
msgid "Join Displays"
msgstr "Unir pantallas"
@@ -2051,21 +2158,21 @@ msgstr "Calendario de Evolution"
msgid "evolution"
msgstr "evolution"
#: src/main.c:380
#: src/main.c:432
msgid "Print version"
msgstr "Imprimir versión"
#: src/main.c:386
#: src/main.c:438
msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para a pantalla de inicio"
#: src/main.c:392
#: src/main.c:444
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr ""
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
"sesión"
#: src/main.c:398
#: src/main.c:450
msgid "List possible modes"
msgstr "Listar os modos posíbeis"
@@ -2113,6 +2220,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#~| msgid "Power Off"
#~ msgctxt "search-result"
#~ msgid "Power off"
#~ msgstr "Apagar"
#~| msgid "Log Out"
#~ msgctxt "search-result"
#~ msgid "Log out"
#~ msgstr "Saír da sesión"
#~| msgid "Switch User"
#~ msgctxt "search-result"
#~ msgid "Switch user"
#~ msgstr "Cambiar de usuario"
#~ msgid "Hide tray"
#~ msgstr "Ocultar bandexa"
@@ -2652,9 +2774,6 @@ msgstr "Sons do sistema"
#~ msgid "Mouse Settings"
#~ msgstr "Preferencias do rato"
#~ msgid "Region & Language Settings"
#~ msgstr "Preferencias de rexión e idioma"
#~ msgid "Wi-Fi"
#~ msgstr "Wifi"

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